Title: [285846] trunk/Source
Revision
285846
Author
[email protected]
Date
2021-11-15 18:11:27 -0800 (Mon, 15 Nov 2021)

Log Message

Add another <model> backend backed by SceneKit to prove out ModelPlayer infrastructure a bit more
https://bugs.webkit.org/show_bug.cgi?id=233112

Reviewed by Dean Jackson.

Source/WebCore:

Adds basic SceneKit based ModelPlayer implementation. Like the ARKit player, this one
also requires writing the USD file to a temporary file as SceneKit does not support
loading USD files from NSData, and therefore is not actually something that can be used
for production yet.

The player is backed by a SceneKitModel class, which is created via a SceneKitModelLoader.
Both SceneKitModel and SceneKitModelLoader are abstract so that different types of models
can be supported. Currently, there is only a USD loader implemented for parity with the
ARKit based implementation.

* SourcesCocoa.txt:
* WebCore.xcodeproj/project.pbxproj:
Add new files.

* Modules/model-element/scenekit: Added.
* Modules/model-element/scenekit/SceneKitModel.h: Added.
* Modules/model-element/scenekit/SceneKitModel.mm: Added.
Abstract base class for loader specific implementations.

* Modules/model-element/scenekit/SceneKitModelLoader.h: Added.
* Modules/model-element/scenekit/SceneKitModelLoader.mm: Added.
(WebCore::loadSceneKitModel):
Entry point where different loaders can be referenced for different
file types. As noted above, currenly only a USD loader is implementend.

* Modules/model-element/scenekit/SceneKitModelLoaderClient.h: Added.
* Modules/model-element/scenekit/SceneKitModelLoaderClient.mm: Added.
Interface to pass state back to whatever requested the load.

* Modules/model-element/scenekit/SceneKitModelLoaderUSD.h: Added.
* Modules/model-element/scenekit/SceneKitModelLoaderUSD.mm: Added.
Loads USD file into a SCNScene which the client can attach to a
renderer (e.g. the SCNMetalLayer).

* Modules/model-element/scenekit/SceneKitModelPlayer.h: Added.
* Modules/model-element/scenekit/SceneKitModelPlayer.mm: Added.
The SceneKitModelPlayer uses loadSceneKitModel() to load and build
a SCNScene asynchonously that it then attaches to its SCNMetalLayer.

Source/WebCore/PAL:

* PAL.xcodeproj/project.pbxproj:
* pal/spi/cocoa/SceneKitSPI.h: Added.
Adds forward declaration of SCNMetalLayer SPI so SceneKit can be used
without an NSView/UIView.

Source/WebKit:

Add support for instantiating the new SceneKit backed ModelPlayer.

If both ARKit based ModelPlayer and SceneKit based ModelPlayer are enabled,
the ARKit one wins.

* WebProcess/Model/WebModelPlayerProvider.cpp:
(WebKit::WebModelPlayerProvider::createModelPlayer):
Add support for creating a SceneKit based ModelPlayer and add checks
for whether the backend is enabled.

* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::updatePreferences):
* WebProcess/WebPage/WebPage.h:
(WebKit::WebPage::useARKitForModel const):
(WebKit::WebPage::useSceneKitForModel const):
Add bits to store which <model> backends are enabled.

Source/WTF:

* Scripts/Preferences/WebPreferencesInternal.yaml:
Add some internal settings to enable/disable the ARKit and SceneKit based
<model> backends.

* wtf/PlatformHave.h:
Add HAVE macro for SceneKit. Only enabled for macOS at the moment, but could
probably be enabled for iOS if it is useful.

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WTF/ChangeLog (285845 => 285846)


--- trunk/Source/WTF/ChangeLog	2021-11-16 01:42:20 UTC (rev 285845)
+++ trunk/Source/WTF/ChangeLog	2021-11-16 02:11:27 UTC (rev 285846)
@@ -1,3 +1,18 @@
+2021-11-15  Sam Weinig  <[email protected]>
+
+        Add another <model> backend backed by SceneKit to prove out ModelPlayer infrastructure a bit more
+        https://bugs.webkit.org/show_bug.cgi?id=233112
+
+        Reviewed by Dean Jackson.
+
+        * Scripts/Preferences/WebPreferencesInternal.yaml:
+        Add some internal settings to enable/disable the ARKit and SceneKit based
+        <model> backends.
+
+        * wtf/PlatformHave.h:
+        Add HAVE macro for SceneKit. Only enabled for macOS at the moment, but could
+        probably be enabled for iOS if it is useful.
+
 2021-11-15  Eric Liang  <[email protected]>
 
         _AXSCopyPathForAccessibilityBundle is going to be deprecated.

Modified: trunk/Source/WTF/Scripts/Preferences/WebPreferencesInternal.yaml (285845 => 285846)


--- trunk/Source/WTF/Scripts/Preferences/WebPreferencesInternal.yaml	2021-11-16 01:42:20 UTC (rev 285845)
+++ trunk/Source/WTF/Scripts/Preferences/WebPreferencesInternal.yaml	2021-11-16 02:11:27 UTC (rev 285846)
@@ -797,6 +797,17 @@
     WebKit:
       default: true
 
+UseARKitForModel:
+  type: bool
+  humanReadableName: "Use ARKit for <model>"
+  humanReadableDescription: "Use ARKit for <model>"
+  webcoreBinding: none
+  exposed: [ WebKit ]
+  condition: ENABLE(ARKIT_INLINE_PREVIEW)
+  defaultValue:
+    WebKit:
+      default: true
+
 UseCGDisplayListsForDOMRendering:
   type: bool
   humanReadableName: "CG Display Lists: DOM Rendering"
@@ -819,6 +830,17 @@
     WebKit:
       default: defaultUseGPUProcessForDOMRenderingEnabled()
 
+UseSceneKitForModel:
+  type: bool
+  humanReadableName: "Use SceneKit for <model>"
+  humanReadableDescription: "Use SceneKit for <model>"
+  webcoreBinding: none
+  exposed: [ WebKit ]
+  condition: HAVE(SCENEKIT)
+  defaultValue:
+    WebKit:
+      default: false
+
 # FIXME: Remove once <rdar://73830961> has been fixed
 UseiTunesAVOutputContext:
   type: bool

Modified: trunk/Source/WTF/wtf/PlatformHave.h (285845 => 285846)


