From 0e47c6148929f11a0eae9977cdb987b148ccae2b Mon Sep 17 00:00:00 2001 From: Marcin Mielczarczyk Date: Mon, 1 Dec 2025 10:03:57 +0100 Subject: [PATCH] ARRISEOS-48622: Don't release CDM when changing keys When setMediaKeys is being called with the new key, don't release CDM session as it seems that imediate CDM session creation after CDM destroy causes crash. --- Source/WebCore/Modules/encryptedmedia/MediaKeys.cpp | 4 ++++ Source/WebCore/Modules/encryptedmedia/MediaKeys.h | 1 + Source/WebCore/html/HTMLMediaElement.cpp | 3 +++ 3 files changed, 8 insertions(+) diff --git a/Source/WebCore/Modules/encryptedmedia/MediaKeys.cpp b/Source/WebCore/Modules/encryptedmedia/MediaKeys.cpp index 5dcaa2ae646e9..103f8e675b957 100644 --- a/Source/WebCore/Modules/encryptedmedia/MediaKeys.cpp +++ b/Source/WebCore/Modules/encryptedmedia/MediaKeys.cpp @@ -161,6 +161,10 @@ void MediaKeys::detachCDMClient(CDMClient& client) { ASSERT(m_cdmClients.contains(client)); m_cdmClients.remove(client); +} + +void MediaKeys::releaseCDM() +{ if (m_cdmClients.computesEmpty()) { m_instance->releaseCDM(); } diff --git a/Source/WebCore/Modules/encryptedmedia/MediaKeys.h b/Source/WebCore/Modules/encryptedmedia/MediaKeys.h index a4c5272601b3b..62c361b7e1d9f 100644 --- a/Source/WebCore/Modules/encryptedmedia/MediaKeys.h +++ b/Source/WebCore/Modules/encryptedmedia/MediaKeys.h @@ -70,6 +70,7 @@ class MediaKeys final void attachCDMClient(CDMClient&); void detachCDMClient(CDMClient&); + void releaseCDM(); void attemptToResumePlaybackOnClients(); bool hasOpenSessions() const; diff --git a/Source/WebCore/html/HTMLMediaElement.cpp b/Source/WebCore/html/HTMLMediaElement.cpp index c1cc3ee719e78..9331cc8d98279 100644 --- a/Source/WebCore/html/HTMLMediaElement.cpp +++ b/Source/WebCore/html/HTMLMediaElement.cpp @@ -608,6 +608,7 @@ HTMLMediaElement::~HTMLMediaElement() #if ENABLE(ENCRYPTED_MEDIA) if (m_mediaKeys) { m_mediaKeys->detachCDMClient(*this); + m_mediaKeys->releaseCDM(); if (m_player) m_player->cdmInstanceDetached(m_mediaKeys->cdmInstance()); } @@ -2813,6 +2814,7 @@ void HTMLMediaElement::setMediaKeys(MediaKeys* mediaKeys, Ref&& { // https://w3c.github.io/encrypted-media/#dom-htmlmediaelement-setmediakeys // W3C Editor's Draft 23 June 2017 + INFO_LOG(LOGIDENTIFIER); // 1. If this object's attaching media keys value is true, return a promise rejected with an InvalidStateError. if (m_attachingMediaKeys) { @@ -6100,6 +6102,7 @@ void HTMLMediaElement::stop() if (m_mediaKeys) { m_mediaKeys->detachCDMClient(*this); + m_mediaKeys->releaseCDM(); if (m_player) m_player->cdmInstanceDetached(m_mediaKeys->cdmInstance()); }