Changeset 221816 in webkit
- Timestamp:
- Sep 9, 2017 5:42:05 AM (7 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r221815 r221816 1 2017-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 1 25 2017-09-09 Zan Dobersek <zdobersek@igalia.com> 2 26 -
trunk/Source/WebCore/Modules/encryptedmedia/MediaKeySession.cpp
r220905 r221816 46 46 namespace WebCore { 47 47 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)));48 Ref<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))); 51 51 session->suspendIfNeeded(); 52 52 return session; 53 53 } 54 54 55 MediaKeySession::MediaKeySession(ScriptExecutionContext& context, MediaKeys& keys, MediaKeySessionType sessionType, bool useDistinctiveIdentifier, Ref<CDM>&& implementation, Ref<CDMInstance>&& instance)55 MediaKeySession::MediaKeySession(ScriptExecutionContext& context, WeakPtr<MediaKeys>&& keys, MediaKeySessionType sessionType, bool useDistinctiveIdentifier, Ref<CDM>&& implementation, Ref<CDMInstance>&& instance) 56 56 : ActiveDOMObject(&context) 57 , m_keys( &keys)57 , m_keys(WTFMove(keys)) 58 58 , m_expiration(std::numeric_limits<double>::quiet_NaN()) 59 59 , m_keyStatuses(MediaKeyStatusMap::create(*this)) … … 91 91 { 92 92 m_keyStatuses->detachSession(); 93 }94 95 void MediaKeySession::detachKeys()96 {97 m_keys = nullptr;98 93 } 99 94 -
trunk/Source/WebCore/Modules/encryptedmedia/MediaKeySession.h
r220962 r221816 55 55 class MediaKeySession final : public RefCounted<MediaKeySession>, public EventTargetWithInlineData, public ActiveDOMObject { 56 56 public: 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>&&); 58 58 virtual ~MediaKeySession(); 59 59 … … 62 62 63 63 bool isClosed() const { return m_closed; } 64 void detachKeys();65 64 66 65 const String& sessionId() const; … … 80 79 81 80 private: 82 MediaKeySession(ScriptExecutionContext&, MediaKeys&, MediaKeySessionType, bool useDistinctiveIdentifier, Ref<CDM>&&, Ref<CDMInstance>&&);81 MediaKeySession(ScriptExecutionContext&, WeakPtr<MediaKeys>&&, MediaKeySessionType, bool useDistinctiveIdentifier, Ref<CDM>&&, Ref<CDMInstance>&&); 83 82 void enqueueMessage(MediaKeyMessageType, const SharedBuffer&); 84 83 void updateKeyStatuses(CDMInstance::KeyStatusVector&&); … … 98 97 void stop() override; 99 98 100 MediaKeys*m_keys;99 WeakPtr<MediaKeys> m_keys; 101 100 String m_sessionId; 102 101 double m_expiration; -
trunk/Source/WebCore/Modules/encryptedmedia/MediaKeys.cpp
r220962 r221816 46 46 , m_implementation(WTFMove(implementation)) 47 47 , m_instance(WTFMove(instance)) 48 , m_weakPtrFactory(this) 48 49 { 49 50 } 50 51 51 MediaKeys::~MediaKeys() 52 { 53 for (auto& session : m_sessions) 54 session->detachKeys(); 55 } 52 MediaKeys::~MediaKeys() = default; 56 53 57 54 ExceptionOr<Ref<MediaKeySession>> MediaKeys::createSession(ScriptExecutionContext& context, MediaKeySessionType sessionType) … … 72 69 // NOTE: Continued in MediaKeySession. 73 70 // 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()); 75 72 m_sessions.append(session.copyRef()); 76 73 return WTFMove(session); -
trunk/Source/WebCore/Modules/encryptedmedia/MediaKeys.h
r220962 r221816 37 37 #include <wtf/Ref.h> 38 38 #include <wtf/RefCounted.h> 39 #include <wtf/WeakPtr.h> 39 40 40 41 namespace WebCore { … … 76 77 Ref<CDMInstance> m_instance; 77 78 79 WeakPtrFactory<MediaKeys> m_weakPtrFactory; 78 80 Vector<Ref<MediaKeySession>> m_sessions; 79 81 Vector<CDMClient*> m_cdmClients;
Note: See TracChangeset
for help on using the changeset viewer.