--- trunk/Source/WTF/wtf/PlatformHave.h	2021-11-16 01:42:20 UTC (rev 285845)
+++ trunk/Source/WTF/wtf/PlatformHave.h	2021-11-16 02:11:27 UTC (rev 285846)
@@ -1090,3 +1090,7 @@
     || (PLATFORM(APPLETV) && __TV_OS_VERSION_MAX_ALLOWED >= 160000))
 #define HAVE_NSTEXTLIST_MARKER_FORMATS 1
 #endif
+
+#if PLATFORM(MAC)
+#define HAVE_SCENEKIT 1
+#endif

Modified: trunk/Source/WebCore/ChangeLog (285845 => 285846)


--- trunk/Source/WebCore/ChangeLog	2021-11-16 01:42:20 UTC (rev 285845)
+++ trunk/Source/WebCore/ChangeLog	2021-11-16 02:11:27 UTC (rev 285846)
@@ -1,3 +1,49 @@
+2021-11-15  Sam Weinig  <[email protected]>
+
+        Add another <model> backend backed by SceneKit to prove out ModelPlayer infrastructure a bit more
+        https://bugs.webkit.org/show_bug.cgi?id=233112
+
+        Reviewed by Dean Jackson.
+
+        Adds basic SceneKit based ModelPlayer implementation. Like the ARKit player, this one
+        also requires writing the USD file to a temporary file as SceneKit does not support
+        loading USD files from NSData, and therefore is not actually something that can be used
+        for production yet.
+
+        The player is backed by a SceneKitModel class, which is created via a SceneKitModelLoader.
+        Both SceneKitModel and SceneKitModelLoader are abstract so that different types of models
+        can be supported. Currently, there is only a USD loader implemented for parity with the
+        ARKit based implementation.
+
+        * SourcesCocoa.txt:
+        * WebCore.xcodeproj/project.pbxproj:
+        Add new files.
+
+        * Modules/model-element/scenekit: Added.
+        * Modules/model-element/scenekit/SceneKitModel.h: Added.
+        * Modules/model-element/scenekit/SceneKitModel.mm: Added.
+        Abstract base class for loader specific implementations.
+        
+        * Modules/model-element/scenekit/SceneKitModelLoader.h: Added.
+        * Modules/model-element/scenekit/SceneKitModelLoader.mm: Added.
+        (WebCore::loadSceneKitModel):
+        Entry point where different loaders can be referenced for different
+        file types. As noted above, currenly only a USD loader is implementend.
+
+        * Modules/model-element/scenekit/SceneKitModelLoaderClient.h: Added.
+        * Modules/model-element/scenekit/SceneKitModelLoaderClient.mm: Added.
+        Interface to pass state back to whatever requested the load.
+
+        * Modules/model-element/scenekit/SceneKitModelLoaderUSD.h: Added.
+        * Modules/model-element/scenekit/SceneKitModelLoaderUSD.mm: Added.
+        Loads USD file into a SCNScene which the client can attach to a 
+        renderer (e.g. the SCNMetalLayer).
+
+        * Modules/model-element/scenekit/SceneKitModelPlayer.h: Added.
+        * Modules/model-element/scenekit/SceneKitModelPlayer.mm: Added.
+        The SceneKitModelPlayer uses loadSceneKitModel() to load and build
+        a SCNScene asynchonously that it then attaches to its SCNMetalLayer. 
+
 2021-11-15  Takashi Komori  <[email protected]>
 
         [Curl] Security information sometimes do not appear in inspector network tab

Modified: trunk/Source/WebCore/Configurations/WebCore.xcconfig (285845 => 285846)


--- trunk/Source/WebCore/Configurations/WebCore.xcconfig	2021-11-16 01:42:20 UTC (rev 285845)
+++ trunk/Source/WebCore/Configurations/WebCore.xcconfig	2021-11-16 02:11:27 UTC (rev 285846)
@@ -126,8 +126,11 @@
 WK_URL_FORMATTING_LDFLAGS = $(WK_URL_FORMATTING_LDFLAGS_$(WK_HAVE_URL_FORMATTING));
 WK_URL_FORMATTING_LDFLAGS_YES = -framework URLFormatting;
 
+WK_SCENEKIT_LDFLAGS = $(WK_SCENEKIT_LDFLAGS_$(WK_PLATFORM_NAME));
+WK_SCENEKIT_LDFLAGS_macosx = -weak_framework SceneKit;
+
 // FIXME: Reduce the number of allowable_clients <rdar://problem/31823969>
-OTHER_LDFLAGS = $(inherited) $(WK_RELOCATABLE_FRAMEWORK_LDFLAGS) -lsqlite3 -lobjc -allowable_client WebCoreTestSupport -allowable_client WebKitLegacy -force_load $(BUILT_PRODUCTS_DIR)/libPAL.a -framework CFNetwork -framework CoreAudio -framework CoreGraphics -framework CoreText -framework Foundation -framework IOSurface -framework ImageIO -framework Metal $(OTHER_LDFLAGS_PLATFORM_$(WK_COCOA_TOUCH)) $(OTHER_LDFLAGS_PLATFORM_$(WK_PLATFORM_NAME)) $(WK_ANGLE_LDFLAGS) $(WK_APPKIT_LDFLAGS) $(WK_APPSUPPORT_LDFLAGS) $(WK_AUDIO_UNIT_LDFLAGS) $(WK_CARBON_LDFLAGS) $(WK_CORE_UI_LDFLAGS) $(WK_DATA_DETECTORS_CORE_LDFLAGS) $(WK_GRAPHICS_SERVICES_LDFLAGS) $(WK_IOSURFACE_ACCELERATOR_LDFLAGS) $(WK_LIBWEBRTC_LDFLAGS) $(WK_MOBILE_CORE_SERVICES_LDFLAGS) $(WK_MOBILE_GESTALT_LDFLAGS) $(WK_NETWORK_EXTENSION_LD_FLAGS) $(WK_SYSTEM_CONFIGURATION_LDFLAGS) $(WK_CORE_IMAGE_LDFLAGS) $(WK_URL_FORMATTING_LDFLAGS);
+OTHER_LDFLAGS = $(inherited) $(WK_RELOCATABLE_FRAMEWORK_LDFLAGS) -lsqlite3 -lobjc -allowable_client WebCoreTestSupport -allowable_client WebKitLegacy -force_load $(BUILT_PRODUCTS_DIR)/libPAL.a -framework CFNetwork -framework CoreAudio -framework CoreGraphics -framework CoreText -framework Foundation -framework IOSurface -framework ImageIO -framework Metal $(OTHER_LDFLAGS_PLATFORM_$(WK_COCOA_TOUCH)) $(OTHER_LDFLAGS_PLATFORM_$(WK_PLATFORM_NAME)) $(WK_ANGLE_LDFLAGS) $(WK_APPKIT_LDFLAGS) $(WK_APPSUPPORT_LDFLAGS) $(WK_AUDIO_UNIT_LDFLAGS) $(WK_CARBON_LDFLAGS) $(WK_CORE_UI_LDFLAGS) $(WK_DATA_DETECTORS_CORE_LDFLAGS) $(WK_GRAPHICS_SERVICES_LDFLAGS) $(WK_IOSURFACE_ACCELERATOR_LDFLAGS) $(WK_LIBWEBRTC_LDFLAGS) $(WK_MOBILE_CORE_SERVICES_LDFLAGS) $(WK_MOBILE_GESTALT_LDFLAGS) $(WK_NETWORK_EXTENSION_LD_FLAGS) $(WK_SYSTEM_CONFIGURATION_LDFLAGS) $(WK_CORE_IMAGE_LDFLAGS) $(WK_URL_FORMATTING_LDFLAGS) $(WK_SCENEKIT_LDFLAGS);
 
 OTHER_LDFLAGS_PLATFORM_cocoatouch = -allowable_client WebKit -allowable_client iTunesU -allowable_client Casablanca -allowable_client Remote -allowable_client TVBooks -allowable_client DumpRenderTree -allowable_client WebKitTestRunner -allowable_client TestWebKitAPI;
 OTHER_LDFLAGS_PLATFORM_macosx = -sub_library libobjc -umbrella WebKit;

Added: trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModel.h (0 => 285846)


--- trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModel.h	                        (rev 0)
+++ trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModel.h	2021-11-16 02:11:27 UTC (rev 285846)
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if HAVE(SCENEKIT)
+
+#import <Foundation/Foundation.h>
+#import <wtf/Compiler.h>
+#import <wtf/RefCounted.h>
+
+OBJC_CLASS SCNScene;
+
+namespace WebCore {
+
+class Model;
+
+class SceneKitModel : public RefCounted<SceneKitModel> {
+public:
+    virtual ~SceneKitModel();
+
+    virtual const Model& modelSource() const = 0;
+
+    virtual SCNScene *defaultScene() const = 0;
+    virtual NSArray<SCNScene *> *scenes() const = 0;
+};
+
+}
+
+#endif

Added: trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModel.mm (0 => 285846)


--- trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModel.mm	                        (rev 0)
+++ trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModel.mm	2021-11-16 02:11:27 UTC (rev 285846)
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+
+#if HAVE(SCENEKIT)
+
+#import "SceneKitModel.h"
+
+namespace WebCore {
+
+// Defining trivial virtual destructor in implementation to pin vtable.
+SceneKitModel::~SceneKitModel() = default;
+
+}
+
+#endif

Added: trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelLoader.h (0 => 285846)


--- trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelLoader.h	                        (rev 0)
+++ trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelLoader.h	2021-11-16 02:11:27 UTC (rev 285846)
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if HAVE(SCENEKIT)
+
+#import <wtf/Forward.h>
+#import <wtf/RefCounted.h>
+
+namespace WebCore {
+
+class Model;
+class SceneKitModelLoaderClient;
+
+class SceneKitModelLoader : public RefCounted<SceneKitModelLoader> {
+public:
+    virtual ~SceneKitModelLoader();
+
+    virtual void cancel() = 0;
+};
+
+Ref<SceneKitModelLoader> loadSceneKitModel(Model&, SceneKitModelLoaderClient&);
+
+}
+
+#endif

Added: trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelLoader.mm (0 => 285846)


--- trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelLoader.mm	                        (rev 0)
+++ trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelLoader.mm	2021-11-16 02:11:27 UTC (rev 285846)
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+
+#if HAVE(SCENEKIT)
+
+#import "SceneKitModelLoader.h"
+
+#import "MIMETypeRegistry.h"
+#import "Model.h"
+#import "ResourceError.h"
+#import "SceneKitModelLoaderClient.h"
+#import "SceneKitModelLoaderUSD.h"
+
+namespace WebCore {
+
+// Defining trivial virtual destructor in implementation to pin vtable.
+SceneKitModelLoader::~SceneKitModelLoader() = default;
+
+// No-op loader used for the cases where no loading actually happens (such as unsupported MIME type).
+class SceneKitModelLoaderFailure final : public SceneKitModelLoader {
+public:
+    static Ref<SceneKitModelLoaderFailure> create(ResourceError error)
+    {
+        return adoptRef(*new SceneKitModelLoaderFailure(WTFMove(error)));
+    }
+
+    virtual ~SceneKitModelLoaderFailure() = default;
+    virtual void cancel() override { }
+
+    const ResourceError& error() const
+    {
+        return m_error;
+    }
+
+private:
+    SceneKitModelLoaderFailure(ResourceError error)
+        : m_error { WTFMove(error) }
+    {
+    }
+
+    ResourceError m_error;
+};
+
+
+}
+
+namespace WebCore {
+
+static String mimeTypeUtilizingFileExtensionOverridingForLocalFiles(const Model& modelSource)
+{
+    if (modelSource.url().isLocalFile() && (modelSource.mimeType().isEmpty() || modelSource.mimeType() == WebCore::defaultMIMEType())) {
+        // FIXME: Getting the file extension from a URL seems like it should be in shared code.
+        auto lastPathComponent = modelSource.url().lastPathComponent();
+        auto position = lastPathComponent.reverseFind('.');
+        if (position != WTF::notFound) {
+            auto extension = lastPathComponent.substring(position + 1);
+
+            return MIMETypeRegistry::mediaMIMETypeForExtension(extension.toString());
+        }
+    }
+
+    return modelSource.mimeType();
+}
+
+enum class ModelType {
+    USD,
+    Unknown
+};
+
+static ModelType modelType(Model& modelSource)
+{
+    auto mimeType = mimeTypeUtilizingFileExtensionOverridingForLocalFiles(modelSource);
+
+    if (WebCore::MIMETypeRegistry::isUSDMIMEType(mimeType))
+        return ModelType::USD;
+
+    return ModelType::Unknown;
+}
+
+Ref<SceneKitModelLoader> loadSceneKitModel(Model& modelSource, SceneKitModelLoaderClient& client)
+{
+    switch (modelType(modelSource)) {
+    case ModelType::USD:
+        return loadSceneKitModelUsingUSDLoader(modelSource, client);
+    case ModelType::Unknown:
+        break;
+    }
+
+    auto loader = SceneKitModelLoaderFailure::create([NSError errorWithDomain:@"SceneKitModelLoader" code:-1 userInfo:@{
+        NSLocalizedDescriptionKey: [NSString stringWithFormat:@"Unsupported MIME type: %s.", modelSource.mimeType().utf8().data()],
+        NSURLErrorFailingURLErrorKey: (NSURL *)modelSource.url()
+    }]);
+
+    dispatch_async(dispatch_get_main_queue(), [weakClient = WeakPtr { client }, loader] {
+        auto strongClient = weakClient.get();
+        if (!strongClient)
+            return;
+
+        strongClient->didFailLoading(loader.get(), loader->error());
+    });
+
+    return loader;
+}
+
+}
+
+#endif

