Title: [293031] trunk/Source/WebKit
Revision
293031
Author
grao...@webkit.org
Date
2022-04-19 12:24:15 -0700 (Tue, 19 Apr 2022)

Log Message

[model] ready promise does not work on iOS
https://bugs.webkit.org/show_bug.cgi?id=239395
rdar://91761135

Reviewed by Dean Jackson.

We actually never communicated success or failure when creating the ASVInlinePreview
in the UI process on iOS in WKModelView. We now provide a reference to the WebPageProxy
and a GraphicsLayer::PlatformLayerID when creating a WKModelView so that we can message
the Web process and have WebPage look for the matching ARKitInlinePreviewModelPlayerIOS
to notify of load success or failure via the ModelPlayerClient protocol which is already
implemented by HTMLModelElement.

* UIProcess/RemoteLayerTree/ios/RemoteLayerTreeHostIOS.mm:
(WebKit::RemoteLayerTreeHost::makeNode):
* UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::modelInlinePreviewDidLoad):
(WebKit::WebPageProxy::modelInlinePreviewDidFailToLoad):
* UIProcess/WebPageProxy.h:
* UIProcess/ios/WKModelView.h:
* UIProcess/ios/WKModelView.mm:
(-[WKModelView initWithModel:layerID:page:]):
(-[WKModelView createPreview]):
(-[WKModelView initWithModel:]): Deleted.
* WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.h:
* WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.mm:
(WebKit::ARKitInlinePreviewModelPlayerIOS::ARKitInlinePreviewModelPlayerIOS):
(WebKit::ARKitInlinePreviewModelPlayerIOS::~ARKitInlinePreviewModelPlayerIOS):
(WebKit::ARKitInlinePreviewModelPlayerIOS::modelPlayerForPageAndLayerID):
(WebKit::ARKitInlinePreviewModelPlayerIOS::pageLoadedModelInlinePreview):
(WebKit::ARKitInlinePreviewModelPlayerIOS::pageFailedToLoadModelInlinePreview):
* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::modelInlinePreviewDidLoad):
(WebKit::WebPage::modelInlinePreviewDidFailToLoad):
* WebProcess/WebPage/WebPage.h:
* WebProcess/WebPage/WebPage.messages.in:

Canonical link: https://commits.webkit.org/249770@main

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (293030 => 293031)


--- trunk/Source/WebKit/ChangeLog	2022-04-19 19:00:12 UTC (rev 293030)
+++ trunk/Source/WebKit/ChangeLog	2022-04-19 19:24:15 UTC (rev 293031)
@@ -1,3 +1,42 @@
+2022-04-15  Antoine Quint  <grao...@apple.com>
+
+        [model] ready promise does not work on iOS
+        https://bugs.webkit.org/show_bug.cgi?id=239395
+        rdar://91761135
+
+        Reviewed by Dean Jackson.
+
+        We actually never communicated success or failure when creating the ASVInlinePreview
+        in the UI process on iOS in WKModelView. We now provide a reference to the WebPageProxy
+        and a GraphicsLayer::PlatformLayerID when creating a WKModelView so that we can message
+        the Web process and have WebPage look for the matching ARKitInlinePreviewModelPlayerIOS
+        to notify of load success or failure via the ModelPlayerClient protocol which is already
+        implemented by HTMLModelElement.
+
+        * UIProcess/RemoteLayerTree/ios/RemoteLayerTreeHostIOS.mm:
+        (WebKit::RemoteLayerTreeHost::makeNode):
+        * UIProcess/WebPageProxy.cpp:
+        (WebKit::WebPageProxy::modelInlinePreviewDidLoad):
+        (WebKit::WebPageProxy::modelInlinePreviewDidFailToLoad):
+        * UIProcess/WebPageProxy.h:
+        * UIProcess/ios/WKModelView.h:
+        * UIProcess/ios/WKModelView.mm:
+        (-[WKModelView initWithModel:layerID:page:]):
+        (-[WKModelView createPreview]):
+        (-[WKModelView initWithModel:]): Deleted.
+        * WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.h:
+        * WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.mm:
+        (WebKit::ARKitInlinePreviewModelPlayerIOS::ARKitInlinePreviewModelPlayerIOS):
+        (WebKit::ARKitInlinePreviewModelPlayerIOS::~ARKitInlinePreviewModelPlayerIOS):
+        (WebKit::ARKitInlinePreviewModelPlayerIOS::modelPlayerForPageAndLayerID):
+        (WebKit::ARKitInlinePreviewModelPlayerIOS::pageLoadedModelInlinePreview):
+        (WebKit::ARKitInlinePreviewModelPlayerIOS::pageFailedToLoadModelInlinePreview):
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::modelInlinePreviewDidLoad):
+        (WebKit::WebPage::modelInlinePreviewDidFailToLoad):
+        * WebProcess/WebPage/WebPage.h:
+        * WebProcess/WebPage/WebPage.messages.in:
+
 2022-04-19  Wenson Hsieh  <wenson_hs...@apple.com>
 
         [iOS] Text selection flickers when inserting text using dictation

