Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: df1d0981bc3818eeb64d5369b4b30f7b834f976f
https://github.com/WebKit/WebKit/commit/df1d0981bc3818eeb64d5369b4b30f7b834f976f
Author: Ada Chan <[email protected]>
Date: 2025-05-09 (Fri, 09 May 2025)
Changed paths:
A LayoutTests/model-element/model-element-on-hidden-page-expected.txt
A LayoutTests/model-element/model-element-on-hidden-page.html
M Source/WebCore/Headers.cmake
M Source/WebCore/Modules/model-element/HTMLModelElement.cpp
M Source/WebCore/Modules/model-element/HTMLModelElement.h
M Source/WebCore/Modules/model-element/ModelPlayer.cpp
M Source/WebCore/Modules/model-element/ModelPlayer.h
M Source/WebCore/Modules/model-element/ModelPlayerClient.h
M Source/WebCore/Modules/model-element/ModelPlayerTransformState.h
A Source/WebCore/Modules/model-element/PlaceholderModelPlayer.cpp
A Source/WebCore/Modules/model-element/PlaceholderModelPlayer.h
M Source/WebCore/Modules/speech/SpeechRecognition.cpp
M Source/WebCore/Modules/webaudio/MediaStreamAudioSourceGStreamer.cpp
M Source/WebCore/Modules/webdatabase/DatabaseTracker.h
M Source/WebCore/Modules/webxr/WebXROpaqueFramebuffer.cpp
M Source/WebCore/Sources.txt
M Source/WebCore/WebCore.xcodeproj/project.pbxproj
M Source/WebCore/dom/TaskSource.h
M Source/WebCore/page/Page.h
M Source/WebCore/testing/Internals.cpp
M Source/WebCore/testing/Internals.h
M Source/WebCore/testing/Internals.idl
M Source/WebKit/ModelProcess/ModelConnectionToWebProcess.cpp
M Source/WebKit/ModelProcess/ModelConnectionToWebProcess.h
M Source/WebKit/ModelProcess/ModelProcessModelPlayerManagerProxy.cpp
M Source/WebKit/ModelProcess/ModelProcessModelPlayerManagerProxy.h
M Source/WebKit/ModelProcess/cocoa/ModelProcessModelPlayerProxy.h
M Source/WebKit/ModelProcess/cocoa/ModelProcessModelPlayerProxy.messages.in
M Source/WebKit/ModelProcess/cocoa/ModelProcessModelPlayerProxy.mm
M Source/WebKit/Shared/WebCoreArgumentCoders.serialization.in
M Source/WebKit/WebProcess/Model/ModelProcessConnection.cpp
M Source/WebKit/WebProcess/Model/ModelProcessConnection.h
M Source/WebKit/WebProcess/Model/ModelProcessConnection.messages.in
M Source/WebKit/WebProcess/Model/ModelProcessModelPlayer.cpp
M Source/WebKit/WebProcess/Model/ModelProcessModelPlayer.h
M Source/WebKit/WebProcess/Model/ModelProcessModelPlayer.messages.in
M Source/WebKit/WebProcess/Model/ModelProcessModelPlayerManager.cpp
M Source/WebKit/WebProcess/Model/ModelProcessModelPlayerManager.h
M Source/WebKit/WebProcess/Model/ModelProcessModelPlayerTransformState.cpp
M Source/WebKit/WebProcess/Model/ModelProcessModelPlayerTransformState.h
M Source/WebKit/WebProcess/WebPage/WebPage.cpp
M Source/WebKit/WebProcess/WebPage/WebPage.h
M Tools/WebKitTestRunner/ios/TestControllerIOS.mm
Log Message:
-----------
[Model Element] Unload the model player (and its resources) when it's
invisible
https://bugs.webkit.org/show_bug.cgi?id=292574
rdar://149972888
Reviewed by Ryosuke Niwa and Mike Wyrzykowski.
When the model element's document has become hidden, unload its model player in
the model process to reduce its memory allocations. The unloading is done with
a delay in case the user quickly reactivates the page the model is in. The
unloading is handled by the model process, as the web content process will
likely get suspended when the page becomes hidden.
When the web content process is notified of the model player unloading, it
creates a PlaceholderModelPlayer with the current animation and transform
states. This way HTMLModelElement can continue to access/update that placeholder
model player. Any running animation timeline can keep running, and updates
can still be tracked by this placeholder model player.
When the page is shown again, HTMLModelElement gets the most current animation
and transform states from the placeholder model player, creates the "real"
model player, and restores it with those states. The reloading is also done
with a short delay in case the user quickly deactivates the page right after
activating it.
Unload the model player into a PlaceholderModelPlayer when the <model>
element is suspended when the page is added to the back/forward cache.
Any running animation is paused when the element is suspended, and
unpaused when the element is resumed.
* LayoutTests/model-element/model-element-on-hidden-page-expected.txt
* LayoutTests/model-element/model-element-on-hidden-page.html
* Source/WebCore/Modules/model-element/HTMLModelElement.cpp:
(WebCore::HTMLModelElement::visibilityStateChanged):
(WebCore::HTMLModelElement::unloadModelPlayer):
(WebCore::HTMLModelElement::reloadModelPlayer):
(WebCore::HTMLModelElement::reloadModelTimerFired):
(WebCore::HTMLModelElement::isVisible const):
(WebCore::HTMLModelElement::didUnload):
(WebCore::HTMLModelElement::renderingAbruptlyStopped): Deleted.
* Source/WebCore/Modules/model-element/HTMLModelElement.h:
* Source/WebCore/Modules/model-element/ModelPlayer.cpp:
(WebCore::ModelPlayer::isPlaceholder const):
(WebCore::ModelPlayer::reload):
(WebCore::ModelPlayer::visibilityStateDidChange):
(WebCore::ModelPlayer::renderingAbruptlyStopped): Deleted.
* Source/WebCore/Modules/model-element/ModelPlayer.h:
* Source/WebCore/Modules/model-element/ModelPlayerClient.h:
* Source/WebCore/Modules/model-element/ModelPlayerTransformState.h:
* Source/WebCore/Modules/model-element/PlaceholderModelPlayer.cpp: Added.
(WebCore::PlaceholderModelPlayer::create):
(WebCore::PlaceholderModelPlayer::PlaceholderModelPlayer):
(WebCore::PlaceholderModelPlayer::currentAnimationState const):
(WebCore::PlaceholderModelPlayer::currentTransformState const):
(WebCore::PlaceholderModelPlayer::load):
(WebCore::PlaceholderModelPlayer::reload):
(WebCore::PlaceholderModelPlayer::boundingBoxCenter const):
(WebCore::PlaceholderModelPlayer::boundingBoxExtents const):
(WebCore::PlaceholderModelPlayer::entityTransform const):
(WebCore::PlaceholderModelPlayer::setEntityTransform):
(WebCore::PlaceholderModelPlayer::supportsTransform):
(WebCore::PlaceholderModelPlayer::setAutoplay):
(WebCore::PlaceholderModelPlayer::setLoop):
(WebCore::PlaceholderModelPlayer::setPlaybackRate):
(WebCore::PlaceholderModelPlayer::duration const):
(WebCore::PlaceholderModelPlayer::paused const):
(WebCore::PlaceholderModelPlayer::setPaused):
(WebCore::PlaceholderModelPlayer::currentTime const):
(WebCore::PlaceholderModelPlayer::setCurrentTime):
(WebCore::PlaceholderModelPlayer::setHasPortal):
(WebCore::PlaceholderModelPlayer::setStageMode):
(WebCore::PlaceholderModelPlayer::layer):
(WebCore::PlaceholderModelPlayer::layerHostingContextIdentifier):
(WebCore::PlaceholderModelPlayer::sizeDidChange):
(WebCore::PlaceholderModelPlayer::enterFullscreen):
(WebCore::PlaceholderModelPlayer::handleMouseDown):
(WebCore::PlaceholderModelPlayer::handleMouseMove):
(WebCore::PlaceholderModelPlayer::handleMouseUp):
(WebCore::PlaceholderModelPlayer::getCamera):
(WebCore::PlaceholderModelPlayer::setCamera):
(WebCore::PlaceholderModelPlayer::isPlayingAnimation):
(WebCore::PlaceholderModelPlayer::setAnimationIsPlaying):
(WebCore::PlaceholderModelPlayer::isLoopingAnimation):
(WebCore::PlaceholderModelPlayer::setIsLoopingAnimation):
(WebCore::PlaceholderModelPlayer::animationDuration):
(WebCore::PlaceholderModelPlayer::animationCurrentTime):
(WebCore::PlaceholderModelPlayer::setAnimationCurrentTime):
(WebCore::PlaceholderModelPlayer::hasAudio):
(WebCore::PlaceholderModelPlayer::isMuted):
(WebCore::PlaceholderModelPlayer::setIsMuted):
(WebCore::PlaceholderModelPlayer::accessibilityChildren):
* Source/WebCore/Modules/model-element/PlaceholderModelPlayer.h: Added.
* Source/WebCore/Sources.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebKit/ModelProcess/ModelConnectionToWebProcess.cpp:
(WebKit::ModelConnectionToWebProcess::didUnloadModelPlayer):
* Source/WebKit/ModelProcess/ModelConnectionToWebProcess.h:
* Source/WebKit/ModelProcess/ModelProcessModelPlayerManagerProxy.cpp:
(WebKit::ModelProcessModelPlayerManagerProxy::unloadModelPlayer):
* Source/WebKit/ModelProcess/ModelProcessModelPlayerManagerProxy.h:
* Source/WebKit/ModelProcess/cocoa/ModelProcessModelPlayerProxy.h:
* Source/WebKit/ModelProcess/cocoa/ModelProcessModelPlayerProxy.messages.in:
* Source/WebKit/ModelProcess/cocoa/ModelProcessModelPlayerProxy.mm:
(WebKit::ModelProcessModelPlayerProxy::ModelProcessModelPlayerProxy):
(WebKit::ModelProcessModelPlayerProxy::reloadModel):
(WebKit::ModelProcessModelPlayerProxy::modelVisibilityDidChange):
(WebKit::ModelProcessModelPlayerProxy::unloadModelTimerFired):
(WebKit::ModelProcessModelPlayerProxy::didFinishLoading):
(WebKit::ModelProcessModelPlayerProxy::sizeDidChange):
* Source/WebKit/Shared/WebCoreArgumentCoders.serialization.in:
* Source/WebKit/WebProcess/Model/ModelProcessConnection.cpp:
(WebKit::ModelProcessConnection::didUnloadModelPlayer):
* Source/WebKit/WebProcess/Model/ModelProcessConnection.h:
* Source/WebKit/WebProcess/Model/ModelProcessConnection.messages.in:
* Source/WebKit/WebProcess/Model/ModelProcessModelPlayer.cpp:
(WebKit::ModelProcessModelPlayer::didUnload):
(WebKit::ModelProcessModelPlayer::reload):
(WebKit::ModelProcessModelPlayer::visibilityStateDidChange):
(WebKit::ModelProcessModelPlayer::sizeDidChange):
(WebKit::ModelProcessModelPlayer::renderingAbruptlyStopped): Deleted.
* Source/WebKit/WebProcess/Model/ModelProcessModelPlayer.h:
* Source/WebKit/WebProcess/Model/ModelProcessModelPlayer.messages.in:
* Source/WebKit/WebProcess/Model/ModelProcessModelPlayerManager.cpp:
(WebKit::ModelProcessModelPlayerManager::didUnloadModelProcessModelPlayer):
(WebKit::ModelProcessModelPlayerManager::modelProcessConnectionDidClose):
* Source/WebKit/WebProcess/Model/ModelProcessModelPlayerManager.h:
* Source/WebKit/WebProcess/Model/ModelProcessModelPlayerTransformState.cpp:
(WebKit::ModelProcessModelPlayerTransformState::clone const):
* Source/WebKit/WebProcess/Model/ModelProcessModelPlayerTransformState.h:
Canonical link: https://commits.webkit.org/294731@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes