Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 7b6ea01374235df040c52dfcd986447c7aec9aca
https://github.com/WebKit/WebKit/commit/7b6ea01374235df040c52dfcd986447c7aec9aca
Author: Andy Estes <[email protected]>
Date: 2023-12-08 (Fri, 08 Dec 2023)
Changed paths:
M Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml
M Source/WebKit/Platform/Logging.h
M Source/WebKit/Platform/cocoa/AssertionCapability.h
M Source/WebKit/Platform/cocoa/AssertionCapability.mm
A Source/WebKit/Platform/cocoa/MediaCapability.h
A Source/WebKit/Platform/cocoa/MediaCapability.mm
R Source/WebKit/Platform/cocoa/ProcessCapability.cpp
M Source/WebKit/Platform/cocoa/ProcessCapability.h
A Source/WebKit/Platform/cocoa/ProcessCapabilityGrant.h
A Source/WebKit/Platform/cocoa/ProcessCapabilityGrant.mm
M Source/WebKit/Platform/spi/Cocoa/ExtensionKitSPI.h
M Source/WebKit/SourcesCocoa.txt
M Source/WebKit/UIProcess/AuxiliaryProcessProxy.cpp
M Source/WebKit/UIProcess/AuxiliaryProcessProxy.h
M Source/WebKit/UIProcess/Cocoa/ProcessAssertionCocoa.mm
A Source/WebKit/UIProcess/Cocoa/ProcessCapabilityGranter.h
A Source/WebKit/UIProcess/Cocoa/ProcessCapabilityGranter.mm
M Source/WebKit/UIProcess/Cocoa/WebPageProxyCocoa.mm
M Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm
M Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp
M
Source/WebKit/UIProcess/RemoteLayerTree/ios/RemoteScrollingCoordinatorProxyIOS.h
M
Source/WebKit/UIProcess/RemoteLayerTree/ios/RemoteScrollingCoordinatorProxyIOS.mm
M Source/WebKit/UIProcess/WebPageProxy.cpp
M Source/WebKit/UIProcess/WebPageProxy.h
M Source/WebKit/UIProcess/WebPageProxyInternals.h
M Source/WebKit/UIProcess/WebProcessPool.cpp
M Source/WebKit/UIProcess/WebProcessPool.h
M Source/WebKit/WebKit.xcodeproj/project.pbxproj
Log Message:
-----------
[iOS] Grant media capabilities to the WebContent and GPU processes during
capture and playback
https://bugs.webkit.org/show_bug.cgi?id=265588
rdar://116242683
Reviewed by Per Arne Vollan.
This patch introduces MediaCapability and ProcessCapabilityGranter, responsible
for granting,
revoking, and managing the activation of a MediaCapability.
A MediaCapability is created each time a WebPageProxy navigates to a new top
privately-controlled
domain, and is granted to the page's GPU and WebContent processes. When media
playback or capture
becomes active on the page the capability is activated, and remains active for
as long as that page
is capable of playback or capture. Granting and activating these capabilities
allows iOS to know the
process hierarchy and domain responsible for playback and capture, and allows
the system to, e.g.,
resume the responsible processes when starting playback from Now Playing or
account for the
responsible domain in System Status. Media capabilities will serve as a
replacement to SPIs like
AVSystemController_PIDToInheritApplicationStateFrom and -[AVAudioSession
setHostProcessAttribution:].
This feature is behind an off-by-default web preference
(MediaCapabilityGrantsEnabled). Adding API
tests is tracked by rdar://115750175. It wasn't done in this patch because
tests are blocked by
other work.
* Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml: Added a web
preference.
* Source/WebKit/Platform/Logging.h: Added a logging channel.
* Source/WebKit/Platform/cocoa/AssertionCapability.h:
* Source/WebKit/Platform/cocoa/AssertionCapability.mm:
(WebKit::AssertionCapability::AssertionCapability):
(WebKit::AssertionCapability::platformCapability const):
* Source/WebKit/Platform/cocoa/MediaCapability.h: Added a ProcessCapability
subclass for media
capabilities.
* Source/WebKit/Platform/cocoa/MediaCapability.mm:
(WebKit::createPlatformCapability):
(WebKit::MediaCapability::MediaCapability):
(WebKit::MediaCapability::environmentIdentifier const):
* Source/WebKit/Platform/cocoa/ProcessCapability.h:
(WebKit::ProcessCapability::environmentIdentifier const): Deleted.
* Source/WebKit/Platform/cocoa/ProcessCapabilityGrant.h: Added a class to
represent a capability
grant created by ProcessCapabilityGranter.
(WebKit::ProcessCapabilityGrant::environmentIdentifier const):
* Source/WebKit/Platform/cocoa/ProcessCapabilityGrant.mm:
(WebKit::platformInvalidate):
(WebKit::ProcessCapabilityGrant::ProcessCapabilityGrant):
(WebKit::ProcessCapabilityGrant::~ProcessCapabilityGrant):
(WebKit::ProcessCapabilityGrant::isEmpty const):
(WebKit::ProcessCapabilityGrant::isValid const):
(WebKit::ProcessCapabilityGrant::setPlatformGrant):
* Source/WebKit/Platform/spi/Cocoa/ExtensionKitSPI.h: Defined new
_SECapabilities SPI.
* Source/WebKit/SourcesCocoa.txt:
* Source/WebKit/UIProcess/AuxiliaryProcessProxy.cpp: Stored a map of
ProcessCapabilityGrants by
environmentIdentifier.
(WebKit::AuxiliaryProcessProxy::~AuxiliaryProcessProxy):
* Source/WebKit/UIProcess/AuxiliaryProcessProxy.h:
(WebKit::AuxiliaryProcessProxy::processCapabilityGrants):
* Source/WebKit/UIProcess/Cocoa/ProcessAssertionCocoa.mm:
(WebKit::ProcessAssertion::ProcessAssertion):
* Source/WebKit/UIProcess/Cocoa/ProcessCapabilityGranter.h: Added.
* Source/WebKit/UIProcess/Cocoa/ProcessCapabilityGranter.mm: Added.
(WebKit::granterQueue): Defined a queue for granting, revoking, and activating.
(WebKit::grantCapability): Internal helpers for granting on granterQueue.
(WebKit::grantCapabilityInternal): Ditto.
(WebKit::prepareGrant): Ditto.
(WebKit::finalizeGrant): Ditto.
(WebKit::ProcessCapabilityGranter::create):
(WebKit::ProcessCapabilityGranter::ProcessCapabilityGranter):
(WebKit::ProcessCapabilityGranter::grant): Grants a capability to the GPU and
WebContent processes.
(WebKit::ProcessCapabilityGranter::revoke): Revokes a capability previously
granted to the GPU and
WebContent processes.
(WebKit::ProcessCapabilityGranter::setMediaCapabilityActive): Activates a
capability.
(WebKit::ProcessCapabilityGranter::invalidateGrants): Invalidates a vector of
grants in a single
batch.
* Source/WebKit/UIProcess/Cocoa/WebPageProxyCocoa.mm:
(WebKit::WebPageProxy::mediaCapability const): Returns the current media
capability or nullopt.
(WebKit::WebPageProxy::setMediaCapability): Sets or clears the current media
capability.
(WebKit::WebPageProxy::updateMediaCapability): Updates the current media
capability when the top
privately-controlled domain changes, and activates or deactivates it as needed.
(WebKit::WebPageProxy::shouldActivateMediaCapability const): Defines when a
media capability should
be activated.
(WebKit::WebPageProxy::shouldDeactivateMediaCapability const): Defines when a
media capability
should be deactivated.
* Source/WebKit/UIProcess/Cocoa/WebProcessPoolCocoa.mm:
(WebKit::WebProcessPool::processCapabilityGranter): Creates a
ProcessCapabilityGranter if needed and
returns a reference to it.
(WebKit::WebProcessPool::gpuProcessForCapabilityGranter): Returns a
GPUProcessProxy, if one exists,
to ProcessCapabilityGranter.
(WebKit::WebProcessPool::webProcessForCapabilityGranter): Returns a
WebProcessProxy for a given
environmentIdentifier, if one exists, to ProcessCapabilityGranter.
* Source/WebKit/UIProcess/RemoteLayerTree/RemoteLayerTreeHost.mm: Fixed a
unified source issue.
* Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp:
(WebKit::GPUProcessProxy::gpuProcessExited): Invalidated existing grants when
the GPU process exits.
* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::dispatchActivityStateChange): Called
updateMediaCapability().
(WebKit::WebPageProxy::didCommitLoadForFrame): Ditto.
(WebKit::WebPageProxy::updatePlayingMediaDidChange): Ditto.
(WebKit::WebPageProxy::resetState): Set the mediaCapability to nullopt.
(WebKit::WebPageProxy::gpuProcessDidFinishLaunching): Granted an existing media
capability to the
new GPU process.
* Source/WebKit/UIProcess/WebPageProxy.h:
* Source/WebKit/UIProcess/WebPageProxyInternals.h:
* Source/WebKit/UIProcess/WebProcessPool.cpp:
(WebKit::WebProcessPool::processDidFinishLaunching): Granted existing media
capabilities to the new
WebContent process.
(WebKit::WebProcessPool::disconnectProcess): Invalidated existing grants for
the process that
disconnected.
* Source/WebKit/UIProcess/WebProcessPool.h:
* Source/WebKit/WebKit.xcodeproj/project.pbxproj:
Canonical link: https://commits.webkit.org/271761@main
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes