Home | History | Annotate | Download | only in media
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "content/renderer/media/webcontentdecryptionmodule_impl.h"
      6 
      7 #include <map>
      8 #include <vector>
      9 
     10 #include "base/basictypes.h"
     11 #include "base/bind.h"
     12 #include "base/logging.h"
     13 #include "base/strings/string_util.h"
     14 #include "base/strings/utf_string_conversions.h"
     15 #include "content/renderer/media/cdm_result_promise.h"
     16 #include "content/renderer/media/cdm_session_adapter.h"
     17 #include "content/renderer/media/crypto/key_systems.h"
     18 #include "content/renderer/media/webcontentdecryptionmodulesession_impl.h"
     19 #include "media/base/cdm_promise.h"
     20 #include "media/base/media_keys.h"
     21 #include "third_party/WebKit/public/platform/WebString.h"
     22 #include "third_party/WebKit/public/web/WebSecurityOrigin.h"
     23 #include "url/gurl.h"
     24 
     25 #if defined(ENABLE_PEPPER_CDMS)
     26 #include "content/renderer/media/crypto/pepper_cdm_wrapper_impl.h"
     27 #endif
     28 
     29 namespace content {
     30 
     31 WebContentDecryptionModuleImpl* WebContentDecryptionModuleImpl::Create(
     32 #if defined(ENABLE_PEPPER_CDMS)
     33     blink::WebLocalFrame* frame,
     34 #elif defined(ENABLE_BROWSER_CDMS)
     35     RendererCdmManager* manager,
     36 #endif
     37     const blink::WebSecurityOrigin& security_origin,
     38     const base::string16& key_system) {
     39 #if defined(ENABLE_PEPPER_CDMS)
     40   DCHECK(frame);
     41 #elif defined(ENABLE_BROWSER_CDMS)
     42   DCHECK(manager);
     43 #endif
     44   DCHECK(!security_origin.isNull());
     45   DCHECK(!key_system.empty());
     46 
     47   // TODO(ddorwin): Guard against this in supported types check and remove this.
     48   // Chromium only supports ASCII key systems.
     49   if (!base::IsStringASCII(key_system)) {
     50     NOTREACHED();
     51     return NULL;
     52   }
     53 
     54   std::string key_system_ascii = base::UTF16ToASCII(key_system);
     55   if (!IsConcreteSupportedKeySystem(key_system_ascii))
     56     return NULL;
     57 
     58   // If unique security origin, don't try to create the CDM.
     59   if (security_origin.isUnique() || security_origin.toString() == "null") {
     60     DLOG(ERROR) << "CDM use not allowed for unique security origin.";
     61     return NULL;
     62   }
     63 
     64   scoped_refptr<CdmSessionAdapter> adapter(new CdmSessionAdapter());
     65   GURL security_origin_as_gurl(security_origin.toString());
     66 
     67   if (!adapter->Initialize(
     68 #if defined(ENABLE_PEPPER_CDMS)
     69           base::Bind(&PepperCdmWrapperImpl::Create, frame),
     70 #elif defined(ENABLE_BROWSER_CDMS)
     71           manager,
     72 #endif
     73           key_system_ascii,
     74           security_origin_as_gurl)) {
     75     return NULL;
     76   }
     77 
     78   return new WebContentDecryptionModuleImpl(adapter);
     79 }
     80 
     81 WebContentDecryptionModuleImpl::WebContentDecryptionModuleImpl(
     82     scoped_refptr<CdmSessionAdapter> adapter)
     83     : adapter_(adapter) {
     84 }
     85 
     86 WebContentDecryptionModuleImpl::~WebContentDecryptionModuleImpl() {
     87 }
     88 
     89 // The caller owns the created session.
     90 blink::WebContentDecryptionModuleSession*
     91 WebContentDecryptionModuleImpl::createSession() {
     92   return adapter_->CreateSession();
     93 }
     94 
     95 blink::WebContentDecryptionModuleSession*
     96 WebContentDecryptionModuleImpl::createSession(
     97     blink::WebContentDecryptionModuleSession::Client* client) {
     98   WebContentDecryptionModuleSessionImpl* session = adapter_->CreateSession();
     99   session->setClientInterface(client);
    100   return session;
    101 }
    102 
    103 void WebContentDecryptionModuleImpl::setServerCertificate(
    104     const uint8* server_certificate,
    105     size_t server_certificate_length,
    106     blink::WebContentDecryptionModuleResult result) {
    107   DCHECK(server_certificate);
    108   adapter_->SetServerCertificate(
    109       server_certificate,
    110       server_certificate_length,
    111       scoped_ptr<media::SimpleCdmPromise>(new SimpleCdmResultPromise(result)));
    112 }
    113 
    114 media::Decryptor* WebContentDecryptionModuleImpl::GetDecryptor() {
    115   return adapter_->GetDecryptor();
    116 }
    117 
    118 #if defined(ENABLE_BROWSER_CDMS)
    119 int WebContentDecryptionModuleImpl::GetCdmId() const {
    120   return adapter_->GetCdmId();
    121 }
    122 #endif  // defined(ENABLE_BROWSER_CDMS)
    123 
    124 }  // namespace content
    125