[webkit-changes] [WebKit/WebKit] 7b6ea0: [iOS] Grant media capabilities to the WebContent a...

aestes noreply at github.com
Fri Dec 8 15:07:53 PST 2023


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 7b6ea01374235df040c52dfcd986447c7aec9aca
      https://github.com/WebKit/WebKit/commit/7b6ea01374235df040c52dfcd986447c7aec9aca
  Author: Andy Estes <aestes at apple.com>
  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




More information about the webkit-changes mailing list