summaryrefslogtreecommitdiffstats
path: root/webkit/renderer
diff options
context:
space:
mode:
authorddorwin@chromium.org <ddorwin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-12 20:42:19 +0000
committerddorwin@chromium.org <ddorwin@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-06-12 20:42:19 +0000
commit586d6f15802e4f1a873b2d0709d1b5f32da2bc7f (patch)
tree44888c8b7ac2efbff879ffe1dfe05b491e839acf /webkit/renderer
parent6d3c558e01e0d80281061e67399512439e7d772d (diff)
downloadchromium_src-586d6f15802e4f1a873b2d0709d1b5f32da2bc7f.zip
chromium_src-586d6f15802e4f1a873b2d0709d1b5f32da2bc7f.tar.gz
chromium_src-586d6f15802e4f1a873b2d0709d1b5f32da2bc7f.tar.bz2
ProxyDecryptor owns destruction of the Helper Plugin.
This moves ths responsibility from from ProxyDecryptor to PpapiDecryptor. BUG=173755 Review URL: https://chromiumcodereview.appspot.com/15724027 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@205921 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit/renderer')
-rw-r--r--webkit/renderer/media/crypto/ppapi_decryptor.cc5
-rw-r--r--webkit/renderer/media/crypto/ppapi_decryptor.h6
-rw-r--r--webkit/renderer/media/crypto/proxy_decryptor.cc24
-rw-r--r--webkit/renderer/media/crypto/proxy_decryptor.h5
4 files changed, 21 insertions, 19 deletions
diff --git a/webkit/renderer/media/crypto/ppapi_decryptor.cc b/webkit/renderer/media/crypto/ppapi_decryptor.cc
index 341f8d3..310f9a5 100644
--- a/webkit/renderer/media/crypto/ppapi_decryptor.cc
+++ b/webkit/renderer/media/crypto/ppapi_decryptor.cc
@@ -28,12 +28,14 @@ PpapiDecryptor::PpapiDecryptor(
const media::KeyAddedCB& key_added_cb,
const media::KeyErrorCB& key_error_cb,
const media::KeyMessageCB& key_message_cb,
- const media::NeedKeyCB& need_key_cb)
+ const media::NeedKeyCB& need_key_cb,
+ const base::Closure& destroy_plugin_cb)
: plugin_instance_(plugin_instance),
key_added_cb_(key_added_cb),
key_error_cb_(key_error_cb),
key_message_cb_(key_message_cb),
need_key_cb_(need_key_cb),
+ destroy_plugin_cb_(destroy_plugin_cb),
plugin_cdm_delegate_(NULL),
render_loop_proxy_(base::MessageLoopProxy::current()),
weak_ptr_factory_(this),
@@ -44,6 +46,7 @@ PpapiDecryptor::PpapiDecryptor(
PpapiDecryptor::~PpapiDecryptor() {
plugin_cdm_delegate_ = NULL;
plugin_instance_ = NULL;
+ destroy_plugin_cb_.Run();
}
bool PpapiDecryptor::GenerateKeyRequest(const std::string& key_system,
diff --git a/webkit/renderer/media/crypto/ppapi_decryptor.h b/webkit/renderer/media/crypto/ppapi_decryptor.h
index dd47cc7..6b08a82 100644
--- a/webkit/renderer/media/crypto/ppapi_decryptor.h
+++ b/webkit/renderer/media/crypto/ppapi_decryptor.h
@@ -36,7 +36,8 @@ class PpapiDecryptor : public media::MediaKeys, public media::Decryptor {
const media::KeyAddedCB& key_added_cb,
const media::KeyErrorCB& key_error_cb,
const media::KeyMessageCB& key_message_cb,
- const media::NeedKeyCB& need_key_cb);
+ const media::NeedKeyCB& need_key_cb,
+ const base::Closure& destroy_plugin_cb);
virtual ~PpapiDecryptor();
// media::MediaKeys implementation.
@@ -104,6 +105,9 @@ class PpapiDecryptor : public media::MediaKeys, public media::Decryptor {
media::KeyMessageCB key_message_cb_;
media::NeedKeyCB need_key_cb_;
+ // Called to destroy the helper plugin when this class no longer needs it.
+ base::Closure destroy_plugin_cb_;
+
webkit::ppapi::ContentDecryptorDelegate* plugin_cdm_delegate_;
scoped_refptr<base::MessageLoopProxy> render_loop_proxy_;
diff --git a/webkit/renderer/media/crypto/proxy_decryptor.cc b/webkit/renderer/media/crypto/proxy_decryptor.cc
index 94c32a8..4bf7374 100644
--- a/webkit/renderer/media/crypto/proxy_decryptor.cc
+++ b/webkit/renderer/media/crypto/proxy_decryptor.cc
@@ -37,17 +37,17 @@ static scoped_refptr<webkit::ppapi::PluginInstance> CreateHelperPlugin(
if (!web_plugin)
return NULL;
- DCHECK(!web_plugin->isPlaceholder()); // Prevented by WebKit.
+ 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 void DestroyHelperPlugin(
- WebKit::WebMediaPlayerClient* web_media_player_client) {
- web_media_player_client->closeHelperPlugin();
+void ProxyDecryptor::DestroyHelperPlugin() {
+ web_media_player_client_->closeHelperPlugin();
}
+
#endif // defined(ENABLE_PEPPER_CDMS)
ProxyDecryptor::ProxyDecryptor(
@@ -59,7 +59,6 @@ ProxyDecryptor::ProxyDecryptor(
const media::NeedKeyCB& need_key_cb)
: web_media_player_client_(web_media_player_client),
web_frame_(web_frame),
- did_create_helper_plugin_(false),
key_added_cb_(key_added_cb),
key_error_cb_(key_error_cb),
key_message_cb_(key_message_cb),
@@ -73,13 +72,6 @@ ProxyDecryptor::~ProxyDecryptor() {
base::AutoLock auto_lock(lock_);
decryptor_.reset();
}
-
-#if defined(ENABLE_PEPPER_CDMS)
- if (did_create_helper_plugin_)
- DestroyHelperPlugin(web_media_player_client_);
-#endif
-
- web_media_player_client_ = NULL; // We should be done using it now.
}
// TODO(xhwang): Support multiple decryptor notification request (e.g. from
@@ -169,18 +161,20 @@ scoped_ptr<media::Decryptor> ProxyDecryptor::CreatePpapiDecryptor(
DCHECK(!plugin_type.empty());
const scoped_refptr<webkit::ppapi::PluginInstance>& plugin_instance =
CreateHelperPlugin(plugin_type, web_media_player_client_, web_frame_);
- did_create_helper_plugin_ = plugin_instance.get() != NULL;
- if (!did_create_helper_plugin_) {
+ if (!plugin_instance.get()) {
DVLOG(1) << "ProxyDecryptor: plugin instance creation failed.";
return scoped_ptr<media::Decryptor>();
}
+ // The new object will call destroy_plugin_cb to destroy Helper Plugin.
return scoped_ptr<media::Decryptor>(new PpapiDecryptor(
plugin_instance,
base::Bind(&ProxyDecryptor::KeyAdded, weak_ptr_factory_.GetWeakPtr()),
base::Bind(&ProxyDecryptor::KeyError, weak_ptr_factory_.GetWeakPtr()),
base::Bind(&ProxyDecryptor::KeyMessage, weak_ptr_factory_.GetWeakPtr()),
- base::Bind(&ProxyDecryptor::NeedKey, weak_ptr_factory_.GetWeakPtr())));
+ base::Bind(&ProxyDecryptor::NeedKey, weak_ptr_factory_.GetWeakPtr()),
+ base::Bind(&ProxyDecryptor::DestroyHelperPlugin,
+ weak_ptr_factory_.GetWeakPtr())));
}
#endif // defined(ENABLE_PEPPER_CDMS)
diff --git a/webkit/renderer/media/crypto/proxy_decryptor.h b/webkit/renderer/media/crypto/proxy_decryptor.h
index 1580099..629f76f 100644
--- a/webkit/renderer/media/crypto/proxy_decryptor.h
+++ b/webkit/renderer/media/crypto/proxy_decryptor.h
@@ -55,11 +55,13 @@ class ProxyDecryptor : public media::MediaKeys {
private:
// Helper functions to create decryptors to handle the given |key_system|.
+ scoped_ptr<media::Decryptor> CreateDecryptor(const std::string& key_system);
#if defined(ENABLE_PEPPER_CDMS)
scoped_ptr<media::Decryptor> CreatePpapiDecryptor(
const std::string& key_system);
+ // Callback for cleaning up a Pepper CDM.
+ void DestroyHelperPlugin();
#endif // defined(ENABLE_PEPPER_CDMS)
- scoped_ptr<media::Decryptor> CreateDecryptor(const std::string& key_system);
// Callbacks for firing key events.
void KeyAdded(const std::string& key_system, const std::string& session_id);
@@ -79,7 +81,6 @@ class ProxyDecryptor : public media::MediaKeys {
// Needed to create the PpapiDecryptor.
WebKit::WebMediaPlayerClient* web_media_player_client_;
WebKit::WebFrame* web_frame_;
- bool did_create_helper_plugin_;
// Callbacks for firing key events.
media::KeyAddedCB key_added_cb_;