Commit d2fa738d authored by jrummell's avatar jrummell Committed by Commit bot

CdmPromise to use CdmPromiseTraits so specializations not needed

Due to GetResolveParameterType(), the template was specialized for all
the cases used. Adding CdmPromiseTraits so that the specializations
are not needed, and the type set in the constructor appropriately.

BUG=358271
TEST=existing EME tests still pass

Review URL: https://codereview.chromium.org/567123002

Cr-Commit-Position: refs/heads/master@{#296112}
parent 03217458
......@@ -10,17 +10,46 @@
namespace media {
CdmPromise::CdmPromise() : is_pending_(true) {
template <typename T>
struct CdmPromiseTraits {};
template <>
struct CdmPromiseTraits<void> {
static const CdmPromise::ResolveParameterType kType = CdmPromise::VOID_TYPE;
};
template <>
struct CdmPromiseTraits<std::string> {
static const CdmPromise::ResolveParameterType kType = CdmPromise::STRING_TYPE;
};
template <>
struct CdmPromiseTraits<KeyIdsVector> {
static const CdmPromise::ResolveParameterType kType =
CdmPromise::KEY_IDS_VECTOR_TYPE;
};
CdmPromise::CdmPromise(ResolveParameterType parameter_type)
: parameter_type_(parameter_type), is_pending_(true) {
}
CdmPromise::CdmPromise(PromiseRejectedCB reject_cb)
: reject_cb_(reject_cb), is_pending_(true) {
CdmPromise::CdmPromise(ResolveParameterType parameter_type,
PromiseRejectedCB reject_cb)
: parameter_type_(parameter_type),
reject_cb_(reject_cb),
is_pending_(true) {
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) {
CdmPromise::CdmPromise(ResolveParameterType parameter_type,
PromiseRejectedCB reject_cb,
const std::string& uma_name)
: parameter_type_(parameter_type),
reject_cb_(reject_cb),
is_pending_(true),
uma_name_(uma_name) {
DCHECK(!reject_cb_.is_null());
DCHECK(!uma_name_.empty());
}
CdmPromise::~CdmPromise() {
......@@ -52,125 +81,80 @@ static CdmPromise::ResultCodeForUMA ConvertExceptionToUMAResult(
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);
}
ReportResultToUMA(ConvertExceptionToUMAResult(exception_code));
reject_cb_.Run(exception_code, system_code, error_message);
}
CdmPromiseTemplate<void>::CdmPromiseTemplate(base::Callback<void()> resolve_cb,
PromiseRejectedCB reject_cb)
: CdmPromise(reject_cb), resolve_cb_(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() {
}
CdmPromiseTemplate<void>::~CdmPromiseTemplate() {
DCHECK(!is_pending_);
}
void CdmPromiseTemplate<void>::resolve() {
void CdmPromise::ReportResultToUMA(ResultCodeForUMA 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);
uma_name_,
1,
NUM_RESULT_CODES,
NUM_RESULT_CODES + 1,
base::HistogramBase::kUmaTargetedHistogramFlag)->Add(result);
}
resolve_cb_.Run();
}
CdmPromise::ResolveParameterType
CdmPromiseTemplate<void>::GetResolveParameterType() const {
return VOID_TYPE;
}
CdmPromiseTemplate<std::string>::CdmPromiseTemplate(
base::Callback<void(const std::string&)> resolve_cb,
template <typename T>
CdmPromiseTemplate<T>::CdmPromiseTemplate(
base::Callback<void(const T&)> resolve_cb,
PromiseRejectedCB reject_cb)
: CdmPromise(reject_cb), resolve_cb_(resolve_cb) {
: CdmPromise(CdmPromiseTraits<T>::kType, reject_cb),
resolve_cb_(resolve_cb) {
DCHECK(!resolve_cb_.is_null());
}
CdmPromiseTemplate<std::string>::CdmPromiseTemplate(
base::Callback<void(const std::string&)> resolve_cb,
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) {
: CdmPromise(CdmPromiseTraits<T>::kType, reject_cb, uma_name),
resolve_cb_(resolve_cb) {
DCHECK(!resolve_cb_.is_null());
}
CdmPromiseTemplate<std::string>::CdmPromiseTemplate() {
}
CdmPromiseTemplate<std::string>::~CdmPromiseTemplate() {
DCHECK(!is_pending_);
template <typename T>
CdmPromiseTemplate<T>::CdmPromiseTemplate()
: CdmPromise(CdmPromiseTraits<T>::kType) {
}
void CdmPromiseTemplate<std::string>::resolve(const std::string& 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);
}
template <typename T>
void CdmPromiseTemplate<T>::resolve(const T& result) {
ReportResultToUMA(SUCCESS);
resolve_cb_.Run(result);
}
CdmPromise::ResolveParameterType
CdmPromiseTemplate<std::string>::GetResolveParameterType() const {
return STRING_TYPE;
}
CdmPromiseTemplate<KeyIdsVector>::CdmPromiseTemplate(
base::Callback<void(const KeyIdsVector&)> resolve_cb,
CdmPromiseTemplate<void>::CdmPromiseTemplate(base::Callback<void()> resolve_cb,
PromiseRejectedCB reject_cb)
: CdmPromise(reject_cb), resolve_cb_(resolve_cb) {
: CdmPromise(CdmPromiseTraits<void>::kType, reject_cb),
resolve_cb_(resolve_cb) {
DCHECK(!resolve_cb_.is_null());
}
CdmPromiseTemplate<KeyIdsVector>::CdmPromiseTemplate(
base::Callback<void(const KeyIdsVector&)> resolve_cb,
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) {
: CdmPromise(CdmPromiseTraits<void>::kType, reject_cb, uma_name),
resolve_cb_(resolve_cb) {
DCHECK(!resolve_cb_.is_null());
DCHECK(!uma_name_.empty());
}
CdmPromiseTemplate<KeyIdsVector>::~CdmPromiseTemplate() {
DCHECK(!is_pending_);
CdmPromiseTemplate<void>::CdmPromiseTemplate()
: CdmPromise(CdmPromiseTraits<void>::kType) {
}
void CdmPromiseTemplate<KeyIdsVector>::resolve(const KeyIdsVector& 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);
void CdmPromiseTemplate<void>::resolve() {
ReportResultToUMA(SUCCESS);
resolve_cb_.Run();
}
CdmPromise::ResolveParameterType
CdmPromiseTemplate<KeyIdsVector>::GetResolveParameterType() const {
return KEY_IDS_VECTOR_TYPE;
}
// Explicit template instantiation for the Promises needed.
template class MEDIA_EXPORT CdmPromiseTemplate<std::string>;
template class MEDIA_EXPORT CdmPromiseTemplate<KeyIdsVector>;
} // namespace media
......@@ -56,89 +56,74 @@ class MEDIA_EXPORT CdmPromise {
uint32 system_code,
const std::string& error_message);
virtual ResolveParameterType GetResolveParameterType() const = 0;
ResolveParameterType GetResolveParameterType() const {
return parameter_type_;
}
protected:
CdmPromise();
CdmPromise(PromiseRejectedCB reject_cb);
explicit CdmPromise(ResolveParameterType parameter_type);
CdmPromise(ResolveParameterType parameter_type, 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);
CdmPromise(ResolveParameterType parameter_type,
PromiseRejectedCB reject_cb,
const std::string& uma_name);
// Called by all resolve()/reject() methods to report the UMA result if
// applicable, and update |is_pending_|.
void ReportResultToUMA(ResultCodeForUMA result);
const ResolveParameterType parameter_type_;
PromiseRejectedCB reject_cb_;
// Keep track of whether the promise hasn't been resolved or rejected yet.
bool is_pending_;
// UMA to report result to.
// UMA name to report result to.
std::string uma_name_;
DISALLOW_COPY_AND_ASSIGN(CdmPromise);
};
// Specialization for no parameter to resolve().
template <>
class MEDIA_EXPORT CdmPromiseTemplate<void> : public CdmPromise {
template <typename T>
class MEDIA_EXPORT CdmPromiseTemplate : public CdmPromise {
public:
CdmPromiseTemplate(base::Callback<void(void)> resolve_cb,
CdmPromiseTemplate(base::Callback<void(const T&)> resolve_cb,
PromiseRejectedCB rejected_cb);
CdmPromiseTemplate(base::Callback<void(void)> resolve_cb,
CdmPromiseTemplate(base::Callback<void(const T&)> resolve_cb,
PromiseRejectedCB rejected_cb,
const std::string& uma_name);
virtual ~CdmPromiseTemplate();
virtual void resolve();
virtual ResolveParameterType GetResolveParameterType() const OVERRIDE;
virtual void resolve(const T& result);
protected:
// Allow subclasses to completely override the implementation.
CdmPromiseTemplate();
private:
base::Callback<void(void)> resolve_cb_;
base::Callback<void(const T&)> resolve_cb_;
DISALLOW_COPY_AND_ASSIGN(CdmPromiseTemplate);
};
// Specialization for no parameter to resolve().
template <>
class MEDIA_EXPORT CdmPromiseTemplate<std::string> : public CdmPromise {
class MEDIA_EXPORT CdmPromiseTemplate<void> : public CdmPromise {
public:
CdmPromiseTemplate(base::Callback<void(const std::string&)> resolve_cb,
CdmPromiseTemplate(base::Callback<void(void)> resolve_cb,
PromiseRejectedCB rejected_cb);
CdmPromiseTemplate(base::Callback<void(const std::string&)> resolve_cb,
CdmPromiseTemplate(base::Callback<void(void)> resolve_cb,
PromiseRejectedCB rejected_cb,
const std::string& uma_name);
virtual ~CdmPromiseTemplate();
virtual void resolve(const std::string& result);
virtual ResolveParameterType GetResolveParameterType() const OVERRIDE;
virtual void resolve();
protected:
// Allow subclasses to completely override the implementation.
// TODO(jrummell): Remove when derived class SessionLoadedPromise
// (in ppapi_decryptor.cc) is no longer needed.
CdmPromiseTemplate();
private:
base::Callback<void(const std::string&)> resolve_cb_;
DISALLOW_COPY_AND_ASSIGN(CdmPromiseTemplate);
};
template <>
class MEDIA_EXPORT CdmPromiseTemplate<KeyIdsVector> : public CdmPromise {
public:
CdmPromiseTemplate(base::Callback<void(const KeyIdsVector&)> resolve_cb,
PromiseRejectedCB rejected_cb);
CdmPromiseTemplate(base::Callback<void(const KeyIdsVector&)> resolve_cb,
PromiseRejectedCB rejected_cb,
const std::string& uma_name);
virtual ~CdmPromiseTemplate();
virtual void resolve(const KeyIdsVector& result);
virtual ResolveParameterType GetResolveParameterType() const OVERRIDE;
private:
base::Callback<void(const KeyIdsVector&)> resolve_cb_;
base::Callback<void(void)> resolve_cb_;
DISALLOW_COPY_AND_ASSIGN(CdmPromiseTemplate);
};
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment