summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--content/renderer/media/cdm_session_adapter.cc9
-rw-r--r--content/renderer/media/cdm_session_adapter.h5
-rw-r--r--content/renderer/media/webcontentdecryptionmodulesession_impl.cc8
-rw-r--r--media/base/cdm_promise.cc61
-rw-r--r--media/base/cdm_promise.h27
-rw-r--r--tools/metrics/histograms/histograms.xml33
6 files changed, 141 insertions, 2 deletions
diff --git a/content/renderer/media/cdm_session_adapter.cc b/content/renderer/media/cdm_session_adapter.cc
index 9a84d54..de3d162 100644
--- a/content/renderer/media/cdm_session_adapter.cc
+++ b/content/renderer/media/cdm_session_adapter.cc
@@ -9,6 +9,7 @@
#include "base/memory/weak_ptr.h"
#include "base/stl_util.h"
#include "content/renderer/media/crypto/content_decryption_module_factory.h"
+#include "content/renderer/media/crypto/key_systems.h"
#include "content/renderer/media/webcontentdecryptionmodulesession_impl.h"
#include "media/base/cdm_promise.h"
#include "media/base/media_keys.h"
@@ -16,6 +17,9 @@
namespace content {
+const char kMediaEME[] = "Media.EME.";
+const char kDot[] = ".";
+
CdmSessionAdapter::CdmSessionAdapter() :
#if defined(ENABLE_BROWSER_CDMS)
cdm_id_(0),
@@ -32,6 +36,7 @@ bool CdmSessionAdapter::Initialize(
#endif // defined(ENABLE_PEPPER_CDMS)
const std::string& key_system,
const GURL& security_origin) {
+ key_system_uma_prefix_ = kMediaEME + KeySystemNameForUMA(key_system) + kDot;
base::WeakPtr<CdmSessionAdapter> weak_this = weak_ptr_factory_.GetWeakPtr();
media_keys_ = ContentDecryptionModuleFactory::Create(
key_system,
@@ -103,6 +108,10 @@ media::Decryptor* CdmSessionAdapter::GetDecryptor() {
return media_keys_->GetDecryptor();
}
+const std::string& CdmSessionAdapter::GetKeySystemUMAPrefix() const {
+ return key_system_uma_prefix_;
+}
+
#if defined(ENABLE_BROWSER_CDMS)
int CdmSessionAdapter::GetCdmId() const {
return cdm_id_;
diff --git a/content/renderer/media/cdm_session_adapter.h b/content/renderer/media/cdm_session_adapter.h
index 35e060b..7e32669 100644
--- a/content/renderer/media/cdm_session_adapter.h
+++ b/content/renderer/media/cdm_session_adapter.h
@@ -88,6 +88,9 @@ class CdmSessionAdapter : public base::RefCounted<CdmSessionAdapter> {
// after WebContentDecryptionModule is freed. http://crbug.com/330324
media::Decryptor* GetDecryptor();
+ // Returns a prefix to use for UMAs.
+ const std::string& GetKeySystemUMAPrefix() const;
+
#if defined(ENABLE_BROWSER_CDMS)
// Returns the CDM ID associated with the |media_keys_|. May be kInvalidCdmId
// if no CDM ID is associated.
@@ -125,6 +128,8 @@ class CdmSessionAdapter : public base::RefCounted<CdmSessionAdapter> {
int cdm_id_;
#endif
+ std::string key_system_uma_prefix_;
+
// NOTE: Weak pointers must be invalidated before all other member variables.
base::WeakPtrFactory<CdmSessionAdapter> weak_ptr_factory_;
diff --git a/content/renderer/media/webcontentdecryptionmodulesession_impl.cc b/content/renderer/media/webcontentdecryptionmodulesession_impl.cc
index 6597518..a24d12b 100644
--- a/content/renderer/media/webcontentdecryptionmodulesession_impl.cc
+++ b/content/renderer/media/webcontentdecryptionmodulesession_impl.cc
@@ -15,6 +15,8 @@
namespace content {
+const char kCreateSessionUMAName[] = "CreateSession";
+
// For backwards compatibility with blink not using
// WebContentDecryptionModuleResult, reserve an index for |outstanding_results_|
// that will not be used when adding a WebContentDecryptionModuleResult.
@@ -107,7 +109,8 @@ void WebContentDecryptionModuleSessionImpl::initializeNewSession(
weak_ptr_factory_.GetWeakPtr(),
kReservedIndex),
base::Bind(&WebContentDecryptionModuleSessionImpl::OnSessionError,
- weak_ptr_factory_.GetWeakPtr())));
+ weak_ptr_factory_.GetWeakPtr()),
+ adapter_->GetKeySystemUMAPrefix() + kCreateSessionUMAName));
adapter_->InitializeNewSession(init_data_type_as_ascii,
init_data,
init_data_length,
@@ -168,7 +171,8 @@ void WebContentDecryptionModuleSessionImpl::initializeNewSession(
result_index),
base::Bind(&WebContentDecryptionModuleSessionImpl::SessionError,
weak_ptr_factory_.GetWeakPtr(),
- result_index)));
+ result_index),
+ adapter_->GetKeySystemUMAPrefix() + kCreateSessionUMAName));
adapter_->InitializeNewSession(init_data_type_as_ascii,
init_data,
init_data_length,
diff --git a/media/base/cdm_promise.cc b/media/base/cdm_promise.cc
index ec5e913..e57d4f4 100644
--- a/media/base/cdm_promise.cc
+++ b/media/base/cdm_promise.cc
@@ -6,6 +6,7 @@
#include "base/bind.h"
#include "base/logging.h"
+#include "base/metrics/histogram.h"
namespace media {
@@ -17,15 +18,48 @@ CdmPromise::CdmPromise(PromiseRejectedCB reject_cb)
DCHECK(!reject_cb_.is_null());
}
+CdmPromise::CdmPromise(PromiseRejectedCB reject_cb, const std::string& uma_name)
+ : reject_cb_(reject_cb), is_pending_(true), uma_name_(uma_name) {
+ DCHECK(!reject_cb_.is_null());
+}
+
CdmPromise::~CdmPromise() {
DCHECK(!is_pending_);
}
+static CdmPromise::ResultCodeForUMA ConvertExceptionToUMAResult(
+ MediaKeys::Exception exception_code) {
+ switch (exception_code) {
+ case MediaKeys::NOT_SUPPORTED_ERROR:
+ return CdmPromise::NOT_SUPPORTED_ERROR;
+ case MediaKeys::INVALID_STATE_ERROR:
+ return CdmPromise::INVALID_STATE_ERROR;
+ case MediaKeys::INVALID_ACCESS_ERROR:
+ return CdmPromise::INVALID_ACCESS_ERROR;
+ case MediaKeys::QUOTA_EXCEEDED_ERROR:
+ return CdmPromise::QUOTA_EXCEEDED_ERROR;
+ case MediaKeys::UNKNOWN_ERROR:
+ return CdmPromise::UNKNOWN_ERROR;
+ case MediaKeys::CLIENT_ERROR:
+ return CdmPromise::CLIENT_ERROR;
+ case MediaKeys::OUTPUT_ERROR:
+ return CdmPromise::OUTPUT_ERROR;
+ }
+ NOTREACHED();
+ return CdmPromise::UNKNOWN_ERROR;
+}
+
void CdmPromise::reject(MediaKeys::Exception exception_code,
uint32 system_code,
const std::string& error_message) {
DCHECK(is_pending_);
is_pending_ = false;
+ if (!uma_name_.empty()) {
+ ResultCodeForUMA result_code = ConvertExceptionToUMAResult(exception_code);
+ base::LinearHistogram::FactoryGet(
+ uma_name_, 1, NUM_RESULT_CODES, NUM_RESULT_CODES + 1,
+ base::HistogramBase::kUmaTargetedHistogramFlag)->Add(result_code);
+ }
reject_cb_.Run(exception_code, system_code, error_message);
}
@@ -38,6 +72,15 @@ CdmPromiseTemplate<T>::CdmPromiseTemplate(
}
template <typename T>
+CdmPromiseTemplate<T>::CdmPromiseTemplate(
+ base::Callback<void(const T&)> resolve_cb,
+ PromiseRejectedCB reject_cb,
+ const std::string& uma_name)
+ : CdmPromise(reject_cb, uma_name), resolve_cb_(resolve_cb) {
+ DCHECK(!resolve_cb_.is_null());
+}
+
+template <typename T>
CdmPromiseTemplate<T>::~CdmPromiseTemplate() {
DCHECK(!is_pending_);
}
@@ -46,6 +89,11 @@ template <typename T>
void CdmPromiseTemplate<T>::resolve(const T& result) {
DCHECK(is_pending_);
is_pending_ = false;
+ if (!uma_name_.empty()) {
+ base::LinearHistogram::FactoryGet(
+ uma_name_, 1, NUM_RESULT_CODES, NUM_RESULT_CODES + 1,
+ base::HistogramBase::kUmaTargetedHistogramFlag)->Add(SUCCESS);
+ }
resolve_cb_.Run(result);
}
@@ -55,6 +103,14 @@ CdmPromiseTemplate<void>::CdmPromiseTemplate(base::Callback<void()> resolve_cb,
DCHECK(!resolve_cb_.is_null());
}
+CdmPromiseTemplate<void>::CdmPromiseTemplate(base::Callback<void()> resolve_cb,
+ PromiseRejectedCB reject_cb,
+ const std::string& uma_name)
+ : CdmPromise(reject_cb, uma_name), resolve_cb_(resolve_cb) {
+ DCHECK(!resolve_cb_.is_null());
+ DCHECK(!uma_name_.empty());
+}
+
CdmPromiseTemplate<void>::CdmPromiseTemplate() {
}
@@ -65,6 +121,11 @@ CdmPromiseTemplate<void>::~CdmPromiseTemplate() {
void CdmPromiseTemplate<void>::resolve() {
DCHECK(is_pending_);
is_pending_ = false;
+ if (!uma_name_.empty()) {
+ base::LinearHistogram::FactoryGet(
+ uma_name_, 1, NUM_RESULT_CODES, NUM_RESULT_CODES + 1,
+ base::HistogramBase::kUmaTargetedHistogramFlag)->Add(SUCCESS);
+ }
resolve_cb_.Run();
}
diff --git a/media/base/cdm_promise.h b/media/base/cdm_promise.h
index ad1d196..2d45cf2 100644
--- a/media/base/cdm_promise.h
+++ b/media/base/cdm_promise.h
@@ -22,6 +22,19 @@ namespace media {
// This is only the base class, as parameter to resolve() varies.
class MEDIA_EXPORT CdmPromise {
public:
+ // A superset of media::MediaKeys::Exception for UMA reporting.
+ enum ResultCodeForUMA {
+ SUCCESS,
+ NOT_SUPPORTED_ERROR,
+ INVALID_STATE_ERROR,
+ INVALID_ACCESS_ERROR,
+ QUOTA_EXCEEDED_ERROR,
+ UNKNOWN_ERROR,
+ CLIENT_ERROR,
+ OUTPUT_ERROR,
+ NUM_RESULT_CODES
+ };
+
typedef base::Callback<void(MediaKeys::Exception exception_code,
uint32 system_code,
const std::string& error_message)>
@@ -41,11 +54,19 @@ class MEDIA_EXPORT CdmPromise {
CdmPromise();
CdmPromise(PromiseRejectedCB reject_cb);
+ // If constructed with a |uma_name| (which must be the name of a
+ // CdmPromiseResult UMA), CdmPromise will report the promise result (success
+ // or rejection code).
+ CdmPromise(PromiseRejectedCB reject_cb, const std::string& uma_name);
+
PromiseRejectedCB reject_cb_;
// Keep track of whether the promise hasn't been resolved or rejected yet.
bool is_pending_;
+ // UMA to report result to.
+ std::string uma_name_;
+
DISALLOW_COPY_AND_ASSIGN(CdmPromise);
};
@@ -54,6 +75,9 @@ class MEDIA_EXPORT CdmPromiseTemplate : public CdmPromise {
public:
CdmPromiseTemplate(base::Callback<void(const T&)> resolve_cb,
PromiseRejectedCB rejected_cb);
+ CdmPromiseTemplate(base::Callback<void(const T&)> resolve_cb,
+ PromiseRejectedCB rejected_cb,
+ const std::string& uma_name);
virtual ~CdmPromiseTemplate();
virtual void resolve(const T& result);
@@ -69,6 +93,9 @@ class MEDIA_EXPORT CdmPromiseTemplate<void> : public CdmPromise {
public:
CdmPromiseTemplate(base::Callback<void(void)> resolve_cb,
PromiseRejectedCB rejected_cb);
+ CdmPromiseTemplate(base::Callback<void(void)> resolve_cb,
+ PromiseRejectedCB rejected_cb,
+ const std::string& uma_name);
virtual ~CdmPromiseTemplate();
virtual void resolve();
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml
index 944b7d3..53fb4d8 100644
--- a/tools/metrics/histograms/histograms.xml
+++ b/tools/metrics/histograms/histograms.xml
@@ -10893,6 +10893,13 @@ Therefore, the affected-histogram name has to have at least one dot in it.
<summary>cancelKeyRequest result using the Clear Key key system.</summary>
</histogram>
+<histogram name="Media.EME.ClearKey.CreateSession" enum="CdmPromiseResult">
+ <owner>sandersd@chromium.org</owner>
+ <summary>
+ Result of Clear Key createSession promises handled by Chromium code.
+ </summary>
+</histogram>
+
<histogram name="Media.EME.ClearKey.DecryptError">
<owner>xhwang@chromium.org</owner>
<summary>
@@ -10939,6 +10946,14 @@ Therefore, the affected-histogram name has to have at least one dot in it.
<summary>cancelKeyRequest result using an unknown key system.</summary>
</histogram>
+<histogram name="Media.EME.Unknown.CreateSession" enum="CdmPromiseResult">
+ <owner>sandersd@chromium.org</owner>
+ <summary>
+ Result of createSession promises for unknown key systems promises that were
+ handled by Chromium code.
+ </summary>
+</histogram>
+
<histogram name="Media.EME.Unknown.DecryptError">
<owner>xhwang@chromium.org</owner>
<summary>Decryption error event count using an unknown key system.</summary>
@@ -10969,6 +10984,13 @@ Therefore, the affected-histogram name has to have at least one dot in it.
<summary>cancelKeyRequest result using the Widevine key system.</summary>
</histogram>
+<histogram name="Media.EME.Widevine.CreateSession" enum="CdmPromiseResult">
+ <owner>sandersd@chromium.org</owner>
+ <summary>
+ Result of Widevine createSession promises handled by Chromium code.
+ </summary>
+</histogram>
+
<histogram name="Media.EME.Widevine.DecryptError">
<owner>xhwang@chromium.org</owner>
<summary>Decryption error event count using the Widevine key system.</summary>
@@ -37666,6 +37688,17 @@ Therefore, the affected-histogram name has to have at least one dot in it.
<int value="20" label="FutureCat (&gt;10.10), 8-bit (?)"/>
</enum>
+<enum name="CdmPromiseResult" type="int">
+ <int value="0" label="Success"/>
+ <int value="1" label="NotSupportedError"/>
+ <int value="2" label="InvalidStateError"/>
+ <int value="3" label="InvalidAccessError"/>
+ <int value="4" label="QuotaExceededError"/>
+ <int value="5" label="UnknownError"/>
+ <int value="6" label="ClientError"/>
+ <int value="7" label="OutputError"/>
+</enum>
+
<enum name="CertificateChainPosition" type="int">
<int value="0" label="Root Certificate"/>
</enum>