Added: trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelLoaderClient.h (0 => 285846)


--- trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelLoaderClient.h	                        (rev 0)
+++ trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelLoaderClient.h	2021-11-16 02:11:27 UTC (rev 285846)
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if HAVE(SCENEKIT)
+
+#import <wtf/Forward.h>
+#import <wtf/WeakPtr.h>
+
+namespace WebCore {
+
+class ResourceError;
+class SceneKitModel;
+class SceneKitModelLoader;
+
+class SceneKitModelLoaderClient : public CanMakeWeakPtr<SceneKitModelLoaderClient> {
+public:
+    virtual ~SceneKitModelLoaderClient();
+
+    virtual void didFinishLoading(SceneKitModelLoader&, Ref<SceneKitModel>) = 0;
+    virtual void didFailLoading(SceneKitModelLoader&, const ResourceError&) = 0;
+};
+
+}
+
+#endif

Added: trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelLoaderClient.mm (0 => 285846)


--- trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelLoaderClient.mm	                        (rev 0)
+++ trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelLoaderClient.mm	2021-11-16 02:11:27 UTC (rev 285846)
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+
+#if HAVE(SCENEKIT)
+
+#import "SceneKitModelLoaderClient.h"
+
+namespace WebCore {
+
+// Defining trivial virtual destructor in implementation to pin vtable.
+SceneKitModelLoaderClient::~SceneKitModelLoaderClient() = default;
+
+}
+
+#endif

Added: trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelLoaderUSD.h (0 => 285846)


--- trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelLoaderUSD.h	                        (rev 0)
+++ trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelLoaderUSD.h	2021-11-16 02:11:27 UTC (rev 285846)
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if HAVE(SCENEKIT)
+
+#import <wtf/Forward.h>
+
+namespace WebCore {
+
+class Model;
+class SceneKitModelLoader;
+class SceneKitModelLoaderClient;
+
+Ref<SceneKitModelLoader> loadSceneKitModelUsingUSDLoader(Model&, SceneKitModelLoaderClient&);
+
+}
+
+#endif

Added: trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelLoaderUSD.mm (0 => 285846)


--- trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelLoaderUSD.mm	                        (rev 0)
+++ trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelLoaderUSD.mm	2021-11-16 02:11:27 UTC (rev 285846)
@@ -0,0 +1,150 @@
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+
+#if HAVE(SCENEKIT)
+
+#import "SceneKitModelLoaderUSD.h"
+
+#import "Model.h"
+#import "SceneKitModel.h"
+#import "SceneKitModelLoader.h"
+#import "SceneKitModelLoaderClient.h"
+#import <pal/spi/cocoa/SceneKitSPI.h>
+
+namespace WebCore {
+
+class SceneKitModelLoaderUSD final : public SceneKitModelLoader {
+public:
+    static Ref<SceneKitModelLoaderUSD> create()
+    {
+        return adoptRef(*new SceneKitModelLoaderUSD());
+    }
+
+    virtual ~SceneKitModelLoaderUSD() = default;
+    virtual void cancel() final { m_canceled = true; }
+
+    bool isCanceled() const { return m_canceled; }
+
+private:
+    SceneKitModelLoaderUSD()
+        : m_canceled { false }
+    {
+    }
+
+    bool m_canceled;
+};
+
+class SceneKitModelUSD final : public SceneKitModel {
+public:
+    static Ref<SceneKitModelUSD> create(Ref<Model> modelSource, RetainPtr<SCNScene> scene)
+    {
+        return adoptRef(*new SceneKitModelUSD(WTFMove(modelSource), WTFMove(scene)));
+    }
+
+    virtual ~SceneKitModelUSD() = default;
+
+private:
+    SceneKitModelUSD(Ref<Model> modelSource, RetainPtr<SCNScene> scene)
+        : m_modelSource { WTFMove(modelSource) }
+        , m_scene { WTFMove(scene) }
+    {
+    }
+
+    // SceneKitModel overrides.
+    virtual const Model& modelSource() const override
+    {
+        return m_modelSource.get();
+    }
+
+    virtual SCNScene *defaultScene() const override
+    {
+        return m_scene.get();
+    }
+
+    virtual NSArray<SCNScene *> *scenes() const override
+    {
+        return @[ m_scene.get() ];
+    }
+
+    Ref<Model> m_modelSource;
+    RetainPtr<SCNScene> m_scene;
+};
+
+static RetainPtr<NSURL> writeToTemporaryFile(WebCore::Model& modelSource)
+{
+    // FIXME: DO NOT SHIP!!! We must not write these to disk; we need SceneKit
+    // to support reading USD files from its [SCNSceneSource initWithData:options:],
+    // initializer but currently that does not work.
+
+    FileSystem::PlatformFileHandle fileHandle;
+    auto filePath = FileSystem::openTemporaryFile("ModelFile", fileHandle, ".usdz");
+    ASSERT(FileSystem::isHandleValid(fileHandle));
+
+    size_t byteCount = FileSystem::writeToFile(fileHandle, modelSource.data()->data(), modelSource.data()->size());
+    ASSERT_UNUSED(byteCount, byteCount == modelSource.data()->size());
+    FileSystem::closeFile(fileHandle);
+
+    return adoptNS([[NSURL alloc] initFileURLWithPath:filePath]);
+}
+
+Ref<SceneKitModelLoader> loadSceneKitModelUsingUSDLoader(Model& modelSource, SceneKitModelLoaderClient& client)
+{
+    auto loader = SceneKitModelLoaderUSD::create();
+    
+    dispatch_async(dispatch_get_main_queue(), [weakClient = WeakPtr { client }, loader, modelSource = Ref { modelSource }] () mutable {
+        // If the client has gone away, there is no reason to do any work.
+        auto strongClient = weakClient.get();
+        if (!strongClient)
+            return;
+
+        // If the caller has canceled the load, there is no reason to do any work.
+        if (loader->isCanceled())
+            return;
+
+        auto url = ""
+
+        auto source = adoptNS([[SCNSceneSource alloc] initWithURL:url.get() options:nil]);
+        NSError *error = nil;
+        RetainPtr scene = [source sceneWithOptions:@{ } error:&error];
+
+        if (error) {
+            strongClient->didFailLoading(loader.get(), ResourceError(error));
+            [error release];
+            return;
+        }
+
+        ASSERT(scene);
+
+        strongClient->didFinishLoading(loader.get(), SceneKitModelUSD::create(WTFMove(modelSource), WTFMove(scene)));
+    });
+
+    return loader;
+}
+
+}
+
+#endif

