Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(600)

Unified Diff: content/renderer/pepper/content_decryptor_delegate.cc

Issue 116443009: Handle plugin instance crash in ContentDecryptorDelegate. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: comments addressed Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/renderer/pepper/content_decryptor_delegate.cc
diff --git a/content/renderer/pepper/content_decryptor_delegate.cc b/content/renderer/pepper/content_decryptor_delegate.cc
index 6712f46074dbef238461e1b70729cfa93d8a090b..79af011266d86d5b1b9c4ca3cc4d0362a1deb017 100644
--- a/content/renderer/pepper/content_decryptor_delegate.cc
+++ b/content/renderer/pepper/content_decryptor_delegate.cc
@@ -255,29 +255,35 @@ ContentDecryptorDelegate::ContentDecryptorDelegate(
}
ContentDecryptorDelegate::~ContentDecryptorDelegate() {
+ SatisfyAllPendingCallbacksOnError();
}
-void ContentDecryptorDelegate::Initialize(const std::string& key_system) {
- DCHECK(!key_system.empty());
- DCHECK(key_system_.empty());
- key_system_ = key_system;
-
- plugin_decryption_interface_->Initialize(
- pp_instance_,
- StringVar::StringToPPVar(key_system_));
-}
-
-void ContentDecryptorDelegate::SetSessionEventCallbacks(
+void ContentDecryptorDelegate::Initialize(
+ const std::string& key_system,
const media::SessionCreatedCB& session_created_cb,
const media::SessionMessageCB& session_message_cb,
const media::SessionReadyCB& session_ready_cb,
const media::SessionClosedCB& session_closed_cb,
- const media::SessionErrorCB& session_error_cb) {
+ const media::SessionErrorCB& session_error_cb,
+ const base::Closure& plugin_error_cb) {
+ DCHECK(!key_system.empty());
+ DCHECK(key_system_.empty());
+ key_system_ = key_system;
+
session_created_cb_ = session_created_cb;
session_message_cb_ = session_message_cb;
session_ready_cb_ = session_ready_cb;
session_closed_cb_ = session_closed_cb;
session_error_cb_ = session_error_cb;
+ plugin_error_cb_ = plugin_error_cb;
+
+ plugin_decryption_interface_->Initialize(
ddorwin 2014/01/08 23:40:32 I think one/the reason Initialize() was separate b
xhwang 2014/01/09 01:58:49 If we really want to avoid IPC in ctor, we can add
+ pp_instance_, StringVar::StringToPPVar(key_system_));
+}
+
+void ContentDecryptorDelegate::InstanceCrashed() {
+ plugin_error_cb_.Run();
+ SatisfyAllPendingCallbacksOnError();
}
bool ContentDecryptorDelegate::CreateSession(uint32 session_id,
@@ -318,6 +324,7 @@ bool ContentDecryptorDelegate::Decrypt(
const scoped_refptr<media::DecoderBuffer>& encrypted_buffer,
const Decryptor::DecryptCB& decrypt_cb) {
DVLOG(3) << "Decrypt() - stream_type: " << stream_type;
+
// |{audio|video}_input_resource_| is not being used by the plugin
// now because there is only one pending audio/video decrypt request at any
// time. This is enforced by the media pipeline.
@@ -1021,4 +1028,30 @@ bool ContentDecryptorDelegate::DeserializeAudioFrames(
return true;
}
+void ContentDecryptorDelegate::SatisfyAllPendingCallbacksOnError() {
+ if (!audio_decoder_init_cb_.is_null())
+ audio_decoder_init_cb_.ResetAndReturn().Run(false);
+
+ if (!video_decoder_init_cb_.is_null())
+ video_decoder_init_cb_.ResetAndReturn().Run(false);
+
+ audio_input_resource_ = NULL;
+ video_input_resource_ = NULL;
+
+ if (!audio_decrypt_cb_.is_null())
+ audio_decrypt_cb_.ResetAndReturn().Run(media::Decryptor::kError, NULL);
+
+ if (!video_decrypt_cb_.is_null())
+ video_decrypt_cb_.ResetAndReturn().Run(media::Decryptor::kError, NULL);
+
+ if (!audio_decode_cb_.is_null()) {
+ const media::Decryptor::AudioBuffers empty_frames;
+ audio_decode_cb_.ResetAndReturn().Run(media::Decryptor::kError,
+ empty_frames);
+ }
+
+ if (!video_decode_cb_.is_null())
+ video_decode_cb_.ResetAndReturn().Run(media::Decryptor::kError, NULL);
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698