Title: [271405] trunk/Source
Revision
271405
Author
[email protected]
Date
2021-01-12 09:20:08 -0800 (Tue, 12 Jan 2021)

Log Message

[Cocoa] Support key rotation with HLS-backed encrypted media streams
https://bugs.webkit.org/show_bug.cgi?id=220493
<rdar://68227709>

Reviewed by Eric Carlson.

Source/WebCore:

Support key rotation through AVContentKeySession by explicitly handling unexpected key requests
submitted through the new -contentKeySession:didProvideContentKeyRequests:forInitializationData:.
Rotation was previously handled in the delegate method -contentKeySession:didProvideContentKeyRequest,
but that method is no longer called after the replacement delegate method was implemented, and
that method never handled "skd://" style initialization data.

Update the helper method, initTypeForRequest(), to detect "skd://" identifiers and correctly identify
those sessions as "skd".

Add a new helper method, initializationDataForRequest(), which will package the AVContentKeySession's
identifier as initialization data.

Drive-by Fix: Fixing this bug causes the default key group to update it's identifier, which causes an assert
when the group in question isn't any of those associated with an existing MediaKeySession, so handle that case
explicitly.

Drive-by Fix 2: Sometimes, when GPUP is enabled for media, we will get spurious mediaPlayerEngineUpdated()
calls which cause cdmInstanceAttached() to be called multiple times for the same player, triggering an ASSERT.
If called twice with the same CDM, just return early rather than ASSERTing.

* platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.h:
* platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.mm:
(WebCore::initTypeForRequest):
(WebCore::initializationDataForRequest):
(WebCore::CDMInstanceFairPlayStreamingAVFObjC::takeUnexpectedKeyRequestForInitializationData):
(WebCore::CDMInstanceFairPlayStreamingAVFObjC::didProvideRequest):
(WebCore::CDMInstanceFairPlayStreamingAVFObjC::didProvideRequests):
(WebCore::CDMInstanceFairPlayStreamingAVFObjC::handleUnexpectedRequests):
(WebCore::CDMInstanceFairPlayStreamingAVFObjC::groupSessionIdentifierChanged):
* platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm:
(WebCore::MediaSourcePrivateAVFObjC::cdmInstanceAttached):

Source/WebCore/PAL:

* pal/spi/cocoa/AVFoundationSPI.h:

Source/WebKit:

Support handling the "unexpectedInitializationDataReceived()" client callback from within the GPUP.

* DerivedSources-input.xcfilelist:
* DerivedSources-output.xcfilelist:
* DerivedSources.make:
* GPUProcess/media/RemoteCDMInstanceProxy.cpp:
(WebKit::RemoteCDMInstanceProxy::create):
(WebKit::RemoteCDMInstanceProxy::RemoteCDMInstanceProxy):
(WebKit::RemoteCDMInstanceProxy::~RemoteCDMInstanceProxy):
(WebKit::RemoteCDMInstanceProxy::unrequestedInitializationDataReceived):
* GPUProcess/media/RemoteCDMInstanceProxy.h:
* GPUProcess/media/RemoteCDMProxy.cpp:
(WebKit::RemoteCDMProxy::createInstance):
* WebKit.xcodeproj/project.pbxproj:
* WebProcess/GPU/media/RemoteCDMInstance.cpp:
(WebKit::RemoteCDMInstance::RemoteCDMInstance):
(WebKit::RemoteCDMInstance::~RemoteCDMInstance):
(WebKit::RemoteCDMInstance::unrequestedInitializationDataReceived):
* WebProcess/GPU/media/RemoteCDMInstance.h:
* WebProcess/GPU/media/RemoteCDMInstance.messages.in: Added.

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (271404 => 271405)


