Index: content/browser/frame_host/render_frame_host_impl.cc |
diff --git a/content/browser/frame_host/render_frame_host_impl.cc b/content/browser/frame_host/render_frame_host_impl.cc |
index a70eb9397d3f57ac915f12c8a3ab7aa4d226aa18..f401cf3d6a4ad32929c45875e4c7fc80b0f59cc7 100644 |
--- a/content/browser/frame_host/render_frame_host_impl.cc |
+++ b/content/browser/frame_host/render_frame_host_impl.cc |
@@ -18,6 +18,7 @@ |
#include "content/common/frame_messages.h" |
#include "content/common/input_messages.h" |
#include "content/common/inter_process_time_ticks_converter.h" |
+#include "content/common/swapped_out_messages.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/content_browser_client.h" |
#include "content/public/browser/render_process_host.h" |
@@ -224,6 +225,23 @@ bool RenderFrameHostImpl::Send(IPC::Message* message) { |
} |
bool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) { |
+ // Filter out most IPC messages if this renderer is swapped out. |
+ // We still want to handle certain ACKs to keep our state consistent. |
+ if (is_swapped_out_ || render_view_host_->IsSwappedOut()) { |
+ if (!SwappedOutMessages::CanHandleWhileSwappedOut(msg)) { |
+ // If this is a synchronous message and we decided not to handle it, |
+ // we must send an error reply, or else the renderer will be stuck |
+ // and won't respond to future requests. |
+ if (msg.is_sync()) { |
+ IPC::Message* reply = IPC::SyncMessage::GenerateReply(&msg); |
+ reply->set_reply_error(); |
+ Send(reply); |
+ } |
+ // Don't continue looking for someone to handle it. |
+ return true; |
+ } |
+ } |
+ |
if (delegate_->OnMessageReceived(this, msg)) |
return true; |