Index: content/renderer/media/cdm_result_promise.cc |
diff --git a/content/renderer/media/cdm_result_promise.cc b/content/renderer/media/cdm_result_promise.cc |
index ad591677b1dde5e859fec400d162629741487e13..5d673f061c385e5d6bec4541ffef37944825c0d9 100644 |
--- a/content/renderer/media/cdm_result_promise.cc |
+++ b/content/renderer/media/cdm_result_promise.cc |
@@ -4,12 +4,29 @@ |
#include "content/renderer/media/cdm_result_promise.h" |
-#include "base/bind.h" |
#include "base/logging.h" |
+#include "base/metrics/histogram.h" |
#include "third_party/WebKit/public/platform/WebString.h" |
namespace content { |
+namespace { |
+ |
+// A superset of media::MediaKeys::Exception for UMA reporting. These values |
+// should never be changed as it will affect existing reporting, and must match |
+// the values for CdmPromiseResult in tools/metrics/histograms/histograms.xml. |
+enum ResultCodeForUMA { |
+ SUCCESS = 0, |
+ NOT_SUPPORTED_ERROR = 1, |
+ INVALID_STATE_ERROR = 2, |
+ INVALID_ACCESS_ERROR = 3, |
+ QUOTA_EXCEEDED_ERROR = 4, |
+ UNKNOWN_ERROR = 5, |
+ CLIENT_ERROR = 6, |
+ OUTPUT_ERROR = 7, |
+ NUM_RESULT_CODES |
+}; |
+ |
static blink::WebContentDecryptionModuleException ConvertException( |
media::MediaKeys::Exception exception_code) { |
switch (exception_code) { |
@@ -27,95 +44,117 @@ static blink::WebContentDecryptionModuleException ConvertException( |
return blink::WebContentDecryptionModuleExceptionClientError; |
case media::MediaKeys::OUTPUT_ERROR: |
return blink::WebContentDecryptionModuleExceptionOutputError; |
- default: |
- NOTREACHED(); |
- return blink::WebContentDecryptionModuleExceptionUnknownError; |
} |
+ NOTREACHED(); |
+ return blink::WebContentDecryptionModuleExceptionUnknownError; |
+} |
+ |
+static ResultCodeForUMA ConvertExceptionToUMAResult( |
+ media::MediaKeys::Exception exception_code) { |
+ switch (exception_code) { |
+ case media::MediaKeys::NOT_SUPPORTED_ERROR: |
+ return NOT_SUPPORTED_ERROR; |
+ case media::MediaKeys::INVALID_STATE_ERROR: |
+ return INVALID_STATE_ERROR; |
+ case media::MediaKeys::INVALID_ACCESS_ERROR: |
+ return INVALID_ACCESS_ERROR; |
+ case media::MediaKeys::QUOTA_EXCEEDED_ERROR: |
+ return QUOTA_EXCEEDED_ERROR; |
+ case media::MediaKeys::UNKNOWN_ERROR: |
+ return UNKNOWN_ERROR; |
+ case media::MediaKeys::CLIENT_ERROR: |
+ return CLIENT_ERROR; |
+ case media::MediaKeys::OUTPUT_ERROR: |
+ return OUTPUT_ERROR; |
+ } |
+ NOTREACHED(); |
+ return UNKNOWN_ERROR; |
} |
-template <typename T> |
-CdmResultPromise<T>::CdmResultPromise( |
- const blink::WebContentDecryptionModuleResult& result) |
- : media::CdmPromiseTemplate<T>( |
- base::Bind(&CdmResultPromise::OnResolve, base::Unretained(this)), |
- base::Bind(&CdmResultPromise::OnReject, base::Unretained(this))), |
- web_cdm_result_(result) { |
+static void ReportUMA(std::string uma_name, ResultCodeForUMA result) { |
+ if (uma_name.empty()) |
+ return; |
+ |
+ base::LinearHistogram::FactoryGet( |
+ uma_name, |
+ 1, |
+ NUM_RESULT_CODES, |
+ NUM_RESULT_CODES + 1, |
+ base::HistogramBase::kUmaTargetedHistogramFlag)->Add(result); |
} |
-template <typename T> |
-CdmResultPromise<T>::CdmResultPromise( |
+} // namespace |
+ |
+template <typename... T> |
+CdmResultPromise<T...>::CdmResultPromise( |
const blink::WebContentDecryptionModuleResult& result, |
const std::string& uma_name) |
- : media::CdmPromiseTemplate<T>( |
- base::Bind(&CdmResultPromise::OnResolve, base::Unretained(this)), |
- base::Bind(&CdmResultPromise::OnReject, base::Unretained(this)), |
- uma_name), |
- web_cdm_result_(result) { |
+ : web_cdm_result_(result), uma_name_(uma_name) { |
} |
-template <typename T> |
-CdmResultPromise<T>::~CdmResultPromise() { |
+template <typename... T> |
+CdmResultPromise<T...>::~CdmResultPromise() { |
} |
template <> |
-void CdmResultPromise<std::string>::OnResolve(const std::string& result) { |
- // This must be overridden in a subclass. |
- NOTREACHED(); |
+void CdmResultPromise<>::resolve() { |
+ MarkPromiseSettled(); |
+ ReportUMA(uma_name_, SUCCESS); |
+ web_cdm_result_.complete(); |
} |
template <> |
-void CdmResultPromise<media::KeyIdsVector>::OnResolve( |
+void CdmResultPromise<media::KeyIdsVector>::resolve( |
const media::KeyIdsVector& result) { |
// TODO(jrummell): Update blink::WebContentDecryptionModuleResult to |
// handle the set of keys. |
- OnReject(media::MediaKeys::NOT_SUPPORTED_ERROR, 0, "Not implemented."); |
+ reject(media::MediaKeys::NOT_SUPPORTED_ERROR, 0, "Not implemented."); |
} |
-template <typename T> |
-void CdmResultPromise<T>::OnReject(media::MediaKeys::Exception exception_code, |
- uint32 system_code, |
- const std::string& error_message) { |
+template <typename... T> |
+void CdmResultPromise<T...>::reject(media::MediaKeys::Exception exception_code, |
+ uint32 system_code, |
+ const std::string& error_message) { |
+ MarkPromiseSettled(); |
+ ReportUMA(uma_name_, ConvertExceptionToUMAResult(exception_code)); |
web_cdm_result_.completeWithError(ConvertException(exception_code), |
system_code, |
blink::WebString::fromUTF8(error_message)); |
} |
-CdmResultPromise<void>::CdmResultPromise( |
- const blink::WebContentDecryptionModuleResult& result) |
- : media::CdmPromiseTemplate<void>( |
- base::Bind(&CdmResultPromise::OnResolve, base::Unretained(this)), |
- base::Bind(&CdmResultPromise::OnReject, base::Unretained(this))), |
- web_cdm_result_(result) { |
-} |
- |
-CdmResultPromise<void>::CdmResultPromise( |
+NewSessionCdmResultPromise::NewSessionCdmResultPromise( |
const blink::WebContentDecryptionModuleResult& result, |
- const std::string& uma_name) |
- : media::CdmPromiseTemplate<void>( |
- base::Bind(&CdmResultPromise::OnResolve, base::Unretained(this)), |
- base::Bind(&CdmResultPromise::OnReject, base::Unretained(this)), |
- uma_name), |
- web_cdm_result_(result) { |
+ const std::string& uma_name, |
+ const SessionInitializedCB& new_session_created_cb) |
+ : web_cdm_result_(result), |
+ uma_name_(uma_name), |
+ new_session_created_cb_(new_session_created_cb) { |
} |
-CdmResultPromise<void>::~CdmResultPromise() { |
+NewSessionCdmResultPromise::~NewSessionCdmResultPromise() { |
} |
-void CdmResultPromise<void>::OnResolve() { |
- web_cdm_result_.complete(); |
+void NewSessionCdmResultPromise::resolve(const std::string& web_session_id) { |
+ MarkPromiseSettled(); |
+ ReportUMA(uma_name_, SUCCESS); |
+ blink::WebContentDecryptionModuleResult::SessionStatus status = |
+ new_session_created_cb_.Run(web_session_id); |
+ web_cdm_result_.completeWithSession(status); |
} |
-void CdmResultPromise<void>::OnReject( |
+void NewSessionCdmResultPromise::reject( |
media::MediaKeys::Exception exception_code, |
uint32 system_code, |
const std::string& error_message) { |
+ MarkPromiseSettled(); |
+ ReportUMA(uma_name_, ConvertExceptionToUMAResult(exception_code)); |
web_cdm_result_.completeWithError(ConvertException(exception_code), |
system_code, |
blink::WebString::fromUTF8(error_message)); |
} |
// Explicit template instantiation for the templates needed. |
-template class CdmResultPromise<std::string>; |
+template class CdmResultPromise<>; |
template class CdmResultPromise<media::KeyIdsVector>; |
} // namespace content |