Title: [289495] trunk/Source
Revision
289495
Author
[email protected]
Date
2022-02-09 12:20:04 -0800 (Wed, 09 Feb 2022)

Log Message

[model] improve sizing on macOS
https://bugs.webkit.org/show_bug.cgi?id=236233
<rdar://problem/88569881>

Reviewed by Simon Fraser.

Source/WebCore:

We detect when the <model> layer size changes under RenderLayerBacking::updateGeometry()
and inform the associated HTMLModelElement through the new parentLayerSizeMayHaveChanged()
method that the size has changed. We then inform the backing player that sizeDidChange().

* Modules/model-element/HTMLModelElement.cpp:
(WebCore::HTMLModelElement::createModelPlayer):
(WebCore::HTMLModelElement::parentLayerSizeMayHaveChanged):
(WebCore::HTMLModelElement::platformLayerSize const):
* Modules/model-element/HTMLModelElement.h:
* Modules/model-element/ModelPlayer.h:
* Modules/model-element/dummy/DummyModelPlayer.cpp:
(WebCore::DummyModelPlayer::sizeDidChange):
* Modules/model-element/dummy/DummyModelPlayer.h:
* Modules/model-element/scenekit/SceneKitModelPlayer.h:
* Modules/model-element/scenekit/SceneKitModelPlayer.mm:
(WebCore::SceneKitModelPlayer::sizeDidChange):
* rendering/RenderLayerBacking.cpp:
(WebCore::RenderLayerBacking::updateConfiguration):
(WebCore::RenderLayerBacking::updateGeometry):

Source/WebCore/PAL:

Add newly-used CAFenceHandle and ASVInlinePreview SPIs.

* pal/spi/cocoa/QuartzCoreSPI.h:
* pal/spi/mac/SystemPreviewSPI.h:

Source/WebKit:

We override the new ModelPlayer::sizeDidChange() virtual method on ARKitInlinePreviewModelPlayerMac
to be notified when the <model> layer's has changed size. We then send the new ModelElementSizeDidChange
message to the UI process which will yield a call to ModelElementController::modelElementSizeDidChange().

In that new method, we call -[ASVInlinePreview updateFrame:completionHandler:] which provides us with a
CAFenceHandle which we copy to create a MachSendRight to send back to the Web process in the IPC callback.

Back in the Web process, we install this fence on the drawing area and finally call -[ASVInlinePreview
setFrameWithinFencedTransaction:] to complete the sizing update on both the ASVInlinePreview instances.

* UIProcess/Cocoa/ModelElementControllerCocoa.mm:
(WebKit::ModelElementController::modelElementSizeDidChange):
* UIProcess/ModelElementController.h:
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::modelElementSizeDidChange):
* UIProcess/WebPageProxy.h:
* UIProcess/WebPageProxy.messages.in:
* WebProcess/Model/ARKitInlinePreviewModelPlayer.h:
* WebProcess/Model/ARKitInlinePreviewModelPlayer.mm:
(WebKit::ARKitInlinePreviewModelPlayer::sizeDidChange):
* WebProcess/Model/mac/ARKitInlinePreviewModelPlayerMac.h:
* WebProcess/Model/mac/ARKitInlinePreviewModelPlayerMac.mm:
(WebKit::ARKitInlinePreviewModelPlayerMac::load):
(WebKit::ARKitInlinePreviewModelPlayerMac::sizeDidChange):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (289494 => 289495)