--- trunk/Source/WebCore/ChangeLog	2021-01-12 17:00:21 UTC (rev 271404)
+++ trunk/Source/WebCore/ChangeLog	2021-01-12 17:20:08 UTC (rev 271405)
@@ -1,3 +1,43 @@
+2021-01-12  Jer Noble  <[email protected]>
+
+        [Cocoa] Support key rotation with HLS-backed encrypted media streams
+        https://bugs.webkit.org/show_bug.cgi?id=220493
+        <rdar://68227709>
+
+        Reviewed by Eric Carlson.
+
+        Support key rotation through AVContentKeySession by explicitly handling unexpected key requests
+        submitted through the new -contentKeySession:didProvideContentKeyRequests:forInitializationData:.
+        Rotation was previously handled in the delegate method -contentKeySession:didProvideContentKeyRequest,
+        but that method is no longer called after the replacement delegate method was implemented, and
+        that method never handled "skd://" style initialization data.
+
+        Update the helper method, initTypeForRequest(), to detect "skd://" identifiers and correctly identify
+        those sessions as "skd".
+
+        Add a new helper method, initializationDataForRequest(), which will package the AVContentKeySession's
+        identifier as initialization data.
+
+        Drive-by Fix: Fixing this bug causes the default key group to update it's identifier, which causes an assert
+        when the group in question isn't any of those associated with an existing MediaKeySession, so handle that case
+        explicitly.
+
+        Drive-by Fix 2: Sometimes, when GPUP is enabled for media, we will get spurious mediaPlayerEngineUpdated()
+        calls which cause cdmInstanceAttached() to be called multiple times for the same player, triggering an ASSERT.
+        If called twice with the same CDM, just return early rather than ASSERTing.
+
+        * platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.h:
+        * platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.mm:
+        (WebCore::initTypeForRequest):
+        (WebCore::initializationDataForRequest):
+        (WebCore::CDMInstanceFairPlayStreamingAVFObjC::takeUnexpectedKeyRequestForInitializationData):
+        (WebCore::CDMInstanceFairPlayStreamingAVFObjC::didProvideRequest):
+        (WebCore::CDMInstanceFairPlayStreamingAVFObjC::didProvideRequests):
+        (WebCore::CDMInstanceFairPlayStreamingAVFObjC::handleUnexpectedRequests):
+        (WebCore::CDMInstanceFairPlayStreamingAVFObjC::groupSessionIdentifierChanged):
+        * platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm:
+        (WebCore::MediaSourcePrivateAVFObjC::cdmInstanceAttached):
+
 2021-01-12  Youenn Fablet  <[email protected]>
 
         Safari Networking high % CPU when Caches/WebKit/ServiceWorkers folder not writable

Modified: trunk/Source/WebCore/PAL/ChangeLog (271404 => 271405)


--- trunk/Source/WebCore/PAL/ChangeLog	2021-01-12 17:00:21 UTC (rev 271404)
+++ trunk/Source/WebCore/PAL/ChangeLog	2021-01-12 17:20:08 UTC (rev 271405)
@@ -1,3 +1,13 @@
+2021-01-12  Jer Noble  <[email protected]>
+
+        [Cocoa] Support key rotation with HLS-backed encrypted media streams
+        https://bugs.webkit.org/show_bug.cgi?id=220493
+        <rdar://68227709>
+
+        Reviewed by Eric Carlson.
+
+        * pal/spi/cocoa/AVFoundationSPI.h:
+
 2021-01-08  Commit Queue  <[email protected]>
 
         Unreviewed, reverting r271331.

Modified: trunk/Source/WebCore/PAL/pal/spi/cocoa/AVFoundationSPI.h (271404 => 271405)


--- trunk/Source/WebCore/PAL/pal/spi/cocoa/AVFoundationSPI.h	2021-01-12 17:00:21 UTC (rev 271404)
+++ trunk/Source/WebCore/PAL/pal/spi/cocoa/AVFoundationSPI.h	2021-01-12 17:20:08 UTC (rev 271405)
@@ -200,6 +200,7 @@
 @end
 
 @interface AVContentKeySession (AVContentKeyGroup_Support)
+@property (readonly, nullable) AVContentKeyReportGroup *defaultContentKeyGroup;
 - (nonnull AVContentKeyReportGroup *)makeContentKeyGroup;
 @end
 

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.h (271404 => 271405)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.h	2021-01-12 17:00:21 UTC (rev 271404)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.h	2021-01-12 17:20:08 UTC (rev 271405)
@@ -120,6 +120,8 @@
     CDMInstanceSessionFairPlayStreamingAVFObjC* sessionForRequest(AVContentKeyRequest*) const;
 
 private:
