summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
authorpfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-17 00:13:55 +0000
committerpfeldman@chromium.org <pfeldman@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-17 00:13:55 +0000
commit6273e2e7892702061d535025f7144a005ea2fc5d (patch)
treeaca15ef39f2c4b2436b70535452b08100a1a082c /chrome/renderer
parent439b88b1071539c011f3cadb9ba0bc86c6cafb98 (diff)
downloadchromium_src-6273e2e7892702061d535025f7144a005ea2fc5d.zip
chromium_src-6273e2e7892702061d535025f7144a005ea2fc5d.tar.gz
chromium_src-6273e2e7892702061d535025f7144a005ea2fc5d.tar.bz2
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
Diffstat (limited to 'chrome/renderer')
-rw-r--r--chrome/renderer/plugin_channel_host.cc36
-rw-r--r--chrome/renderer/plugin_channel_host.h2
-rw-r--r--chrome/renderer/render_view.cc3
3 files changed, 28 insertions, 13 deletions
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(