Added: trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelPlayer.h (0 => 285846)


--- trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelPlayer.h	                        (rev 0)
+++ trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelPlayer.h	2021-11-16 02:11:27 UTC (rev 285846)
@@ -0,0 +1,75 @@
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if HAVE(SCENEKIT)
+
+#include "Model.h"
+#include "ModelPlayer.h"
+#include "ModelPlayerClient.h"
+#include "SceneKitModelLoaderClient.h"
+#include <wtf/RetainPtr.h>
+#include <wtf/URL.h>
+#include <wtf/WeakPtr.h>
+#include <wtf/Forward.h>
+
+OBJC_CLASS SCNMetalLayer;
+
+namespace WebCore {
+
+class ModelPlayerClient;
+class SceneKitModel;
+class SceneKitModelLoader;
+
+class WEBCORE_EXPORT SceneKitModelPlayer final : public ModelPlayer, public SceneKitModelLoaderClient {
+public:
+    static Ref<SceneKitModelPlayer> create(ModelPlayerClient&);
+    virtual ~SceneKitModelPlayer();
+
+private:
+    SceneKitModelPlayer(ModelPlayerClient&);
+
+    void updateScene();
+
+    // ModelPlayer overrides.
+    virtual void load(Model&, LayoutSize) override;
+    virtual CALayer *layer() override;
+
+    // SceneKitModelLoaderClient overrides.
+    virtual void didFinishLoading(SceneKitModelLoader&, Ref<SceneKitModel>) override;
+    virtual void didFailLoading(SceneKitModelLoader&, const ResourceError&) override;
+
+    WeakPtr<ModelPlayerClient> m_client;
+
+    RefPtr<SceneKitModelLoader> m_loader;
+    RefPtr<SceneKitModel> m_model;
+
+    RetainPtr<SCNMetalLayer> m_layer;
+};
+
+}
+
+#endif

Added: trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelPlayer.mm (0 => 285846)


--- trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelPlayer.mm	                        (rev 0)
+++ trunk/Source/WebCore/Modules/model-element/scenekit/SceneKitModelPlayer.mm	2021-11-16 02:11:27 UTC (rev 285846)
@@ -0,0 +1,111 @@
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+
+#if HAVE(SCENEKIT)
+
+#import "SceneKitModelPlayer.h"
+
+#import "SceneKitModel.h"
+#import "SceneKitModelLoader.h"
+#import <pal/spi/cocoa/SceneKitSPI.h>
+
+namespace WebCore {
+
+Ref<SceneKitModelPlayer> SceneKitModelPlayer::create(ModelPlayerClient& client)
+{
+    return adoptRef(*new SceneKitModelPlayer(client));
+}
+
+SceneKitModelPlayer::SceneKitModelPlayer(ModelPlayerClient& client)
+    : m_client { client }
+    , m_layer { adoptNS([[SCNMetalLayer alloc] init]) }
+{
+    m_layer.get().autoenablesDefaultLighting = YES;
+
+    // FIXME: This should be done by the caller.
+    m_layer.get().contentsScale = 2.0;
+}
+
+SceneKitModelPlayer::~SceneKitModelPlayer()
+{
+    // If there is an outstanding load, as indicated by a non-null m_loader, cancel it.
+    if (m_loader)
+        m_loader->cancel();
+}
+
+// MARK: - ModelPlayer overrides.
+
+void SceneKitModelPlayer::load(Model& modelSource, LayoutSize)
+{
+    if (m_loader)
+        m_loader->cancel();
+
+    m_loader = loadSceneKitModel(modelSource, *this);
+}
+
+PlatformLayer* SceneKitModelPlayer::layer()
+{
+    return m_layer.get();
+}
+
+// MARK: - SceneKitModelLoaderClient overrides.
+
+void SceneKitModelPlayer::didFinishLoading(SceneKitModelLoader& loader, Ref<SceneKitModel> model)
+{
+    dispatch_assert_queue(dispatch_get_main_queue());
+    ASSERT_UNUSED(loader, &loader == m_loader.get());
+
+    m_loader = nullptr;
+    m_model = WTFMove(model);
+
+    updateScene();
+
+    if (m_client)
+        m_client->didFinishLoading(*this);
+}
+
+void SceneKitModelPlayer::didFailLoading(SceneKitModelLoader& loader, const ResourceError& error)
+{
+    dispatch_assert_queue(dispatch_get_main_queue());
+    ASSERT_UNUSED(loader, &loader == m_loader.get());
+
+    m_loader = nullptr;
+
+    if (!m_client)
+        m_client->didFailLoading(*this, error);
+}
+
+void SceneKitModelPlayer::updateScene()
+{
+    if (m_layer.get().scene == m_model->defaultScene())
+        return;
+    m_layer.get().scene = m_model->defaultScene();
+}
+
+}
+
+#endif

Modified: trunk/Source/WebCore/PAL/ChangeLog (285845 => 285846)


--- trunk/Source/WebCore/PAL/ChangeLog	2021-11-16 01:42:20 UTC (rev 285845)
+++ trunk/Source/WebCore/PAL/ChangeLog	2021-11-16 02:11:27 UTC (rev 285846)
@@ -1,3 +1,15 @@
+2021-11-15  Sam Weinig  <[email protected]>
+
+        Add another <model> backend backed by SceneKit to prove out ModelPlayer infrastructure a bit more
+        https://bugs.webkit.org/show_bug.cgi?id=233112
+
+        Reviewed by Dean Jackson.
+
+        * PAL.xcodeproj/project.pbxproj:
+        * pal/spi/cocoa/SceneKitSPI.h: Added.
+        Adds forward declaration of SCNMetalLayer SPI so SceneKit can be used
+        without an NSView/UIView.
+
 2021-11-15  Jer Noble  <[email protected]>
 
         [iOS] Adopt -[AVAudioSession setAuditTokensForProcessAssertion:]

