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];