--- trunk/Source/WebCore/ChangeLog	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebCore/ChangeLog	2022-02-09 20:20:04 UTC (rev 289495)
@@ -1,3 +1,31 @@
+2022-02-09  Antoine Quint  <[email protected]>
+
+        [model] improve sizing on macOS
+        https://bugs.webkit.org/show_bug.cgi?id=236233
+        <rdar://problem/88569881>
+
+        Reviewed by Simon Fraser.
+
+        We detect when the <model> layer size changes under RenderLayerBacking::updateGeometry()
+        and inform the associated HTMLModelElement through the new parentLayerSizeMayHaveChanged()
+        method that the size has changed. We then inform the backing player that sizeDidChange().
+
+        * Modules/model-element/HTMLModelElement.cpp:
+        (WebCore::HTMLModelElement::createModelPlayer):
+        (WebCore::HTMLModelElement::parentLayerSizeMayHaveChanged):
+        (WebCore::HTMLModelElement::platformLayerSize const):
+        * Modules/model-element/HTMLModelElement.h:
+        * Modules/model-element/ModelPlayer.h:
+        * Modules/model-element/dummy/DummyModelPlayer.cpp:
+        (WebCore::DummyModelPlayer::sizeDidChange):
+        * Modules/model-element/dummy/DummyModelPlayer.h:
+        * Modules/model-element/scenekit/SceneKitModelPlayer.h:
+        * Modules/model-element/scenekit/SceneKitModelPlayer.mm:
+        (WebCore::SceneKitModelPlayer::sizeDidChange):
+        * rendering/RenderLayerBacking.cpp:
+        (WebCore::RenderLayerBacking::updateConfiguration):
+        (WebCore::RenderLayerBacking::updateGeometry):
+
 2022-02-09  Alex Christensen  <[email protected]>
 
         Add TAO check to PerformanceResourceTiming::fetchStart

Modified: trunk/Source/WebCore/Modules/model-element/HTMLModelElement.cpp (289494 => 289495)


--- trunk/Source/WebCore/Modules/model-element/HTMLModelElement.cpp	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebCore/Modules/model-element/HTMLModelElement.cpp	2022-02-09 20:20:04 UTC (rev 289495)
@@ -45,6 +45,8 @@
 #include "JSEventTarget.h"
 #include "JSHTMLModelElement.h"
 #include "JSHTMLModelElementCamera.h"
+#include "LayoutRect.h"
+#include "LayoutSize.h"
 #include "Model.h"
 #include "ModelPlayer.h"
 #include "ModelPlayerProvider.h"
@@ -55,6 +57,7 @@
 #include "RenderLayerBacking.h"
 #include "RenderLayerModelObject.h"
 #include "RenderModel.h"
+#include "RenderReplaced.h"
 #include <wtf/IsoMallocInlines.h>
 #include <wtf/Seconds.h>
 #include <wtf/URL.h>
@@ -261,9 +264,7 @@
 
     // FIXME: We need to tell the player if the size changes as well, so passing this
     // in with load probably doesn't make sense.
-    ASSERT(renderer());
-    auto size = renderer()->absoluteBoundingBoxRect(false).size();
-    m_modelPlayer->load(*m_model, size);
+    m_modelPlayer->load(*m_model, contentSize());
 }
 
 bool HTMLModelElement::usesPlatformLayer() const
@@ -276,6 +277,11 @@
     return m_modelPlayer->layer();
 }
 
+void HTMLModelElement::sizeMayHaveChanged()
+{
+    m_modelPlayer->sizeDidChange(contentSize());
+}
+
 void HTMLModelElement::didFinishLoading(ModelPlayer& modelPlayer)
 {
     ASSERT_UNUSED(modelPlayer, &modelPlayer == m_modelPlayer);
@@ -638,6 +644,12 @@
 }
 #endif
 
+LayoutSize HTMLModelElement::contentSize() const
+{
+    ASSERT(renderer());
+    return downcast<RenderReplaced>(*renderer()).replacedContentRect().size();
 }
 
+}
+
 #endif // ENABLE(MODEL_ELEMENT)

Modified: trunk/Source/WebCore/Modules/model-element/HTMLModelElement.h (289494 => 289495)


