From 6273e2e7892702061d535025f7144a005ea2fc5d Mon Sep 17 00:00:00 2001 From: "pfeldman@chromium.org" Date: Fri, 17 Apr 2009 00:13:55 +0000 Subject: Prevent Plugin Channel Host from dropping reply messages while plugins are disabled; do not create plugins while plugin messages are being dropped. Review URL: http://codereview.chromium.org/69021 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@13905 0039d316-1c4b-4281-b951-d872f2087c98 --- chrome/renderer/plugin_channel_host.cc | 36 ++++++++++++++++++++++------------ chrome/renderer/plugin_channel_host.h | 2 ++ chrome/renderer/render_view.cc | 3 +++ 3 files changed, 28 insertions(+), 13 deletions(-) (limited to 'chrome/renderer') diff --git a/chrome/renderer/plugin_channel_host.cc b/chrome/renderer/plugin_channel_host.cc index 3759de1..b206f0e 100644 --- a/chrome/renderer/plugin_channel_host.cc +++ b/chrome/renderer/plugin_channel_host.cc @@ -26,26 +26,36 @@ class IsListeningFilter : public IPC::ChannelProxy::MessageFilter { }; bool IsListeningFilter::OnMessageReceived(const IPC::Message& message) { - bool handled = true; - if (!IsListeningFilter::is_listening_) { - // reply to synchronous messages with an error (so they don't block while - // we're not listening) - if (message.is_sync()) { - IPC::Message* reply = IPC::SyncMessage::GenerateReply(&message); - reply->set_reply_error(); - channel_->Send(reply); - } - handled = true; - } else { - handled = false; + if (IsListeningFilter::is_listening_) { + // Proceed with normal operation. + return false; } - return handled; + + // Always process message reply to prevent renderer from hanging on sync + // messages. + if (message.is_reply() || message.is_reply_error()) { + return false; + } + + // Reply to synchronous messages with an error (so they don't block while + // we're not listening). + if (message.is_sync()) { + IPC::Message* reply = IPC::SyncMessage::GenerateReply(&message); + reply->set_reply_error(); + channel_->Send(reply); + } + return true; } // static bool IsListeningFilter::is_listening_ = true; // static +bool PluginChannelHost::IsListening() { + return IsListeningFilter::is_listening_; +} + +// static void PluginChannelHost::SetListening(bool flag) { IsListeningFilter::is_listening_ = flag; } diff --git a/chrome/renderer/plugin_channel_host.h b/chrome/renderer/plugin_channel_host.h index 6edbadd..446ef5c 100644 --- a/chrome/renderer/plugin_channel_host.h +++ b/chrome/renderer/plugin_channel_host.h @@ -31,6 +31,8 @@ class PluginChannelHost : public PluginChannelBase { static void SetListening(bool flag); + static bool IsListening(); + private: // Called on the render thread PluginChannelHost(); diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc index f5ca189..c0b13f2 100644 --- a/chrome/renderer/render_view.cc +++ b/chrome/renderer/render_view.cc @@ -1875,6 +1875,9 @@ WebPluginDelegate* RenderView::CreatePluginDelegate( const std::string& clsid, std::string* actual_mime_type) { #if defined(OS_WIN) + if (!PluginChannelHost::IsListening()) + return NULL; + if (RenderProcess::current()->in_process_plugins()) { FilePath path; render_thread_->Send( -- cgit v1.1