blob: ad591677b1dde5e859fec400d162629741487e13 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/renderer/media/cdm_result_promise.h"
#include "base/bind.h"
#include "base/logging.h"
#include "third_party/WebKit/public/platform/WebString.h"
namespace content {
static blink::WebContentDecryptionModuleException ConvertException(
media::MediaKeys::Exception exception_code) {
switch (exception_code) {
case media::MediaKeys::NOT_SUPPORTED_ERROR:
return blink::WebContentDecryptionModuleExceptionNotSupportedError;
case media::MediaKeys::INVALID_STATE_ERROR:
return blink::WebContentDecryptionModuleExceptionInvalidStateError;
case media::MediaKeys::INVALID_ACCESS_ERROR:
return blink::WebContentDecryptionModuleExceptionInvalidAccessError;
case media::MediaKeys::QUOTA_EXCEEDED_ERROR:
return blink::WebContentDecryptionModuleExceptionQuotaExceededError;
case media::MediaKeys::UNKNOWN_ERROR:
return blink::WebContentDecryptionModuleExceptionUnknownError;
case media::MediaKeys::CLIENT_ERROR:
return blink::WebContentDecryptionModuleExceptionClientError;
case media::MediaKeys::OUTPUT_ERROR:
return blink::WebContentDecryptionModuleExceptionOutputError;
default:
NOTREACHED();
return blink::WebContentDecryptionModuleExceptionUnknownError;
}
}
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) {
}
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) {
}
template <typename T>
CdmResultPromise<T>::~CdmResultPromise() {
}
template <>
void CdmResultPromise<std::string>::OnResolve(const std::string& result) {
// This must be overridden in a subclass.
NOTREACHED();
}
template <>
void CdmResultPromise<media::KeyIdsVector>::OnResolve(
const media::KeyIdsVector& result) {
// TODO(jrummell): Update blink::WebContentDecryptionModuleResult to
// handle the set of keys.
OnReject(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) {
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(
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) {
}
CdmResultPromise<void>::~CdmResultPromise() {
}
void CdmResultPromise<void>::OnResolve() {
web_cdm_result_.complete();
}
void CdmResultPromise<void>::OnReject(
media::MediaKeys::Exception exception_code,
uint32 system_code,
const std::string& error_message) {
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<media::KeyIdsVector>;
} // namespace content