--- trunk/Source/WebCore/Modules/model-element/HTMLModelElement.h	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebCore/Modules/model-element/HTMLModelElement.h	2022-02-09 20:20:04 UTC (rev 289495)
@@ -43,6 +43,7 @@
 namespace WebCore {
 
 class Event;
+class LayoutSize;
 class Model;
 class ModelPlayer;
 class MouseEvent;
@@ -103,7 +104,9 @@
 #if PLATFORM(COCOA)
     Vector<RetainPtr<id>> accessibilityChildren();
 #endif
-    
+
+    void sizeMayHaveChanged();
+
 private:
     HTMLModelElement(const QualifiedName&, Document&);
 
@@ -145,6 +148,8 @@
 
     bool isInteractive() const;
 
+    LayoutSize contentSize() const;
+
     URL m_sourceURL;
     CachedResourceHandle<CachedRawResource> m_resource;
     SharedBufferBuilder m_data;

Modified: trunk/Source/WebCore/Modules/model-element/ModelPlayer.h (289494 => 289495)


--- trunk/Source/WebCore/Modules/model-element/ModelPlayer.h	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebCore/Modules/model-element/ModelPlayer.h	2022-02-09 20:20:04 UTC (rev 289495)
@@ -44,6 +44,7 @@
     virtual ~ModelPlayer();
 
     virtual void load(Model&, LayoutSize) = 0;
+    virtual void sizeDidChange(LayoutSize) = 0;
     virtual PlatformLayer* layer() = 0;
     virtual void enterFullscreen() = 0;
     virtual bool supportsMouseInteraction();

Modified: trunk/Source/WebCore/Modules/model-element/dummy/DummyModelPlayer.cpp (289494 => 289495)


--- trunk/Source/WebCore/Modules/model-element/dummy/DummyModelPlayer.cpp	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebCore/Modules/model-element/dummy/DummyModelPlayer.cpp	2022-02-09 20:20:04 UTC (rev 289495)
@@ -54,6 +54,10 @@
     return nullptr;
 }
 
+void DummyModelPlayer::sizeDidChange(LayoutSize)
+{
+}
+
 void DummyModelPlayer::enterFullscreen()
 {
 }

Modified: trunk/Source/WebCore/Modules/model-element/dummy/DummyModelPlayer.h (289494 => 289495)


--- trunk/Source/WebCore/Modules/model-element/dummy/DummyModelPlayer.h	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebCore/Modules/model-element/dummy/DummyModelPlayer.h	2022-02-09 20:20:04 UTC (rev 289495)
@@ -42,6 +42,7 @@
 
     // ModelPlayer overrides.
     void load(Model&, LayoutSize) override;
+    void sizeDidChange(LayoutSize) override;
     PlatformLayer* layer() override;
     void enterFullscreen() override;
     void handleMouseDown(const LayoutPoint&, MonotonicTime) override;

Modified: trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelPlayer.h (289494 => 289495)


--- trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelPlayer.h	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelPlayer.h	2022-02-09 20:20:04 UTC (rev 289495)
@@ -56,6 +56,7 @@
 
     // ModelPlayer overrides.
     void load(Model&, LayoutSize) override;
+    void sizeDidChange(LayoutSize) override;
     CALayer *layer() override;
     void enterFullscreen() override;
     void handleMouseDown(const LayoutPoint&, MonotonicTime) override;

Modified: trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelPlayer.mm (289494 => 289495)


--- trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelPlayer.mm	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelPlayer.mm	2022-02-09 20:20:04 UTC (rev 289495)
@@ -73,6 +73,10 @@
     m_loader = loadSceneKitModel(modelSource, *this);
 }
 
