swapped_out_messages.cc revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "content/common/swapped_out_messages.h"
6
7#include "content/common/accessibility_messages.h"
8#include "content/common/frame_messages.h"
9#include "content/common/input_messages.h"
10#include "content/common/view_messages.h"
11#include "content/public/common/content_client.h"
12
13namespace content {
14
15bool SwappedOutMessages::CanSendWhileSwappedOut(const IPC::Message* msg) {
16  // We filter out most IPC messages when swapped out.  However, some are
17  // important (e.g., ACKs) for keeping the browser and renderer state
18  // consistent in case we later return to the same renderer.
19  switch (msg->type()) {
20    // Handled by RenderWidgetHost.
21    case InputHostMsg_HandleInputEvent_ACK::ID:
22    case ViewHostMsg_UpdateRect::ID:
23    // Allow targeted navigations while swapped out.
24    case ViewHostMsg_OpenURL::ID:
25    case ViewHostMsg_Focus::ID:
26    // Handled by RenderViewHost.
27    case ViewHostMsg_RenderProcessGone::ID:
28    case ViewHostMsg_ShouldClose_ACK::ID:
29    case ViewHostMsg_SwapOut_ACK::ID:
30    case ViewHostMsg_ClosePage_ACK::ID:
31    case ViewHostMsg_DomOperationResponse::ID:
32    case ViewHostMsg_SwapCompositorFrame::ID:
33    case ViewHostMsg_UpdateIsDelayed::ID:
34    case ViewHostMsg_DidActivateAcceleratedCompositing::ID:
35    // Allow cross-process JavaScript calls.
36    case ViewHostMsg_RouteCloseEvent::ID:
37    case ViewHostMsg_RouteMessageEvent::ID:
38    // Handled by RenderFrameHost.
39    case FrameHostMsg_SwapOut_ACK::ID:
40    // Frame detach must occur after the RenderView has swapped out.
41    case FrameHostMsg_Detach::ID:
42    case FrameHostMsg_CompositorFrameSwappedACK::ID:
43    case FrameHostMsg_BuffersSwappedACK::ID:
44    case FrameHostMsg_ReclaimCompositorResources::ID:
45    // Input events propagate from parent to child.
46    case FrameHostMsg_ForwardInputEvent::ID:
47      return true;
48    default:
49      break;
50  }
51
52  // Check with the embedder as well.
53  ContentClient* client = GetContentClient();
54  return client->CanSendWhileSwappedOut(msg);
55}
56
57bool SwappedOutMessages::CanHandleWhileSwappedOut(
58    const IPC::Message& msg) {
59  // Any message the renderer is allowed to send while swapped out should
60  // be handled by the browser.
61  if (CanSendWhileSwappedOut(&msg))
62    return true;
63
64  // We drop most other messages that arrive from a swapped out renderer.
65  // However, some are important (e.g., ACKs) for keeping the browser and
66  // renderer state consistent in case we later return to the renderer.
67  // Note that synchronous messages that are not handled will receive an
68  // error reply instead, to avoid leaving the renderer in a stuck state.
69  switch (msg.type()) {
70    // Sends an ACK.
71    case ViewHostMsg_ShowView::ID:
72    // Sends an ACK.
73    case ViewHostMsg_ShowWidget::ID:
74    // Sends an ACK.
75    case ViewHostMsg_ShowFullscreenWidget::ID:
76    // Updates browser state.
77    case ViewHostMsg_RenderViewReady::ID:
78    // Updates the previous navigation entry.
79    case ViewHostMsg_UpdateState::ID:
80    // Sends an ACK.
81    case ViewHostMsg_UpdateTargetURL::ID:
82    // We allow closing even if we are in the process of swapping out.
83    case ViewHostMsg_Close::ID:
84    // Sends an ACK.
85    case ViewHostMsg_RequestMove::ID:
86    // Sends an ACK.
87    case AccessibilityHostMsg_Events::ID:
88#if defined(USE_X11)
89    // Synchronous message when leaving a page with plugin.  In this case,
90    // we want to destroy the plugin rather than return an error message.
91    case ViewHostMsg_DestroyPluginContainer::ID:
92#endif
93      return true;
94    default:
95      break;
96  }
97
98  // Check with the embedder as well.
99  ContentClient* client = GetContentClient();
100  return client->CanHandleWhileSwappedOut(msg);
101}
102
103}  // namespace content
104