Home | History | Annotate | Download | only in common
      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