Modified: trunk/Source/WebCore/PAL/PAL.xcodeproj/project.pbxproj (285845 => 285846)


--- trunk/Source/WebCore/PAL/PAL.xcodeproj/project.pbxproj	2021-11-16 01:42:20 UTC (rev 285845)
+++ trunk/Source/WebCore/PAL/PAL.xcodeproj/project.pbxproj	2021-11-16 02:11:27 UTC (rev 285846)
@@ -351,6 +351,7 @@
 		A3C66CDC1F462D6A009E6EE9 /* SessionID.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A3C66CDA1F462D6A009E6EE9 /* SessionID.cpp */; };
 		A3C66CDD1F462D6A009E6EE9 /* SessionID.h in Headers */ = {isa = PBXBuildFile; fileRef = A3C66CDB1F462D6A009E6EE9 /* SessionID.h */; };
 		ABCA536824895DB900361BFF /* CoreMotionSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = ABCA536724895DB900361BFF /* CoreMotionSPI.h */; };
+		BC4DDD9F273EF56E00660EBB /* SceneKitSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4DDD9E273EF56E00660EBB /* SceneKitSPI.h */; };
 		C15CBB3523F3548A00300CC7 /* NSUserDefaultsSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = C15CBB3223F34A1200300CC7 /* NSUserDefaultsSPI.h */; };
 		CD6122CC2559B6AC00FC657A /* OutputContext.h in Headers */ = {isa = PBXBuildFile; fileRef = CD6122CA2559B6AC00FC657A /* OutputContext.h */; };
 		CD6122CD2559B6AC00FC657A /* OutputContext.mm in Sources */ = {isa = PBXBuildFile; fileRef = CD6122CB2559B6AC00FC657A /* OutputContext.mm */; };
@@ -755,6 +756,7 @@
 		A3C66CDA1F462D6A009E6EE9 /* SessionID.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SessionID.cpp; sourceTree = "<group>"; };
 		A3C66CDB1F462D6A009E6EE9 /* SessionID.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SessionID.h; sourceTree = "<group>"; };
 		ABCA536724895DB900361BFF /* CoreMotionSPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CoreMotionSPI.h; sourceTree = "<group>"; };
+		BC4DDD9E273EF56E00660EBB /* SceneKitSPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SceneKitSPI.h; sourceTree = "<group>"; };
 		C037494124127CCB00D9A36E /* AccessibilitySupportSPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AccessibilitySupportSPI.h; sourceTree = "<group>"; };
 		C138EA1A2436447200656DF1 /* CoreServicesSPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CoreServicesSPI.h; sourceTree = "<group>"; };
 		C15CBB3223F34A1200300CC7 /* NSUserDefaultsSPI.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = NSUserDefaultsSPI.h; sourceTree = "<group>"; };
@@ -906,6 +908,7 @@
 				0C2DA13A1F3BEB4900DBC317 /* pthreadSPI.h */,
 				0C2DA13B1F3BEB4900DBC317 /* QuartzCoreSPI.h */,
 				442956CC218A72DE0080DB54 /* RevealSPI.h */,
+				BC4DDD9E273EF56E00660EBB /* SceneKitSPI.h */,
 				570AB8F020AE2E8D00B8BE87 /* SecKeyProxySPI.h */,
 				0C2DA13C1F3BEB4900DBC317 /* ServersSPI.h */,
 				93B38EC125821D2200198E63 /* SpeechSPI.h */,
@@ -1537,6 +1540,7 @@
 				071C00382707EDF000D027C7 /* ReplayKitSoftLink.h in Headers */,
 				F4974EA3265EEA2200B49B8C /* RevealSoftLink.h in Headers */,
 				442956CD218A72DF0080DB54 /* RevealSPI.h in Headers */,
+				BC4DDD9F273EF56E00660EBB /* SceneKitSPI.h in Headers */,
 				570AB8F120AE2E8D00B8BE87 /* SecKeyProxySPI.h in Headers */,
 				0C2DA1581F3BEB4900DBC317 /* ServersSPI.h in Headers */,
 				A3C66CDD1F462D6A009E6EE9 /* SessionID.h in Headers */,

Copied: trunk/Source/WebCore/PAL/pal/spi/cocoa/SceneKitSPI.h (from rev 285843, trunk/Source/WebKit/WebProcess/Model/WebModelPlayerProvider.cpp) (0 => 285846)


--- trunk/Source/WebCore/PAL/pal/spi/cocoa/SceneKitSPI.h	                        (rev 0)
+++ trunk/Source/WebCore/PAL/pal/spi/cocoa/SceneKitSPI.h	2021-11-16 02:11:27 UTC (rev 285846)
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2021 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#if HAVE(SCENEKIT)
+#if USE(APPLE_INTERNAL_SDK)
+
+#import <SceneKit/SceneKitPrivate.h>
+
+#else
+
+#import <QuartzCore/CAMetalLayer.h>
+#import <SceneKit/SceneKit.h>
+
+@interface SCNMetalLayer : CAMetalLayer <SCNSceneRenderer, SCNTechniqueSupport>
+@property (nonatomic, retain, nullable) SCNScene *scene;
+@end
+
+#endif
+
+#endif // HAVE(SCENEKIT)

Modified: trunk/Source/WebCore/SourcesCocoa.txt (285845 => 285846)


--- trunk/Source/WebCore/SourcesCocoa.txt	2021-11-16 01:42:20 UTC (rev 285845)
+++ trunk/Source/WebCore/SourcesCocoa.txt	2021-11-16 02:11:27 UTC (rev 285846)
@@ -101,6 +101,11 @@
 Modules/async-clipboard/ios/ClipboardImageReaderIOS.mm
 Modules/async-clipboard/mac/ClipboardImageReaderMac.mm
 Modules/mediastream/RTCRtpSFrameTransformerCocoa.cpp