Modified: trunk/Source/WebKit/UIProcess/RemoteLayerTree/ios/RemoteLayerTreeHostIOS.mm (293030 => 293031)


--- trunk/Source/WebKit/UIProcess/RemoteLayerTree/ios/RemoteLayerTreeHostIOS.mm	2022-04-19 19:00:12 UTC (rev 293030)
+++ trunk/Source/WebKit/UIProcess/RemoteLayerTree/ios/RemoteLayerTreeHostIOS.mm	2022-04-19 19:24:15 UTC (rev 293031)
@@ -101,7 +101,7 @@
 #if ENABLE(SEPARATED_MODEL)
         return makeWithView(adoptNS([[WKSeparatedModelView alloc] initWithModel:*properties.model]));
 #elif ENABLE(ARKIT_INLINE_PREVIEW_IOS)
-        return makeWithView(adoptNS([[WKModelView alloc] initWithModel:*properties.model]));
+        return makeWithView(adoptNS([[WKModelView alloc] initWithModel:*properties.model layerID:properties.layerID page:m_drawingArea->page()]));
 #else
         return makeWithView(adoptNS([[WKCompositingView alloc] init]));
 #endif

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (293030 => 293031)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2022-04-19 19:00:12 UTC (rev 293030)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp	2022-04-19 19:24:15 UTC (rev 293031)
@@ -11184,6 +11184,17 @@
 {
     modelElementController()->setInteractionEnabledForModelElement(modelIdentifier, isInteractionEnabled);
 }
+
+void WebPageProxy::modelInlinePreviewDidLoad(WebCore::GraphicsLayer::PlatformLayerID layerID)
+{
+    send(Messages::WebPage::ModelInlinePreviewDidLoad(layerID));
+}
+
+void WebPageProxy::modelInlinePreviewDidFailToLoad(WebCore::GraphicsLayer::PlatformLayerID layerID, const WebCore::ResourceError& error)
+{
+    send(Messages::WebPage::ModelInlinePreviewDidFailToLoad(layerID, error));
+}
+
 #endif
 
 #if ENABLE(ARKIT_INLINE_PREVIEW_MAC)

Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.h (293030 => 293031)


--- trunk/Source/WebKit/UIProcess/WebPageProxy.h	2022-04-19 19:00:12 UTC (rev 293030)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.h	2022-04-19 19:24:15 UTC (rev 293031)
@@ -613,6 +613,8 @@
 #if ENABLE(ARKIT_INLINE_PREVIEW_IOS)
     void takeModelElementFullscreen(ModelIdentifier);
     void modelElementSetInteractionEnabled(ModelIdentifier, bool);
+    void modelInlinePreviewDidLoad(WebCore::GraphicsLayer::PlatformLayerID);
+    void modelInlinePreviewDidFailToLoad(WebCore::GraphicsLayer::PlatformLayerID, const WebCore::ResourceError&);
 #endif
 #if ENABLE(ARKIT_INLINE_PREVIEW_MAC)
     void modelElementCreateRemotePreview(const String&, const WebCore::FloatSize&, CompletionHandler<void(Expected<std::pair<String, uint32_t>, WebCore::ResourceError>)>&&);

Modified: trunk/Source/WebKit/UIProcess/ios/WKModelView.h (293030 => 293031)


--- trunk/Source/WebKit/UIProcess/ios/WKModelView.h	2022-04-19 19:00:12 UTC (rev 293030)
+++ trunk/Source/WebKit/UIProcess/ios/WKModelView.h	2022-04-19 19:24:15 UTC (rev 293031)
@@ -31,11 +31,15 @@
 class Model;
 }
 
+namespace WebKit {
+class WebPageProxy;
+}
+
 OBJC_CLASS ASVInlinePreview;
 
 @interface WKModelView : WKCompositingView <WKNativelyInteractible>
 
-- (instancetype)initWithModel:(WebCore::Model&)model NS_DESIGNATED_INITIALIZER;
+- (instancetype)initWithModel:(WebCore::Model&)model layerID:(WebCore::GraphicsLayer::PlatformLayerID)layerID page:(WebKit::WebPageProxy&)page NS_DESIGNATED_INITIALIZER;
 
 - (instancetype)initWithFrame:(CGRect)frame NS_UNAVAILABLE;
 - (instancetype)initWithCoder:(NSCoder *)coder NS_UNAVAILABLE;

Modified: trunk/Source/WebKit/UIProcess/ios/WKModelView.mm (293030 => 293031)


