Index: media/cdm/ppapi/cdm_adapter.cc |
diff --git a/media/cdm/ppapi/cdm_adapter.cc b/media/cdm/ppapi/cdm_adapter.cc |
index 636ea3284be2ae2bdcf0bb28a9904940aa1fbb09..7ecdb5767ce3beafa67b6d71ae925e1f7db963fd 100644 |
--- a/media/cdm/ppapi/cdm_adapter.cc |
+++ b/media/cdm/ppapi/cdm_adapter.cc |
@@ -340,40 +340,34 @@ CdmAdapter::CdmAdapter(PP_Instance instance, pp::Module* module) |
CdmAdapter::~CdmAdapter() {} |
-bool CdmAdapter::CreateCdmInstance(const std::string& key_system) { |
- PP_DCHECK(!cdm_); |
- cdm_ = make_linked_ptr(CdmWrapper::Create( |
- key_system.data(), key_system.size(), GetCdmHost, this)); |
- bool success = cdm_ != NULL; |
+CdmWrapper* CdmAdapter::CreateCdmInstance(const std::string& key_system) { |
+ CdmWrapper* cdm = CdmWrapper::Create(key_system.data(), key_system.size(), |
+ GetCdmHost, this); |
const std::string message = "CDM instance for " + key_system + |
- (success ? "" : " could not be") + " created."; |
+ (cdm ? "" : " could not be") + " created."; |
DLOG_TO_CONSOLE(message); |
CDM_DLOG() << message; |
- return success; |
+ return cdm; |
} |
-// No errors should be reported in this function because the spec says: |
-// "Store this new error object internally with the MediaKeys instance being |
-// created. This will be used to fire an error against any session created for |
-// this instance." These errors will be reported during session creation |
-// (CreateSession()) or session loading (LoadSession()). |
-// TODO(xhwang): If necessary, we need to store the error here if we want to |
-// support more specific error reporting (other than "Unknown"). |
-void CdmAdapter::Initialize(const std::string& key_system, |
+void CdmAdapter::Initialize(uint32_t promise_id, |
+ const std::string& key_system, |
bool allow_distinctive_identifier, |
bool allow_persistent_state) { |
PP_DCHECK(!key_system.empty()); |
- // TODO(jrummell): Remove this check when CDM creation is asynchronous. |
- // http://crbug.com/469003 |
- PP_DCHECK(key_system_.empty() || (key_system_ == key_system && cdm_)); |
+ PP_DCHECK(!cdm_); |
#if defined(CHECK_DOCUMENT_URL) |
PP_URLComponents_Dev url_components = {}; |
const pp::URLUtil_Dev* url_util = pp::URLUtil_Dev::Get(); |
- if (!url_util) |
+ if (!url_util) { |
+ RejectPromise(promise_id, cdm::kUnknownError, 0, |
+ "Unable to determine origin."); |
return; |
+ } |
+ |
pp::Var href = url_util->GetDocumentURL(pp::InstanceHandle(pp_instance()), |
&url_components); |
PP_DCHECK(href.is_string()); |
@@ -388,14 +382,18 @@ void CdmAdapter::Initialize(const std::string& key_system, |
} |
#endif // defined(CHECK_DOCUMENT_URL) |
- if (!cdm_ && !CreateCdmInstance(key_system)) |
+ cdm_ = make_linked_ptr(CreateCdmInstance(key_system)); |
+ if (!cdm_) { |
+ RejectPromise(promise_id, cdm::kInvalidAccessError, 0, |
+ "Unable to create CDM."); |
return; |
+ } |
- PP_DCHECK(cdm_); |
key_system_ = key_system; |
allow_distinctive_identifier_ = allow_distinctive_identifier; |
allow_persistent_state_ = allow_persistent_state; |
cdm_->Initialize(allow_distinctive_identifier, allow_persistent_state); |
+ OnResolvePromise(promise_id); |
} |
void CdmAdapter::SetServerCertificate(uint32_t promise_id, |
@@ -412,17 +410,6 @@ void CdmAdapter::SetServerCertificate(uint32_t promise_id, |
return; |
} |
- // Initialize() doesn't report an error, so SetServerCertificate() can be |
- // called even if Initialize() failed. |
- // TODO(jrummell): Remove this code when prefixed EME gets removed. |
- if (!cdm_) { |
- RejectPromise(promise_id, |
- cdm::kInvalidStateError, |
- 0, |
- "CDM has not been initialized."); |
- return; |
- } |
- |
cdm_->SetServerCertificate( |
promise_id, server_certificate_ptr, server_certificate_size); |
} |
@@ -431,19 +418,6 @@ void CdmAdapter::CreateSessionAndGenerateRequest(uint32_t promise_id, |
PP_SessionType session_type, |
PP_InitDataType init_data_type, |
pp::VarArrayBuffer init_data) { |
- // Initialize() doesn't report an error, so CreateSession() can be called |
- // even if Initialize() failed. |
- // TODO(jrummell): Remove this code when prefixed EME gets removed. |
- // TODO(jrummell): Verify that Initialize() failing does not resolve the |
- // MediaKeys.create() promise. |
- if (!cdm_) { |
- RejectPromise(promise_id, |
- cdm::kInvalidStateError, |
- 0, |
- "CDM has not been initialized."); |
- return; |
- } |
- |
cdm_->CreateSessionAndGenerateRequest( |
promise_id, PpSessionTypeToCdmSessionType(session_type), |
PpInitDataTypeToCdmInitDataType(init_data_type), |
@@ -453,19 +427,6 @@ void CdmAdapter::CreateSessionAndGenerateRequest(uint32_t promise_id, |
void CdmAdapter::LoadSession(uint32_t promise_id, |
PP_SessionType session_type, |
const std::string& session_id) { |
- // Initialize() doesn't report an error, so LoadSession() can be called |
- // even if Initialize() failed. |
- // TODO(jrummell): Remove this code when prefixed EME gets removed. |
- // TODO(jrummell): Verify that Initialize() failing does not resolve the |
- // MediaKeys.create() promise. |
- if (!cdm_) { |
- RejectPromise(promise_id, |
- cdm::kInvalidStateError, |
- 0, |
- "CDM has not been initialized."); |
- return; |
- } |
- |
cdm_->LoadSession(promise_id, PpSessionTypeToCdmSessionType(session_type), |
session_id.data(), session_id.size()); |
} |