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 13 namespace content { 14 15 bool 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 FrameHostMsg_OpenURL::ID: 25 case ViewHostMsg_Focus::ID: 26 // Handled by RenderViewHost. 27 case ViewHostMsg_RenderProcessGone::ID: 28 case ViewHostMsg_ClosePage_ACK::ID: 29 case ViewHostMsg_SwapCompositorFrame::ID: 30 // Handled by WorkerMessageFilter (or by SharedWorkerMessageFilter when 31 // embedded-shared-worker is enabled). 32 case ViewHostMsg_DocumentDetached::ID: 33 // Allow cross-process JavaScript calls. 34 case ViewHostMsg_RouteCloseEvent::ID: 35 case ViewHostMsg_RouteMessageEvent::ID: 36 // Handled by RenderFrameHost. 37 case FrameHostMsg_BeforeUnload_ACK::ID: 38 case FrameHostMsg_SwapOut_ACK::ID: 39 // Frame detach must occur after the RenderView has swapped out. 40 case FrameHostMsg_Detach::ID: 41 case FrameHostMsg_DomOperationResponse::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 case FrameHostMsg_InitializeChildFrame::ID: 48 return true; 49 default: 50 break; 51 } 52 53 // Check with the embedder as well. 54 ContentClient* client = GetContentClient(); 55 return client->CanSendWhileSwappedOut(msg); 56 } 57 58 bool SwappedOutMessages::CanHandleWhileSwappedOut( 59 const IPC::Message& msg) { 60 // Any message the renderer is allowed to send while swapped out should 61 // be handled by the browser. 62 if (CanSendWhileSwappedOut(&msg)) 63 return true; 64 65 // We drop most other messages that arrive from a swapped out renderer. 66 // However, some are important (e.g., ACKs) for keeping the browser and 67 // renderer state consistent in case we later return to the renderer. 68 // Note that synchronous messages that are not handled will receive an 69 // error reply instead, to avoid leaving the renderer in a stuck state. 70 switch (msg.type()) { 71 // Sends an ACK. 72 case ViewHostMsg_ShowView::ID: 73 // Sends an ACK. 74 case ViewHostMsg_ShowWidget::ID: 75 // Sends an ACK. 76 case ViewHostMsg_ShowFullscreenWidget::ID: 77 // Updates browser state. 78 case ViewHostMsg_RenderViewReady::ID: 79 // Updates the previous navigation entry. 80 case ViewHostMsg_UpdateState::ID: 81 // Sends an ACK. 82 case ViewHostMsg_UpdateTargetURL::ID: 83 // We allow closing even if we are in the process of swapping out. 84 case ViewHostMsg_Close::ID: 85 // Sends an ACK. 86 case ViewHostMsg_RequestMove::ID: 87 // Sends an ACK. 88 case AccessibilityHostMsg_Events::ID: 89 return true; 90 default: 91 break; 92 } 93 94 return false; 95 } 96 97 } // namespace content 98