| OLD | NEW |
| (Empty) |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "content/renderer/media/cdm_result_promise.h" | |
| 6 | |
| 7 #include "base/logging.h" | |
| 8 #include "base/metrics/histogram.h" | |
| 9 #include "third_party/WebKit/public/platform/WebString.h" | |
| 10 | |
| 11 namespace content { | |
| 12 | |
| 13 namespace { | |
| 14 | |
| 15 // A superset of media::MediaKeys::Exception for UMA reporting. These values | |
| 16 // should never be changed as it will affect existing reporting, and must match | |
| 17 // the values for CdmPromiseResult in tools/metrics/histograms/histograms.xml. | |
| 18 enum ResultCodeForUMA { | |
| 19 SUCCESS = 0, | |
| 20 NOT_SUPPORTED_ERROR = 1, | |
| 21 INVALID_STATE_ERROR = 2, | |
| 22 INVALID_ACCESS_ERROR = 3, | |
| 23 QUOTA_EXCEEDED_ERROR = 4, | |
| 24 UNKNOWN_ERROR = 5, | |
| 25 CLIENT_ERROR = 6, | |
| 26 OUTPUT_ERROR = 7, | |
| 27 NUM_RESULT_CODES | |
| 28 }; | |
| 29 | |
| 30 static blink::WebContentDecryptionModuleException ConvertException( | |
| 31 media::MediaKeys::Exception exception_code) { | |
| 32 switch (exception_code) { | |
| 33 case media::MediaKeys::NOT_SUPPORTED_ERROR: | |
| 34 return blink::WebContentDecryptionModuleExceptionNotSupportedError; | |
| 35 case media::MediaKeys::INVALID_STATE_ERROR: | |
| 36 return blink::WebContentDecryptionModuleExceptionInvalidStateError; | |
| 37 case media::MediaKeys::INVALID_ACCESS_ERROR: | |
| 38 return blink::WebContentDecryptionModuleExceptionInvalidAccessError; | |
| 39 case media::MediaKeys::QUOTA_EXCEEDED_ERROR: | |
| 40 return blink::WebContentDecryptionModuleExceptionQuotaExceededError; | |
| 41 case media::MediaKeys::UNKNOWN_ERROR: | |
| 42 return blink::WebContentDecryptionModuleExceptionUnknownError; | |
| 43 case media::MediaKeys::CLIENT_ERROR: | |
| 44 return blink::WebContentDecryptionModuleExceptionClientError; | |
| 45 case media::MediaKeys::OUTPUT_ERROR: | |
| 46 return blink::WebContentDecryptionModuleExceptionOutputError; | |
| 47 } | |
| 48 NOTREACHED(); | |
| 49 return blink::WebContentDecryptionModuleExceptionUnknownError; | |
| 50 } | |
| 51 | |
| 52 static ResultCodeForUMA ConvertExceptionToUMAResult( | |
| 53 media::MediaKeys::Exception exception_code) { | |
| 54 switch (exception_code) { | |
| 55 case media::MediaKeys::NOT_SUPPORTED_ERROR: | |
| 56 return NOT_SUPPORTED_ERROR; | |
| 57 case media::MediaKeys::INVALID_STATE_ERROR: | |
| 58 return INVALID_STATE_ERROR; | |
| 59 case media::MediaKeys::INVALID_ACCESS_ERROR: | |
| 60 return INVALID_ACCESS_ERROR; | |
| 61 case media::MediaKeys::QUOTA_EXCEEDED_ERROR: | |
| 62 return QUOTA_EXCEEDED_ERROR; | |
| 63 case media::MediaKeys::UNKNOWN_ERROR: | |
| 64 return UNKNOWN_ERROR; | |
| 65 case media::MediaKeys::CLIENT_ERROR: | |
| 66 return CLIENT_ERROR; | |
| 67 case media::MediaKeys::OUTPUT_ERROR: | |
| 68 return OUTPUT_ERROR; | |
| 69 } | |
| 70 NOTREACHED(); | |
| 71 return UNKNOWN_ERROR; | |
| 72 } | |
| 73 | |
| 74 static void ReportUMA(std::string uma_name, ResultCodeForUMA result) { | |
| 75 if (uma_name.empty()) | |
| 76 return; | |
| 77 | |
| 78 base::LinearHistogram::FactoryGet( | |
| 79 uma_name, | |
| 80 1, | |
| 81 NUM_RESULT_CODES, | |
| 82 NUM_RESULT_CODES + 1, | |
| 83 base::HistogramBase::kUmaTargetedHistogramFlag)->Add(result); | |
| 84 } | |
| 85 | |
| 86 } // namespace | |
| 87 | |
| 88 template <typename... T> | |
| 89 CdmResultPromise<T...>::CdmResultPromise( | |
| 90 const blink::WebContentDecryptionModuleResult& result, | |
| 91 const std::string& uma_name) | |
| 92 : web_cdm_result_(result), uma_name_(uma_name) { | |
| 93 } | |
| 94 | |
| 95 template <typename... T> | |
| 96 CdmResultPromise<T...>::~CdmResultPromise() { | |
| 97 } | |
| 98 | |
| 99 template <> | |
| 100 void CdmResultPromise<>::resolve() { | |
| 101 MarkPromiseSettled(); | |
| 102 ReportUMA(uma_name_, SUCCESS); | |
| 103 web_cdm_result_.complete(); | |
| 104 } | |
| 105 | |
| 106 template <> | |
| 107 void CdmResultPromise<media::KeyIdsVector>::resolve( | |
| 108 const media::KeyIdsVector& result) { | |
| 109 // TODO(jrummell): Update blink::WebContentDecryptionModuleResult to | |
| 110 // handle the set of keys. | |
| 111 reject(media::MediaKeys::NOT_SUPPORTED_ERROR, 0, "Not implemented."); | |
| 112 } | |
| 113 | |
| 114 template <typename... T> | |
| 115 void CdmResultPromise<T...>::reject(media::MediaKeys::Exception exception_code, | |
| 116 uint32 system_code, | |
| 117 const std::string& error_message) { | |
| 118 MarkPromiseSettled(); | |
| 119 ReportUMA(uma_name_, ConvertExceptionToUMAResult(exception_code)); | |
| 120 web_cdm_result_.completeWithError(ConvertException(exception_code), | |
| 121 system_code, | |
| 122 blink::WebString::fromUTF8(error_message)); | |
| 123 } | |
| 124 | |
| 125 NewSessionCdmResultPromise::NewSessionCdmResultPromise( | |
| 126 const blink::WebContentDecryptionModuleResult& result, | |
| 127 const std::string& uma_name, | |
| 128 const SessionInitializedCB& new_session_created_cb) | |
| 129 : web_cdm_result_(result), | |
| 130 uma_name_(uma_name), | |
| 131 new_session_created_cb_(new_session_created_cb) { | |
| 132 } | |
| 133 | |
| 134 NewSessionCdmResultPromise::~NewSessionCdmResultPromise() { | |
| 135 } | |
| 136 | |
| 137 void NewSessionCdmResultPromise::resolve(const std::string& web_session_id) { | |
| 138 MarkPromiseSettled(); | |
| 139 ReportUMA(uma_name_, SUCCESS); | |
| 140 blink::WebContentDecryptionModuleResult::SessionStatus status = | |
| 141 new_session_created_cb_.Run(web_session_id); | |
| 142 web_cdm_result_.completeWithSession(status); | |
| 143 } | |
| 144 | |
| 145 void NewSessionCdmResultPromise::reject( | |
| 146 media::MediaKeys::Exception exception_code, | |
| 147 uint32 system_code, | |
| 148 const std::string& error_message) { | |
| 149 MarkPromiseSettled(); | |
| 150 ReportUMA(uma_name_, ConvertExceptionToUMAResult(exception_code)); | |
| 151 web_cdm_result_.completeWithError(ConvertException(exception_code), | |
| 152 system_code, | |
| 153 blink::WebString::fromUTF8(error_message)); | |
| 154 } | |
| 155 | |
| 156 // Explicit template instantiation for the templates needed. | |
| 157 template class CdmResultPromise<>; | |
| 158 template class CdmResultPromise<media::KeyIdsVector>; | |
| 159 | |
| 160 } // namespace content | |
| OLD | NEW |