Index: content/renderer/pepper/content_decryptor_delegate.cc |
diff --git a/content/renderer/pepper/content_decryptor_delegate.cc b/content/renderer/pepper/content_decryptor_delegate.cc |
index e1b0b1ba3e5d1100275908abf15dd578ec1b86a9..79129abb37838b390c0d19cb737bb9000e9254b6 100644 |
--- a/content/renderer/pepper/content_decryptor_delegate.cc |
+++ b/content/renderer/pepper/content_decryptor_delegate.cc |
@@ -20,6 +20,7 @@ |
#include "media/base/video_decoder_config.h" |
#include "media/base/video_frame.h" |
#include "media/base/video_util.h" |
+#include "ppapi/shared_impl/array_var.h" |
#include "ppapi/shared_impl/scoped_pp_resource.h" |
#include "ppapi/shared_impl/var.h" |
#include "ppapi/shared_impl/var_tracker.h" |
@@ -29,10 +30,12 @@ |
using media::CdmPromise; |
using media::Decryptor; |
+using media::KeyIdsPromise; |
using media::MediaKeys; |
using media::NewSessionCdmPromise; |
using media::SimpleCdmPromise; |
using ppapi::ArrayBufferVar; |
+using ppapi::ArrayVar; |
using ppapi::PpapiGlobals; |
using ppapi::ScopedPPResource; |
using ppapi::StringVar; |
@@ -330,6 +333,18 @@ void ContentDecryptorDelegate::InstanceCrashed() { |
SatisfyAllPendingCallbacksOnError(); |
} |
+void ContentDecryptorDelegate::SetServerCertificate( |
+ const uint8* certificate, |
+ int certificate_length, |
+ scoped_ptr<media::SimpleCdmPromise> promise) { |
+ uint32_t promise_id = SavePromise(promise.PassAs<CdmPromise>()); |
+ PP_Var certificate_array = |
+ PpapiGlobals::Get()->GetVarTracker()->MakeArrayBufferPPVar( |
+ certificate_length, certificate); |
palmer
2014/08/26 19:09:20
Check |certificate_length| for sanity first: minim
jrummell
2014/08/29 22:35:34
Done.
|
+ plugin_decryption_interface_->SetServerCertificate( |
+ pp_instance_, promise_id, certificate_array); |
+} |
+ |
void ContentDecryptorDelegate::CreateSession( |
const std::string& init_data_type, |
const uint8* init_data, |
@@ -372,11 +387,27 @@ void ContentDecryptorDelegate::UpdateSession( |
response_array); |
} |
-void ContentDecryptorDelegate::ReleaseSession( |
+void ContentDecryptorDelegate::CloseSession( |
+ const std::string& web_session_id, |
+ scoped_ptr<SimpleCdmPromise> promise) { |
+ uint32_t promise_id = SavePromise(promise.PassAs<CdmPromise>()); |
+ plugin_decryption_interface_->CloseSession( |
+ pp_instance_, promise_id, StringVar::StringToPPVar(web_session_id)); |
+} |
+ |
+void ContentDecryptorDelegate::RemoveSession( |
const std::string& web_session_id, |
scoped_ptr<SimpleCdmPromise> promise) { |
uint32_t promise_id = SavePromise(promise.PassAs<CdmPromise>()); |
- plugin_decryption_interface_->ReleaseSession( |
+ plugin_decryption_interface_->RemoveSession( |
+ pp_instance_, promise_id, StringVar::StringToPPVar(web_session_id)); |
+} |
+ |
+void ContentDecryptorDelegate::GetUsableKeyIds( |
+ const std::string& web_session_id, |
+ scoped_ptr<media::KeyIdsPromise> promise) { |
+ uint32_t promise_id = SavePromise(promise.PassAs<CdmPromise>()); |
+ plugin_decryption_interface_->GetUsableKeyIds( |
pp_instance_, promise_id, StringVar::StringToPPVar(web_session_id)); |
} |
@@ -625,7 +656,10 @@ bool ContentDecryptorDelegate::DecryptAndDecodeVideo( |
void ContentDecryptorDelegate::OnPromiseResolved(uint32 promise_id) { |
scoped_ptr<CdmPromise> promise = TakePromise(promise_id); |
- if (promise) { |
+ DCHECK(promise && |
+ promise->GetResolveParameterType() == media::CdmPromise::VOID_TYPE); |
+ if (promise && |
+ promise->GetResolveParameterType() == media::CdmPromise::VOID_TYPE) { |
SimpleCdmPromise* simple_promise( |
static_cast<SimpleCdmPromise*>(promise.get())); |
simple_promise->resolve(); |
@@ -640,13 +674,48 @@ void ContentDecryptorDelegate::OnPromiseResolvedWithSession( |
StringVar* web_session_id_string = StringVar::FromPPVar(web_session_id); |
DCHECK(web_session_id_string); |
- if (promise) { |
+ DCHECK(promise && |
+ promise->GetResolveParameterType() == media::CdmPromise::STRING_TYPE); |
+ if (promise && |
+ promise->GetResolveParameterType() == media::CdmPromise::STRING_TYPE) { |
NewSessionCdmPromise* session_promise( |
static_cast<NewSessionCdmPromise*>(promise.get())); |
session_promise->resolve(web_session_id_string->value()); |
} |
} |
+void ContentDecryptorDelegate::OnPromiseResolvedWithKeyIds( |
+ uint32 promise_id, |
+ PP_Var key_ids_array) { |
+ scoped_ptr<CdmPromise> promise = TakePromise(promise_id); |
+ |
+ ArrayVar* key_ids = ArrayVar::FromPPVar(key_ids_array); |
+ media::KeyIdsVector key_ids_vector; |
+ DCHECK(key_ids); |
palmer
2014/08/26 19:09:20
Nit: Might as well move this DCHECK up a line, to
jrummell
2014/08/29 22:35:34
Done.
|
+ if (key_ids) { |
+ for (size_t i = 0; i < key_ids->GetLength(); ++i) { |
+ ArrayBufferVar* array_buffer = ArrayBufferVar::FromPPVar(key_ids->Get(i)); |
+ DCHECK(array_buffer); |
+ if (array_buffer) { |
+ std::vector<uint8> key_id; |
+ const uint8* data = static_cast<const uint8*>(array_buffer->Map()); |
+ key_id.assign(data, data + array_buffer->ByteLength()); |
+ key_ids_vector.push_back(key_id); |
+ } |
+ } |
+ } |
+ |
+ DCHECK(promise && |
+ promise->GetResolveParameterType() == |
+ media::CdmPromise::KEY_IDS_VECTOR_TYPE); |
+ if (promise && |
+ promise->GetResolveParameterType() == |
+ media::CdmPromise::KEY_IDS_VECTOR_TYPE) { |
+ KeyIdsPromise* key_ids_promise(static_cast<KeyIdsPromise*>(promise.get())); |
+ key_ids_promise->resolve(key_ids_vector); |
+ } |
+} |
+ |
void ContentDecryptorDelegate::OnPromiseRejected( |
uint32 promise_id, |
PP_CdmExceptionCode exception_code, |
@@ -656,6 +725,7 @@ void ContentDecryptorDelegate::OnPromiseRejected( |
DCHECK(error_description_string); |
scoped_ptr<CdmPromise> promise = TakePromise(promise_id); |
+ DCHECK(promise); |
if (promise) { |
promise->reject(PpExceptionTypeToMediaException(exception_code), |
system_code, |
@@ -693,6 +763,18 @@ void ContentDecryptorDelegate::OnSessionMessage(PP_Var web_session_id, |
web_session_id_string->value(), message_vector, verified_gurl); |
} |
+void ContentDecryptorDelegate::OnSessionKeysChange( |
+ PP_Var web_session_id, |
+ PP_Bool has_additional_usable_key) { |
+ // TODO(jrummell): Pass this event on. |
+} |
+ |
+void ContentDecryptorDelegate::OnSessionExpirationChange( |
+ PP_Var web_session_id, |
+ PP_Time new_expiry_time) { |
+ // TODO(jrummell): Pass this event on. |
+} |
+ |
void ContentDecryptorDelegate::OnSessionReady(PP_Var web_session_id) { |
if (session_ready_cb_.is_null()) |
return; |