1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file. 4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/renderer/media/cdm_session_adapter.h" 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/bind.h" 8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/logging.h" 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/memory/weak_ptr.h" 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/stl_util.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/renderer/media/crypto/content_decryption_module_factory.h" 126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/renderer/media/crypto/key_systems.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/renderer/media/webcontentdecryptionmodulesession_impl.h" 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "media/base/cdm_promise.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "media/base/media_keys.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "url/gurl.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace content { 19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const char kMediaEME[] = "Media.EME."; 216e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const char kDot[] = "."; 226e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 23e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen MurdochCdmSessionAdapter::CdmSessionAdapter() : 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_BROWSER_CDMS) 25e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch cdm_id_(0), 26e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif 27e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch weak_ptr_factory_(this) {} 28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)CdmSessionAdapter::~CdmSessionAdapter() {} 30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)bool CdmSessionAdapter::Initialize( 32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(ENABLE_PEPPER_CDMS) 33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const CreatePepperCdmCB& create_pepper_cdm_cb, 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#elif defined(ENABLE_BROWSER_CDMS) 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RendererCdmManager* manager, 36e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch#endif // defined(ENABLE_PEPPER_CDMS) 37e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const std::string& key_system, 38e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const GURL& security_origin) { 396e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) key_system_uma_prefix_ = kMediaEME + KeySystemNameForUMA(key_system) + kDot; 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) base::WeakPtr<CdmSessionAdapter> weak_this = weak_ptr_factory_.GetWeakPtr(); 41e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch media_keys_ = ContentDecryptionModuleFactory::Create( 42e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch key_system, 43e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch security_origin, 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(ENABLE_PEPPER_CDMS) 45e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch create_pepper_cdm_cb, 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#elif defined(ENABLE_BROWSER_CDMS) 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) manager, 48e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch &cdm_id_, 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif // defined(ENABLE_PEPPER_CDMS) 50e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch base::Bind(&CdmSessionAdapter::OnSessionMessage, weak_this), 51e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch base::Bind(&CdmSessionAdapter::OnSessionReady, weak_this), 52e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch base::Bind(&CdmSessionAdapter::OnSessionClosed, weak_this), 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&CdmSessionAdapter::OnSessionError, weak_this), 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&CdmSessionAdapter::OnSessionKeysChange, weak_this), 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&CdmSessionAdapter::OnSessionExpirationUpdate, weak_this)); 56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Success if |media_keys_| created. 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return media_keys_; 59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid CdmSessionAdapter::SetServerCertificate( 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const uint8* server_certificate, 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int server_certificate_length, 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<media::SimpleCdmPromise> promise) { 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_keys_->SetServerCertificate( 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci server_certificate, server_certificate_length, promise.Pass()); 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 69116680a4aac90f2aa7413d9095a592090648e557Ben MurdochWebContentDecryptionModuleSessionImpl* CdmSessionAdapter::CreateSession() { 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return new WebContentDecryptionModuleSessionImpl(this); 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool CdmSessionAdapter::RegisterSession( 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& web_session_id, 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::WeakPtr<WebContentDecryptionModuleSessionImpl> session) { 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // If this session ID is already registered, don't register it again. 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (ContainsKey(sessions_, web_session_id)) 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) sessions_[web_session_id] = session; 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return true; 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid CdmSessionAdapter::UnregisterSession(const std::string& web_session_id) { 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(ContainsKey(sessions_, web_session_id)); 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) sessions_.erase(web_session_id); 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmSessionAdapter::InitializeNewSession( 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& init_data_type, 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const uint8* init_data, 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int init_data_length, 93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media::MediaKeys::SessionType session_type, 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<media::NewSessionCdmPromise> promise) { 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media_keys_->CreateSession(init_data_type, 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) init_data, 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) init_data_length, 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) session_type, 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) promise.Pass()); 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 101a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmSessionAdapter::UpdateSession( 103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& web_session_id, 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const uint8* response, 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int response_length, 106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<media::SimpleCdmPromise> promise) { 107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media_keys_->UpdateSession( 108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) web_session_id, response, response_length, promise.Pass()); 109a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 110a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid CdmSessionAdapter::CloseSession( 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& web_session_id, 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<media::SimpleCdmPromise> promise) { 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_keys_->CloseSession(web_session_id, promise.Pass()); 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid CdmSessionAdapter::RemoveSession( 118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& web_session_id, 119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<media::SimpleCdmPromise> promise) { 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_keys_->RemoveSession(web_session_id, promise.Pass()); 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid CdmSessionAdapter::GetUsableKeyIds( 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& web_session_id, 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<media::KeyIdsPromise> promise) { 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci media_keys_->GetUsableKeyIds(web_session_id, promise.Pass()); 127a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 128a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 129a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)media::Decryptor* CdmSessionAdapter::GetDecryptor() { 130a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return media_keys_->GetDecryptor(); 131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 132a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const std::string& CdmSessionAdapter::GetKeySystemUMAPrefix() const { 1346e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return key_system_uma_prefix_; 1356e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1366e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#if defined(ENABLE_BROWSER_CDMS) 138e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdochint CdmSessionAdapter::GetCdmId() const { 139e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch return cdm_id_; 140e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch} 141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#endif // defined(ENABLE_BROWSER_CDMS) 142a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmSessionAdapter::OnSessionMessage(const std::string& web_session_id, 144a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::vector<uint8>& message, 145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& destination_url) { 146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) WebContentDecryptionModuleSessionImpl* session = GetSession(web_session_id); 147a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DLOG_IF(WARNING, !session) << __FUNCTION__ << " for unknown session " 148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) << web_session_id; 149a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (session) 150a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) session->OnSessionMessage(message, destination_url); 151a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid CdmSessionAdapter::OnSessionKeysChange(const std::string& web_session_id, 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool has_additional_usable_key) { 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebContentDecryptionModuleSessionImpl* session = GetSession(web_session_id); 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DLOG_IF(WARNING, !session) << __FUNCTION__ << " for unknown session " 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << web_session_id; 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (session) 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci session->OnSessionKeysChange(has_additional_usable_key); 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid CdmSessionAdapter::OnSessionExpirationUpdate( 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::string& web_session_id, 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const base::Time& new_expiry_time) { 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci WebContentDecryptionModuleSessionImpl* session = GetSession(web_session_id); 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DLOG_IF(WARNING, !session) << __FUNCTION__ << " for unknown session " 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << web_session_id; 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (session) 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci session->OnSessionExpirationUpdate(new_expiry_time); 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 172f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmSessionAdapter::OnSessionReady(const std::string& web_session_id) { 173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) WebContentDecryptionModuleSessionImpl* session = GetSession(web_session_id); 174a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DLOG_IF(WARNING, !session) << __FUNCTION__ << " for unknown session " 175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) << web_session_id; 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (session) 177a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) session->OnSessionReady(); 178a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 179a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 180f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmSessionAdapter::OnSessionClosed(const std::string& web_session_id) { 181f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) WebContentDecryptionModuleSessionImpl* session = GetSession(web_session_id); 182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DLOG_IF(WARNING, !session) << __FUNCTION__ << " for unknown session " 183f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) << web_session_id; 184a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (session) 185a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) session->OnSessionClosed(); 186a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 187a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 188f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void CdmSessionAdapter::OnSessionError( 189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& web_session_id, 190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) media::MediaKeys::Exception exception_code, 191f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) uint32 system_code, 192f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& error_message) { 193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) WebContentDecryptionModuleSessionImpl* session = GetSession(web_session_id); 194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DLOG_IF(WARNING, !session) << __FUNCTION__ << " for unknown session " 195f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) << web_session_id; 196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (session) 197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) session->OnSessionError(exception_code, system_code, error_message); 198a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 199a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)WebContentDecryptionModuleSessionImpl* CdmSessionAdapter::GetSession( 201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const std::string& web_session_id) { 202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Since session objects may get garbage collected, it is possible that there 203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // are events coming back from the CDM and the session has been unregistered. 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // We can not tell if the CDM is firing events at sessions that never existed. 205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SessionMap::iterator session = sessions_.find(web_session_id); 206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return (session != sessions_.end()) ? session->second.get() : NULL; 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 208a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 209a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} // namespace content 210