Home | History | Annotate | Download | only in frame_host
      1 // Copyright 2014 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 #ifndef CONTENT_BROWSER_FRAME_HOST_CROSS_PROCESS_FRAME_CONNECTOR_H_
      6 #define CONTENT_BROWSER_FRAME_HOST_CROSS_PROCESS_FRAME_CONNECTOR_H_
      7 
      8 #include "cc/output/compositor_frame.h"
      9 #include "ui/gfx/rect.h"
     10 
     11 namespace blink {
     12 class WebInputEvent;
     13 }
     14 
     15 namespace IPC {
     16 class Message;
     17 }
     18 
     19 struct FrameHostMsg_BuffersSwappedACK_Params;
     20 struct FrameHostMsg_CompositorFrameSwappedACK_Params;
     21 struct FrameHostMsg_ReclaimCompositorResources_Params;
     22 struct GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params;
     23 
     24 namespace content {
     25 class RenderFrameProxyHost;
     26 class RenderWidgetHostImpl;
     27 class RenderWidgetHostViewChildFrame;
     28 
     29 // CrossProcessFrameConnector provides the platform view abstraction for
     30 // RenderWidgetHostViewChildFrame allowing RWHVChildFrame to remain ignorant
     31 // of RenderFrameHost.
     32 //
     33 // The RenderWidgetHostView of an out-of-process child frame needs to
     34 // communicate with the RenderFrameProxyHost representing this frame in the
     35 // process of the parent frame. For example, assume you have this page:
     36 //
     37 //   -----------------
     38 //   | frame 1       |
     39 //   |  -----------  |
     40 //   |  | frame 2 |  |
     41 //   |  -----------  |
     42 //   -----------------
     43 //
     44 // If frames 1 and 2 are in process A and B, there are 4 RenderFrameHosts:
     45 //   A1 - RFH for frame 1 in process A
     46 //   B1 - RFPH for frame 1 in process B
     47 //   A2 - RFPH for frame 2 in process A
     48 //   B2 - RFH for frame 2 in process B
     49 //
     50 // B2, having a parent frame in a different process, will have a
     51 // RenderWidgetHostViewChildFrame. This RenderWidgetHostViewChildFrame needs
     52 // to communicate with A2 because the embedding process is an abstract
     53 // for the child frame -- it needs information necessary for compositing child
     54 // frame textures, and also can pass platform messages such as view resizing.
     55 // CrossProcessFrameConnector bridges between B2's
     56 // RenderWidgetHostViewChildFrame and A2 to allow for this communication.
     57 // (Note: B1 is only mentioned for completeness. It is not needed in this
     58 // example.)
     59 //
     60 // CrossProcessFrameConnector objects are owned by the RenderFrameProxyHost
     61 // in the child frame's RenderFrameHostManager corresponding to the parent's
     62 // SiteInstance, A2 in the picture above. When a child frame navigates in a new
     63 // process, set_view() is called to update to the new view.
     64 //
     65 class CrossProcessFrameConnector {
     66  public:
     67   // |frame_proxy_in_parent_renderer| corresponds to A2 in the example above.
     68   explicit CrossProcessFrameConnector(
     69       RenderFrameProxyHost* frame_proxy_in_parent_renderer);
     70   virtual ~CrossProcessFrameConnector();
     71 
     72   bool OnMessageReceived(const IPC::Message &msg);
     73 
     74   // |view| corresponds to B2's RenderWidgetHostViewChildFrame in the example
     75   // above.
     76   void set_view(RenderWidgetHostViewChildFrame* view);
     77   RenderWidgetHostViewChildFrame* get_view_for_testing() { return view_; }
     78 
     79   void RenderProcessGone();
     80 
     81   // 'Platform' functionality exposed to RenderWidgetHostViewChildFrame.
     82   // These methods can forward messages to the child frame proxy in the parent
     83   // frame's renderer or attempt to handle them within the browser process.
     84   void ChildFrameBuffersSwapped(
     85       const GpuHostMsg_AcceleratedSurfaceBuffersSwapped_Params& params,
     86       int gpu_host_id);
     87 
     88   void ChildFrameCompositorFrameSwapped(uint32 output_surface_id,
     89                                         int host_id,
     90                                         int route_id,
     91                                         scoped_ptr<cc::CompositorFrame> frame);
     92 
     93   gfx::Rect ChildFrameRect();
     94 
     95  private:
     96   // Handlers for messages received from the parent frame.
     97   void OnBuffersSwappedACK(
     98       const FrameHostMsg_BuffersSwappedACK_Params& params);
     99   void OnCompositorFrameSwappedACK(
    100       const FrameHostMsg_CompositorFrameSwappedACK_Params& params);
    101   void OnReclaimCompositorResources(
    102       const FrameHostMsg_ReclaimCompositorResources_Params& params);
    103   void OnForwardInputEvent(const blink::WebInputEvent* event);
    104   void OnInitializeChildFrame(gfx::Rect frame_rect, float scale_factor);
    105 
    106   void SetDeviceScaleFactor(float scale_factor);
    107   void SetSize(gfx::Rect frame_rect);
    108 
    109   // The RenderFrameProxyHost that routes messages to the parent frame's
    110   // renderer process.
    111   RenderFrameProxyHost* frame_proxy_in_parent_renderer_;
    112 
    113   // The RenderWidgetHostView for the frame. Initially NULL.
    114   RenderWidgetHostViewChildFrame* view_;
    115 
    116   gfx::Rect child_frame_rect_;
    117   float device_scale_factor_;
    118 };
    119 
    120 }  // namespace content
    121 
    122 #endif  // CONTENT_BROWSER_FRAME_HOST_CROSS_PROCESS_FRAME_CONNECTOR_H_
    123 
    124