+    void handleUnexpectedRequests(Vector<RetainPtr<AVContentKeyRequest>>&&);
+
 #if !RELEASE_LOG_DISABLED
     WTF::Logger* loggerPtr() const { return m_logger.get(); };
     const void* logIdentifier() const { return m_logIdentifier; }

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.mm (271404 => 271405)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.mm	2021-01-12 17:00:21 UTC (rev 271404)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.mm	2021-01-12 17:20:08 UTC (rev 271405)
@@ -196,6 +196,9 @@
 
 static AtomString initTypeForRequest(AVContentKeyRequest* request)
 {
+    if ([request.identifier isKindOfClass:NSString.class] && [request.identifier hasPrefix:@"skd://"])
+        return CDMPrivateFairPlayStreaming::skdName();
+
     if (![request respondsToSelector:@selector(options)]) {
         // AVContentKeyRequest.options was added in 10.14.4; if we are running on a previous version
         // we don't have support for 'cenc' anyway, so just assume 'sinf'.
@@ -215,6 +218,17 @@
     return AtomString(nsInitType);
 }
 
+static Ref<SharedBuffer> initializationDataForRequest(AVContentKeyRequest* request)
+{
+    if (!request)
+        return SharedBuffer::create();
+
+    if (initTypeForRequest(request) == CDMPrivateFairPlayStreaming::skdName())
+        return SharedBuffer::create([request.identifier dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]);
+
+    return SharedBuffer::create(request.initializationData);
+}
+
 CDMInstanceFairPlayStreamingAVFObjC::CDMInstanceFairPlayStreamingAVFObjC() = default;
 
 #if !RELEASE_LOG_DISABLED
@@ -257,8 +271,8 @@
     for (auto requestIter = m_unexpectedKeyRequests.begin(); requestIter != m_unexpectedKeyRequests.end(); ++requestIter) {
         auto& request = *requestIter;
         auto requestType = initTypeForRequest(request.get());
-        auto* requestInitData  = request.get().initializationData;
-        if (initDataType != requestType || initData != SharedBuffer::create(requestInitData))
+        auto requestInitData = initializationDataForRequest(request.get());
+        if (initDataType != requestType || initData != requestInitData)
             continue;
 
         return m_unexpectedKeyRequests.take(requestIter);
@@ -444,10 +458,7 @@
 
     DEBUG_LOG_IF_POSSIBLE(LOGIDENTIFIER, "- Unexpected request");
 
-    m_unexpectedKeyRequests.add(request);
-
-    if (m_client)
-        m_client->unrequestedInitializationDataReceived(initTypeForRequest(request), SharedBuffer::create(request.initializationData));
+    handleUnexpectedRequests({{ request }});
 }
 
 void CDMInstanceFairPlayStreamingAVFObjC::didProvideRequests(Vector<RetainPtr<AVContentKeyRequest>>&& requests)
@@ -457,10 +468,20 @@
         return;
     }
 
-    ASSERT_NOT_REACHED();
-    ERROR_LOG_IF_POSSIBLE(LOGIDENTIFIER, "- no responsible session; dropping");
+    handleUnexpectedRequests(WTFMove(requests));
 }
 
