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;