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