--- trunk/Source/WebKit/UIProcess/ios/WKModelView.mm	2022-04-19 19:00:12 UTC (rev 293030)
+++ trunk/Source/WebKit/UIProcess/ios/WKModelView.mm	2022-04-19 19:24:15 UTC (rev 293031)
@@ -31,6 +31,7 @@
 #import "Logging.h"
 #import "RemoteLayerTreeViews.h"
 #import "WKModelInteractionGestureRecognizer.h"
+#import "WebPageProxy.h"
 #import "WebsiteDataStore.h"
 #import <WebCore/Model.h>
 #import <pal/spi/cocoa/QuartzCoreSPI.h>
@@ -49,6 +50,8 @@
     RetainPtr<WKModelInteractionGestureRecognizer> _modelInteractionGestureRecognizer;
     String _filePath;
     CGRect _lastBounds;
+    WebCore::GraphicsLayer::PlatformLayerID _layerID;
+    WeakPtr<WebKit::WebPageProxy> _page;
 }
 
 - (ASVInlinePreview *)preview
@@ -66,7 +69,7 @@
     return nil;
 }
 
-- (instancetype)initWithModel:(WebCore::Model&)model
+- (instancetype)initWithModel:(WebCore::Model&)model layerID:(WebCore::GraphicsLayer::PlatformLayerID)layerID page:(WebKit::WebPageProxy&)page
 {
     _lastBounds = CGRectZero;
     self = [super initWithFrame:_lastBounds];
@@ -73,6 +76,9 @@
     if (!self)
         return nil;
 
+    _layerID = layerID;
+    _page = page;
+
     [self createFileForModel:model];
     [self updateBounds];
 
@@ -126,6 +132,7 @@
     [_preview setupRemoteConnectionWithCompletionHandler:^(NSError *contextError) {
         if (contextError) {
             LOG(ModelElement, "Unable to create remote connection, error: %@", [contextError localizedDescription]);
+            _page->modelInlinePreviewDidFailToLoad(_layerID, WebCore::ResourceError { contextError });
             return;
         }
 
@@ -132,10 +139,12 @@
         [_preview preparePreviewOfFileAtURL:url.get() completionHandler:^(NSError *loadError) {
             if (loadError) {
                 LOG(ModelElement, "Unable to load file, error: %@", [loadError localizedDescription]);
+                _page->modelInlinePreviewDidFailToLoad(_layerID, WebCore::ResourceError { loadError });
                 return;
             }
 
             LOG(ModelElement, "File loaded successfully.");
+            _page->modelInlinePreviewDidLoad(_layerID);
         }];
     }];
 

Modified: trunk/Source/WebKit/WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.h (293030 => 293031)


--- trunk/Source/WebKit/WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.h	2022-04-19 19:00:12 UTC (rev 293030)
+++ trunk/Source/WebKit/WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.h	2022-04-19 19:24:15 UTC (rev 293031)
@@ -38,11 +38,16 @@
     static Ref<ARKitInlinePreviewModelPlayerIOS> create(WebPage&, WebCore::ModelPlayerClient&);
     virtual ~ARKitInlinePreviewModelPlayerIOS();
 
+    static void pageLoadedModelInlinePreview(WebPage&, WebCore::GraphicsLayer::PlatformLayerID);
+    static void pageFailedToLoadModelInlinePreview(WebPage&, WebCore::GraphicsLayer::PlatformLayerID, const WebCore::ResourceError&);
+
 private:
     ARKitInlinePreviewModelPlayerIOS(WebPage&, WebCore::ModelPlayerClient&);
 
     std::optional<ModelIdentifier> modelIdentifier() override;
 
+    static ARKitInlinePreviewModelPlayerIOS* modelPlayerForPageAndLayerID(WebPage&, WebCore::GraphicsLayer::PlatformLayerID);
+
     // WebCore::ModelPlayer overrides.
     void enterFullscreen() override;
     void setInteractionEnabled(bool) override;

Modified: trunk/Source/WebKit/WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.mm (293030 => 293031)


--- trunk/Source/WebKit/WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.mm	2022-04-19 19:00:12 UTC (rev 293030)
+++ trunk/Source/WebKit/WebProcess/Model/ios/ARKitInlinePreviewModelPlayerIOS.mm	2022-04-19 19:24:15 UTC (rev 293031)
@@ -39,15 +39,53 @@
     return adoptRef(*new ARKitInlinePreviewModelPlayerIOS(page, client));
 }
 
+static HashSet<ARKitInlinePreviewModelPlayerIOS*>& instances()
+{
+    static NeverDestroyed<HashSet<ARKitInlinePreviewModelPlayerIOS*>> instances;
+    return instances;
+}
+
 ARKitInlinePreviewModelPlayerIOS::ARKitInlinePreviewModelPlayerIOS(WebPage& page, WebCore::ModelPlayerClient& client)
     : ARKitInlinePreviewModelPlayer(page, client)
 {
+    instances().add(this);
 }
 
 ARKitInlinePreviewModelPlayerIOS::~ARKitInlinePreviewModelPlayerIOS()
 {
+    instances().remove(this);
 }
 
+ARKitInlinePreviewModelPlayerIOS* ARKitInlinePreviewModelPlayerIOS::modelPlayerForPageAndLayerID(WebPage& page, GraphicsLayer::PlatformLayerID layerID)
+{
+    for (auto* modelPlayer : instances()) {
+        if (!modelPlayer || !modelPlayer->client())
+            continue;
+
+        if (&page != modelPlayer->page())
+            continue;
+
+        if (modelPlayer->client()->platformLayerID() != layerID)
+            continue;
+
+        return modelPlayer;
+    }
+
+    return nullptr;
+}
+
+void ARKitInlinePreviewModelPlayerIOS::pageLoadedModelInlinePreview(WebPage& page, GraphicsLayer::PlatformLayerID layerID)
+{
+    if (auto* modelPlayer = modelPlayerForPageAndLayerID(page, layerID))
+        modelPlayer->client()->didFinishLoading(*modelPlayer);
+}
+
+void ARKitInlinePreviewModelPlayerIOS::pageFailedToLoadModelInlinePreview(WebPage& page, WebCore::GraphicsLayer::PlatformLayerID layerID, const WebCore::ResourceError& error)
+{
+    if (auto* modelPlayer = modelPlayerForPageAndLayerID(page, layerID))
+        modelPlayer->client()->didFailLoading(*modelPlayer, error);
+}
+
 std::optional<ModelIdentifier> ARKitInlinePreviewModelPlayerIOS::modelIdentifier()
 {
     if (!client())

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (293030 => 293031)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2022-04-19 19:00:12 UTC (rev 293030)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2022-04-19 19:24:15 UTC (rev 293031)
@@ -384,6 +384,10 @@
 #include <WebCore/NavigatorMediaSession.h>
 #endif
 
+#if ENABLE(ARKIT_INLINE_PREVIEW_IOS)
+#include "ARKitInlinePreviewModelPlayerIOS.h"
+#endif
+
 #if PLATFORM(IOS)
 #include "WebPreferencesDefaultValuesIOS.h"
 #endif
@@ -8090,6 +8094,18 @@
     send(Messages::WebPageProxy::CancelVideoExtractionInElementFullScreen());
 }
 
+#if ENABLE(ARKIT_INLINE_PREVIEW_IOS)
+void WebPage::modelInlinePreviewDidLoad(WebCore::GraphicsLayer::PlatformLayerID layerID)
+{
+    ARKitInlinePreviewModelPlayerIOS::pageLoadedModelInlinePreview(*this, layerID);
+}
+
+void WebPage::modelInlinePreviewDidFailToLoad(WebCore::GraphicsLayer::PlatformLayerID layerID, const WebCore::ResourceError& error)
+{
+    ARKitInlinePreviewModelPlayerIOS::pageFailedToLoadModelInlinePreview(*this, layerID, error);
+}
+#endif
+
 } // namespace WebKit
 
 #undef WEBPAGE_RELEASE_LOG

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (293030 => 293031)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2022-04-19 19:00:12 UTC (rev 293030)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2022-04-19 19:24:15 UTC (rev 293031)
@@ -1524,6 +1524,11 @@
     bool useSceneKitForModel() const { return m_useSceneKitForModel; };
 #endif
 
+#if ENABLE(ARKIT_INLINE_PREVIEW_IOS)
+    void modelInlinePreviewDidLoad(WebCore::GraphicsLayer::PlatformLayerID);
+    void modelInlinePreviewDidFailToLoad(WebCore::GraphicsLayer::PlatformLayerID, const WebCore::ResourceError&);
+#endif
+
     void extractVideoInElementFullScreen(const WebCore::HTMLVideoElement&);
     void cancelVideoExtractionInElementFullScreen();
 

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in (293030 => 293031)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2022-04-19 19:00:12 UTC (rev 293030)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2022-04-19 19:24:15 UTC (rev 293031)
@@ -678,4 +678,9 @@
     InteractionRegions(WebCore::FloatRect rectInContentCoordinates) -> (Vector<WebCore::InteractionRegion> regions)
 
     NavigateServiceWorkerClient(WebCore::ScriptExecutionContextIdentifier documentIdentifier, URL url) -> (bool result)
+
+#if ENABLE(ARKIT_INLINE_PREVIEW_IOS)
+    ModelInlinePreviewDidLoad(WebCore::GraphicsLayer::PlatformLayerID layerID)
+    ModelInlinePreviewDidFailToLoad(WebCore::GraphicsLayer::PlatformLayerID layerID, WebCore::ResourceError error)
+#endif
 }
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to