summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorxhwang@chromium.org <xhwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-12 23:57:08 +0000
committerxhwang@chromium.org <xhwang@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-02-12 23:57:08 +0000
commit82792996a329f3f364c36c1fa331b100bca49568 (patch)
tree07ac2f87671a8f293fc61dfc4c54acf84f8cdfc8
parent2e5dd03fda633b6ade73d016a9672a7812cdf313 (diff)
downloadchromium_src-82792996a329f3f364c36c1fa331b100bca49568.zip
chromium_src-82792996a329f3f364c36c1fa331b100bca49568.tar.gz
chromium_src-82792996a329f3f364c36c1fa331b100bca49568.tar.bz2
Prefixed EME: Fire special KeyError when a persistent session is closed.
BUG=340859 Review URL: https://codereview.chromium.org/150203014 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@250854 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--content/renderer/media/crypto/proxy_decryptor.cc44
-rw-r--r--content/renderer/media/crypto/proxy_decryptor.h3
2 files changed, 35 insertions, 12 deletions
diff --git a/content/renderer/media/crypto/proxy_decryptor.cc b/content/renderer/media/crypto/proxy_decryptor.cc
index 2c9c008..b556278 100644
--- a/content/renderer/media/crypto/proxy_decryptor.cc
+++ b/content/renderer/media/crypto/proxy_decryptor.cc
@@ -4,6 +4,8 @@
#include "content/renderer/media/crypto/proxy_decryptor.h"
+#include <cstring>
+
#include "base/bind.h"
#include "base/callback_helpers.h"
#include "base/logging.h"
@@ -25,6 +27,11 @@ uint32 ProxyDecryptor::next_session_id_ = 100000;
const uint32 kInvalidSessionId = 0;
+// Special system code to signal a closed persistent session in a SessionError()
+// call. This is needed because there is no SessionClosed() call in the prefixed
+// EME API.
+const int kSessionClosedSystemCode = 7 * 1024 * 1024 + 7;
+
#if defined(ENABLE_PEPPER_CDMS)
void ProxyDecryptor::DestroyHelperPlugin() {
ContentDecryptionModuleFactory::DestroyHelperPlugin(
@@ -83,30 +90,36 @@ bool ProxyDecryptor::InitializeCDM(const std::string& key_system,
return true;
}
+// Returns true if |data| is prefixed with |header| and has data after the
+// |header|.
+bool HasHeader(const uint8* data, int data_length, const std::string& header) {
+ return static_cast<size_t>(data_length) > header.size() &&
+ std::equal(data, data + header.size(), header.begin());
+}
+
bool ProxyDecryptor::GenerateKeyRequest(const std::string& content_type,
const uint8* init_data,
int init_data_length) {
// Use a unique reference id for this request.
uint32 session_id = next_session_id_++;
- const uint8 kPrefixedApiLoadSessionHeader[] = "LOAD_SESSION|";
- const int kPrefixedApiLoadSessionHeaderLength =
- sizeof(kPrefixedApiLoadSessionHeader) - 1;
+ const char kPrefixedApiPersistentSessionHeader[] = "PERSISTENT|";
+ const char kPrefixedApiLoadSessionHeader[] = "LOAD_SESSION|";
- if (init_data_length > kPrefixedApiLoadSessionHeaderLength &&
- std::equal(init_data,
- init_data + kPrefixedApiLoadSessionHeaderLength,
- kPrefixedApiLoadSessionHeader)) {
- // TODO(xhwang): Track loadable session to handle OnSessionClosed().
- // See: http://crbug.com/340859.
+ if (HasHeader(init_data, init_data_length, kPrefixedApiLoadSessionHeader)) {
+ persistent_sessions_.insert(session_id);
media_keys_->LoadSession(
session_id,
std::string(reinterpret_cast<const char*>(
- init_data + kPrefixedApiLoadSessionHeaderLength),
- init_data_length - kPrefixedApiLoadSessionHeaderLength));
+ init_data + strlen(kPrefixedApiLoadSessionHeader)),
+ init_data_length - strlen(kPrefixedApiLoadSessionHeader)));
return true;
}
+ if (HasHeader(
+ init_data, init_data_length, kPrefixedApiPersistentSessionHeader))
+ persistent_sessions_.insert(session_id);
+
return media_keys_->CreateSession(
session_id, content_type, init_data, init_data_length);
}
@@ -219,7 +232,14 @@ void ProxyDecryptor::OnSessionReady(uint32 session_id) {
}
void ProxyDecryptor::OnSessionClosed(uint32 session_id) {
- // No closed event in EME v0.1b.
+ std::set<uint32>::iterator it = persistent_sessions_.find(session_id);
+ if (it != persistent_sessions_.end()) {
+ persistent_sessions_.erase(it);
+ OnSessionError(
+ session_id, media::MediaKeys::kUnknownError, kSessionClosedSystemCode);
+ }
+
+ sessions_.erase(session_id);
}
void ProxyDecryptor::OnSessionError(uint32 session_id,
diff --git a/content/renderer/media/crypto/proxy_decryptor.h b/content/renderer/media/crypto/proxy_decryptor.h
index 4d1e7c7..1256ada 100644
--- a/content/renderer/media/crypto/proxy_decryptor.h
+++ b/content/renderer/media/crypto/proxy_decryptor.h
@@ -6,6 +6,7 @@
#define CONTENT_RENDERER_MEDIA_CRYPTO_PROXY_DECRYPTOR_H_
#include <map>
+#include <set>
#include <string>
#include <vector>
@@ -141,6 +142,8 @@ class ProxyDecryptor {
SessionIdMap sessions_;
+ std::set<uint32> persistent_sessions_;
+
bool is_clear_key_;
DISALLOW_COPY_AND_ASSIGN(ProxyDecryptor);