Changeset 271405 in webkit


Ignore:
Timestamp:
Jan 12, 2021 9:20:08 AM (3 years ago)
Author:
jer.noble@apple.com
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.
Location:
trunk/Source
Files:
1 added
17 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r271404 r271405  
     12021-01-12  Jer Noble  <jer.noble@apple.com>
     2
     3        [Cocoa] Support key rotation with HLS-backed encrypted media streams
     4        https://bugs.webkit.org/show_bug.cgi?id=220493
     5        <rdar://68227709>
     6
     7        Reviewed by Eric Carlson.
     8
     9        Support key rotation through AVContentKeySession by explicitly handling unexpected key requests
     10        submitted through the new -contentKeySession:didProvideContentKeyRequests:forInitializationData:.
     11        Rotation was previously handled in the delegate method -contentKeySession:didProvideContentKeyRequest,
     12        but that method is no longer called after the replacement delegate method was implemented, and
     13        that method never handled "skd://" style initialization data.
     14
     15        Update the helper method, initTypeForRequest(), to detect "skd://" identifiers and correctly identify
     16        those sessions as "skd".
     17
     18        Add a new helper method, initializationDataForRequest(), which will package the AVContentKeySession's
     19        identifier as initialization data.
     20
     21        Drive-by Fix: Fixing this bug causes the default key group to update it's identifier, which causes an assert
     22        when the group in question isn't any of those associated with an existing MediaKeySession, so handle that case
     23        explicitly.
     24
     25        Drive-by Fix 2: Sometimes, when GPUP is enabled for media, we will get spurious mediaPlayerEngineUpdated()
     26        calls which cause cdmInstanceAttached() to be called multiple times for the same player, triggering an ASSERT.
     27        If called twice with the same CDM, just return early rather than ASSERTing.
     28
     29        * platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.h:
     30        * platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.mm:
     31        (WebCore::initTypeForRequest):
     32        (WebCore::initializationDataForRequest):
     33        (WebCore::CDMInstanceFairPlayStreamingAVFObjC::takeUnexpectedKeyRequestForInitializationData):
     34        (WebCore::CDMInstanceFairPlayStreamingAVFObjC::didProvideRequest):
     35        (WebCore::CDMInstanceFairPlayStreamingAVFObjC::didProvideRequests):
     36        (WebCore::CDMInstanceFairPlayStreamingAVFObjC::handleUnexpectedRequests):
     37        (WebCore::CDMInstanceFairPlayStreamingAVFObjC::groupSessionIdentifierChanged):
     38        * platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm:
     39        (WebCore::MediaSourcePrivateAVFObjC::cdmInstanceAttached):
     40
    1412021-01-12  Youenn Fablet  <youenn@apple.com>
    242
  • trunk/Source/WebCore/PAL/ChangeLog

    r271333 r271405  
     12021-01-12  Jer Noble  <jer.noble@apple.com>
     2
     3        [Cocoa] Support key rotation with HLS-backed encrypted media streams
     4        https://bugs.webkit.org/show_bug.cgi?id=220493
     5        <rdar://68227709>
     6
     7        Reviewed by Eric Carlson.
     8
     9        * pal/spi/cocoa/AVFoundationSPI.h:
     10
    1112021-01-08  Commit Queue  <commit-queue@webkit.org>
    212
  • trunk/Source/WebCore/PAL/pal/spi/cocoa/AVFoundationSPI.h

    r270872 r271405  
    201201
    202202@interface AVContentKeySession (AVContentKeyGroup_Support)
     203@property (readonly, nullable) AVContentKeyReportGroup *defaultContentKeyGroup;
    203204- (nonnull AVContentKeyReportGroup *)makeContentKeyGroup;
    204205@end
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.h

    r270872 r271405  
    121121
    122122private:
     123    void handleUnexpectedRequests(Vector<RetainPtr<AVContentKeyRequest>>&&);
     124
    123125#if !RELEASE_LOG_DISABLED
    124126    WTF::Logger* loggerPtr() const { return m_logger.get(); };
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/CDMInstanceFairPlayStreamingAVFObjC.mm

    r270872 r271405  
    197197static AtomString initTypeForRequest(AVContentKeyRequest* request)
    198198{
     199    if ([request.identifier isKindOfClass:NSString.class] && [request.identifier hasPrefix:@"skd://"])
     200        return CDMPrivateFairPlayStreaming::skdName();
     201
    199202    if (![request respondsToSelector:@selector(options)]) {
    200203        // AVContentKeyRequest.options was added in 10.14.4; if we are running on a previous version
     
    216219}
    217220
     221static Ref<SharedBuffer> initializationDataForRequest(AVContentKeyRequest* request)
     222{
     223    if (!request)
     224        return SharedBuffer::create();
     225
     226    if (initTypeForRequest(request) == CDMPrivateFairPlayStreaming::skdName())
     227        return SharedBuffer::create([request.identifier dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES]);
     228
     229    return SharedBuffer::create(request.initializationData);
     230}
     231
    218232CDMInstanceFairPlayStreamingAVFObjC::CDMInstanceFairPlayStreamingAVFObjC() = default;
    219233
     
    258272        auto& request = *requestIter;
    259273        auto requestType = initTypeForRequest(request.get());
    260         auto* requestInitData  = request.get().initializationData;
    261         if (initDataType != requestType || initData != SharedBuffer::create(requestInitData))
     274        auto requestInitData = initializationDataForRequest(request.get());
     275        if (initDataType != requestType || initData != requestInitData)
    262276            continue;
    263277
     
    445459    DEBUG_LOG_IF_POSSIBLE(LOGIDENTIFIER, "- Unexpected request");
    446460
    447     m_unexpectedKeyRequests.add(request);
    448 
    449     if (m_client)
    450         m_client->unrequestedInitializationDataReceived(initTypeForRequest(request), SharedBuffer::create(request.initializationData));
     461    handleUnexpectedRequests({{ request }});
    451462}
    452463
     
    458469    }
    459470
    460     ASSERT_NOT_REACHED();
    461     ERROR_LOG_IF_POSSIBLE(LOGIDENTIFIER, "- no responsible session; dropping");
     471    handleUnexpectedRequests(WTFMove(requests));
     472}
     473
     474void CDMInstanceFairPlayStreamingAVFObjC::handleUnexpectedRequests(Vector<RetainPtr<AVContentKeyRequest>>&& requests)
     475{
     476    while (!requests.isEmpty()) {
     477        auto request = requests.takeLast();
     478        m_unexpectedKeyRequests.add(request);
     479
     480        if (m_client)
     481            m_client->unrequestedInitializationDataReceived(initTypeForRequest(request.get()), initializationDataForRequest(request.get()));
     482    }
    462483}
    463484
     
    525546void CDMInstanceFairPlayStreamingAVFObjC::groupSessionIdentifierChanged(AVContentKeyReportGroup* group, NSData *sessionIdentifier)
    526547{
     548    if (group == [m_session defaultContentKeyGroup]) {
     549        INFO_LOG_IF_POSSIBLE(LOGIDENTIFIER, "- default unused group identifier changed; dropping");
     550        return;
     551    }
     552
    527553    if (auto* session = sessionForGroup(group)) {
    528554        session->groupSessionIdentifierChanged(group, sessionIdentifier);
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaSourcePrivateAVFObjC.mm

    r270805 r271405  
    278278void MediaSourcePrivateAVFObjC::cdmInstanceAttached(CDMInstance& instance)
    279279{
     280    if (m_cdmInstance.get() == &instance)
     281        return;
     282
    280283    ASSERT(!m_cdmInstance);
    281284    m_cdmInstance = &instance;
  • trunk/Source/WebKit/CMakeLists.txt

    r270907 r271405  
    229229    WebProcess/GPU/media/RemoteAudioSession
    230230    WebProcess/GPU/media/RemoteAudioSourceProviderManager
     231    WebProcess/GPU/media/RemoteCDMInstance
    231232    WebProcess/GPU/media/RemoteCDMInstanceSession
    232233    WebProcess/GPU/media/RemoteLegacyCDMSession
  • trunk/Source/WebKit/ChangeLog

    r271401 r271405  
     12021-01-12  Jer Noble  <jer.noble@apple.com>
     2
     3        [Cocoa] Support key rotation with HLS-backed encrypted media streams
     4        https://bugs.webkit.org/show_bug.cgi?id=220493
     5        <rdar://68227709>
     6
     7        Reviewed by Eric Carlson.
     8
     9        Support handling the "unexpectedInitializationDataReceived()" client callback from within the GPUP.
     10
     11        * DerivedSources-input.xcfilelist:
     12        * DerivedSources-output.xcfilelist:
     13        * DerivedSources.make:
     14        * GPUProcess/media/RemoteCDMInstanceProxy.cpp:
     15        (WebKit::RemoteCDMInstanceProxy::create):
     16        (WebKit::RemoteCDMInstanceProxy::RemoteCDMInstanceProxy):
     17        (WebKit::RemoteCDMInstanceProxy::~RemoteCDMInstanceProxy):
     18        (WebKit::RemoteCDMInstanceProxy::unrequestedInitializationDataReceived):
     19        * GPUProcess/media/RemoteCDMInstanceProxy.h:
     20        * GPUProcess/media/RemoteCDMProxy.cpp:
     21        (WebKit::RemoteCDMProxy::createInstance):
     22        * WebKit.xcodeproj/project.pbxproj:
     23        * WebProcess/GPU/media/RemoteCDMInstance.cpp:
     24        (WebKit::RemoteCDMInstance::RemoteCDMInstance):
     25        (WebKit::RemoteCDMInstance::~RemoteCDMInstance):
     26        (WebKit::RemoteCDMInstance::unrequestedInitializationDataReceived):
     27        * WebProcess/GPU/media/RemoteCDMInstance.h:
     28        * WebProcess/GPU/media/RemoteCDMInstance.messages.in: Added.
     29
    1302021-01-12  Youenn Fablet  <youenn@apple.com>
    231
  • trunk/Source/WebKit/DerivedSources-input.xcfilelist

    r270907 r271405  
    144144$(PROJECT_DIR)/WebProcess/GPU/media/RemoteAudioSession.messages.in
    145145$(PROJECT_DIR)/WebProcess/GPU/media/RemoteAudioSourceProviderManager.messages.in
     146$(PROJECT_DIR)/WebProcess/GPU/media/RemoteCDMInstance.messages.in
    146147$(PROJECT_DIR)/WebProcess/GPU/media/RemoteCDMInstanceSession.messages.in
    147148$(PROJECT_DIR)/WebProcess/GPU/media/RemoteLegacyCDMSession.messages.in
  • trunk/Source/WebKit/DerivedSources-output.xcfilelist

    r270907 r271405  
    163163$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/RemoteCDMFactoryProxyMessages.h
    164164$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/RemoteCDMFactoryProxyMessagesReplies.h
     165$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/RemoteCDMInstanceMessageReceiver.cpp
     166$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/RemoteCDMInstanceMessages.h
     167$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/RemoteCDMInstanceMessagesReplies.h
    165168$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/RemoteCDMInstanceProxyMessageReceiver.cpp
    166169$(BUILT_PRODUCTS_DIR)/DerivedSources/WebKit2/RemoteCDMInstanceProxyMessages.h
  • trunk/Source/WebKit/DerivedSources.make

    r270907 r271405  
    181181        WebProcess/GPU/media/RemoteAudioSession \
    182182        WebProcess/GPU/media/RemoteAudioSourceProviderManager \
     183        WebProcess/GPU/media/RemoteCDMInstance \
    183184        WebProcess/GPU/media/RemoteCDMInstanceSession \
    184185        WebProcess/GPU/media/RemoteLegacyCDMSession \
  • trunk/Source/WebKit/GPUProcess/media/RemoteCDMInstanceProxy.cpp

    r266003 r271405  
    3030
    3131#include "RemoteCDMInstanceConfiguration.h"
     32#include "RemoteCDMInstanceMessages.h"
    3233#include "RemoteCDMInstanceSessionProxy.h"
    3334#include "SharedBufferCopy.h"
     
    3839using namespace WebCore;
    3940
    40 std::unique_ptr<RemoteCDMInstanceProxy> RemoteCDMInstanceProxy::create(WeakPtr<RemoteCDMProxy>&& cdm, Ref<CDMInstance>&& priv)
     41std::unique_ptr<RemoteCDMInstanceProxy> RemoteCDMInstanceProxy::create(WeakPtr<RemoteCDMProxy>&& cdm, Ref<CDMInstance>&& priv, RemoteCDMInstanceIdentifier identifier)
    4142{
    4243    auto configuration = makeUniqueRefWithoutFastMallocCheck<RemoteCDMInstanceConfiguration, RemoteCDMInstanceConfiguration&&>({
    4344        priv->keySystem(),
    4445    });
    45     return std::unique_ptr<RemoteCDMInstanceProxy>(new RemoteCDMInstanceProxy(WTFMove(cdm), WTFMove(priv), WTFMove(configuration)));
     46    return std::unique_ptr<RemoteCDMInstanceProxy>(new RemoteCDMInstanceProxy(WTFMove(cdm), WTFMove(priv), WTFMove(configuration), identifier));
    4647}
    4748
    48 RemoteCDMInstanceProxy::RemoteCDMInstanceProxy(WeakPtr<RemoteCDMProxy>&& cdm, Ref<CDMInstance>&& priv, UniqueRef<RemoteCDMInstanceConfiguration>&& configuration)
     49RemoteCDMInstanceProxy::RemoteCDMInstanceProxy(WeakPtr<RemoteCDMProxy>&& cdm, Ref<CDMInstance>&& priv, UniqueRef<RemoteCDMInstanceConfiguration>&& configuration, RemoteCDMInstanceIdentifier identifier)
    4950    : m_cdm(WTFMove(cdm))
    5051    , m_instance(WTFMove(priv))
    5152    , m_configuration(WTFMove(configuration))
     53    , m_identifier(identifier)
    5254{
     55    m_instance->setClient(makeWeakPtr<CDMInstanceClient>(this));
    5356}
    5457
    55 RemoteCDMInstanceProxy::~RemoteCDMInstanceProxy() = default;
     58RemoteCDMInstanceProxy::~RemoteCDMInstanceProxy()
     59{
     60    m_instance->clearClient();
     61}
     62
     63void RemoteCDMInstanceProxy::unrequestedInitializationDataReceived(const String& type, Ref<SharedBuffer>&& initData)
     64{
     65    if (!m_cdm)
     66        return;
     67
     68    if (auto* factory = m_cdm->factory())
     69        factory->gpuConnectionToWebProcess().connection().send(Messages::RemoteCDMInstance::UnrequestedInitializationDataReceived(type, WTFMove(initData)), m_identifier);
     70}
    5671
    5772void RemoteCDMInstanceProxy::initializeWithConfiguration(const WebCore::CDMKeySystemConfiguration& configuration, AllowDistinctiveIdentifiers allowDistinctiveIdentifiers, AllowPersistentState allowPersistentState, CompletionHandler<void(SuccessValue)>&& completion)
  • trunk/Source/WebKit/GPUProcess/media/RemoteCDMInstanceProxy.h

    r266003 r271405  
    5151class RemoteCDMInstanceSessionProxy;
    5252
    53 class RemoteCDMInstanceProxy : private IPC::MessageReceiver  {
     53class RemoteCDMInstanceProxy : public WebCore::CDMInstanceClient, private IPC::MessageReceiver  {
    5454public:
    55     static std::unique_ptr<RemoteCDMInstanceProxy> create(WeakPtr<RemoteCDMProxy>&&, Ref<WebCore::CDMInstance>&&);
     55    static std::unique_ptr<RemoteCDMInstanceProxy> create(WeakPtr<RemoteCDMProxy>&&, Ref<WebCore::CDMInstance>&&, RemoteCDMInstanceIdentifier);
    5656    ~RemoteCDMInstanceProxy();
    5757
     
    6161private:
    6262    friend class RemoteCDMFactoryProxy;
    63     RemoteCDMInstanceProxy(WeakPtr<RemoteCDMProxy>&&, Ref<WebCore::CDMInstance>&&, UniqueRef<RemoteCDMInstanceConfiguration>&&);
     63    RemoteCDMInstanceProxy(WeakPtr<RemoteCDMProxy>&&, Ref<WebCore::CDMInstance>&&, UniqueRef<RemoteCDMInstanceConfiguration>&&, RemoteCDMInstanceIdentifier);
     64
     65    // CDMInstanceClient
     66    void unrequestedInitializationDataReceived(const String&, Ref<WebCore::SharedBuffer>&&) final;
    6467
    6568    // IPC::MessageReceiver
     
    8083    Ref<WebCore::CDMInstance> m_instance;
    8184    UniqueRef<RemoteCDMInstanceConfiguration> m_configuration;
     85    RemoteCDMInstanceIdentifier m_identifier;
    8286    HashMap<RemoteCDMInstanceSessionIdentifier, std::unique_ptr<RemoteCDMInstanceSessionProxy>> m_sessions;
    8387};
  • trunk/Source/WebKit/GPUProcess/media/RemoteCDMProxy.cpp

    r267143 r271405  
    9191        return;
    9292    }
    93     auto instance = RemoteCDMInstanceProxy::create(makeWeakPtr(this), privateInstance.releaseNonNull());
    9493    auto identifier = RemoteCDMInstanceIdentifier::generate();
     94    auto instance = RemoteCDMInstanceProxy::create(makeWeakPtr(this), privateInstance.releaseNonNull(), identifier);
    9595    RemoteCDMInstanceConfiguration configuration = instance->configuration();
    9696    m_factory->addInstance(identifier, WTFMove(instance));
  • trunk/Source/WebKit/WebKit.xcodeproj/project.pbxproj

    r271253 r271405  
    18621862                CDA29A2A1CBEB67A00901CCF /* PlaybackSessionManagerProxyMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDA29A261CBEB67A00901CCF /* PlaybackSessionManagerProxyMessageReceiver.cpp */; };
    18631863                CDA29A2B1CBEB67A00901CCF /* PlaybackSessionManagerProxyMessages.h in Headers */ = {isa = PBXBuildFile; fileRef = CDA29A271CBEB67A00901CCF /* PlaybackSessionManagerProxyMessages.h */; };
     1864                CDA6D45125A989C7004B1DF6 /* RemoteCDMInstanceMessageReceiver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDA6D45025A989AC004B1DF6 /* RemoteCDMInstanceMessageReceiver.cpp */; };
    18641865                CDA93DB022F8BCF400490A69 /* FullscreenTouchSecheuristicParameters.h in Headers */ = {isa = PBXBuildFile; fileRef = CDA93DAE22F8BCF300490A69 /* FullscreenTouchSecheuristicParameters.h */; settings = {ATTRIBUTES = (Private, ); }; };
    18651866                CDA93DB122F8BCF400490A69 /* FullscreenTouchSecheuristicParameters.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDA93DAF22F8BCF400490A69 /* FullscreenTouchSecheuristicParameters.cpp */; };
     
    55265527                CDA29A261CBEB67A00901CCF /* PlaybackSessionManagerProxyMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = PlaybackSessionManagerProxyMessageReceiver.cpp; path = DerivedSources/WebKit2/PlaybackSessionManagerProxyMessageReceiver.cpp; sourceTree = BUILT_PRODUCTS_DIR; };
    55275528                CDA29A271CBEB67A00901CCF /* PlaybackSessionManagerProxyMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlaybackSessionManagerProxyMessages.h; path = DerivedSources/WebKit2/PlaybackSessionManagerProxyMessages.h; sourceTree = BUILT_PRODUCTS_DIR; };
     5529                CDA6D44D25A97158004B1DF6 /* RemoteCDMInstance.messages.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = RemoteCDMInstance.messages.in; sourceTree = "<group>"; };
     5530                CDA6D44F25A989AC004B1DF6 /* RemoteCDMInstanceMessages.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemoteCDMInstanceMessages.h; sourceTree = "<group>"; };
     5531                CDA6D45025A989AC004B1DF6 /* RemoteCDMInstanceMessageReceiver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RemoteCDMInstanceMessageReceiver.cpp; sourceTree = "<group>"; };
    55285532                CDA93DAE22F8BCF300490A69 /* FullscreenTouchSecheuristicParameters.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FullscreenTouchSecheuristicParameters.h; path = ios/fullscreen/FullscreenTouchSecheuristicParameters.h; sourceTree = "<group>"; };
    55295533                CDA93DAF22F8BCF400490A69 /* FullscreenTouchSecheuristicParameters.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = FullscreenTouchSecheuristicParameters.cpp; path = ios/fullscreen/FullscreenTouchSecheuristicParameters.cpp; sourceTree = "<group>"; };
     
    59635967                                CDAC20BB23FC2F740021DEE3 /* RemoteCDMInstance.cpp */,
    59645968                                CDAC20B723FC2F730021DEE3 /* RemoteCDMInstance.h */,
     5969                                CDA6D44D25A97158004B1DF6 /* RemoteCDMInstance.messages.in */,
    59655970                                CDAC20C123FC2F750021DEE3 /* RemoteCDMInstanceConfiguration.h */,
    59665971                                CDAC20B623FC2F730021DEE3 /* RemoteCDMInstanceIdentifier.h */,
     
    1076510770                                CDAC20F323FC383A0021DEE3 /* RemoteCDMFactoryProxyMessages.h */,
    1076610771                                CDAC20EE23FC38390021DEE3 /* RemoteCDMFactoryProxyMessagesReplies.h */,
     10772                                CDA6D45025A989AC004B1DF6 /* RemoteCDMInstanceMessageReceiver.cpp */,
     10773                                CDA6D44F25A989AC004B1DF6 /* RemoteCDMInstanceMessages.h */,
    1076710774                                CDAC20F523FC383B0021DEE3 /* RemoteCDMInstanceProxyMessageReceiver.cpp */,
    1076810775                                CDAC20EB23FC38380021DEE3 /* RemoteCDMInstanceProxyMessages.h */,
     
    1377513782                                2D11B7632126A282006F8878 /* UnifiedSource10-mm.mm in Sources */,
    1377613783                                2D11B7652126A282006F8878 /* UnifiedSource11-mm.mm in Sources */,
     13784                                CDA6D45125A989C7004B1DF6 /* RemoteCDMInstanceMessageReceiver.cpp in Sources */,
    1377713785                                2D11B7662126A282006F8878 /* UnifiedSource11.cpp in Sources */,
    1377813786                                2D11B7672126A282006F8878 /* UnifiedSource12-mm.mm in Sources */,
  • trunk/Source/WebKit/WebProcess/GPU/media/RemoteCDMInstance.cpp

    r268118 r271405  
    3030
    3131#include "GPUProcessConnection.h"
     32#include "RemoteCDMInstanceMessages.h"
    3233#include "RemoteCDMInstanceProxyMessages.h"
    3334#include "RemoteCDMInstanceSession.h"
     
    5253    , m_configuration(WTFMove(configuration))
    5354{
     55    if (m_factory)
     56        m_factory->gpuProcessConnection().messageReceiverMap().addMessageReceiver(Messages::RemoteCDMInstance::messageReceiverName(), m_identifier.toUInt64(), *this);
     57}
     58
     59RemoteCDMInstance::~RemoteCDMInstance()
     60{
     61    if (m_factory)
     62        m_factory->gpuProcessConnection().messageReceiverMap().removeMessageReceiver(Messages::RemoteCDMInstance::messageReceiverName(), m_identifier.toUInt64());
     63}
     64
     65void RemoteCDMInstance::unrequestedInitializationDataReceived(const String& type, IPC::SharedBufferCopy&& initData)
     66{
     67    if (m_client && initData.buffer())
     68        m_client->unrequestedInitializationDataReceived(type, initData.buffer().releaseNonNull());
    5469}
    5570
  • trunk/Source/WebKit/WebProcess/GPU/media/RemoteCDMInstance.h

    r257867 r271405  
    2828#if ENABLE(GPU_PROCESS) && ENABLE(ENCRYPTED_MEDIA)
    2929
     30#include "MessageReceiver.h"
    3031#include "RemoteCDMFactory.h"
    3132#include "RemoteCDMInstanceConfiguration.h"
    3233#include "RemoteCDMInstanceIdentifier.h"
     34#include "SharedBufferCopy.h"
    3335#include <WebCore/CDMInstance.h>
    3436
    3537namespace WebKit {
    3638
    37 class RemoteCDMInstance final : public WebCore::CDMInstance {
     39class RemoteCDMInstance final : public WebCore::CDMInstance, private IPC::MessageReceiver {
    3840public:
    39     virtual ~RemoteCDMInstance() = default;
     41    virtual ~RemoteCDMInstance();
    4042    static Ref<RemoteCDMInstance> create(WeakPtr<RemoteCDMFactory>&&, RemoteCDMInstanceIdentifier&&, RemoteCDMInstanceConfiguration&&);
    4143
     
    4547    RemoteCDMInstance(WeakPtr<RemoteCDMFactory>&&, RemoteCDMInstanceIdentifier&&, RemoteCDMInstanceConfiguration&&);
    4648
     49    // IPC::MessageReceiver
     50    void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
     51
     52    // Messages
     53    void unrequestedInitializationDataReceived(const String&, IPC::SharedBufferCopy&&);
     54
    4755    ImplementationType implementationType() const final { return ImplementationType::Remote; }
    4856    void initializeWithConfiguration(const WebCore::CDMKeySystemConfiguration&, AllowDistinctiveIdentifiers, AllowPersistentState, SuccessCallback&&) final;
     
    5159    const String& keySystem() const final { return m_configuration.keySystem; }
    5260    RefPtr<WebCore::CDMInstanceSession> createSession() final;
     61    void setClient(WeakPtr<WebCore::CDMInstanceClient>&& client) final { m_client = WTFMove(client); }
     62    void clearClient() final { m_client.clear(); }
    5363
    5464    WeakPtr<RemoteCDMFactory> m_factory;
    5565    RemoteCDMInstanceIdentifier m_identifier;
    5666    RemoteCDMInstanceConfiguration m_configuration;
     67    WeakPtr<WebCore::CDMInstanceClient> m_client;
    5768};
    5869
Note: See TracChangeset for help on using the changeset viewer.