+Modules/model-element/scenekit/SceneKitModel.mm
+Modules/model-element/scenekit/SceneKitModelLoader.mm
+Modules/model-element/scenekit/SceneKitModelLoaderClient.mm
+Modules/model-element/scenekit/SceneKitModelLoaderUSD.mm
+Modules/model-element/scenekit/SceneKitModelPlayer.mm
 Modules/speech/cocoa/SpeechRecognizerCocoa.mm
 Modules/speech/cocoa/WebSpeechRecognizerTask.mm
 Modules/speech/cocoa/WebSpeechRecognizerTaskMock.mm

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (285845 => 285846)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2021-11-16 01:42:20 UTC (rev 285845)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2021-11-16 02:11:27 UTC (rev 285846)
@@ -4110,6 +4110,8 @@
 		BC4A533725605AE10028C592 /* StorageBlockingPolicy.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4A533625605AE10028C592 /* StorageBlockingPolicy.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		BC4A5339256063980028C592 /* FontRenderingMode.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4A5338256063980028C592 /* FontRenderingMode.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		BC4A533B256064E10028C592 /* TextDirection.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4A533A256064E10028C592 /* TextDirection.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		BC4DDD96273D949900660EBB /* SceneKitModelPlayer.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4DDD8F273D84E700660EBB /* SceneKitModelPlayer.h */; settings = {ATTRIBUTES = (Private, ); }; };
+		BC4DDD97273D94A800660EBB /* SceneKitModelLoaderClient.h in Headers */ = {isa = PBXBuildFile; fileRef = BC4DDD91273D84E700660EBB /* SceneKitModelLoaderClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		BC51156E12B1749C00C96754 /* ScrollAnimatorMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = BC51156D12B1749C00C96754 /* ScrollAnimatorMac.mm */; };
 		BC53C5F50DA56B920021EB5D /* Gradient.h in Headers */ = {isa = PBXBuildFile; fileRef = BC53C5F40DA56B920021EB5D /* Gradient.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		BC53C6920DA591140021EB5D /* CSSGradientValue.h in Headers */ = {isa = PBXBuildFile; fileRef = BC53C6910DA591140021EB5D /* CSSGradientValue.h */; settings = {ATTRIBUTES = (Private, ); }; };
@@ -14825,6 +14827,16 @@
 		BC4A533625605AE10028C592 /* StorageBlockingPolicy.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StorageBlockingPolicy.h; sourceTree = "<group>"; };
 		BC4A5338256063980028C592 /* FontRenderingMode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FontRenderingMode.h; sourceTree = "<group>"; };
 		BC4A533A256064E10028C592 /* TextDirection.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TextDirection.h; sourceTree = "<group>"; };
+		BC4DDD8B273D84E700660EBB /* SceneKitModelLoaderUSD.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SceneKitModelLoaderUSD.h; sourceTree = "<group>"; };
+		BC4DDD8C273D84E700660EBB /* SceneKitModelLoaderClient.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = SceneKitModelLoaderClient.mm; sourceTree = "<group>"; };
+		BC4DDD8D273D84E700660EBB /* SceneKitModelPlayer.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = SceneKitModelPlayer.mm; sourceTree = "<group>"; };
+		BC4DDD8E273D84E700660EBB /* SceneKitModelLoader.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = SceneKitModelLoader.mm; sourceTree = "<group>"; };
+		BC4DDD8F273D84E700660EBB /* SceneKitModelPlayer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SceneKitModelPlayer.h; sourceTree = "<group>"; };
+		BC4DDD90273D84E700660EBB /* SceneKitModel.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SceneKitModel.h; sourceTree = "<group>"; };
+		BC4DDD91273D84E700660EBB /* SceneKitModelLoaderClient.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SceneKitModelLoaderClient.h; sourceTree = "<group>"; };
+		BC4DDD92273D84E700660EBB /* SceneKitModel.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = SceneKitModel.mm; sourceTree = "<group>"; };
+		BC4DDD93273D84E700660EBB /* SceneKitModelLoader.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SceneKitModelLoader.h; sourceTree = "<group>"; };
+		BC4DDD94273D84E700660EBB /* SceneKitModelLoaderUSD.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = SceneKitModelLoaderUSD.mm; sourceTree = "<group>"; };
 		BC51156D12B1749C00C96754 /* ScrollAnimatorMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ScrollAnimatorMac.mm; sourceTree = "<group>"; };
 		BC51580A0C03D404008BB0EE /* JSHTMLDocumentCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JSHTMLDocumentCustom.cpp; sourceTree = "<group>"; };
 		BC53C5F40DA56B920021EB5D /* Gradient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Gradient.h; sourceTree = "<group>"; };
@@ -23792,6 +23804,7 @@
 			isa = PBXGroup;
 			children = (
 				BC2B412227335E0C00A2D191 /* dummy */,
+				BC4DDD8A273D84E700660EBB /* scenekit */,
 				71A3D1802562B8250064E2A6 /* HTMLModelElement.cpp */,
 				71A3D17D2562B8240064E2A6 /* HTMLModelElement.h */,
 				71A3D17F2562B8240064E2A6 /* HTMLModelElement.idl */,
@@ -28392,6 +28405,23 @@
 			path = dummy;
 			sourceTree = "<group>";
 		};