+void SceneKitModelPlayer::sizeDidChange(LayoutSize)
+{
+}
+
 PlatformLayer* SceneKitModelPlayer::layer()
 {
     return m_layer.get();

Modified: trunk/Source/WebCore/PAL/ChangeLog (289494 => 289495)


--- trunk/Source/WebCore/PAL/ChangeLog	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebCore/PAL/ChangeLog	2022-02-09 20:20:04 UTC (rev 289495)
@@ -1,3 +1,16 @@
+2022-02-09  Antoine Quint  <[email protected]>
+
+        [model] improve sizing on macOS
+        https://bugs.webkit.org/show_bug.cgi?id=236233
+        <rdar://problem/88569881>
+
+        Reviewed by Simon Fraser.
+
+        Add newly-used CAFenceHandle and ASVInlinePreview SPIs.
+
+        * pal/spi/cocoa/QuartzCoreSPI.h:
+        * pal/spi/mac/SystemPreviewSPI.h:
+
 2022-02-07  Antoine Quint  <[email protected]>
 
         [model] improve sizing on iOS

Modified: trunk/Source/WebCore/PAL/pal/spi/cocoa/QuartzCoreSPI.h (289494 => 289495)


--- trunk/Source/WebCore/PAL/pal/spi/cocoa/QuartzCoreSPI.h	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebCore/PAL/pal/spi/cocoa/QuartzCoreSPI.h	2022-02-09 20:20:04 UTC (rev 289495)
@@ -52,6 +52,10 @@
 #import <QuartzCore/CADisplayLinkPrivate.h>
 #endif
 
+#if ENABLE(ARKIT_INLINE_PREVIEW)
+#import <QuartzCore/CAFenceHandle.h>
+#endif
+
 #endif // __OBJC__
 
 #else
@@ -65,8 +69,14 @@
 @end
 #endif
 
-#if ENABLE(ARKIT_INLINE_PREVIEW_IOS)
-@class CAFenceHandle;
+#if ENABLE(ARKIT_INLINE_PREVIEW)
+@interface CAFenceHandle : NSObject
+@end
+
+@interface CAFenceHandle ()
+- (mach_port_t)copyPort;
+- (void)invalidate;
+@end
 #endif
 
 @interface CAContext : NSObject

Modified: trunk/Source/WebCore/PAL/pal/spi/mac/SystemPreviewSPI.h (289494 => 289495)


--- trunk/Source/WebCore/PAL/pal/spi/mac/SystemPreviewSPI.h	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebCore/PAL/pal/spi/mac/SystemPreviewSPI.h	2022-02-09 20:20:04 UTC (rev 289495)
@@ -50,6 +50,9 @@
 - (void)preparePreviewOfFileAtURL:(NSURL *)url completionHandler:(void (^)(NSError * _Nullable error))handler;
 - (void)setRemoteContext:(uint32_t)contextId;
 
+- (void)updateFrame:(CGRect)newFrame completionHandler:(void (^)(CAFenceHandle * _Nullable fenceHandle, NSError * _Nullable error))handler;
+- (void)setFrameWithinFencedTransaction:(CGRect)frame;
+
 - (void)mouseDownAtLocation:(CGPoint)location timestamp:(NSTimeInterval)timestamp;
 - (void)mouseDraggedAtLocation:(CGPoint)location timestamp:(NSTimeInterval)timestamp;
 - (void)mouseUpAtLocation:(CGPoint)location timestamp:(NSTimeInterval)timestamp;

Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.cpp (289494 => 289495)


--- trunk/Source/WebCore/rendering/RenderLayerBacking.cpp	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.cpp	2022-02-09 20:20:04 UTC (rev 289495)
@@ -1120,9 +1120,9 @@
 
         // Some ModelPlayers use a platformLayer() and some pass the Model to the layer as contents,
         // but this is a runtime decision.
-        if (element->usesPlatformLayer()) {
+        if (element->usesPlatformLayer())
             m_graphicsLayer->setContentsToPlatformLayer(element->platformLayer(), GraphicsLayer::ContentsLayerPurpose::Model);
-        } else if (auto model = element->model())
+        else if (auto model = element->model())
             m_graphicsLayer->setContentsToModel(WTFMove(model));
 
         layerConfigChanged = true;
@@ -1531,6 +1531,14 @@
 
     if (subpixelOffsetFromRendererChanged(oldSubpixelOffsetFromRenderer, m_subpixelOffsetFromRenderer, deviceScaleFactor) && canIssueSetNeedsDisplay())
         setContentsNeedDisplay();
+
+#if ENABLE(MODEL_ELEMENT)
+    if (is<RenderModel>(renderer())) {
+        auto* element = downcast<HTMLModelElement>(renderer().element());
+        if (element->usesPlatformLayer())
+            element->sizeMayHaveChanged();
+    }
+#endif
 }
 
 void RenderLayerBacking::adjustOverflowControlsPositionRelativeToAncestor(const RenderLayer& ancestorLayer)

