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

Handle createCDM() when frame destroyed

createCDM() now uses WeakPtr<> so that it fails gracefully when the
frame is destroyed.

BUG=454278
TEST=fuzzed test doesn't crash

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

Cr-Commit-Position: refs/heads/master@{#314417}
parent 71d14181
...@@ -2,24 +2,31 @@ ...@@ -2,24 +2,31 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
#include "webcontentdecryptionmoduleaccess_impl.h" #include "media/blink/webcontentdecryptionmoduleaccess_impl.h"
#include "base/basictypes.h" #include "base/basictypes.h"
#include "base/bind.h" #include "base/bind.h"
#include "base/location.h" #include "base/location.h"
#include "base/message_loop/message_loop_proxy.h" #include "base/message_loop/message_loop_proxy.h"
#include "third_party/WebKit/public/platform/WebContentDecryptionModuleResult.h" #include "media/blink/webencryptedmediaclient_impl.h"
#include "webcontentdecryptionmodule_impl.h"
namespace media { namespace media {
// The caller owns the created cdm (passed back using |result|). // The caller owns the created cdm (passed back using |result|).
static void CreateCdm(CdmFactory* cdm_factory, static void CreateCdm(const base::WeakPtr<WebEncryptedMediaClientImpl>& client,
blink::WebSecurityOrigin security_origin, const blink::WebString& key_system,
blink::WebString key_system, const blink::WebSecurityOrigin& security_origin,
blink::WebContentDecryptionModuleResult result) { blink::WebContentDecryptionModuleResult result) {
WebContentDecryptionModuleImpl::Create(cdm_factory, security_origin, // If |client| is gone (due to the frame getting destroyed), it is
key_system, result); // impossible to create the CDM, so fail.
if (!client) {
result.completeWithError(
blink::WebContentDecryptionModuleExceptionInvalidStateError, 0,
"Failed to create CDM.");
return;
}
client->CreateCdm(key_system, security_origin, result);
} }
WebContentDecryptionModuleAccessImpl* WebContentDecryptionModuleAccessImpl*
...@@ -27,20 +34,20 @@ WebContentDecryptionModuleAccessImpl::Create( ...@@ -27,20 +34,20 @@ WebContentDecryptionModuleAccessImpl::Create(
const blink::WebString& key_system, const blink::WebString& key_system,
const blink::WebMediaKeySystemConfiguration& configuration, const blink::WebMediaKeySystemConfiguration& configuration,
const blink::WebSecurityOrigin& security_origin, const blink::WebSecurityOrigin& security_origin,
CdmFactory* cdm_factory) { const base::WeakPtr<WebEncryptedMediaClientImpl>& client) {
return new WebContentDecryptionModuleAccessImpl(key_system, configuration, return new WebContentDecryptionModuleAccessImpl(key_system, configuration,
security_origin, cdm_factory); security_origin, client);
} }
WebContentDecryptionModuleAccessImpl::WebContentDecryptionModuleAccessImpl( WebContentDecryptionModuleAccessImpl::WebContentDecryptionModuleAccessImpl(
const blink::WebString& key_system, const blink::WebString& key_system,
const blink::WebMediaKeySystemConfiguration& configuration, const blink::WebMediaKeySystemConfiguration& configuration,
const blink::WebSecurityOrigin& security_origin, const blink::WebSecurityOrigin& security_origin,
CdmFactory* cdm_factory) const base::WeakPtr<WebEncryptedMediaClientImpl>& client)
: key_system_(key_system), : key_system_(key_system),
configuration_(configuration), configuration_(configuration),
security_origin_(security_origin), security_origin_(security_origin),
cdm_factory_(cdm_factory) { client_(client) {
} }
WebContentDecryptionModuleAccessImpl::~WebContentDecryptionModuleAccessImpl() { WebContentDecryptionModuleAccessImpl::~WebContentDecryptionModuleAccessImpl() {
...@@ -58,8 +65,8 @@ void WebContentDecryptionModuleAccessImpl::createContentDecryptionModule( ...@@ -58,8 +65,8 @@ void WebContentDecryptionModuleAccessImpl::createContentDecryptionModule(
// blink side, copy all values needed by CreateCdm() in case the blink object // blink side, copy all values needed by CreateCdm() in case the blink object
// gets garbage-collected. // gets garbage-collected.
base::MessageLoopProxy::current()->PostTask( base::MessageLoopProxy::current()->PostTask(
FROM_HERE, base::Bind(&CreateCdm, cdm_factory_, security_origin_, FROM_HERE,
key_system_, result)); base::Bind(&CreateCdm, client_, key_system_, security_origin_, result));
} }
} // namespace media } // namespace media
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "base/basictypes.h" #include "base/basictypes.h"
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "media/base/cdm_factory.h" #include "media/base/cdm_factory.h"
#include "third_party/WebKit/public/platform/WebContentDecryptionModuleAccess.h" #include "third_party/WebKit/public/platform/WebContentDecryptionModuleAccess.h"
#include "third_party/WebKit/public/platform/WebMediaKeySystemConfiguration.h" #include "third_party/WebKit/public/platform/WebMediaKeySystemConfiguration.h"
...@@ -19,6 +20,8 @@ class WebLocalFrame; ...@@ -19,6 +20,8 @@ class WebLocalFrame;
namespace media { namespace media {
class WebEncryptedMediaClientImpl;
class WebContentDecryptionModuleAccessImpl class WebContentDecryptionModuleAccessImpl
: public blink::WebContentDecryptionModuleAccess { : public blink::WebContentDecryptionModuleAccess {
public: public:
...@@ -26,7 +29,7 @@ class WebContentDecryptionModuleAccessImpl ...@@ -26,7 +29,7 @@ class WebContentDecryptionModuleAccessImpl
const blink::WebString& key_system, const blink::WebString& key_system,
const blink::WebMediaKeySystemConfiguration& configuration, const blink::WebMediaKeySystemConfiguration& configuration,
const blink::WebSecurityOrigin& security_origin, const blink::WebSecurityOrigin& security_origin,
CdmFactory* cdm_factory); const base::WeakPtr<WebEncryptedMediaClientImpl>& client);
virtual ~WebContentDecryptionModuleAccessImpl(); virtual ~WebContentDecryptionModuleAccessImpl();
// blink::WebContentDecryptionModuleAccess interface. // blink::WebContentDecryptionModuleAccess interface.
...@@ -39,14 +42,16 @@ class WebContentDecryptionModuleAccessImpl ...@@ -39,14 +42,16 @@ class WebContentDecryptionModuleAccessImpl
const blink::WebString& key_system, const blink::WebString& key_system,
const blink::WebMediaKeySystemConfiguration& configuration, const blink::WebMediaKeySystemConfiguration& configuration,
const blink::WebSecurityOrigin& security_origin, const blink::WebSecurityOrigin& security_origin,
CdmFactory* cdm_factory); const base::WeakPtr<WebEncryptedMediaClientImpl>& client);
DISALLOW_COPY_AND_ASSIGN(WebContentDecryptionModuleAccessImpl); DISALLOW_COPY_AND_ASSIGN(WebContentDecryptionModuleAccessImpl);
blink::WebString key_system_; blink::WebString key_system_;
blink::WebMediaKeySystemConfiguration configuration_; blink::WebMediaKeySystemConfiguration configuration_;
blink::WebSecurityOrigin security_origin_; blink::WebSecurityOrigin security_origin_;
CdmFactory* cdm_factory_;
// Keep a WeakPtr as client is owned by render_frame_impl.
base::WeakPtr<WebEncryptedMediaClientImpl> client_;
}; };
} // namespace media } // namespace media
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "third_party/WebKit/public/platform/WebMediaKeySystemConfiguration.h" #include "third_party/WebKit/public/platform/WebMediaKeySystemConfiguration.h"
#include "third_party/WebKit/public/platform/WebString.h" #include "third_party/WebKit/public/platform/WebString.h"
#include "third_party/WebKit/public/platform/WebVector.h" #include "third_party/WebKit/public/platform/WebVector.h"
#include "webcontentdecryptionmodule_impl.h"
#include "webcontentdecryptionmoduleaccess_impl.h" #include "webcontentdecryptionmoduleaccess_impl.h"
namespace media { namespace media {
...@@ -189,7 +190,7 @@ class WebEncryptedMediaClientImpl::Reporter { ...@@ -189,7 +190,7 @@ class WebEncryptedMediaClientImpl::Reporter {
WebEncryptedMediaClientImpl::WebEncryptedMediaClientImpl( WebEncryptedMediaClientImpl::WebEncryptedMediaClientImpl(
scoped_ptr<CdmFactory> cdm_factory, scoped_ptr<CdmFactory> cdm_factory,
MediaPermission* media_permission) MediaPermission* media_permission)
: cdm_factory_(cdm_factory.Pass()) { : cdm_factory_(cdm_factory.Pass()), weak_factory_(this) {
// TODO(sandersd): Use |media_permission| to check for media permissions in // TODO(sandersd): Use |media_permission| to check for media permissions in
// this class. // this class.
DCHECK(media_permission); DCHECK(media_permission);
...@@ -237,7 +238,7 @@ void WebEncryptedMediaClientImpl::requestMediaKeySystemAccess( ...@@ -237,7 +238,7 @@ void WebEncryptedMediaClientImpl::requestMediaKeySystemAccess(
reporter->ReportSupported(); reporter->ReportSupported();
request.requestSucceeded(WebContentDecryptionModuleAccessImpl::Create( request.requestSucceeded(WebContentDecryptionModuleAccessImpl::Create(
request.keySystem(), blink::WebMediaKeySystemConfiguration(), request.keySystem(), blink::WebMediaKeySystemConfiguration(),
request.securityOrigin(), cdm_factory_.get())); request.securityOrigin(), weak_factory_.GetWeakPtr()));
return; return;
} }
...@@ -250,7 +251,7 @@ void WebEncryptedMediaClientImpl::requestMediaKeySystemAccess( ...@@ -250,7 +251,7 @@ void WebEncryptedMediaClientImpl::requestMediaKeySystemAccess(
reporter->ReportSupported(); reporter->ReportSupported();
request.requestSucceeded(WebContentDecryptionModuleAccessImpl::Create( request.requestSucceeded(WebContentDecryptionModuleAccessImpl::Create(
request.keySystem(), accumulated_configuration, request.keySystem(), accumulated_configuration,
request.securityOrigin(), cdm_factory_.get())); request.securityOrigin(), weak_factory_.GetWeakPtr()));
return; return;
} }
} }
...@@ -260,6 +261,14 @@ void WebEncryptedMediaClientImpl::requestMediaKeySystemAccess( ...@@ -260,6 +261,14 @@ void WebEncryptedMediaClientImpl::requestMediaKeySystemAccess(
"None of the requested configurations were supported."); "None of the requested configurations were supported.");
} }
void WebEncryptedMediaClientImpl::CreateCdm(
const blink::WebString& key_system,
const blink::WebSecurityOrigin& security_origin,
blink::WebContentDecryptionModuleResult result) {
WebContentDecryptionModuleImpl::Create(cdm_factory_.get(), security_origin,
key_system, result);
}
// Lazily create Reporters. // Lazily create Reporters.
WebEncryptedMediaClientImpl::Reporter* WebEncryptedMediaClientImpl::GetReporter( WebEncryptedMediaClientImpl::Reporter* WebEncryptedMediaClientImpl::GetReporter(
const std::string& key_system) { const std::string& key_system) {
......
...@@ -9,8 +9,10 @@ ...@@ -9,8 +9,10 @@
#include "base/containers/scoped_ptr_hash_map.h" #include "base/containers/scoped_ptr_hash_map.h"
#include "base/memory/scoped_ptr.h" #include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "media/base/cdm_factory.h" #include "media/base/cdm_factory.h"
#include "media/base/media_export.h" #include "media/base/media_export.h"
#include "third_party/WebKit/public/platform/WebContentDecryptionModuleResult.h"
#include "third_party/WebKit/public/platform/WebEncryptedMediaClient.h" #include "third_party/WebKit/public/platform/WebEncryptedMediaClient.h"
#include "third_party/WebKit/public/web/WebSecurityOrigin.h" #include "third_party/WebKit/public/web/WebSecurityOrigin.h"
...@@ -29,6 +31,12 @@ class MEDIA_EXPORT WebEncryptedMediaClientImpl ...@@ -29,6 +31,12 @@ class MEDIA_EXPORT WebEncryptedMediaClientImpl
virtual void requestMediaKeySystemAccess( virtual void requestMediaKeySystemAccess(
blink::WebEncryptedMediaRequest request); blink::WebEncryptedMediaRequest request);
// Create the CDM for |key_system| and |security_origin|. The caller owns
// the created cdm (passed back using |result|).
void CreateCdm(const blink::WebString& key_system,
const blink::WebSecurityOrigin& security_origin,
blink::WebContentDecryptionModuleResult result);
private: private:
// Report usage of key system to UMA. There are 2 different counts logged: // Report usage of key system to UMA. There are 2 different counts logged:
// 1. The key system is requested. // 1. The key system is requested.
...@@ -45,6 +53,8 @@ class MEDIA_EXPORT WebEncryptedMediaClientImpl ...@@ -45,6 +53,8 @@ class MEDIA_EXPORT WebEncryptedMediaClientImpl
Reporters reporters_; Reporters reporters_;
scoped_ptr<CdmFactory> cdm_factory_; scoped_ptr<CdmFactory> cdm_factory_;
base::WeakPtrFactory<WebEncryptedMediaClientImpl> weak_factory_;
}; };
} // namespace media } // namespace media
......
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