Changeset 221816 in webkit


Ignore:
Timestamp:
Sep 9, 2017 5:42:05 AM (7 years ago)
Author:
zandobersek@gmail.com
Message:

[EME] MediaKeySession: handle MediaKeys association through a WeakPtr
https://bugs.webkit.org/show_bug.cgi?id=176584

Reviewed by Xabier Rodriguez-Calvar.

Don't keep a raw pointer to the originating MediaKeys object in
MediaKeySession that gets nulled out once MediaKeys is destroyed.
Instead, make MediaKeys a WeakPtrFactory and use a WeakPtr<MediaKeys>
object to maintain the association between MediaKeySession and
MediaKeys.

  • Modules/encryptedmedia/MediaKeySession.cpp:

(WebCore::MediaKeySession::create):
(WebCore::MediaKeySession::MediaKeySession):
(WebCore::MediaKeySession::detachKeys): Deleted.

  • Modules/encryptedmedia/MediaKeySession.h:
  • Modules/encryptedmedia/MediaKeys.cpp:

(WebCore::MediaKeys::MediaKeys):
(WebCore::MediaKeys::createSession):
(WebCore::MediaKeys::~MediaKeys): Deleted.

  • Modules/encryptedmedia/MediaKeys.h:
Location:
trunk/Source/WebCore
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r221815 r221816  
     12017-09-09  Zan Dobersek  <zdobersek@igalia.com>
     2
     3        [EME] MediaKeySession: handle MediaKeys association through a WeakPtr
     4        https://bugs.webkit.org/show_bug.cgi?id=176584
     5
     6        Reviewed by Xabier Rodriguez-Calvar.
     7
     8        Don't keep a raw pointer to the originating MediaKeys object in
     9        MediaKeySession that gets nulled out once MediaKeys is destroyed.
     10        Instead, make MediaKeys a WeakPtrFactory and use a WeakPtr<MediaKeys>
     11        object to maintain the association between MediaKeySession and
     12        MediaKeys.
     13
     14        * Modules/encryptedmedia/MediaKeySession.cpp:
     15        (WebCore::MediaKeySession::create):
     16        (WebCore::MediaKeySession::MediaKeySession):
     17        (WebCore::MediaKeySession::detachKeys): Deleted.
     18        * Modules/encryptedmedia/MediaKeySession.h:
     19        * Modules/encryptedmedia/MediaKeys.cpp:
     20        (WebCore::MediaKeys::MediaKeys):
     21        (WebCore::MediaKeys::createSession):
     22        (WebCore::MediaKeys::~MediaKeys): Deleted.
     23        * Modules/encryptedmedia/MediaKeys.h:
     24
    1252017-09-09  Zan Dobersek  <zdobersek@igalia.com>
    226
  • trunk/Source/WebCore/Modules/encryptedmedia/MediaKeySession.cpp

    r220905 r221816  
    4646namespace WebCore {
    4747
    48 Ref<MediaKeySession> MediaKeySession::create(ScriptExecutionContext& context, MediaKeys& keys, MediaKeySessionType sessionType, bool useDistinctiveIdentifier, Ref<CDM>&& implementation, Ref<CDMInstance>&& instance)
    49 {
    50     auto session = adoptRef(*new MediaKeySession(context, keys, sessionType, useDistinctiveIdentifier, WTFMove(implementation), WTFMove(instance)));
     48Ref<MediaKeySession> MediaKeySession::create(ScriptExecutionContext& context, WeakPtr<MediaKeys>&& keys, MediaKeySessionType sessionType, bool useDistinctiveIdentifier, Ref<CDM>&& implementation, Ref<CDMInstance>&& instance)
     49{
     50    auto session = adoptRef(*new MediaKeySession(context, WTFMove(keys), sessionType, useDistinctiveIdentifier, WTFMove(implementation), WTFMove(instance)));
    5151    session->suspendIfNeeded();
    5252    return session;
    5353}
    5454
    55 MediaKeySession::MediaKeySession(ScriptExecutionContext& context, MediaKeys& keys, MediaKeySessionType sessionType, bool useDistinctiveIdentifier, Ref<CDM>&& implementation, Ref<CDMInstance>&& instance)
     55MediaKeySession::MediaKeySession(ScriptExecutionContext& context, WeakPtr<MediaKeys>&& keys, MediaKeySessionType sessionType, bool useDistinctiveIdentifier, Ref<CDM>&& implementation, Ref<CDMInstance>&& instance)
    5656    : ActiveDOMObject(&context)
    57     , m_keys(&keys)
     57    , m_keys(WTFMove(keys))
    5858    , m_expiration(std::numeric_limits<double>::quiet_NaN())
    5959    , m_keyStatuses(MediaKeyStatusMap::create(*this))
     
    9191{
    9292    m_keyStatuses->detachSession();
    93 }
    94 
    95 void MediaKeySession::detachKeys()
    96 {
    97     m_keys = nullptr;
    9893}
    9994
  • trunk/Source/WebCore/Modules/encryptedmedia/MediaKeySession.h

    r220962 r221816  
    5555class MediaKeySession final : public RefCounted<MediaKeySession>, public EventTargetWithInlineData, public ActiveDOMObject {
    5656public:
    57     static Ref<MediaKeySession> create(ScriptExecutionContext&, MediaKeys&, MediaKeySessionType, bool useDistinctiveIdentifier, Ref<CDM>&&, Ref<CDMInstance>&&);
     57    static Ref<MediaKeySession> create(ScriptExecutionContext&, WeakPtr<MediaKeys>&&, MediaKeySessionType, bool useDistinctiveIdentifier, Ref<CDM>&&, Ref<CDMInstance>&&);
    5858    virtual ~MediaKeySession();
    5959
     
    6262
    6363    bool isClosed() const { return m_closed; }
    64     void detachKeys();
    6564
    6665    const String& sessionId() const;
     
    8079
    8180private:
    82     MediaKeySession(ScriptExecutionContext&, MediaKeys&, MediaKeySessionType, bool useDistinctiveIdentifier, Ref<CDM>&&, Ref<CDMInstance>&&);
     81    MediaKeySession(ScriptExecutionContext&, WeakPtr<MediaKeys>&&, MediaKeySessionType, bool useDistinctiveIdentifier, Ref<CDM>&&, Ref<CDMInstance>&&);
    8382    void enqueueMessage(MediaKeyMessageType, const SharedBuffer&);
    8483    void updateKeyStatuses(CDMInstance::KeyStatusVector&&);
     
    9897    void stop() override;
    9998
    100     MediaKeys* m_keys;
     99    WeakPtr<MediaKeys> m_keys;
    101100    String m_sessionId;
    102101    double m_expiration;
  • trunk/Source/WebCore/Modules/encryptedmedia/MediaKeys.cpp

    r220962 r221816  
    4646    , m_implementation(WTFMove(implementation))
    4747    , m_instance(WTFMove(instance))
     48    , m_weakPtrFactory(this)
    4849{
    4950}
    5051
    51 MediaKeys::~MediaKeys()
    52 {
    53     for (auto& session : m_sessions)
    54         session->detachKeys();
    55 }
     52MediaKeys::~MediaKeys() = default;
    5653
    5754ExceptionOr<Ref<MediaKeySession>> MediaKeys::createSession(ScriptExecutionContext& context, MediaKeySessionType sessionType)
     
    7269    // NOTE: Continued in MediaKeySession.
    7370    // 4. Return session.
    74     auto session = MediaKeySession::create(context, *this, sessionType, m_useDistinctiveIdentifier, m_implementation.copyRef(), m_instance.copyRef());
     71    auto session = MediaKeySession::create(context, m_weakPtrFactory.createWeakPtr(), sessionType, m_useDistinctiveIdentifier, m_implementation.copyRef(), m_instance.copyRef());
    7572    m_sessions.append(session.copyRef());
    7673    return WTFMove(session);
  • trunk/Source/WebCore/Modules/encryptedmedia/MediaKeys.h

    r220962 r221816  
    3737#include <wtf/Ref.h>
    3838#include <wtf/RefCounted.h>
     39#include <wtf/WeakPtr.h>
    3940
    4041namespace WebCore {
     
    7677    Ref<CDMInstance> m_instance;
    7778
     79    WeakPtrFactory<MediaKeys> m_weakPtrFactory;
    7880    Vector<Ref<MediaKeySession>> m_sessions;
    7981    Vector<CDMClient*> m_cdmClients;
Note: See TracChangeset for help on using the changeset viewer.