1eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Copyright 2013 The Chromium Authors. All rights reserved.
2eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// found in the LICENSE file.
4eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
5eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "content/renderer/media/webcontentdecryptionmodulesession_impl.h"
6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/bind.h"
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/callback_helpers.h"
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/logging.h"
10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/strings/string_util.h"
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "content/renderer/media/cdm_result_promise.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/renderer/media/cdm_session_adapter.h"
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "media/base/cdm_promise.h"
15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "third_party/WebKit/public/platform/WebURL.h"
16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace content {
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
196e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const char kCreateSessionUMAName[] = "CreateSession";
206e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccitypedef base::Callback<blink::WebContentDecryptionModuleResult::SessionStatus(
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::string& web_session_id)> SessionInitializedCB;
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass NewSessionCdmResultPromise : public CdmResultPromise<std::string> {
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public:
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NewSessionCdmResultPromise(blink::WebContentDecryptionModuleResult result,
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             std::string uma_name,
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                             const SessionInitializedCB& new_session_created_cb)
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      : CdmResultPromise<std::string>(result, uma_name),
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        new_session_created_cb_(new_session_created_cb) {}
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected:
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  virtual void OnResolve(const std::string& web_session_id) OVERRIDE {
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    blink::WebContentDecryptionModuleResult::SessionStatus status =
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        new_session_created_cb_.Run(web_session_id);
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    web_cdm_result_.completeWithSession(status);
37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private:
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  SessionInitializedCB new_session_created_cb_;
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci};
42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
43eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochWebContentDecryptionModuleSessionImpl::WebContentDecryptionModuleSessionImpl(
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    const scoped_refptr<CdmSessionAdapter>& adapter)
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    : adapter_(adapter),
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      is_closed_(false),
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      weak_ptr_factory_(this) {
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
49eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
50eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochWebContentDecryptionModuleSessionImpl::
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ~WebContentDecryptionModuleSessionImpl() {
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!web_session_id_.empty())
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    adapter_->UnregisterSession(web_session_id_);
54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
56116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentDecryptionModuleSessionImpl::setClientInterface(Client* client) {
57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  client_ = client;
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebString WebContentDecryptionModuleSessionImpl::sessionId() const {
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return blink::WebString::fromUTF8(web_session_id_);
62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentDecryptionModuleSessionImpl::initializeNewSession(
65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const blink::WebString& init_data_type,
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const uint8* init_data,
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    size_t init_data_length) {
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(jrummell): Remove once blink updated.
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NOTREACHED();
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
72a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentDecryptionModuleSessionImpl::update(const uint8* response,
73a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                                   size_t response_length) {
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(jrummell): Remove once blink updated.
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NOTREACHED();
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void WebContentDecryptionModuleSessionImpl::release() {
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(jrummell): Remove once blink updated.
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NOTREACHED();
81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
83116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentDecryptionModuleSessionImpl::initializeNewSession(
84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const blink::WebString& init_data_type,
85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const uint8* init_data,
86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    size_t init_data_length,
87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const blink::WebString& session_type,
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    blink::WebContentDecryptionModuleResult result) {
89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // TODO(ddorwin): Guard against this in supported types check and remove this.
91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Chromium only supports ASCII MIME types.
92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  if (!base::IsStringASCII(init_data_type)) {
93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    NOTREACHED();
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    std::string message = "The initialization data type " +
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          init_data_type.utf8() +
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                          " is not supported by the key system.";
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    result.completeWithError(
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        blink::WebContentDecryptionModuleExceptionNotSupportedError,
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        0,
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        blink::WebString::fromUTF8(message));
101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    return;
102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  }
103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  std::string init_data_type_as_ascii = base::UTF16ToASCII(init_data_type);
105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DLOG_IF(WARNING, init_data_type_as_ascii.find('/') != std::string::npos)
106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      << "init_data_type '" << init_data_type_as_ascii
107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      << "' may be a MIME type";
108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  adapter_->InitializeNewSession(
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      init_data_type_as_ascii,
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      init_data,
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      init_data_length,
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      media::MediaKeys::TEMPORARY_SESSION,
1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      scoped_ptr<media::NewSessionCdmPromise>(new NewSessionCdmResultPromise(
1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          result,
1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          adapter_->GetKeySystemUMAPrefix() + kCreateSessionUMAName,
1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          base::Bind(
1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              &WebContentDecryptionModuleSessionImpl::OnSessionInitialized,
1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci              base::Unretained(this)))));
120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
122116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentDecryptionModuleSessionImpl::update(
123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    const uint8* response,
124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    size_t response_length,
125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    blink::WebContentDecryptionModuleResult result) {
126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(response);
1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(!web_session_id_.empty());
128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  adapter_->UpdateSession(
1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      web_session_id_,
1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      response,
1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      response_length,
1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      scoped_ptr<media::SimpleCdmPromise>(new SimpleCdmResultPromise(result)));
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebContentDecryptionModuleSessionImpl::close(
1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    blink::WebContentDecryptionModuleResult result) {
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(!web_session_id_.empty());
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  adapter_->CloseSession(
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      web_session_id_,
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      scoped_ptr<media::SimpleCdmPromise>(new SimpleCdmResultPromise(result)));
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebContentDecryptionModuleSessionImpl::remove(
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    blink::WebContentDecryptionModuleResult result) {
1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(!web_session_id_.empty());
1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  adapter_->RemoveSession(
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      web_session_id_,
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      scoped_ptr<media::SimpleCdmPromise>(new SimpleCdmResultPromise(result)));
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebContentDecryptionModuleSessionImpl::getUsableKeyIds(
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    blink::WebContentDecryptionModuleResult result) {
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(!web_session_id_.empty());
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  adapter_->GetUsableKeyIds(
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      web_session_id_,
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      scoped_ptr<media::KeyIdsPromise>(
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci          new CdmResultPromise<media::KeyIdsVector>(result)));
158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
160116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebContentDecryptionModuleSessionImpl::release(
161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    blink::WebContentDecryptionModuleResult result) {
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  close(result);
163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
165a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentDecryptionModuleSessionImpl::OnSessionMessage(
166eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const std::vector<uint8>& message,
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const GURL& destination_url) {
168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  DCHECK(client_) << "Client not set before message event";
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  client_->message(
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      message.empty() ? NULL : &message[0], message.size(), destination_url);
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebContentDecryptionModuleSessionImpl::OnSessionKeysChange(
1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    bool has_additional_usable_key) {
1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(jrummell): Update this once Blink client supports this.
1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid WebContentDecryptionModuleSessionImpl::OnSessionExpirationUpdate(
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const base::Time& new_expiry_time) {
1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(jrummell): Update this once Blink client supports this.
1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The EME spec has expiration attribute as the time in milliseconds, so use
1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // InMillisecondsF() to convert.
1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
185a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentDecryptionModuleSessionImpl::OnSessionReady() {
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  client_->ready();
187a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
188a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
189a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentDecryptionModuleSessionImpl::OnSessionClosed() {
190f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (!is_closed_) {
191f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    is_closed_ = true;
192f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    client_->close();
193f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
194a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
195a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
196a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void WebContentDecryptionModuleSessionImpl::OnSessionError(
197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    media::MediaKeys::Exception exception_code,
198f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    uint32 system_code,
199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const std::string& error_message) {
200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Convert |exception_code| back to MediaKeyErrorCode if possible.
201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // TODO(jrummell): Update this conversion when promises flow
202f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // back into blink:: (as blink:: will have its own error definition).
203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  switch (exception_code) {
204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    case media::MediaKeys::CLIENT_ERROR:
205f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      client_->error(Client::MediaKeyErrorCodeClient, system_code);
206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      break;
207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    default:
208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      // This will include all other CDM4 errors and any error generated
209f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      // by CDM5 or later.
210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      client_->error(Client::MediaKeyErrorCodeUnknown, system_code);
211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      break;
212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
2151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciblink::WebContentDecryptionModuleResult::SessionStatus
2161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciWebContentDecryptionModuleSessionImpl::OnSessionInitialized(
217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const std::string& web_session_id) {
218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // CDM will return NULL if the session to be loaded can't be found.
2191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (web_session_id.empty())
2201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return blink::WebContentDecryptionModuleResult::SessionNotFound;
2211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  DCHECK(web_session_id_.empty()) << "Session ID may not be changed once set.";
2231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  web_session_id_ = web_session_id;
2241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return adapter_->RegisterSession(web_session_id_,
2251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   weak_ptr_factory_.GetWeakPtr())
2261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             ? blink::WebContentDecryptionModuleResult::NewSession
2271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci             : blink::WebContentDecryptionModuleResult::SessionAlreadyExists;
228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
230eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}  // namespace content
231