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