| Index: media/cdm/proxy_decryptor.cc
|
| diff --git a/media/cdm/proxy_decryptor.cc b/media/cdm/proxy_decryptor.cc
|
| index d1be9d8b204fe2b99d4dbf3a368cc733ea8af852..97374ba3a4757cd7fc45e3183c6c3c10759ce391 100644
|
| --- a/media/cdm/proxy_decryptor.cc
|
| +++ b/media/cdm/proxy_decryptor.cc
|
| @@ -29,7 +29,8 @@ ProxyDecryptor::ProxyDecryptor(MediaPermission* media_permission,
|
| const KeyAddedCB& key_added_cb,
|
| const KeyErrorCB& key_error_cb,
|
| const KeyMessageCB& key_message_cb)
|
| - : key_added_cb_(key_added_cb),
|
| + : media_permission_(media_permission),
|
| + key_added_cb_(key_added_cb),
|
| key_error_cb_(key_error_cb),
|
| key_message_cb_(key_message_cb),
|
| is_clear_key_(false),
|
| @@ -59,6 +60,9 @@ bool ProxyDecryptor::InitializeCDM(CdmFactory* cdm_factory,
|
| if (!media_keys_)
|
| return false;
|
|
|
| + key_system_ = key_system;
|
| + security_origin_ = security_origin;
|
| +
|
| is_clear_key_ =
|
| IsClearKey(key_system) || IsExternalClearKey(key_system);
|
| return true;
|
| @@ -103,10 +107,10 @@ bool ProxyDecryptor::GenerateKeyRequest(const std::string& init_data_type,
|
| base::Bind(&ProxyDecryptor::OnSessionError,
|
| weak_ptr_factory_.GetWeakPtr(),
|
| std::string()))); // No session id until created.
|
| - uint8* init_data_vector_data =
|
| - (init_data_vector.size() > 0) ? &init_data_vector[0] : nullptr;
|
|
|
| if (session_creation_type == LoadSession) {
|
| + uint8* init_data_vector_data =
|
| + (init_data_vector.size() > 0) ? &init_data_vector[0] : nullptr;
|
| media_keys_->LoadSession(
|
| MediaKeys::PERSISTENT_LICENSE_SESSION,
|
| std::string(reinterpret_cast<const char*>(init_data_vector_data),
|
| @@ -120,12 +124,51 @@ bool ProxyDecryptor::GenerateKeyRequest(const std::string& init_data_type,
|
| ? MediaKeys::PERSISTENT_LICENSE_SESSION
|
| : MediaKeys::TEMPORARY_SESSION;
|
|
|
| - media_keys_->CreateSessionAndGenerateRequest(
|
| - session_type, init_data_type, init_data_vector_data,
|
| - init_data_vector.size(), promise.Pass());
|
| + // No permission required when AesDecryptor is used or when the key system is
|
| + // external clear key.
|
| + DCHECK(!key_system_.empty());
|
| + if (CanUseAesDecryptor(key_system_) || IsExternalClearKey(key_system_)) {
|
| + OnPermissionStatus(session_type, init_data_type, init_data_vector,
|
| + promise.Pass(), true /* granted */);
|
| + return true;
|
| + }
|
| +
|
| +#if defined(OS_CHROMEOS)
|
| + media_permission_->RequestPermission(
|
| + MediaPermission::PROTECTED_MEDIA_IDENTIFIER, security_origin_,
|
| + base::Bind(&ProxyDecryptor::OnPermissionStatus,
|
| + weak_ptr_factory_.GetWeakPtr(), session_type, init_data_type,
|
| + init_data_vector, base::Passed(&promise)));
|
| +#else
|
| + // TODO(xhwang): Fix the Android path by requesting permission for key systems
|
| + // that don't use AesDecryptor in M43.
|
| + OnPermissionStatus(session_type, init_data_type, init_data_vector,
|
| + promise.Pass(), true /* granted */);
|
| +#endif
|
| +
|
| return true;
|
| }
|
|
|
| +void ProxyDecryptor::OnPermissionStatus(
|
| + MediaKeys::SessionType session_type,
|
| + const std::string& init_data_type,
|
| + const std::vector<uint8>& init_data,
|
| + scoped_ptr<NewSessionCdmPromise> promise,
|
| + bool granted) {
|
| + // ProxyDecryptor is only used by Prefixed EME, where RequestPermission() is
|
| + // only for triggering the permission UI. Later CheckPermission() will be
|
| + // called (e.g. in PlatformVerificationFlow) and the permission status will be
|
| + // evaluated there.
|
| + DVLOG_IF(1, !granted) << "Permission request rejected.";
|
| +
|
| + const uint8* init_data_vector_data =
|
| + (init_data.size() > 0) ? &init_data[0] : nullptr;
|
| +
|
| + media_keys_->CreateSessionAndGenerateRequest(
|
| + session_type, init_data_type, init_data_vector_data, init_data.size(),
|
| + promise.Pass());
|
| +}
|
| +
|
| void ProxyDecryptor::AddKey(const uint8* key,
|
| int key_length,
|
| const uint8* init_data,
|
|
|