diff options
author | ddorwin@chromium.org <ddorwin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-27 12:26:05 +0000 |
---|---|---|
committer | ddorwin@chromium.org <ddorwin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-06-27 12:26:05 +0000 |
commit | c94bf3dc23af5f3c73134b4295a30f128073040e (patch) | |
tree | 03a96fb17e7e717310db8fd58e5a7d0da16a85ad /webkit | |
parent | 794495d77c7fb2ebd19e1c07fdd14d42b7e55640 (diff) | |
download | chromium_src-c94bf3dc23af5f3c73134b4295a30f128073040e.zip chromium_src-c94bf3dc23af5f3c73134b4295a30f128073040e.tar.gz chromium_src-c94bf3dc23af5f3c73134b4295a30f128073040e.tar.bz2 |
Move ContentDecryptionModuleFactory to its own files.
BUG=250048
Review URL: https://chromiumcodereview.appspot.com/17769007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@208894 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit')
5 files changed, 177 insertions, 142 deletions
diff --git a/webkit/renderer/media/crypto/content_decryption_module_factory.cc b/webkit/renderer/media/crypto/content_decryption_module_factory.cc new file mode 100644 index 0000000..a599c8a --- /dev/null +++ b/webkit/renderer/media/crypto/content_decryption_module_factory.cc @@ -0,0 +1,121 @@ +// Copyright 2013 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 "webkit/renderer/media/crypto/content_decryption_module_factory.h" + +#include "base/logging.h" +#include "media/crypto/aes_decryptor.h" +#include "webkit/renderer/media/crypto/key_systems.h" + +#if defined(ENABLE_PEPPER_CDMS) +#include "third_party/WebKit/public/platform/WebString.h" +#include "third_party/WebKit/public/web/WebFrame.h" +#include "third_party/WebKit/public/web/WebMediaPlayerClient.h" +#include "webkit/plugins/ppapi/ppapi_plugin_instance.h" +#include "webkit/plugins/ppapi/ppapi_webplugin_impl.h" +#include "webkit/renderer/media/crypto/ppapi_decryptor.h" +#endif // defined(ENABLE_PEPPER_CDMS) + +namespace webkit_media { + +#if defined(ENABLE_PEPPER_CDMS) +// Returns the PluginInstance associated with the Helper Plugin. +// If a non-NULL pointer is returned, the caller must call closeHelperPlugin() +// when the Helper Plugin is no longer needed. +static scoped_refptr<webkit::ppapi::PluginInstance> CreateHelperPlugin( + const std::string& plugin_type, + WebKit::WebMediaPlayerClient* web_media_player_client, + WebKit::WebFrame* web_frame) { + DCHECK(web_media_player_client); + DCHECK(web_frame); + + WebKit::WebPlugin* web_plugin = web_media_player_client->createHelperPlugin( + WebKit::WebString::fromUTF8(plugin_type), web_frame); + if (!web_plugin) + return NULL; + + DCHECK(!web_plugin->isPlaceholder()); // Prevented by Blink. + // Only Pepper plugins are supported, so it must be a ppapi object. + webkit::ppapi::WebPluginImpl* ppapi_plugin = + static_cast<webkit::ppapi::WebPluginImpl*>(web_plugin); + return ppapi_plugin->instance(); +} + +static scoped_ptr<media::MediaKeys> CreatePpapiDecryptor( + const std::string& key_system, + const media::KeyAddedCB& key_added_cb, + const media::KeyErrorCB& key_error_cb, + const media::KeyMessageCB& key_message_cb, + const base::Closure& destroy_plugin_cb, + WebKit::WebMediaPlayerClient* web_media_player_client, + WebKit::WebFrame* web_frame) { + DCHECK(web_media_player_client); + DCHECK(web_frame); + + std::string plugin_type = GetPepperType(key_system); + DCHECK(!plugin_type.empty()); + const scoped_refptr<webkit::ppapi::PluginInstance>& plugin_instance = + CreateHelperPlugin(plugin_type, web_media_player_client, web_frame); + if (!plugin_instance.get()) { + DLOG(ERROR) << "ProxyDecryptor: plugin instance creation failed."; + return scoped_ptr<media::MediaKeys>(); + } + + scoped_ptr<PpapiDecryptor> decryptor = + PpapiDecryptor::Create(key_system, + plugin_instance, + key_added_cb, + key_error_cb, + key_message_cb, + destroy_plugin_cb); + + if (!decryptor) { + ContentDecryptionModuleFactory::DestroyHelperPlugin( + web_media_player_client); + } + // Else the new object will call destroy_plugin_cb to destroy Helper Plugin. + + return scoped_ptr<media::MediaKeys>(decryptor.Pass()); +} + +void ContentDecryptionModuleFactory::DestroyHelperPlugin( + WebKit::WebMediaPlayerClient* web_media_player_client) { + web_media_player_client->closeHelperPlugin(); +} +#endif // defined(ENABLE_PEPPER_CDMS) + +scoped_ptr<media::MediaKeys> ContentDecryptionModuleFactory::Create( + const std::string& key_system, +#if defined(ENABLE_PEPPER_CDMS) + WebKit::WebMediaPlayerClient* web_media_player_client, + WebKit::WebFrame* web_frame, + const base::Closure& destroy_plugin_cb, +#elif defined(OS_ANDROID) + scoped_ptr<media::MediaKeys> media_keys, +#endif // defined(ENABLE_PEPPER_CDMS) + const media::KeyAddedCB& key_added_cb, + const media::KeyErrorCB& key_error_cb, + const media::KeyMessageCB& key_message_cb) { + if (CanUseAesDecryptor(key_system)) { + return scoped_ptr<media::MediaKeys>( + new media::AesDecryptor(key_added_cb, key_error_cb, key_message_cb)); + } + +#if defined(ENABLE_PEPPER_CDMS) + // TODO(ddorwin): Remove when the WD API implementation supports loading + // Pepper-based CDMs: http://crbug.com/250049 + if (!web_media_player_client) + return scoped_ptr<media::MediaKeys>(); + + return CreatePpapiDecryptor( + key_system, key_added_cb, key_error_cb, key_message_cb, + destroy_plugin_cb, web_media_player_client, web_frame); +#elif defined(OS_ANDROID) + return media_keys.Pass(); +#else + return scoped_ptr<media::MediaKeys>(); +#endif // defined(ENABLE_PEPPER_CDMS) +} + +} // namespace webkit_media diff --git a/webkit/renderer/media/crypto/content_decryption_module_factory.h b/webkit/renderer/media/crypto/content_decryption_module_factory.h new file mode 100644 index 0000000..7903030 --- /dev/null +++ b/webkit/renderer/media/crypto/content_decryption_module_factory.h @@ -0,0 +1,49 @@ +// Copyright 2013 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. + +#ifndef WEBKIT_RENDERER_MEDIA_CRYPTO_CONTENT_DECRYPTION_MODULE_FACTORY_H_ +#define WEBKIT_RENDERER_MEDIA_CRYPTO_CONTENT_DECRYPTION_MODULE_FACTORY_H_ + +#include <string> + +#include "base/memory/scoped_ptr.h" +#include "media/base/media_keys.h" + +#if defined(ENABLE_PEPPER_CDMS) +namespace WebKit { +class WebFrame; +class WebMediaPlayerClient; +} +#endif // defined(ENABLE_PEPPER_CDMS) + +namespace webkit_media { + +class ContentDecryptionModuleFactory { + public: + static scoped_ptr<media::MediaKeys> Create( + const std::string& key_system, +#if defined(ENABLE_PEPPER_CDMS) + // TODO(ddorwin): We need different pointers for the WD API. + WebKit::WebMediaPlayerClient* web_media_player_client, + WebKit::WebFrame* web_frame, + const base::Closure& destroy_plugin_cb, +#elif defined(OS_ANDROID) + // TODO(scherkus): Revert the ProxyDecryptor changes from r208040 so that + // this class always creates the MediaKeys. + // A ProxyMediaKeys to be used if |key_system| is not Clear Key. + scoped_ptr<media::MediaKeys> media_keys, +#endif // defined(ENABLE_PEPPER_CDMS) + const media::KeyAddedCB& key_added_cb, + const media::KeyErrorCB& key_error_cb, + const media::KeyMessageCB& key_message_cb); + +#if defined(ENABLE_PEPPER_CDMS) + static void DestroyHelperPlugin( + WebKit::WebMediaPlayerClient* web_media_player_client); +#endif // defined(ENABLE_PEPPER_CDMS) +}; + +} // namespace webkit_media + +#endif // WEBKIT_RENDERER_MEDIA_CRYPTO_CONTENT_DECRYPTION_MODULE_FACTORY_H_ diff --git a/webkit/renderer/media/crypto/proxy_decryptor.cc b/webkit/renderer/media/crypto/proxy_decryptor.cc index 9bcc78b..90001c4 100644 --- a/webkit/renderer/media/crypto/proxy_decryptor.cc +++ b/webkit/renderer/media/crypto/proxy_decryptor.cc @@ -7,52 +7,16 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/logging.h" -#include "media/crypto/aes_decryptor.h" +#include "webkit/renderer/media/crypto/content_decryption_module_factory.h" #include "webkit/renderer/media/crypto/key_systems.h" -#if defined(ENABLE_PEPPER_CDMS) -#include "third_party/WebKit/public/platform/WebString.h" -#include "third_party/WebKit/public/web/WebFrame.h" -#include "third_party/WebKit/public/web/WebMediaPlayerClient.h" -#include "webkit/renderer/media/crypto/ppapi_decryptor.h" -#include "webkit/plugins/ppapi/ppapi_plugin_instance.h" -#include "webkit/plugins/ppapi/ppapi_webplugin_impl.h" -#endif // defined(ENABLE_PEPPER_CDMS) - namespace webkit_media { #if defined(ENABLE_PEPPER_CDMS) -// Returns the PluginInstance associated with the Helper Plugin. -// If a non-NULL pointer is returned, the caller must call closeHelperPlugin() -// when the Helper Plugin is no longer needed. -static scoped_refptr<webkit::ppapi::PluginInstance> CreateHelperPlugin( - const std::string& plugin_type, - WebKit::WebMediaPlayerClient* web_media_player_client, - WebKit::WebFrame* web_frame) { - DCHECK(web_media_player_client); - DCHECK(web_frame); - - WebKit::WebPlugin* web_plugin = web_media_player_client->createHelperPlugin( - WebKit::WebString::fromUTF8(plugin_type), web_frame); - if (!web_plugin) - return NULL; - - DCHECK(!web_plugin->isPlaceholder()); // Prevented by Blink. - // Only Pepper plugins are supported, so it must be a ppapi object. - webkit::ppapi::WebPluginImpl* ppapi_plugin = - static_cast<webkit::ppapi::WebPluginImpl*>(web_plugin); - return ppapi_plugin->instance(); -} - -void DestroyHelperPluginForClient( - WebKit::WebMediaPlayerClient* web_media_player_client) { - web_media_player_client->closeHelperPlugin(); -} - void ProxyDecryptor::DestroyHelperPlugin() { - DestroyHelperPluginForClient(web_media_player_client_); + ContentDecryptionModuleFactory::DestroyHelperPlugin( + web_media_player_client_); } - #endif // defined(ENABLE_PEPPER_CDMS) ProxyDecryptor::ProxyDecryptor( @@ -153,42 +117,6 @@ void ProxyDecryptor::CancelKeyRequest(const std::string& session_id) { media_keys_->CancelKeyRequest(session_id); } -#if defined(ENABLE_PEPPER_CDMS) -scoped_ptr<media::MediaKeys> -ContentDecryptionModuleFactory::CreatePpapiDecryptor( - const std::string& key_system, - const media::KeyAddedCB& key_added_cb, - const media::KeyErrorCB& key_error_cb, - const media::KeyMessageCB& key_message_cb, - const base::Closure& destroy_plugin_cb, - WebKit::WebMediaPlayerClient* web_media_player_client, - WebKit::WebFrame* web_frame) { - DCHECK(web_media_player_client); - DCHECK(web_frame); - - std::string plugin_type = GetPepperType(key_system); - DCHECK(!plugin_type.empty()); - const scoped_refptr<webkit::ppapi::PluginInstance>& plugin_instance = - CreateHelperPlugin(plugin_type, web_media_player_client, web_frame); - if (!plugin_instance.get()) { - DLOG(ERROR) << "ProxyDecryptor: plugin instance creation failed."; - return scoped_ptr<media::MediaKeys>(); - } - - scoped_ptr<webkit_media::PpapiDecryptor> decryptor = PpapiDecryptor::Create( - key_system, - plugin_instance, - key_added_cb, key_error_cb, key_message_cb, - destroy_plugin_cb); - - if (!decryptor) - DestroyHelperPluginForClient(web_media_player_client); - // Else the new object will call destroy_plugin_cb to destroy Helper Plugin. - - return scoped_ptr<media::MediaKeys>(decryptor.Pass()); -} -#endif // defined(ENABLE_PEPPER_CDMS) - scoped_ptr<media::MediaKeys> ProxyDecryptor::CreateMediaKeys( const std::string& key_system) { return ContentDecryptionModuleFactory::Create( @@ -206,39 +134,6 @@ scoped_ptr<media::MediaKeys> ProxyDecryptor::CreateMediaKeys( base::Bind(&ProxyDecryptor::KeyMessage, weak_ptr_factory_.GetWeakPtr())); } -scoped_ptr<media::MediaKeys> ContentDecryptionModuleFactory::Create( - const std::string& key_system, -#if defined(ENABLE_PEPPER_CDMS) - WebKit::WebMediaPlayerClient* web_media_player_client, - WebKit::WebFrame* web_frame, - const base::Closure& destroy_plugin_cb, -#elif defined(OS_ANDROID) - scoped_ptr<media::MediaKeys> media_keys, -#endif // defined(ENABLE_PEPPER_CDMS) - const media::KeyAddedCB& key_added_cb, - const media::KeyErrorCB& key_error_cb, - const media::KeyMessageCB& key_message_cb) { - if (CanUseAesDecryptor(key_system)) { - return scoped_ptr<media::MediaKeys>( - new media::AesDecryptor(key_added_cb, key_error_cb, key_message_cb)); - } - -#if defined(ENABLE_PEPPER_CDMS) - // TODO(ddorwin): Remove when the WD API implementation supports loading - // Pepper-based CDMs: http://crbug.com/250049 - if (!web_media_player_client) - return scoped_ptr<media::MediaKeys>(); - - return CreatePpapiDecryptor( - key_system, key_added_cb, key_error_cb, key_message_cb, - destroy_plugin_cb, web_media_player_client, web_frame); -#elif defined(OS_ANDROID) - return media_keys.Pass(); -#else - return scoped_ptr<media::MediaKeys>(); -#endif // defined(ENABLE_PEPPER_CDMS) -} - void ProxyDecryptor::KeyAdded(const std::string& session_id) { key_added_cb_.Run(session_id); } diff --git a/webkit/renderer/media/crypto/proxy_decryptor.h b/webkit/renderer/media/crypto/proxy_decryptor.h index b9980d9..94dd99f 100644 --- a/webkit/renderer/media/crypto/proxy_decryptor.h +++ b/webkit/renderer/media/crypto/proxy_decryptor.h @@ -14,46 +14,14 @@ #include "media/base/media_keys.h" namespace WebKit { +#if defined(ENABLE_PEPPER_CDMS) class WebFrame; class WebMediaPlayerClient; +#endif // defined(ENABLE_PEPPER_CDMS) } namespace webkit_media { -// TODO(ddorwin): Move to its own file. -class ContentDecryptionModuleFactory { - public: - static scoped_ptr<media::MediaKeys> Create( - const std::string& key_system, -#if defined(ENABLE_PEPPER_CDMS) - // TODO(ddorwin): We need different pointers for the WD API. - WebKit::WebMediaPlayerClient* web_media_player_client, - WebKit::WebFrame* web_frame, - const base::Closure& destroy_plugin_cb, -#elif defined(OS_ANDROID) - // TODO(scherkus): Revert the ProxyDecryptor changes from r208040 so that - // this class always creates the MediaKeys. - // A ProxyMediaKeys to be used if |key_system| is not Clear Key. - scoped_ptr<media::MediaKeys> media_keys, -#endif // defined(ENABLE_PEPPER_CDMS) - const media::KeyAddedCB& key_added_cb, - const media::KeyErrorCB& key_error_cb, - const media::KeyMessageCB& key_message_cb); - - private: -#if defined(ENABLE_PEPPER_CDMS) - static scoped_ptr<media::MediaKeys> CreatePpapiDecryptor( - const std::string& key_system, - const media::KeyAddedCB& key_added_cb, - const media::KeyErrorCB& key_error_cb, - const media::KeyMessageCB& key_message_cb, - const base::Closure& destroy_plugin_cb, - // TODO(ddorwin): We need different pointers for the WD API. - WebKit::WebMediaPlayerClient* web_media_player_client, - WebKit::WebFrame* web_frame); -#endif // defined(ENABLE_PEPPER_CDMS) -}; - // ProxyDecryptor is for EME v0.1b only. It should not be used for the WD API. // A decryptor proxy that creates a real decryptor object on demand and // forwards decryptor calls to it. diff --git a/webkit/renderer/media/webkit_media.gypi b/webkit/renderer/media/webkit_media.gypi index ecd0bf3..2873d69 100644 --- a/webkit/renderer/media/webkit_media.gypi +++ b/webkit/renderer/media/webkit_media.gypi @@ -48,6 +48,8 @@ 'buffered_resource_loader.h', 'cache_util.cc', 'cache_util.h', + 'crypto/content_decryption_module_factory.cc', + 'crypto/content_decryption_module_factory.h', 'crypto/key_systems.cc', 'crypto/key_systems.h', 'crypto/key_systems_info.cc', |