Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 214a0eb36a63bf39948da15d0138b608016139a7
https://github.com/WebKit/WebKit/commit/214a0eb36a63bf39948da15d0138b608016139a7
Author: Etienne Segonzac <[email protected]>
Date: 2026-07-30 (Thu, 30 Jul 2026)
Changed paths:
A LayoutTests/spatial-css/spatial-portal-layers-expected.txt
A LayoutTests/spatial-css/spatial-portal-layers.html
A LayoutTests/spatial-css/spatial-portal-model-insert-remove-expected.txt
A LayoutTests/spatial-css/spatial-portal-model-insert-remove.html
A LayoutTests/spatial-css/spatial-portal-model-move-expected.txt
A LayoutTests/spatial-css/spatial-portal-model-move.html
A LayoutTests/spatial-css/spatial-portal-nested-portals-expected.txt
A LayoutTests/spatial-css/spatial-portal-nested-portals.html
A LayoutTests/spatial-css/spatial-portal-nesting-dynamic-expected.txt
A LayoutTests/spatial-css/spatial-portal-nesting-dynamic.html
A LayoutTests/spatial-css/spatial-portal-scroll-to-load-expected.txt
A LayoutTests/spatial-css/spatial-portal-scroll-to-load.html
A LayoutTests/spatial-css/spatial-portal-single-model-expected.txt
A LayoutTests/spatial-css/spatial-portal-single-model.html
A LayoutTests/spatial-css/spatial-portal-without-box-expected.txt
A LayoutTests/spatial-css/spatial-portal-without-box.html
M Source/WebCore/Modules/model-element/HTMLModelElement.cpp
M Source/WebCore/Modules/model-element/HTMLModelElement.h
M
Source/WebCore/Modules/model-element/ModelPlayerGraphicsLayerConfiguration.h
M Source/WebCore/Modules/model-element/SpatialPortalController.cpp
M Source/WebCore/Modules/model-element/SpatialPortalController.h
M Source/WebCore/dom/Element.cpp
M Source/WebCore/dom/Element.h
M Source/WebCore/platform/graphics/ModelContext.cpp
M Source/WebCore/platform/graphics/ModelContext.h
M Source/WebCore/rendering/RenderBox.cpp
M Source/WebCore/rendering/RenderLayerBacking.cpp
M Source/WebCore/rendering/RenderLayerCompositor.cpp
M Source/WebCore/rendering/RenderLayerCompositor.h
M Source/WebCore/testing/Internals.cpp
M Source/WebCore/testing/Internals.h
M Source/WebCore/testing/Internals.idl
M Source/WebKit/Shared/WebCoreArgumentCoders.serialization.in
M Source/WebKit/UIProcess/Model/PortalPresentationManagerProxy.mm
M Source/WebKit/UIProcess/ios/WKPageHostedPortalView.mm
M Source/WebKit/WebProcess/Model/ModelProcessModelPlayer.cpp
A Tools/TestWebKitAPI/Resources/spatial-portal-two-models-page.html
M Tools/TestWebKitAPI/SourcesCocoa.txt
A Tools/TestWebKitAPI/Tests/WebKit/WKWebView/SpatialPortal.mm
M Tools/TestWebKitAPI/Tests/WebKit/WKWebView/WKWebViewServerTrustKVC.mm
Log Message:
-----------
Add support for loading a single nested model inside of a Spatial Portal
https://bugs.webkit.org/show_bug.cgi?id=320112
<rdar://182292360>
Reviewed by Mike Wyrzykowski.
When a model is nested inside of a `spatial: portal` element, delegate
its loading / rendering to the portal.
When a Spatial Portal is nested inside of a Spatial Portal it's a noop.
Tests: spatial-css/spatial-portal-layers.html
spatial-css/spatial-portal-model-insert-remove.html
spatial-css/spatial-portal-model-move.html
spatial-css/spatial-portal-nested-portals.html
spatial-css/spatial-portal-scroll-to-load.html
spatial-css/spatial-portal-single-model.html
spatial-css/spatial-portal-nesting-dynamic.html
spatial-css/spatial-portal-without-box.html
Tools/TestWebKitAPI/Tests/WebKit/WKWebView/SpatialPortal.mm
* LayoutTests/spatial-css/spatial-portal-layers-expected.txt: Added.
* LayoutTests/spatial-css/spatial-portal-layers.html: Added.
* LayoutTests/spatial-css/spatial-portal-model-insert-remove-expected.txt:
Added.
* LayoutTests/spatial-css/spatial-portal-model-insert-remove.html: Added.
* LayoutTests/spatial-css/spatial-portal-model-move-expected.txt: Added.
* LayoutTests/spatial-css/spatial-portal-model-move.html: Added.
* LayoutTests/spatial-css/spatial-portal-nested-portals-expected.txt: Added.
* LayoutTests/spatial-css/spatial-portal-nested-portals.html: Added.
* LayoutTests/spatial-css/spatial-portal-scroll-to-load-expected.txt: Added.
* LayoutTests/spatial-css/spatial-portal-scroll-to-load.html: Added.
* LayoutTests/spatial-css/spatial-portal-single-model-expected.txt: Added.
* LayoutTests/spatial-css/spatial-portal-single-model.html: Added.
* LayoutTests/spatial-css/spatial-portal-nesting-dynamic-expected.txt: Added.
* LayoutTests/spatial-css/spatial-portal-nesting-dynamic.html: Added.
* LayoutTests/spatial-css/spatial-portal-without-box-expected.txt: Added.
* LayoutTests/spatial-css/spatial-portal-without-box.html: Added.
Complete the test suite to cover:
- the basic single model scenario
- the resulting CALayer tree
- dynamic insertions, removal and move between portals
- lazy loading while inside of a portal
- nested portals and dynamic updates
* Source/WebCore/Modules/model-element/HTMLModelElement.cpp:
(WebCore::HTMLModelElement::createElementRenderer):
(WebCore::HTMLModelElement::rendererIsNeeded):
(WebCore::HTMLModelElement::findPortalAncestor const):
(WebCore::HTMLModelElement::isInsidePortal const):
(WebCore::HTMLModelElement::findPortalController const):
(WebCore::HTMLModelElement::updateSpatialPortalController):
(WebCore::HTMLModelElement::didFinishLoadingInsidePortal):
(WebCore::HTMLModelElement::didFailLoadingInsidePortal):
(WebCore::HTMLModelElement::spatialPortalContextDidChange):
(WebCore::HTMLModelElement::isVisible const):
(WebCore::HTMLModelElement::modelDidChange):
(WebCore::HTMLModelElement::insertionSteps):
(WebCore::HTMLModelElement::removingSteps):
(WebCore::HTMLModelElement::configureGraphicsLayer):
* Source/WebCore/Modules/model-element/HTMLModelElement.h:
Detect if a model element is nested inside of a Spatial Portal. In that
case it doesn't get a Renderer and delegates to the
SpatialPortalController.
* Source/WebCore/Modules/model-element/ModelPlayerGraphicsLayerConfiguration.h:
* Source/WebCore/Modules/model-element/SpatialPortalController.cpp:
(WebCore::SpatialPortalController::SpatialPortalController):
(WebCore::SpatialPortalController::~SpatialPortalController):
(WebCore::SpatialPortalController::unregisterChildModel):
(WebCore::SpatialPortalController::registerChildModel):
(WebCore::SpatialPortalController::childModelDidChange):
(WebCore::SpatialPortalController::loadChildModelIfReady):
(WebCore::SpatialPortalController::observePortalVisibility):
(WebCore::SpatialPortalController::viewportIntersectionChanged):
(WebCore::SpatialPortalController::ensureModelPlayer):
(WebCore::SpatialPortalController::unloadModel):
(WebCore::SpatialPortalController::portalContentSize const):
(WebCore::SpatialPortalController::configureGraphicsLayer):
(WebCore::SpatialPortalController::sizeMayHaveChanged):
(WebCore::SpatialPortalController::modelDidFinishLoading):
(WebCore::SpatialPortalController::modelDidFailLoading):
(WebCore::SpatialPortalController::modelDidUnload):
(WebCore::SpatialPortalController::modelDidUpdate):
(WebCore::SpatialPortalController::reconfigurePortalLayer):
(WebCore::SpatialPortalController::portalGraphicsLayer const):
(WebCore::SpatialPortalController::isPortalVisible const):
(WebCore::SpatialPortalController::logWarning):
* Source/WebCore/Modules/model-element/SpatialPortalController.h:
(WebCore::SpatialPortalController::modelPlayer const):
(WebCore::SpatialPortalController::numberOfHostedModels const):
* Source/WebCore/dom/Element.cpp:
(WebCore::Element::ensureSpatialPortalController):
(WebCore::Element::establishesSpatialPortal const):
* Source/WebCore/dom/Element.h:
* Source/WebCore/platform/graphics/ModelContext.cpp:
(WebCore::ModelContext::create):
(WebCore::ModelContext::ModelContext):
* Source/WebCore/platform/graphics/ModelContext.h:
* Source/WebKit/Shared/WebCoreArgumentCoders.serialization.in:
* Source/WebKit/UIProcess/Model/PortalPresentationManagerProxy.mm:
(WebKit::PortalPresentationManagerProxy::setUpModelView):
* Source/WebKit/UIProcess/ios/WKPageHostedPortalView.mm:
(-[WKPageHostedPortalView layoutSubviews]):
* Source/WebKit/WebProcess/Model/ModelProcessModelPlayer.cpp:
(WebKit::ModelProcessModelPlayer::configureGraphicsLayer):
Create a ModelPlayer and establish the portal's view hierarchy
(WKPageHostedPortalView and RemoteView to the ModelProcess) as soon as
the Spatial Portal is created (even if it contains no model element).
Add support for a custom origin (in the standalone model use case a 0x0
origin is always correct but not for Spatial Portals).
* Source/WebCore/rendering/RenderBox.cpp:
(WebCore::spatialPortalStyleDidChange):
(WebCore::isNestedInsideSpatialPortal):
(WebCore::updateSpatialPortalController):
(WebCore::RenderBox::styleDidChange):
Signal nested model elements when a parent Spatial Portal is
created / destroyed.
* Source/WebCore/rendering/RenderLayerCompositor.cpp:
(WebCore::RenderLayerCompositor::updateBackingAndHierarchy):
(WebCore::RenderLayerCompositor::isSpatialPortal):
(WebCore::RenderLayerCompositor::requiresCompositingForSpatialPortal const):
(WebCore::RenderLayerCompositor::needsContentsCompositingLayer const):
* Source/WebCore/rendering/RenderLayerCompositor.h:
Prevent Spatial Portals nesting.
* Source/WebCore/rendering/RenderLayerBacking.cpp:
(WebCore::RenderLayerBacking::updateConfiguration):
(WebCore::RenderLayerBacking::updateContentsRects):
(WebCore::RenderLayerBacking::contentsBox const):
Configure the Spatial Portal layers.
* Source/WebCore/testing/Internals.cpp:
(WebCore::Internals::numberOfHostedModelsInSpatialPortal):
(WebCore::Internals::establishesSpatialPortal):
* Source/WebCore/testing/Internals.h:
* Source/WebCore/testing/Internals.idl:
Test-only: expose the number of models nested in a portal and if an
element establishes a portal.
(More to come in rdar://182292429.)
* Tools/TestWebKitAPI/Resources/spatial-portal-two-models-page.html: Added.
* Tools/TestWebKitAPI/SourcesCocoa.txt:
* Tools/TestWebKitAPI/Tests/WebKit/WKWebView/SpatialPortal.mm: Added.
(TestWebKitAPI::loadTwoModelPortalWebView):
(TestWebKitAPI::TEST(SpatialPortal, EnabledSharesOnePlayerAcrossModels)):
(TestWebKitAPI::TEST(SpatialPortal, DisabledRendersModelsStandalone)):
Add basic API tests modeled after `ModelProcess.mm`.
* Tools/TestWebKitAPI/Tests/WebKit/WKWebView/WKWebViewServerTrustKVC.mm:
Unified-build fix.
Canonical link: https://commits.webkit.org/318242@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications