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