Changeset 289495 in webkit
- Timestamp:
- Feb 9, 2022 12:20:04 PM (5 months ago)
- Location:
- trunk/Source
- Files:
-
- 22 edited
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/Modules/model-element/HTMLModelElement.cpp (modified) (5 diffs)
-
WebCore/Modules/model-element/HTMLModelElement.h (modified) (3 diffs)
-
WebCore/Modules/model-element/ModelPlayer.h (modified) (1 diff)
-
WebCore/Modules/model-element/dummy/DummyModelPlayer.cpp (modified) (1 diff)
-
WebCore/Modules/model-element/dummy/DummyModelPlayer.h (modified) (1 diff)
-
WebCore/Modules/model-element/scenekit/SceneKitModelPlayer.h (modified) (1 diff)
-
WebCore/Modules/model-element/scenekit/SceneKitModelPlayer.mm (modified) (1 diff)
-
WebCore/PAL/ChangeLog (modified) (1 diff)
-
WebCore/PAL/pal/spi/cocoa/QuartzCoreSPI.h (modified) (2 diffs)
-
WebCore/PAL/pal/spi/mac/SystemPreviewSPI.h (modified) (1 diff)
-
WebCore/rendering/RenderLayerBacking.cpp (modified) (2 diffs)
-
WebKit/ChangeLog (modified) (1 diff)
-
WebKit/UIProcess/Cocoa/ModelElementControllerCocoa.mm (modified) (3 diffs)
-
WebKit/UIProcess/ModelElementController.h (modified) (1 diff)
-
WebKit/UIProcess/WebPageProxy.cpp (modified) (1 diff)
-
WebKit/UIProcess/WebPageProxy.h (modified) (1 diff)
-
WebKit/UIProcess/WebPageProxy.messages.in (modified) (1 diff)
-
WebKit/WebProcess/Model/ARKitInlinePreviewModelPlayer.h (modified) (1 diff)
-
WebKit/WebProcess/Model/ARKitInlinePreviewModelPlayer.mm (modified) (1 diff)
-
WebKit/WebProcess/Model/mac/ARKitInlinePreviewModelPlayerMac.h (modified) (2 diffs)
-
WebKit/WebProcess/Model/mac/ARKitInlinePreviewModelPlayerMac.mm (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r289494 r289495 1 2022-02-09 Antoine Quint <graouts@webkit.org> 2 3 [model] improve sizing on macOS 4 https://bugs.webkit.org/show_bug.cgi?id=236233 5 <rdar://problem/88569881> 6 7 Reviewed by Simon Fraser. 8 9 We detect when the <model> layer size changes under RenderLayerBacking::updateGeometry() 10 and inform the associated HTMLModelElement through the new parentLayerSizeMayHaveChanged() 11 method that the size has changed. We then inform the backing player that sizeDidChange(). 12 13 * Modules/model-element/HTMLModelElement.cpp: 14 (WebCore::HTMLModelElement::createModelPlayer): 15 (WebCore::HTMLModelElement::parentLayerSizeMayHaveChanged): 16 (WebCore::HTMLModelElement::platformLayerSize const): 17 * Modules/model-element/HTMLModelElement.h: 18 * Modules/model-element/ModelPlayer.h: 19 * Modules/model-element/dummy/DummyModelPlayer.cpp: 20 (WebCore::DummyModelPlayer::sizeDidChange): 21 * Modules/model-element/dummy/DummyModelPlayer.h: 22 * Modules/model-element/scenekit/SceneKitModelPlayer.h: 23 * Modules/model-element/scenekit/SceneKitModelPlayer.mm: 24 (WebCore::SceneKitModelPlayer::sizeDidChange): 25 * rendering/RenderLayerBacking.cpp: 26 (WebCore::RenderLayerBacking::updateConfiguration): 27 (WebCore::RenderLayerBacking::updateGeometry): 28 1 29 2022-02-09 Alex Christensen <achristensen@webkit.org> 2 30 -
trunk/Source/WebCore/Modules/model-element/HTMLModelElement.cpp
r288728 r289495 46 46 #include "JSHTMLModelElement.h" 47 47 #include "JSHTMLModelElementCamera.h" 48 #include "LayoutRect.h" 49 #include "LayoutSize.h" 48 50 #include "Model.h" 49 51 #include "ModelPlayer.h" … … 56 58 #include "RenderLayerModelObject.h" 57 59 #include "RenderModel.h" 60 #include "RenderReplaced.h" 58 61 #include <wtf/IsoMallocInlines.h> 59 62 #include <wtf/Seconds.h> … … 262 265 // FIXME: We need to tell the player if the size changes as well, so passing this 263 266 // in with load probably doesn't make sense. 264 ASSERT(renderer()); 265 auto size = renderer()->absoluteBoundingBoxRect(false).size(); 266 m_modelPlayer->load(*m_model, size); 267 m_modelPlayer->load(*m_model, contentSize()); 267 268 } 268 269 … … 275 276 { 276 277 return m_modelPlayer->layer(); 278 } 279 280 void HTMLModelElement::sizeMayHaveChanged() 281 { 282 m_modelPlayer->sizeDidChange(contentSize()); 277 283 } 278 284 … … 639 645 #endif 640 646 647 LayoutSize HTMLModelElement::contentSize() const 648 { 649 ASSERT(renderer()); 650 return downcast<RenderReplaced>(*renderer()).replacedContentRect().size(); 651 } 652 641 653 } 642 654 -
trunk/Source/WebCore/Modules/model-element/HTMLModelElement.h
r288728 r289495 44 44 45 45 class Event; 46 class LayoutSize; 46 47 class Model; 47 48 class ModelPlayer; … … 104 105 Vector<RetainPtr<id>> accessibilityChildren(); 105 106 #endif 106 107 108 void sizeMayHaveChanged(); 109 107 110 private: 108 111 HTMLModelElement(const QualifiedName&, Document&); … … 146 149 bool isInteractive() const; 147 150 151 LayoutSize contentSize() const; 152 148 153 URL m_sourceURL; 149 154 CachedResourceHandle<CachedRawResource> m_resource; -
trunk/Source/WebCore/Modules/model-element/ModelPlayer.h
r288728 r289495 45 45 46 46 virtual void load(Model&, LayoutSize) = 0; 47 virtual void sizeDidChange(LayoutSize) = 0; 47 48 virtual PlatformLayer* layer() = 0; 48 49 virtual void enterFullscreen() = 0; -
trunk/Source/WebCore/Modules/model-element/dummy/DummyModelPlayer.cpp
r286406 r289495 53 53 { 54 54 return nullptr; 55 } 56 57 void DummyModelPlayer::sizeDidChange(LayoutSize) 58 { 55 59 } 56 60 -
trunk/Source/WebCore/Modules/model-element/dummy/DummyModelPlayer.h
r286406 r289495 43 43 // ModelPlayer overrides. 44 44 void load(Model&, LayoutSize) override; 45 void sizeDidChange(LayoutSize) override; 45 46 PlatformLayer* layer() override; 46 47 void enterFullscreen() override; -
trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelPlayer.h
r286406 r289495 57 57 // ModelPlayer overrides. 58 58 void load(Model&, LayoutSize) override; 59 void sizeDidChange(LayoutSize) override; 59 60 CALayer *layer() override; 60 61 void enterFullscreen() override; -
trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelPlayer.mm
r286406 r289495 72 72 73 73 m_loader = loadSceneKitModel(modelSource, *this); 74 } 75 76 void SceneKitModelPlayer::sizeDidChange(LayoutSize) 77 { 74 78 } 75 79 -
trunk/Source/WebCore/PAL/ChangeLog
r289235 r289495 1 2022-02-09 Antoine Quint <graouts@webkit.org> 2 3 [model] improve sizing on macOS 4 https://bugs.webkit.org/show_bug.cgi?id=236233 5 <rdar://problem/88569881> 6 7 Reviewed by Simon Fraser. 8 9 Add newly-used CAFenceHandle and ASVInlinePreview SPIs. 10 11 * pal/spi/cocoa/QuartzCoreSPI.h: 12 * pal/spi/mac/SystemPreviewSPI.h: 13 1 14 2022-02-07 Antoine Quint <graouts@webkit.org> 2 15 -
trunk/Source/WebCore/PAL/pal/spi/cocoa/QuartzCoreSPI.h
r286877 r289495 53 53 #endif 54 54 55 #if ENABLE(ARKIT_INLINE_PREVIEW) 56 #import <QuartzCore/CAFenceHandle.h> 57 #endif 58 55 59 #endif // __OBJC__ 56 60 … … 66 70 #endif 67 71 68 #if ENABLE(ARKIT_INLINE_PREVIEW_IOS) 69 @class CAFenceHandle; 72 #if ENABLE(ARKIT_INLINE_PREVIEW) 73 @interface CAFenceHandle : NSObject 74 @end 75 76 @interface CAFenceHandle () 77 - (mach_port_t)copyPort; 78 - (void)invalidate; 79 @end 70 80 #endif 71 81 -
trunk/Source/WebCore/PAL/pal/spi/mac/SystemPreviewSPI.h
r286317 r289495 51 51 - (void)setRemoteContext:(uint32_t)contextId; 52 52 53 - (void)updateFrame:(CGRect)newFrame completionHandler:(void (^)(CAFenceHandle * _Nullable fenceHandle, NSError * _Nullable error))handler; 54 - (void)setFrameWithinFencedTransaction:(CGRect)frame; 55 53 56 - (void)mouseDownAtLocation:(CGPoint)location timestamp:(NSTimeInterval)timestamp; 54 57 - (void)mouseDraggedAtLocation:(CGPoint)location timestamp:(NSTimeInterval)timestamp; -
trunk/Source/WebCore/rendering/RenderLayerBacking.cpp
r289225 r289495 1121 1121 // Some ModelPlayers use a platformLayer() and some pass the Model to the layer as contents, 1122 1122 // but this is a runtime decision. 1123 if (element->usesPlatformLayer()) {1123 if (element->usesPlatformLayer()) 1124 1124 m_graphicsLayer->setContentsToPlatformLayer(element->platformLayer(), GraphicsLayer::ContentsLayerPurpose::Model); 1125 }else if (auto model = element->model())1125 else if (auto model = element->model()) 1126 1126 m_graphicsLayer->setContentsToModel(WTFMove(model)); 1127 1127 … … 1532 1532 if (subpixelOffsetFromRendererChanged(oldSubpixelOffsetFromRenderer, m_subpixelOffsetFromRenderer, deviceScaleFactor) && canIssueSetNeedsDisplay()) 1533 1533 setContentsNeedDisplay(); 1534 1535 #if ENABLE(MODEL_ELEMENT) 1536 if (is<RenderModel>(renderer())) { 1537 auto* element = downcast<HTMLModelElement>(renderer().element()); 1538 if (element->usesPlatformLayer()) 1539 element->sizeMayHaveChanged(); 1540 } 1541 #endif 1534 1542 } 1535 1543 -
trunk/Source/WebKit/ChangeLog
r289492 r289495 1 2022-02-09 Antoine Quint <graouts@webkit.org> 2 3 [model] improve sizing on macOS 4 https://bugs.webkit.org/show_bug.cgi?id=236233 5 <rdar://problem/88569881> 6 7 Reviewed by Simon Fraser. 8 9 We override the new ModelPlayer::sizeDidChange() virtual method on ARKitInlinePreviewModelPlayerMac 10 to be notified when the <model> layer's has changed size. We then send the new ModelElementSizeDidChange 11 message to the UI process which will yield a call to ModelElementController::modelElementSizeDidChange(). 12 13 In that new method, we call -[ASVInlinePreview updateFrame:completionHandler:] which provides us with a 14 CAFenceHandle which we copy to create a MachSendRight to send back to the Web process in the IPC callback. 15 16 Back in the Web process, we install this fence on the drawing area and finally call -[ASVInlinePreview 17 setFrameWithinFencedTransaction:] to complete the sizing update on both the ASVInlinePreview instances. 18 19 * UIProcess/Cocoa/ModelElementControllerCocoa.mm: 20 (WebKit::ModelElementController::modelElementSizeDidChange): 21 * UIProcess/ModelElementController.h: 22 * UIProcess/WebPageProxy.cpp: 23 (WebKit::WebPageProxy::modelElementSizeDidChange): 24 * UIProcess/WebPageProxy.h: 25 * UIProcess/WebPageProxy.messages.in: 26 * WebProcess/Model/ARKitInlinePreviewModelPlayer.h: 27 * WebProcess/Model/ARKitInlinePreviewModelPlayer.mm: 28 (WebKit::ARKitInlinePreviewModelPlayer::sizeDidChange): 29 * WebProcess/Model/mac/ARKitInlinePreviewModelPlayerMac.h: 30 * WebProcess/Model/mac/ARKitInlinePreviewModelPlayerMac.mm: 31 (WebKit::ARKitInlinePreviewModelPlayerMac::load): 32 (WebKit::ARKitInlinePreviewModelPlayerMac::sizeDidChange): 33 1 34 2022-02-09 Kimmo Kinnunen <kkinnunen@apple.com> 2 35 -
trunk/Source/WebKit/UIProcess/Cocoa/ModelElementControllerCocoa.mm
r288728 r289495 34 34 #import <WebCore/LayoutUnit.h> 35 35 #import <WebCore/ResourceError.h> 36 #import <pal/spi/cocoa/QuartzCoreSPI.h> 36 37 #import <simd/simd.h> 38 #import <wtf/MachSendRight.h> 37 39 #import <wtf/MainThread.h> 38 40 #import <wtf/MonotonicTime.h> … … 44 46 #import "RemoteLayerTreeViews.h" 45 47 #import "WKModelView.h" 46 #import <pal/spi/cocoa/QuartzCoreSPI.h>47 48 #import <pal/spi/ios/SystemPreviewSPI.h> 48 49 #endif … … 240 241 } 241 242 243 void ModelElementController::modelElementSizeDidChange(const String& uuid, WebCore::FloatSize size, CompletionHandler<void(Expected<MachSendRight, WebCore::ResourceError>)>&& completionHandler) 244 { 245 auto preview = previewForUUID(uuid); 246 if (!preview) { 247 completionHandler(makeUnexpected(WebCore::ResourceError { WebCore::errorDomainWebKitInternal, 0, { }, "Could not find model"_s })); 248 return; 249 } 250 251 auto handler = CompletionHandlerWithFinalizer<void(Expected<MachSendRight, WebCore::ResourceError>)>(WTFMove(completionHandler), [] (Function<void(Expected<MachSendRight, WebCore::ResourceError>)>& completionHandler) { 252 completionHandler(makeUnexpected(WebCore::ResourceError { WebCore::ResourceError::Type::General })); 253 }); 254 255 [preview updateFrame:CGRectMake(0, 0, size.width(), size.height()) completionHandler:makeBlockPtr([weakThis = WeakPtr { *this }, handler = WTFMove(handler), uuid] (CAFenceHandle *fenceHandle, NSError *error) mutable { 256 if (error) { 257 LOG(ModelElement, "Unable to update frame: %@.", error.localizedDescription); 258 callOnMainRunLoop([weakThis = WTFMove(weakThis), handler = WTFMove(handler), error = WebCore::ResourceError { error }] () mutable { 259 if (!weakThis) 260 return; 261 handler(makeUnexpected(error)); 262 }); 263 [fenceHandle invalidate]; 264 return; 265 } 266 267 RetainPtr strongFenceHandle = fenceHandle; 268 callOnMainRunLoop([weakThis = WTFMove(weakThis), handler = WTFMove(handler), uuid, strongFenceHandle = WTFMove(strongFenceHandle)] () mutable { 269 if (!weakThis) 270 return; 271 272 auto fenceSendRight = MachSendRight::adopt([strongFenceHandle copyPort]); 273 [strongFenceHandle invalidate]; 274 handler(fenceSendRight); 275 }); 276 }).get()]; 277 } 278 242 279 #endif 243 280 -
trunk/Source/WebKit/UIProcess/ModelElementController.h
r288728 r289495 72 72 #if ENABLE(ARKIT_INLINE_PREVIEW_MAC) 73 73 void modelElementDidCreatePreview(URL, String, WebCore::FloatSize, CompletionHandler<void(Expected<std::pair<String, uint32_t>, WebCore::ResourceError>)>&&); 74 void modelElementSizeDidChange(const String& uuid, WebCore::FloatSize, CompletionHandler<void(Expected<MachSendRight, WebCore::ResourceError>)>&&); 74 75 void handleMouseDownForModelElement(const String&, const WebCore::LayoutPoint&, MonotonicTime); 75 76 void handleMouseMoveForModelElement(const String&, const WebCore::LayoutPoint&, MonotonicTime); -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r289463 r289495 11098 11098 } 11099 11099 11100 void WebPageProxy::modelElementSizeDidChange(const String& uuid, WebCore::FloatSize size, CompletionHandler<void(Expected<MachSendRight, WebCore::ResourceError>)>&& completionHandler) 11101 { 11102 modelElementController()->modelElementSizeDidChange(uuid, size, WTFMove(completionHandler)); 11103 } 11104 11100 11105 void WebPageProxy::handleMouseDownForModelElement(const String& uuid, const WebCore::LayoutPoint& flippedLocationInElement, MonotonicTime timestamp) 11101 11106 { -
trunk/Source/WebKit/UIProcess/WebPageProxy.h
r289463 r289495 613 613 #if ENABLE(ARKIT_INLINE_PREVIEW_MAC) 614 614 void modelElementDidCreatePreview(const URL&, const String&, const WebCore::FloatSize&, CompletionHandler<void(Expected<std::pair<String, uint32_t>, WebCore::ResourceError>)>&&); 615 void modelElementSizeDidChange(const String&, WebCore::FloatSize, CompletionHandler<void(Expected<MachSendRight, WebCore::ResourceError>)>&&); 615 616 void handleMouseDownForModelElement(const String&, const WebCore::LayoutPoint&, MonotonicTime); 616 617 void handleMouseMoveForModelElement(const String&, const WebCore::LayoutPoint&, MonotonicTime); -
trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in
r288728 r289495 590 590 #if ENABLE(ARKIT_INLINE_PREVIEW_MAC) 591 591 ModelElementDidCreatePreview(URL url, String uuid, WebCore::FloatSize size) -> (Expected<std::pair<String, uint32_t>, WebCore::ResourceError> result) Async 592 ModelElementSizeDidChange(String uuid, WebCore::FloatSize size) -> (Expected<MachSendRight, WebCore::ResourceError> result) Async 592 593 HandleMouseDownForModelElement(String uuid, WebCore::LayoutPoint flippedLocationInElement, MonotonicTime timestamp) 593 594 HandleMouseMoveForModelElement(String uuid, WebCore::LayoutPoint flippedLocationInElement, MonotonicTime timestamp) -
trunk/Source/WebKit/WebProcess/Model/ARKitInlinePreviewModelPlayer.h
r286406 r289495 52 52 // WebCore::ModelPlayer overrides. 53 53 void load(WebCore::Model&, WebCore::LayoutSize) override; 54 void sizeDidChange(WebCore::LayoutSize) override; 54 55 PlatformLayer* layer() override; 55 56 void enterFullscreen() override; -
trunk/Source/WebKit/WebProcess/Model/ARKitInlinePreviewModelPlayer.mm
r286406 r289495 47 47 } 48 48 49 void ARKitInlinePreviewModelPlayer::sizeDidChange(LayoutSize) 50 { 51 } 52 49 53 PlatformLayer* ARKitInlinePreviewModelPlayer::layer() 50 54 { -
trunk/Source/WebKit/WebProcess/Model/mac/ARKitInlinePreviewModelPlayerMac.h
r288723 r289495 52 52 // WebCore::ModelPlayer overrides. 53 53 void load(WebCore::Model&, WebCore::LayoutSize) override; 54 void sizeDidChange(WebCore::LayoutSize) override; 54 55 PlatformLayer* layer() override; 55 56 bool supportsMouseInteraction() override; … … 62 63 void clearFile(); 63 64 65 WebCore::LayoutSize m_size; 64 66 String m_filePath; 65 67 RetainPtr<ASVInlinePreview> m_inlinePreview; -
trunk/Source/WebKit/WebProcess/Model/mac/ARKitInlinePreviewModelPlayerMac.mm
r288950 r289495 29 29 #if ENABLE(ARKIT_INLINE_PREVIEW_MAC) 30 30 31 #import "DrawingArea.h" 31 32 #import "WebPage.h" 32 33 #import "WebPageProxyMessages.h" 33 34 #import <WebCore/Model.h> 35 #import <pal/spi/cocoa/QuartzCoreSPI.h> 34 36 #import <pal/spi/mac/SystemPreviewSPI.h> 37 #import <wtf/MachSendRight.h> 35 38 #import <wtf/SoftLinking.h> 36 39 #import <wtf/UUID.h> … … 125 128 void ARKitInlinePreviewModelPlayerMac::load(WebCore::Model& modelSource, WebCore::LayoutSize size) 126 129 { 130 m_size = size; 131 127 132 auto strongClient = client(); 128 133 if (!strongClient) … … 173 178 } 174 179 180 void ARKitInlinePreviewModelPlayerMac::sizeDidChange(WebCore::LayoutSize size) 181 { 182 if (m_size == size) 183 return; 184 185 m_size = size; 186 187 RefPtr strongPage = page(); 188 if (!strongPage) 189 return; 190 191 String uuid = [m_inlinePreview uuid].UUIDString; 192 CompletionHandler<void(Expected<MachSendRight, WebCore::ResourceError>)> completionHandler = [weakSelf = WeakPtr { *this }, strongPage, size] (Expected<MachSendRight, WebCore::ResourceError> result) mutable { 193 if (!result) 194 return; 195 196 RefPtr strongSelf = weakSelf.get(); 197 if (!strongSelf) 198 return; 199 200 auto* drawingArea = strongPage->drawingArea(); 201 if (!drawingArea) 202 return; 203 204 auto fenceSendRight = *result; 205 drawingArea->addFence(fenceSendRight); 206 207 [strongSelf->m_inlinePreview setFrameWithinFencedTransaction:CGRectMake(0, 0, size.width(), size.height())]; 208 }; 209 210 strongPage->sendWithAsyncReply(Messages::WebPageProxy::ModelElementSizeDidChange(uuid, size), WTFMove(completionHandler)); 211 } 212 175 213 PlatformLayer* ARKitInlinePreviewModelPlayerMac::layer() 176 214 {
Note: See TracChangeset
for help on using the changeset viewer.