Modified: trunk/Source/WebKit/ChangeLog (289494 => 289495)


--- trunk/Source/WebKit/ChangeLog	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebKit/ChangeLog	2022-02-09 20:20:04 UTC (rev 289495)
@@ -1,3 +1,36 @@
+2022-02-09  Antoine Quint  <[email protected]>
+
+        [model] improve sizing on macOS
+        https://bugs.webkit.org/show_bug.cgi?id=236233
+        <rdar://problem/88569881>
+
+        Reviewed by Simon Fraser.
+
+        We override the new ModelPlayer::sizeDidChange() virtual method on ARKitInlinePreviewModelPlayerMac
+        to be notified when the <model> layer's has changed size. We then send the new ModelElementSizeDidChange
+        message to the UI process which will yield a call to ModelElementController::modelElementSizeDidChange().
+
+        In that new method, we call -[ASVInlinePreview updateFrame:completionHandler:] which provides us with a
+        CAFenceHandle which we copy to create a MachSendRight to send back to the Web process in the IPC callback.
+
+        Back in the Web process, we install this fence on the drawing area and finally call -[ASVInlinePreview
+        setFrameWithinFencedTransaction:] to complete the sizing update on both the ASVInlinePreview instances.
+
+        * UIProcess/Cocoa/ModelElementControllerCocoa.mm:
+        (WebKit::ModelElementController::modelElementSizeDidChange):
+        * UIProcess/ModelElementController.h:
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::modelElementSizeDidChange):
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/WebPageProxy.messages.in:
+        * WebProcess/Model/ARKitInlinePreviewModelPlayer.h:
+        * WebProcess/Model/ARKitInlinePreviewModelPlayer.mm:
+        (WebKit::ARKitInlinePreviewModelPlayer::sizeDidChange):
+        * WebProcess/Model/mac/ARKitInlinePreviewModelPlayerMac.h:
+        * WebProcess/Model/mac/ARKitInlinePreviewModelPlayerMac.mm:
+        (WebKit::ARKitInlinePreviewModelPlayerMac::load):
+        (WebKit::ARKitInlinePreviewModelPlayerMac::sizeDidChange):
+
 2022-02-09  Kimmo Kinnunen  <[email protected]>
 
         DisplayListRecorder implementations are not able to obtain extra information out of source ImageBuffers

Modified: trunk/Source/WebKit/UIProcess/Cocoa/ModelElementControllerCocoa.mm (289494 => 289495)


--- trunk/Source/WebKit/UIProcess/Cocoa/ModelElementControllerCocoa.mm	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebKit/UIProcess/Cocoa/ModelElementControllerCocoa.mm	2022-02-09 20:20:04 UTC (rev 289495)
@@ -33,7 +33,9 @@
 #import <WebCore/LayoutPoint.h>
 #import <WebCore/LayoutUnit.h>
 #import <WebCore/ResourceError.h>
+#import <pal/spi/cocoa/QuartzCoreSPI.h>
 #import <simd/simd.h>
+#import <wtf/MachSendRight.h>
 #import <wtf/MainThread.h>
 #import <wtf/MonotonicTime.h>
 
@@ -43,7 +45,6 @@
 #import "RemoteLayerTreeHost.h"
 #import "RemoteLayerTreeViews.h"
 #import "WKModelView.h"
-#import <pal/spi/cocoa/QuartzCoreSPI.h>
 #import <pal/spi/ios/SystemPreviewSPI.h>
 #endif
 