+void CDMInstanceFairPlayStreamingAVFObjC::handleUnexpectedRequests(Vector<RetainPtr<AVContentKeyRequest>>&& requests)
+{
+    while (!requests.isEmpty()) {
+        auto request = requests.takeLast();
+        m_unexpectedKeyRequests.add(request);
+
+        if (m_client)
+            m_client->unrequestedInitializationDataReceived(initTypeForRequest(request.get()), initializationDataForRequest(request.get()));
+    }
+}
+
 void CDMInstanceFairPlayStreamingAVFObjC::didProvideRenewingRequest(AVContentKeyRequest *request)
 {
     if (auto* session = sessionForRequest(request)) {
@@ -524,6 +545,11 @@
 
 void CDMInstanceFairPlayStreamingAVFObjC::groupSessionIdentifierChanged(AVContentKeyReportGroup* group, NSData *sessionIdentifier)
 {
+    if (group == [m_session defaultContentKeyGroup]) {
+        INFO_LOG_IF_POSSIBLE(LOGIDENTIFIER, "- default unused group identifier changed; dropping");
+        return;
+    }
+
     if (auto* session = sessionForGroup(group)) {
         session->groupSessionIdentifierChanged(group, sessionIdentifier);
         return;

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm (271404 => 271405)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm	2021-01-12 17:00:21 UTC (rev 271404)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm	2021-01-12 17:20:08 UTC (rev 271405)
@@ -277,6 +277,9 @@
 #if ENABLE(ENCRYPTED_MEDIA)
 void MediaSourcePrivateAVFObjC::cdmInstanceAttached(CDMInstance& instance)
 {
+    if (m_cdmInstance.get() == &instance)
+        return;
+
     ASSERT(!m_cdmInstance);
     m_cdmInstance = &instance;
     for (auto& sourceBuffer : m_sourceBuffers)

Modified: trunk/Source/WebKit/CMakeLists.txt (271404 => 271405)


--- trunk/Source/WebKit/CMakeLists.txt	2021-01-12 17:00:21 UTC (rev 271404)
+++ trunk/Source/WebKit/CMakeLists.txt	2021-01-12 17:20:08 UTC (rev 271405)
@@ -228,6 +228,7 @@
     WebProcess/GPU/media/MediaSourcePrivateRemote
     WebProcess/GPU/media/RemoteAudioSession
     WebProcess/GPU/media/RemoteAudioSourceProviderManager
+    WebProcess/GPU/media/RemoteCDMInstance
     WebProcess/GPU/media/RemoteCDMInstanceSession
     WebProcess/GPU/media/RemoteLegacyCDMSession
     WebProcess/GPU/media/SourceBufferPrivateRemote

Modified: trunk/Source/WebKit/ChangeLog (271404 => 271405)


--- trunk/Source/WebKit/ChangeLog	2021-01-12 17:00:21 UTC (rev 271404)
+++ trunk/Source/WebKit/ChangeLog	2021-01-12 17:20:08 UTC (rev 271405)
@@ -1,3 +1,32 @@
+2021-01-12  Jer Noble  <[email protected]>
+
+        [Cocoa] Support key rotation with HLS-backed encrypted media streams
+        https://bugs.webkit.org/show_bug.cgi?id=220493
+        <rdar://68227709>
+
+        Reviewed by Eric Carlson.
+
+        Support handling the "unexpectedInitializationDataReceived()" client callback from within the GPUP.
+
+        * DerivedSources-input.xcfilelist:
+        * DerivedSources-output.xcfilelist:
+        * DerivedSources.make:
+        * GPUProcess/media/RemoteCDMInstanceProxy.cpp:
+        (WebKit::RemoteCDMInstanceProxy::create):
+        (WebKit::RemoteCDMInstanceProxy::RemoteCDMInstanceProxy):
+        (WebKit::RemoteCDMInstanceProxy::~RemoteCDMInstanceProxy):
+        (WebKit::RemoteCDMInstanceProxy::unrequestedInitializationDataReceived):
+        * GPUProcess/media/RemoteCDMInstanceProxy.h:
+        * GPUProcess/media/RemoteCDMProxy.cpp:
+        (WebKit::RemoteCDMProxy::createInstance):
+        * WebKit.xcodeproj/project.pbxproj:
+        * WebProcess/GPU/media/RemoteCDMInstance.cpp:
+        (WebKit::RemoteCDMInstance::RemoteCDMInstance):
+        (WebKit::RemoteCDMInstance::~RemoteCDMInstance):
+        (WebKit::RemoteCDMInstance::unrequestedInitializationDataReceived):
+        * WebProcess/GPU/media/RemoteCDMInstance.h:
+        * WebProcess/GPU/media/RemoteCDMInstance.messages.in: Added.
+
 2021-01-12  Youenn Fablet  <[email protected]>
 
         Unmuting a track in case of end of interruption by another web process tab is not working well with capture muting icons

Modified: trunk/Source/WebKit/DerivedSources-input.xcfilelist (271404 => 271405)


--- trunk/Source/WebKit/DerivedSources-input.xcfilelist	2021-01-12 17:00:21 UTC (rev 271404)
+++ trunk/Source/WebKit/DerivedSources-input.xcfilelist	2021-01-12 17:20:08 UTC (rev 271405)
@@ -143,6 +143,7 @@
 $(PROJECT_DIR)/WebProcess/GPU/media/MediaSourcePrivateRemote.messages.in
 $(PROJECT_DIR)/WebProcess/GPU/media/RemoteAudioSession.messages.in
 $(PROJECT_DIR)/WebProcess/GPU/media/RemoteAudioSourceProviderManager.messages.in
+$(PROJECT_DIR)/WebProcess/GPU/media/RemoteCDMInstance.messages.in
 $(PROJECT_DIR)/WebProcess/GPU/media/RemoteCDMInstanceSession.messages.in
 $(PROJECT_DIR)/WebProcess/GPU/media/RemoteLegacyCDMSession.messages.in
 $(PROJECT_DIR)/WebProcess/GPU/media/SourceBufferPrivateRemote.messages.in

Modified: trunk/Source/WebKit/DerivedSources-output.xcfilelist (271404 => 271405)


--- trunk/Source/WebKit/DerivedSources-output.xcfilelist	2021-01-12 17:00:21 UTC (rev 271404)
+++ trunk/Source/WebKit/DerivedSources-output.xcfilelist	2021-01-12 17:20:08 UTC (rev 271405)
@@ -162,6 +162,9 @@
 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/RemoteCDMFactoryProxyMessageReceiver.cpp
 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/RemoteCDMFactoryProxyMessages.h
 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/RemoteCDMFactoryProxyMessagesReplies.h
+$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/RemoteCDMInstanceMessageReceiver.cpp
+$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/RemoteCDMInstanceMessages.h
+$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/RemoteCDMInstanceMessagesReplies.h
 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/RemoteCDMInstanceProxyMessageReceiver.cpp
 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/RemoteCDMInstanceProxyMessages.h
 $(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/RemoteCDMInstanceProxyMessagesReplies.h

Modified: trunk/Source/WebKit/DerivedSources.make (271404 => 271405)


--- trunk/Source/WebKit/DerivedSources.make	2021-01-12 17:00:21 UTC (rev 271404)
+++ trunk/Source/WebKit/DerivedSources.make	2021-01-12 17:20:08 UTC (rev 271405)
@@ -180,6 +180,7 @@
 	WebProcess/GPU/media/MediaSourcePrivateRemote \
 	WebProcess/GPU/media/RemoteAudioSession \
 	WebProcess/GPU/media/RemoteAudioSourceProviderManager \
+	WebProcess/GPU/media/RemoteCDMInstance \
 	WebProcess/GPU/media/RemoteCDMInstanceSession \
 	WebProcess/GPU/media/RemoteLegacyCDMSession \
 	WebProcess/GPU/media/SourceBufferPrivateRemote \

Modified: trunk/Source/WebKit/GPUProcess/media/RemoteCDMInstanceProxy.cpp (271404 => 271405)


--- trunk/Source/WebKit/GPUProcess/media/RemoteCDMInstanceProxy.cpp	2021-01-12 17:00:21 UTC (rev 271404)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteCDMInstanceProxy.cpp	2021-01-12 17:20:08 UTC (rev 271405)
@@ -29,6 +29,7 @@
 #if ENABLE(GPU_PROCESS) && ENABLE(ENCRYPTED_MEDIA)
 
 #include "RemoteCDMInstanceConfiguration.h"
+#include "RemoteCDMInstanceMessages.h"
 #include "RemoteCDMInstanceSessionProxy.h"
 #include "SharedBufferCopy.h"
 #include <WebCore/CDMInstance.h>
@@ -37,23 +38,37 @@
 
 using namespace WebCore;
 
-std::unique_ptr<RemoteCDMInstanceProxy> RemoteCDMInstanceProxy::create(WeakPtr<RemoteCDMProxy>&& cdm, Ref<CDMInstance>&& priv)
+std::unique_ptr<RemoteCDMInstanceProxy> RemoteCDMInstanceProxy::create(WeakPtr<RemoteCDMProxy>&& cdm, Ref<CDMInstance>&& priv, RemoteCDMInstanceIdentifier identifier)
 {
     auto configuration = makeUniqueRefWithoutFastMallocCheck<RemoteCDMInstanceConfiguration, RemoteCDMInstanceConfiguration&&>({
         priv->keySystem(),
     });
-    return std::unique_ptr<RemoteCDMInstanceProxy>(new RemoteCDMInstanceProxy(WTFMove(cdm), WTFMove(priv), WTFMove(configuration)));
+    return std::unique_ptr<RemoteCDMInstanceProxy>(new RemoteCDMInstanceProxy(WTFMove(cdm), WTFMove(priv), WTFMove(configuration), identifier));
 }
 
-RemoteCDMInstanceProxy::RemoteCDMInstanceProxy(WeakPtr<RemoteCDMProxy>&& cdm, Ref<CDMInstance>&& priv, UniqueRef<RemoteCDMInstanceConfiguration>&& configuration)
+RemoteCDMInstanceProxy::RemoteCDMInstanceProxy(WeakPtr<RemoteCDMProxy>&& cdm, Ref<CDMInstance>&& priv, UniqueRef<RemoteCDMInstanceConfiguration>&& configuration, RemoteCDMInstanceIdentifier identifier)
     : m_cdm(WTFMove(cdm))
     , m_instance(WTFMove(priv))
     , m_configuration(WTFMove(configuration))
+    , m_identifier(identifier)
 {
+    m_instance->setClient(makeWeakPtr<CDMInstanceClient>(this));
 }
 
-RemoteCDMInstanceProxy::~RemoteCDMInstanceProxy() = default;
+RemoteCDMInstanceProxy::~RemoteCDMInstanceProxy()
+{
+    m_instance->clearClient();
+}
 
+void RemoteCDMInstanceProxy::unrequestedInitializationDataReceived(const String& type, Ref<SharedBuffer>&& initData)
+{
+    if (!m_cdm)
+        return;
+
+    if (auto* factory = m_cdm->factory())
+        factory->gpuConnectionToWebProcess().connection().send(Messages::RemoteCDMInstance::UnrequestedInitializationDataReceived(type, WTFMove(initData)), m_identifier);
+}
+
 void RemoteCDMInstanceProxy::initializeWithConfiguration(const WebCore::CDMKeySystemConfiguration& configuration, AllowDistinctiveIdentifiers allowDistinctiveIdentifiers, AllowPersistentState allowPersistentState, CompletionHandler<void(SuccessValue)>&& completion)
 {
     m_instance->initializeWithConfiguration(configuration, allowDistinctiveIdentifiers, allowPersistentState, WTFMove(completion));

Modified: trunk/Source/WebKit/GPUProcess/media/RemoteCDMInstanceProxy.h (271404 => 271405)


--- trunk/Source/WebKit/GPUProcess/media/RemoteCDMInstanceProxy.h	2021-01-12 17:00:21 UTC (rev 271404)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteCDMInstanceProxy.h	2021-01-12 17:20:08 UTC (rev 271405)
@@ -50,9 +50,9 @@
 struct RemoteCDMInstanceConfiguration;
 class RemoteCDMInstanceSessionProxy;
 
-class RemoteCDMInstanceProxy : private IPC::MessageReceiver  {
+class RemoteCDMInstanceProxy : public WebCore::CDMInstanceClient, private IPC::MessageReceiver  {
 public:
-    static std::unique_ptr<RemoteCDMInstanceProxy> create(WeakPtr<RemoteCDMProxy>&&, Ref<WebCore::CDMInstance>&&);
+    static std::unique_ptr<RemoteCDMInstanceProxy> create(WeakPtr<RemoteCDMProxy>&&, Ref<WebCore::CDMInstance>&&, RemoteCDMInstanceIdentifier);
     ~RemoteCDMInstanceProxy();
 
     const RemoteCDMInstanceConfiguration& configuration() const { return m_configuration.get(); }
@@ -60,8 +60,11 @@
 
 private:
     friend class RemoteCDMFactoryProxy;
-    RemoteCDMInstanceProxy(WeakPtr<RemoteCDMProxy>&&, Ref<WebCore::CDMInstance>&&, UniqueRef<RemoteCDMInstanceConfiguration>&&);
+    RemoteCDMInstanceProxy(WeakPtr<RemoteCDMProxy>&&, Ref<WebCore::CDMInstance>&&, UniqueRef<RemoteCDMInstanceConfiguration>&&, RemoteCDMInstanceIdentifier);
 
+    // CDMInstanceClient
+    void unrequestedInitializationDataReceived(const String&, Ref<WebCore::SharedBuffer>&&) final;
+
     // IPC::MessageReceiver
     void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
     void didReceiveSyncMessage(IPC::Connection&, IPC::Decoder&, std::unique_ptr<IPC::Encoder>&) final;
@@ -79,6 +82,7 @@
     WeakPtr<RemoteCDMProxy> m_cdm;
     Ref<WebCore::CDMInstance> m_instance;
     UniqueRef<RemoteCDMInstanceConfiguration> m_configuration;
+    RemoteCDMInstanceIdentifier m_identifier;
     HashMap<RemoteCDMInstanceSessionIdentifier, std::unique_ptr<RemoteCDMInstanceSessionProxy>> m_sessions;
 };
 

Modified: trunk/Source/WebKit/GPUProcess/media/RemoteCDMProxy.cpp (271404 => 271405)


--- trunk/Source/WebKit/GPUProcess/media/RemoteCDMProxy.cpp	2021-01-12 17:00:21 UTC (rev 271404)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteCDMProxy.cpp	2021-01-12 17:20:08 UTC (rev 271405)
@@ -90,8 +90,8 @@
         completion({ }, { });
         return;
     }
-    auto instance = RemoteCDMInstanceProxy::create(makeWeakPtr(this), privateInstance.releaseNonNull());
     auto identifier = RemoteCDMInstanceIdentifier::generate();
+    auto instance = RemoteCDMInstanceProxy::create(makeWeakPtr(this), privateInstance.releaseNonNull(), identifier);
     RemoteCDMInstanceConfiguration configuration = instance->configuration();
     m_factory->addInstance(identifier, WTFMove(instance));
     completion(identifier, WTFMove(configuration));

Modified: trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj (271404 => 271405)


--- trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2021-01-12 17:00:21 UTC (rev 271404)
+++ trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj	2021-01-12 17:20:08 UTC (rev 271405)
@@ -1861,6 +1861,7 @@
 		CDA29A291CBEB67A00901CCF /* PlaybackSessionManagerMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = CDA29A251CBEB67A00901CCF /* PlaybackSessionManagerMessages.h */; };
 		CDA29A2A1CBEB67A00901CCF /* PlaybackSessionManagerProxyMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDA29A261CBEB67A00901CCF /* PlaybackSessionManagerProxyMessageReceiver.cpp */; };
 		CDA29A2B1CBEB67A00901CCF /* PlaybackSessionManagerProxyMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = CDA29A271CBEB67A00901CCF /* PlaybackSessionManagerProxyMessages.h */; };
+		CDA6D45125A989C7004B1DF6 /* RemoteCDMInstanceMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDA6D45025A989AC004B1DF6 /* RemoteCDMInstanceMessageReceiver.cpp */; };
 		CDA93DB022F8BCF400490A69 /* FullscreenTouchSecheuristicParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = CDA93DAE22F8BCF300490A69 /* FullscreenTouchSecheuristicParameters.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		CDA93DB122F8BCF400490A69 /* FullscreenTouchSecheuristicParameters.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDA93DAF22F8BCF400490A69 /* FullscreenTouchSecheuristicParameters.cpp */; };
 		CDAC20B423FB58F20021DEE3 /* RemoteCDMInstanceProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = CDAC20B223FB58F20021DEE3 /* RemoteCDMInstanceProxy.h */; };
@@ -5525,6 +5526,9 @@
 		CDA29A251CBEB67A00901CCF /* PlaybackSessionManagerMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlaybackSessionManagerMessages.h; path = DerivedSources/WebKit2/PlaybackSessionManagerMessages.h; sourceTree = BUILT_PRODUCTS_DIR; };
 		CDA29A261CBEB67A00901CCF /* PlaybackSessionManagerProxyMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PlaybackSessionManagerProxyMessageReceiver.cpp; path = DerivedSources/WebKit2/PlaybackSessionManagerProxyMessageReceiver.cpp; sourceTree = BUILT_PRODUCTS_DIR; };
 		CDA29A271CBEB67A00901CCF /* PlaybackSessionManagerProxyMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlaybackSessionManagerProxyMessages.h; path = DerivedSources/WebKit2/PlaybackSessionManagerProxyMessages.h; sourceTree = BUILT_PRODUCTS_DIR; };
+		CDA6D44D25A97158004B1DF6 /* RemoteCDMInstance.messages.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = RemoteCDMInstance.messages.in; sourceTree = "<group>"; };
+		CDA6D44F25A989AC004B1DF6 /* RemoteCDMInstanceMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemoteCDMInstanceMessages.h; sourceTree = "<group>"; };
+		CDA6D45025A989AC004B1DF6 /* RemoteCDMInstanceMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RemoteCDMInstanceMessageReceiver.cpp; sourceTree = "<group>"; };
 		CDA93DAE22F8BCF300490A69 /* FullscreenTouchSecheuristicParameters.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FullscreenTouchSecheuristicParameters.h; path = ios/fullscreen/FullscreenTouchSecheuristicParameters.h; sourceTree = "<group>"; };
 		CDA93DAF22F8BCF400490A69 /* FullscreenTouchSecheuristicParameters.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FullscreenTouchSecheuristicParameters.cpp; path = ios/fullscreen/FullscreenTouchSecheuristicParameters.cpp; sourceTree = "<group>"; };
 		CDA9593A2412B17500910EEF /* RemoteMediaSessionHelper.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = RemoteMediaSessionHelper.cpp; sourceTree = "<group>"; };
@@ -5962,6 +5966,7 @@
 				CDAC20C223FC2F750021DEE3 /* RemoteCDMIdentifier.h */,
 				CDAC20BB23FC2F740021DEE3 /* RemoteCDMInstance.cpp */,
 				CDAC20B723FC2F730021DEE3 /* RemoteCDMInstance.h */,
+				CDA6D44D25A97158004B1DF6 /* RemoteCDMInstance.messages.in */,
 				CDAC20C123FC2F750021DEE3 /* RemoteCDMInstanceConfiguration.h */,
 				CDAC20B623FC2F730021DEE3 /* RemoteCDMInstanceIdentifier.h */,
 				CDAC20BE23FC2F740021DEE3 /* RemoteCDMInstanceSession.cpp */,
@@ -10764,6 +10769,8 @@
 				CDAC20F223FC383A0021DEE3 /* RemoteCDMFactoryProxyMessageReceiver.cpp */,
 				CDAC20F323FC383A0021DEE3 /* RemoteCDMFactoryProxyMessages.h */,
 				CDAC20EE23FC38390021DEE3 /* RemoteCDMFactoryProxyMessagesReplies.h */,
+				CDA6D45025A989AC004B1DF6 /* RemoteCDMInstanceMessageReceiver.cpp */,
+				CDA6D44F25A989AC004B1DF6 /* RemoteCDMInstanceMessages.h */,
 				CDAC20F523FC383B0021DEE3 /* RemoteCDMInstanceProxyMessageReceiver.cpp */,
 				CDAC20EB23FC38380021DEE3 /* RemoteCDMInstanceProxyMessages.h */,
 				CDAC20F623FC383B0021DEE3 /* RemoteCDMInstanceProxyMessagesReplies.h */,
@@ -13774,6 +13781,7 @@
 				2D11B7642126A282006F8878 /* UnifiedSource10.cpp in Sources */,
 				2D11B7632126A282006F8878 /* UnifiedSource10-mm.mm in Sources */,
 				2D11B7652126A282006F8878 /* UnifiedSource11-mm.mm in Sources */,
+				CDA6D45125A989C7004B1DF6 /* RemoteCDMInstanceMessageReceiver.cpp in Sources */,
 				2D11B7662126A282006F8878 /* UnifiedSource11.cpp in Sources */,
 				2D11B7672126A282006F8878 /* UnifiedSource12-mm.mm in Sources */,
 				2D11B7682126A282006F8878 /* UnifiedSource12.cpp in Sources */,

Modified: trunk/Source/WebKit/WebProcess/GPU/media/RemoteCDMInstance.cpp (271404 => 271405)


--- trunk/Source/WebKit/WebProcess/GPU/media/RemoteCDMInstance.cpp	2021-01-12 17:00:21 UTC (rev 271404)
+++ trunk/Source/WebKit/WebProcess/GPU/media/RemoteCDMInstance.cpp	2021-01-12 17:20:08 UTC (rev 271405)
@@ -29,6 +29,7 @@
 #if ENABLE(GPU_PROCESS) && ENABLE(ENCRYPTED_MEDIA)
 
 #include "GPUProcessConnection.h"
+#include "RemoteCDMInstanceMessages.h"
 #include "RemoteCDMInstanceProxyMessages.h"
 #include "RemoteCDMInstanceSession.h"
 #include "RemoteCDMInstanceSessionIdentifier.h"
@@ -51,8 +52,22 @@
     , m_identifier(WTFMove(identifier))
     , m_configuration(WTFMove(configuration))
 {
+    if (m_factory)
+        m_factory->gpuProcessConnection().messageReceiverMap().addMessageReceiver(Messages::RemoteCDMInstance::messageReceiverName(), m_identifier.toUInt64(), *this);
 }
 
+RemoteCDMInstance::~RemoteCDMInstance()
+{
+    if (m_factory)
+        m_factory->gpuProcessConnection().messageReceiverMap().removeMessageReceiver(Messages::RemoteCDMInstance::messageReceiverName(), m_identifier.toUInt64());
+}
+
+void RemoteCDMInstance::unrequestedInitializationDataReceived(const String& type, IPC::SharedBufferCopy&& initData)
+{
+    if (m_client && initData.buffer())
+        m_client->unrequestedInitializationDataReceived(type, initData.buffer().releaseNonNull());
+}
+
 void RemoteCDMInstance::initializeWithConfiguration(const WebCore::CDMKeySystemConfiguration& configuration, AllowDistinctiveIdentifiers distinctiveIdentifiers, AllowPersistentState persistentState, SuccessCallback&& callback)
 {
     if (!m_factory) {

Modified: trunk/Source/WebKit/WebProcess/GPU/media/RemoteCDMInstance.h (271404 => 271405)


--- trunk/Source/WebKit/WebProcess/GPU/media/RemoteCDMInstance.h	2021-01-12 17:00:21 UTC (rev 271404)
+++ trunk/Source/WebKit/WebProcess/GPU/media/RemoteCDMInstance.h	2021-01-12 17:20:08 UTC (rev 271405)
@@ -27,16 +27,18 @@
 
 #if ENABLE(GPU_PROCESS) && ENABLE(ENCRYPTED_MEDIA)
 
+#include "MessageReceiver.h"
 #include "RemoteCDMFactory.h"
 #include "RemoteCDMInstanceConfiguration.h"
 #include "RemoteCDMInstanceIdentifier.h"
+#include "SharedBufferCopy.h"
 #include <WebCore/CDMInstance.h>
 
 namespace WebKit {
 
-class RemoteCDMInstance final : public WebCore::CDMInstance {
+class RemoteCDMInstance final : public WebCore::CDMInstance, private IPC::MessageReceiver {
 public:
-    virtual ~RemoteCDMInstance() = default;
+    virtual ~RemoteCDMInstance();
     static Ref<RemoteCDMInstance> create(WeakPtr<RemoteCDMFactory>&&, RemoteCDMInstanceIdentifier&&, RemoteCDMInstanceConfiguration&&);
 
     const RemoteCDMInstanceIdentifier& identifier() const { return m_identifier; }
@@ -44,6 +46,12 @@
 private:
     RemoteCDMInstance(WeakPtr<RemoteCDMFactory>&&, RemoteCDMInstanceIdentifier&&, RemoteCDMInstanceConfiguration&&);
 
+    // IPC::MessageReceiver
+    void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
+
+    // Messages
+    void unrequestedInitializationDataReceived(const String&, IPC::SharedBufferCopy&&);
+
     ImplementationType implementationType() const final { return ImplementationType::Remote; }
     void initializeWithConfiguration(const WebCore::CDMKeySystemConfiguration&, AllowDistinctiveIdentifiers, AllowPersistentState, SuccessCallback&&) final;
     void setServerCertificate(Ref<WebCore::SharedBuffer>&&, SuccessCallback&&) final;
@@ -50,10 +58,13 @@
     void setStorageDirectory(const String&) final;
     const String& keySystem() const final { return m_configuration.keySystem; }
     RefPtr<WebCore::CDMInstanceSession> createSession() final;
+    void setClient(WeakPtr<WebCore::CDMInstanceClient>&& client) final { m_client = WTFMove(client); }
+    void clearClient() final { m_client.clear(); }
 
     WeakPtr<RemoteCDMFactory> m_factory;
     RemoteCDMInstanceIdentifier m_identifier;
     RemoteCDMInstanceConfiguration m_configuration;
+    WeakPtr<WebCore::CDMInstanceClient> m_client;
 };
 
 }

Added: trunk/Source/WebKit/WebProcess/GPU/media/RemoteCDMInstance.messages.in (0 => 271405)


--- trunk/Source/WebKit/WebProcess/GPU/media/RemoteCDMInstance.messages.in	                        (rev 0)
+++ trunk/Source/WebKit/WebProcess/GPU/media/RemoteCDMInstance.messages.in	2021-01-12 17:20:08 UTC (rev 271405)
@@ -0,0 +1,30 @@
+# Copyright (C) 2020 Apple Inc. All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGE.
+
+#if ENABLE(GPU_PROCESS) && ENABLE(ENCRYPTED_MEDIA)
+
+messages -> RemoteCDMInstance NotRefCounted {
+    UnrequestedInitializationDataReceived(String type, IPC::SharedBufferCopy initData)
+}
+
+#endif
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to