[webkit-changes] [WebKit/WebKit] 8da9da: [visionOS] Environment docking may fail if a video...
aestes
noreply at github.com
Tue Aug 13 11:23:33 PDT 2024
Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 8da9da634316e1ff561390301de8f03b4c25886a
https://github.com/WebKit/WebKit/commit/8da9da634316e1ff561390301de8f03b4c25886a
Author: Andy Estes <aestes at apple.com>
Date: 2024-08-13 (Tue, 13 Aug 2024)
Changed paths:
M Source/WebCore/platform/ios/VideoPresentationInterfaceIOS.h
M Source/WebCore/platform/ios/VideoPresentationInterfaceIOS.mm
M Source/WebKit/Platform/ios/VideoPresentationInterfaceLMK.mm
M Source/WebKit/UIProcess/Cocoa/VideoPresentationManagerProxy.mm
M Source/WebKit/UIProcess/WebPageProxy.cpp
Log Message:
-----------
[visionOS] Environment docking may fail if a video's src changes while in element fullscreen
https://bugs.webkit.org/show_bug.cgi?id=278004
rdar://130920037
Reviewed by Eric Carlson.
When a video's src (or srcObject) changes a new WebAVPlayerLayer will be created in the UI process,
removing the previous layer. VideoPresentationManagerProxy::removeClientForContext is called when
the old layer is removed, which invalidates and removes the video presentation model and interface
associated with the video element's context ID. When VideoPresentationInterfaceLMK is invalidated
it removes its LMPlayableViewController, even though an environment picker button owned by that
now-deallocated view controller may be presented in WKFullScreenViewController if the video is part
of an element fullscreen presentation. If the user were to tap that button and choose an
environment then docking would not occur since the LMPlayzableViewController and its associated
playable object no longer exist.
VideoPresentationInterfaceLMK attempted to account for this during invalidation by calling
VideoPresentationModel::didCleanupFullscreen(), which would ultimately call
-[WKFullScreenViewController configureEnvironmentPickerButtonView], re-creating a new video
presentation interface, LMPlayableViewController, playable object, and environment picker button if
the video was still in an element fullscreen presentation. While this re-creation did happen after
some forms of invalidation (e.g., when undocking and returning to element fullscreen) it did *not*
happen when a video layer changed because in VideoPresentationManagerProxy::removeClientForContext
the video presentation model had already been removed from the interface by the time
VideoPresentationInterface::invalidate was called.
To account ensure that a valid environment picker button is displayed in this case, this change
calls WebPageProxy::didCleanupFullscreen explicitly in VideoPresentationManagerProxy::removeClientForContext.
Also added additional logging to help diagnose bugs like this in the future.
* Source/WebCore/platform/ios/VideoPresentationInterfaceIOS.h:
* Source/WebCore/platform/ios/VideoPresentationInterfaceIOS.mm:
(WebCore::VideoPresentationInterfaceIOS::cleanupFullscreen):
* Source/WebKit/Platform/ios/VideoPresentationInterfaceLMK.mm:
(WebKit::VideoPresentationInterfaceLMK::invalidatePlayerViewController):
(WebKit::VideoPresentationInterfaceLMK::ensurePlayableViewController):
* Source/WebKit/UIProcess/Cocoa/VideoPresentationManagerProxy.mm:
(WebKit::VideoPresentationManagerProxy::removeClientForContext):
* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::didCleanupFullscreen):
Canonical link: https://commits.webkit.org/282176@main
To unsubscribe from these emails, change your notification settings at https://github.com/WebKit/WebKit/settings/notifications
More information about the webkit-changes
mailing list