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
}