@@ -239,6 +240,42 @@
         [preview mouseUpAtLocation:CGPointMake(flippedLocationInElement.x().toFloat(), flippedLocationInElement.y().toFloat()) timestamp:timestamp.secondsSinceEpoch().value()];
 }
 
+void ModelElementController::modelElementSizeDidChange(const String& uuid, WebCore::FloatSize size, CompletionHandler<void(Expected<MachSendRight, WebCore::ResourceError>)>&& completionHandler)
+{
+    auto preview = previewForUUID(uuid);
+    if (!preview) {
+        completionHandler(makeUnexpected(WebCore::ResourceError { WebCore::errorDomainWebKitInternal, 0, { }, "Could not find model"_s }));
+        return;
+    }
+
+    auto handler = CompletionHandlerWithFinalizer<void(Expected<MachSendRight, WebCore::ResourceError>)>(WTFMove(completionHandler), [] (Function<void(Expected<MachSendRight, WebCore::ResourceError>)>& completionHandler) {
+        completionHandler(makeUnexpected(WebCore::ResourceError { WebCore::ResourceError::Type::General }));
+    });
+
+    [preview updateFrame:CGRectMake(0, 0, size.width(), size.height()) completionHandler:makeBlockPtr([weakThis = WeakPtr { *this }, handler = WTFMove(handler), uuid] (CAFenceHandle *fenceHandle, NSError *error) mutable {
+        if (error) {
+            LOG(ModelElement, "Unable to update frame: %@.", error.localizedDescription);
+            callOnMainRunLoop([weakThis = WTFMove(weakThis), handler = WTFMove(handler), error = WebCore::ResourceError { error }] () mutable {
+                if (!weakThis)
+                    return;
+                handler(makeUnexpected(error));
+            });
+            [fenceHandle invalidate];
+            return;
+        }
+
+        RetainPtr strongFenceHandle = fenceHandle;
+        callOnMainRunLoop([weakThis = WTFMove(weakThis), handler = WTFMove(handler), uuid, strongFenceHandle = WTFMove(strongFenceHandle)] () mutable {
+            if (!weakThis)
+                return;
+
+            auto fenceSendRight = MachSendRight::adopt([strongFenceHandle copyPort]);
+            [strongFenceHandle invalidate];
+            handler(fenceSendRight);
+        });
+    }).get()];
+}
+
 #endif
 
 #if ENABLE(ARKIT_INLINE_PREVIEW)

Modified: trunk/Source/WebKit/UIProcess/ModelElementController.h (289494 => 289495)


--- trunk/Source/WebKit/UIProcess/ModelElementController.h	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebKit/UIProcess/ModelElementController.h	2022-02-09 20:20:04 UTC (rev 289495)
@@ -71,6 +71,7 @@
 #endif
 #if ENABLE(ARKIT_INLINE_PREVIEW_MAC)
     void modelElementDidCreatePreview(URL, String, WebCore::FloatSize, CompletionHandler<void(Expected<std::pair<String, uint32_t>, WebCore::ResourceError>)>&&);
+    void modelElementSizeDidChange(const String& uuid, WebCore::FloatSize, CompletionHandler<void(Expected<MachSendRight, WebCore::ResourceError>)>&&);
     void handleMouseDownForModelElement(const String&, const WebCore::LayoutPoint&, MonotonicTime);
     void handleMouseMoveForModelElement(const String&, const WebCore::LayoutPoint&, MonotonicTime);
     void handleMouseUpForModelElement(const String&, const WebCore::LayoutPoint&, MonotonicTime);

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (289494 => 289495)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2022-02-09 20:20:04 UTC (rev 289495)
@@ -11097,6 +11097,11 @@
     modelElementController()->modelElementDidCreatePreview(url, uuid, size, WTFMove(completionHandler));
 }
 