+		BC4DDD8A273D84E700660EBB /* scenekit */ = {
+			isa = PBXGroup;
+			children = (
+				BC4DDD90273D84E700660EBB /* SceneKitModel.h */,
+				BC4DDD92273D84E700660EBB /* SceneKitModel.mm */,
+				BC4DDD93273D84E700660EBB /* SceneKitModelLoader.h */,
+				BC4DDD8E273D84E700660EBB /* SceneKitModelLoader.mm */,
+				BC4DDD91273D84E700660EBB /* SceneKitModelLoaderClient.h */,
+				BC4DDD8C273D84E700660EBB /* SceneKitModelLoaderClient.mm */,
+				BC4DDD8B273D84E700660EBB /* SceneKitModelLoaderUSD.h */,
+				BC4DDD94273D84E700660EBB /* SceneKitModelLoaderUSD.mm */,
+				BC4DDD8F273D84E700660EBB /* SceneKitModelPlayer.h */,
+				BC4DDD8D273D84E700660EBB /* SceneKitModelPlayer.mm */,
+			);
+			path = scenekit;
+			sourceTree = "<group>";
+		};
 		BC4EDEF70C08F414007EDD49 /* Custom */ = {
 			isa = PBXGroup;
 			children = (
@@ -35918,6 +35948,8 @@
 				41FCD6B923CE015500C62567 /* SampleBufferDisplayLayer.h in Headers */,
 				CDD7089718359F6F002B3DC6 /* SampleMap.h in Headers */,
 				49E911CB0EF86D47009D0CAF /* ScaleTransformOperation.h in Headers */,
+				BC4DDD97273D94A800660EBB /* SceneKitModelLoaderClient.h in Headers */,
+				BC4DDD96273D949900660EBB /* SceneKitModelPlayer.h in Headers */,
 				5DFE8F570D16477C0076E937 /* ScheduledAction.h in Headers */,
 				9BD0BF9312A42BF50072FD43 /* ScopedEventQueue.h in Headers */,
 				7B7311FB25C092B7003B2796 /* ScopedHighPerformanceGPURequest.h in Headers */,

Modified: trunk/Source/WebKit/ChangeLog (285845 => 285846)


--- trunk/Source/WebKit/ChangeLog	2021-11-16 01:42:20 UTC (rev 285845)
+++ trunk/Source/WebKit/ChangeLog	2021-11-16 02:11:27 UTC (rev 285846)
@@ -1,3 +1,27 @@
+2021-11-15  Sam Weinig  <[email protected]>
+
+        Add another <model> backend backed by SceneKit to prove out ModelPlayer infrastructure a bit more
+        https://bugs.webkit.org/show_bug.cgi?id=233112
+
+        Reviewed by Dean Jackson.
+
+        Add support for instantiating the new SceneKit backed ModelPlayer.
+
+        If both ARKit based ModelPlayer and SceneKit based ModelPlayer are enabled,
+        the ARKit one wins.
+
+        * WebProcess/Model/WebModelPlayerProvider.cpp:
+        (WebKit::WebModelPlayerProvider::createModelPlayer):
+        Add support for creating a SceneKit based ModelPlayer and add checks
+        for whether the backend is enabled.
+
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::updatePreferences):
+        * WebProcess/WebPage/WebPage.h:
+        (WebKit::WebPage::useARKitForModel const):
+        (WebKit::WebPage::useSceneKitForModel const):
+        Add bits to store which <model> backends are enabled.
+
 2021-11-15  Eric Liang  <[email protected]>
 
         _AXSCopyPathForAccessibilityBundle is going to be deprecated.

Modified: trunk/Source/WebKit/WebProcess/Model/WebModelPlayerProvider.cpp (285845 => 285846)


--- trunk/Source/WebKit/WebProcess/Model/WebModelPlayerProvider.cpp	2021-11-16 01:42:20 UTC (rev 285845)
+++ trunk/Source/WebKit/WebProcess/Model/WebModelPlayerProvider.cpp	2021-11-16 02:11:27 UTC (rev 285846)
@@ -26,6 +26,7 @@
 #include "config.h"
 #include "WebModelPlayerProvider.h"
 
+#include "WebPage.h"
 #include <WebCore/ModelPlayer.h>
 
 #if ENABLE(ARKIT_INLINE_PREVIEW_MAC)
@@ -32,6 +33,10 @@
 #include "ARKitInlinePreviewModelPlayer.h"
 #endif
 
+#if HAVE(SCENEKIT)
+#include <WebCore/SceneKitModelPlayer.h>
+#endif
+
 namespace WebKit {
 
 WebModelPlayerProvider::WebModelPlayerProvider(WebPage& page)
@@ -46,12 +51,18 @@
 
 RefPtr<WebCore::ModelPlayer> WebModelPlayerProvider::createModelPlayer(WebCore::ModelPlayerClient& client)
 {
+    UNUSED_PARAM(client);
+
 #if ENABLE(ARKIT_INLINE_PREVIEW_MAC)
-    return ARKitInlinePreviewModelPlayer::create(m_page, client);
-#else
-    UNUSED_PARAM(client);
+    if (m_page.useARKitForModel())
+        return ARKitInlinePreviewModelPlayer::create(m_page, client);
+#endif
+#if HAVE(SCENEKIT)
+    if (m_page.useSceneKitForModel())
+        return WebCore::SceneKitModelPlayer::create(client);
+#endif
+
     return nullptr;
-#endif
 }
 
 }

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (285845 => 285846)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2021-11-16 01:42:20 UTC (rev 285845)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2021-11-16 02:11:27 UTC (rev 285846)
@@ -4040,6 +4040,8 @@
     PlatformMediaSessionManager::setOpusDecoderEnabled(RuntimeEnabledFeatures::sharedFeatures().opusDecoderEnabled());
 #endif
 
+    // FIXME: This should be automated by adding a new field in WebPreferences*.yaml
+    // that indicates override state for captive portal mode. https://webkit.org/b/233100.
     if (WebProcess::singleton().isCaptivePortalModeEnabled()) {
         settings.setWebGLEnabled(false);
 #if ENABLE(WEBGL2)
@@ -4079,6 +4081,13 @@
 #endif
     }
 
+#if ENABLE(ARKIT_INLINE_PREVIEW)
+    m_useARKitForModel = store.getBoolValueForKey(WebPreferencesKey::useARKitForModelKey());
+#endif
+#if HAVE(SCENEKIT)
+    m_useSceneKitForModel = store.getBoolValueForKey(WebPreferencesKey::useSceneKitForModelKey());
+#endif
+
     m_page->settingsDidChange();
 }
 

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.h (285845 => 285846)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2021-11-16 01:42:20 UTC (rev 285845)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.h	2021-11-16 02:11:27 UTC (rev 285846)
@@ -1499,6 +1499,13 @@
     const WebCore::AccessibilityRootAtspi& accessibilityRootObject() const { return *m_accessibilityRootObject; }
 #endif
 
+#if ENABLE(ARKIT_INLINE_PREVIEW)
+    bool useARKitForModel() const { return m_useARKitForModel; };
+#endif
+#if HAVE(SCENEKIT)
+    bool useSceneKitForModel() const { return m_useSceneKitForModel; };
+#endif
+
 private:
     WebPage(WebCore::PageIdentifier, WebPageCreationParameters&&);
 
@@ -2368,6 +2375,13 @@
 
     bool m_didUpdateRenderingAfterCommittingLoad { false };
 
+#if ENABLE(ARKIT_INLINE_PREVIEW)
+    bool m_useARKitForModel { false };
+#endif
+#if HAVE(SCENEKIT)
+    bool m_useSceneKitForModel { false };
+#endif
+
     Vector<String> m_corsDisablingPatterns;
 
     std::unique_ptr<WebCore::CachedPage> m_cachedPage;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to