Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1005)

Unified Diff: webkit/media/crypto/ppapi/cdm_wrapper.cc

Issue 11830042: Ensure keySystem is always provided in keyerror events from Pepper CDMs. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: removed extra line Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/media/crypto/ppapi/cdm_wrapper.cc
diff --git a/webkit/media/crypto/ppapi/cdm_wrapper.cc b/webkit/media/crypto/ppapi/cdm_wrapper.cc
index a3c948ac89d10f669fdbae93631d5019fc43166e..1f4312365155abeef61803b477bc3810179ac9df 100644
--- a/webkit/media/crypto/ppapi/cdm_wrapper.cc
+++ b/webkit/media/crypto/ppapi/cdm_wrapper.cc
@@ -522,24 +522,40 @@ class CdmWrapper : public pp::Instance,
uint32_t system_code) OVERRIDE;
private:
+ struct SessionInfo {
+ SessionInfo(const std::string& key_system_in,
+ const std::string& session_id_in)
+ : key_system(key_system_in),
+ session_id(session_id_in) {}
+ const std::string key_system;
+ const std::string session_id;
+ };
+
typedef linked_ptr<DecryptedBlockImpl> LinkedDecryptedBlock;
typedef linked_ptr<VideoFrameImpl> LinkedVideoFrame;
typedef linked_ptr<AudioFramesImpl> LinkedAudioFrames;
- void SendUnknownKeyError(const std::string& session_id);
+ void SendUnknownKeyError(const std::string& key_system,
+ const std::string& session_id);
- void SendKeyAdded(const std::string& session_id);
+ void SendKeyAdded(const std::string& key_system,
+ const std::string& session_id);
+
+ void SendKeyErrorInternal(const std::string& key_system,
+ const std::string& session_id,
+ cdm::MediaKeyError error_code,
+ uint32_t system_code);
// <code>PPB_ContentDecryptor_Private</code> dispatchers. These are passed to
// <code>callback_factory_</code> to ensure that calls into
// <code>PPP_ContentDecryptor_Private</code> are asynchronous.
- void KeyAdded(int32_t result, const std::string& session_id);
+ void KeyAdded(int32_t result, const SessionInfo& session_info);
void KeyMessage(int32_t result,
- const std::string& session_id,
+ const SessionInfo& session_info,
const std::string& message,
const std::string& default_url);
void KeyError(int32_t result,
- const std::string& session_id,
+ const SessionInfo& session_info,
cdm::MediaKeyError error_code,
uint32_t system_code);
void DeliverBlock(int32_t result,
@@ -594,6 +610,7 @@ CdmWrapper::~CdmWrapper() {
void CdmWrapper::GenerateKeyRequest(const std::string& key_system,
const std::string& type,
pp::VarArrayBuffer init_data) {
+ PP_DCHECK(!key_system.empty());
PP_DCHECK(key_system_.empty() || key_system_ == key_system);
if (!cdm_) {
@@ -601,18 +618,24 @@ void CdmWrapper::GenerateKeyRequest(const std::string& key_system,
&allocator_, this);
PP_DCHECK(cdm_);
if (!cdm_) {
- SendUnknownKeyError("");
+ SendUnknownKeyError(key_system, "");
return;
}
}
+ // Must be set here in case the CDM synchronously calls a cdm::Host method.
+ // Clear below on error.
+ // TODO(ddorwin): Remove this when key_system is added to cdm::Host methods.
+ key_system_ = key_system;
cdm::Status status = cdm_->GenerateKeyRequest(
type.data(), type.size(),
static_cast<const uint8_t*>(init_data.Map()),
init_data.ByteLength());
PP_DCHECK(status == cdm::kSuccess || status == cdm::kSessionError);
- if (status != cdm::kSuccess)
+ if (status != cdm::kSuccess) {
+ key_system_.clear(); // See comment above.
return;
+ }
key_system_ = key_system;
}
@@ -622,7 +645,7 @@ void CdmWrapper::AddKey(const std::string& session_id,
pp::VarArrayBuffer init_data) {
PP_DCHECK(cdm_); // GenerateKeyRequest() should have succeeded.
if (!cdm_) {
- SendUnknownKeyError(session_id);
+ SendUnknownKeyError(key_system_, session_id);
return;
}
@@ -632,7 +655,7 @@ void CdmWrapper::AddKey(const std::string& session_id,
int init_data_size = init_data.ByteLength();
if (!key_ptr || key_size <= 0 || !init_data_ptr || init_data_size <= 0) {
- SendUnknownKeyError(session_id);
+ SendUnknownKeyError(key_system_, session_id);
return;
}
@@ -641,17 +664,17 @@ void CdmWrapper::AddKey(const std::string& session_id,
init_data_ptr, init_data_size);
PP_DCHECK(status == cdm::kSuccess || status == cdm::kSessionError);
if (status != cdm::kSuccess) {
- SendUnknownKeyError(session_id);
+ SendUnknownKeyError(key_system_, session_id);
return;
}
- SendKeyAdded(session_id);
+ SendKeyAdded(key_system_, session_id);
}
void CdmWrapper::CancelKeyRequest(const std::string& session_id) {
PP_DCHECK(cdm_); // GenerateKeyRequest() should have succeeded.
if (!cdm_) {
- SendUnknownKeyError(session_id);
+ SendUnknownKeyError(key_system_, session_id);
return;
}
@@ -659,7 +682,7 @@ void CdmWrapper::CancelKeyRequest(const std::string& session_id) {
session_id.size());
PP_DCHECK(status == cdm::kSuccess || status == cdm::kSessionError);
if (status != cdm::kSuccess)
- SendUnknownKeyError(session_id);
+ SendUnknownKeyError(key_system_, session_id);
}
// Note: In the following decryption/decoding related functions, errors are NOT
@@ -852,9 +875,11 @@ void CdmWrapper::SendKeyMessage(
const char* session_id, int32_t session_id_length,
const char* message, int32_t message_length,
const char* default_url, int32_t default_url_length) {
+ PP_DCHECK(!key_system_.empty());
PostOnMain(callback_factory_.NewCallback(
&CdmWrapper::KeyMessage,
- std::string(session_id, session_id_length),
+ SessionInfo(key_system_,
+ std::string(session_id, session_id_length)),
std::string(message, message_length),
std::string(default_url, default_url_length)));
}
@@ -863,51 +888,69 @@ void CdmWrapper::SendKeyError(const char* session_id,
int32_t session_id_length,
cdm::MediaKeyError error_code,
uint32_t system_code) {
- PostOnMain(callback_factory_.NewCallback(
- &CdmWrapper::KeyError,
- std::string(session_id, session_id_length),
- error_code,
- system_code));
+ SendKeyErrorInternal(key_system_,
+ std::string(session_id, session_id_length),
+ error_code,
+ system_code);
+}
+
+void CdmWrapper::SendUnknownKeyError(const std::string& key_system,
+ const std::string& session_id) {
+ SendKeyErrorInternal(key_system, session_id, cdm::kUnknownError, 0);
}
-void CdmWrapper::SendUnknownKeyError(const std::string& session_id) {
- SendKeyError(session_id.data(), session_id.size(), cdm::kUnknownError, 0);
+
+void CdmWrapper::SendKeyAdded(const std::string& key_system,
+ const std::string& session_id) {
+ PostOnMain(callback_factory_.NewCallback(
+ &CdmWrapper::KeyAdded,
+ SessionInfo(key_system_, session_id)));
}
-void CdmWrapper::SendKeyAdded(const std::string& session_id) {
- PostOnMain(callback_factory_.NewCallback(&CdmWrapper::KeyAdded,session_id));
+void CdmWrapper::SendKeyErrorInternal(const std::string& key_system,
+ const std::string& session_id,
+ cdm::MediaKeyError error_code,
+ uint32_t system_code) {
+ PP_DCHECK(!key_system.empty());
+ PostOnMain(callback_factory_.NewCallback(&CdmWrapper::KeyError,
+ SessionInfo(key_system_, session_id),
+ error_code,
+ system_code));
}
-void CdmWrapper::KeyAdded(int32_t result, const std::string& session_id) {
+void CdmWrapper::KeyAdded(int32_t result, const SessionInfo& session_info) {
PP_DCHECK(result == PP_OK);
- PP_DCHECK(!key_system_.empty());
- pp::ContentDecryptor_Private::KeyAdded(key_system_, session_id);
+ PP_DCHECK(!session_info.key_system.empty());
+ pp::ContentDecryptor_Private::KeyAdded(session_info.key_system,
+ session_info.session_id);
}
void CdmWrapper::KeyMessage(int32_t result,
- const std::string& session_id,
+ const SessionInfo& session_info,
const std::string& message,
const std::string& default_url) {
PP_DCHECK(result == PP_OK);
+ PP_DCHECK(!session_info.key_system.empty());
pp::VarArrayBuffer message_array_buffer(message.size());
if (message.size() > 0) {
memcpy(message_array_buffer.Map(), message.data(), message.size());
}
- PP_DCHECK(!key_system_.empty());
pp::ContentDecryptor_Private::KeyMessage(
- key_system_, session_id, message_array_buffer, default_url);
+ session_info.key_system, session_info.session_id,
+ message_array_buffer, default_url);
}
void CdmWrapper::KeyError(int32_t result,
- const std::string& session_id,
+ const SessionInfo& session_info,
cdm::MediaKeyError error_code,
uint32_t system_code) {
PP_DCHECK(result == PP_OK);
- PP_DCHECK(!key_system_.empty());
+ PP_DCHECK(!session_info.key_system.empty());
pp::ContentDecryptor_Private::KeyError(
- key_system_, session_id, error_code, system_code);
+ session_info.key_system, session_info.session_id,
+ error_code, system_code);
}
void CdmWrapper::DeliverBlock(int32_t result,
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698