+void WebPageProxy::modelElementSizeDidChange(const String& uuid, WebCore::FloatSize size, CompletionHandler<void(Expected<MachSendRight, WebCore::ResourceError>)>&& completionHandler)
+{
+    modelElementController()->modelElementSizeDidChange(uuid, size, WTFMove(completionHandler));
+}
+
 void WebPageProxy::handleMouseDownForModelElement(const String& uuid, const WebCore::LayoutPoint& flippedLocationInElement, MonotonicTime timestamp)
 {
     modelElementController()->handleMouseDownForModelElement(uuid, flippedLocationInElement, timestamp);

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (289494 => 289495)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2022-02-09 20:20:04 UTC (rev 289495)
@@ -612,6 +612,7 @@
 #endif
 #if ENABLE(ARKIT_INLINE_PREVIEW_MAC)
     void modelElementDidCreatePreview(const URL&, const String&, const WebCore::FloatSize&, CompletionHandler<void(Expected<std::pair<String, uint32_t>, WebCore::ResourceError>)>&&);
+    void modelElementSizeDidChange(const String&, WebCore::FloatSize, CompletionHandler<void(Expected<MachSendRight, WebCore::ResourceError>)>&&);
     void handleMouseDownForModelElement(const String&, const WebCore::LayoutPoint&, MonotonicTime);
     void handleMouseMoveForModelElement(const String&, const WebCore::LayoutPoint&, MonotonicTime);
     void handleMouseUpForModelElement(const String&, const WebCore::LayoutPoint&, MonotonicTime);

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in (289494 => 289495)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in	2022-02-09 20:20:04 UTC (rev 289495)
@@ -589,6 +589,7 @@
 #endif
 #if ENABLE(ARKIT_INLINE_PREVIEW_MAC)
     ModelElementDidCreatePreview(URL url, String uuid, WebCore::FloatSize size) -> (Expected<std::pair<String, uint32_t>, WebCore::ResourceError> result) Async
+    ModelElementSizeDidChange(String uuid, WebCore::FloatSize size) -> (Expected<MachSendRight, WebCore::ResourceError> result) Async
     HandleMouseDownForModelElement(String uuid, WebCore::LayoutPoint flippedLocationInElement, MonotonicTime timestamp)
     HandleMouseMoveForModelElement(String uuid, WebCore::LayoutPoint flippedLocationInElement, MonotonicTime timestamp)
     HandleMouseUpForModelElement(String uuid, WebCore::LayoutPoint flippedLocationInElement, MonotonicTime timestamp)

Modified: trunk/Source/WebKit/WebProcess/Model/ARKitInlinePreviewModelPlayer.h (289494 => 289495)


--- trunk/Source/WebKit/WebProcess/Model/ARKitInlinePreviewModelPlayer.h	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebKit/WebProcess/Model/ARKitInlinePreviewModelPlayer.h	2022-02-09 20:20:04 UTC (rev 289495)
@@ -51,6 +51,7 @@
 private:
     // WebCore::ModelPlayer overrides.
     void load(WebCore::Model&, WebCore::LayoutSize) override;
+    void sizeDidChange(WebCore::LayoutSize) override;
     PlatformLayer* layer() override;
     void enterFullscreen() override;
     void getCamera(CompletionHandler<void(std::optional<WebCore::HTMLModelElementCamera>&&)>&&) override;

Modified: trunk/Source/WebKit/WebProcess/Model/ARKitInlinePreviewModelPlayer.mm (289494 => 289495)


--- trunk/Source/WebKit/WebProcess/Model/ARKitInlinePreviewModelPlayer.mm	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebKit/WebProcess/Model/ARKitInlinePreviewModelPlayer.mm	2022-02-09 20:20:04 UTC (rev 289495)
@@ -46,6 +46,10 @@
 {
 }
 
+void ARKitInlinePreviewModelPlayer::sizeDidChange(LayoutSize)
+{
+}
+
 PlatformLayer* ARKitInlinePreviewModelPlayer::layer()
 {
     return nullptr;

Modified: trunk/Source/WebKit/WebProcess/Model/mac/ARKitInlinePreviewModelPlayerMac.h (289494 => 289495)


--- trunk/Source/WebKit/WebProcess/Model/mac/ARKitInlinePreviewModelPlayerMac.h	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebKit/WebProcess/Model/mac/ARKitInlinePreviewModelPlayerMac.h	2022-02-09 20:20:04 UTC (rev 289495)
@@ -51,6 +51,7 @@
 
     // WebCore::ModelPlayer overrides.
     void load(WebCore::Model&, WebCore::LayoutSize) override;
+    void sizeDidChange(WebCore::LayoutSize) override;
     PlatformLayer* layer() override;
     bool supportsMouseInteraction() override;
     bool supportsDragging() override;
@@ -61,6 +62,7 @@
     void createFile(WebCore::Model&);
     void clearFile();
 
+    WebCore::LayoutSize m_size;
     String m_filePath;
     RetainPtr<ASVInlinePreview> m_inlinePreview;
 };

Modified: trunk/Source/WebKit/WebProcess/Model/mac/ARKitInlinePreviewModelPlayerMac.mm (289494 => 289495)


--- trunk/Source/WebKit/WebProcess/Model/mac/ARKitInlinePreviewModelPlayerMac.mm	2022-02-09 19:48:43 UTC (rev 289494)
+++ trunk/Source/WebKit/WebProcess/Model/mac/ARKitInlinePreviewModelPlayerMac.mm	2022-02-09 20:20:04 UTC (rev 289495)
@@ -28,10 +28,13 @@
 
 #if ENABLE(ARKIT_INLINE_PREVIEW_MAC)
 
+#import "DrawingArea.h"
 #import "WebPage.h"
 #import "WebPageProxyMessages.h"
 #import <WebCore/Model.h>
+#import <pal/spi/cocoa/QuartzCoreSPI.h>
 #import <pal/spi/mac/SystemPreviewSPI.h>
+#import <wtf/MachSendRight.h>
 #import <wtf/SoftLinking.h>
 #import <wtf/UUID.h>
 
@@ -124,6 +127,8 @@
 
 void ARKitInlinePreviewModelPlayerMac::load(WebCore::Model& modelSource, WebCore::LayoutSize size)
 {
+    m_size = size;
+
     auto strongClient = client();
     if (!strongClient)
         return;
@@ -172,6 +177,39 @@
     strongPage->sendWithAsyncReply(Messages::WebPageProxy::ModelElementDidCreatePreview(URL::fileURLWithFileSystemPath(m_filePath), [m_inlinePreview uuid].UUIDString, size), WTFMove(completionHandler));
 }
 
+void ARKitInlinePreviewModelPlayerMac::sizeDidChange(WebCore::LayoutSize size)
+{
+    if (m_size == size)
+        return;
+
+    m_size = size;
+
+    RefPtr strongPage = page();
+    if (!strongPage)
+        return;
+
+    String uuid = [m_inlinePreview uuid].UUIDString;
+    CompletionHandler<void(Expected<MachSendRight, WebCore::ResourceError>)> completionHandler = [weakSelf = WeakPtr { *this }, strongPage, size] (Expected<MachSendRight, WebCore::ResourceError> result) mutable {
+        if (!result)
+            return;
+
+        RefPtr strongSelf = weakSelf.get();
+        if (!strongSelf)
+            return;
+
+        auto* drawingArea = strongPage->drawingArea();
+        if (!drawingArea)
+            return;
+
+        auto fenceSendRight = *result;
+        drawingArea->addFence(fenceSendRight);
+
+        [strongSelf->m_inlinePreview setFrameWithinFencedTransaction:CGRectMake(0, 0, size.width(), size.height())];
+    };
+
+    strongPage->sendWithAsyncReply(Messages::WebPageProxy::ModelElementSizeDidChange(uuid, size), WTFMove(completionHandler));
+}
+
 PlatformLayer* ARKitInlinePreviewModelPlayerMac::layer()
 {
     return [m_inlinePreview layer];
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to