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

Reply via email to