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_RENDERER_CHILD_FRAME_COMPOSITING_HELPER_H_
6#define CONTENT_RENDERER_CHILD_FRAME_COMPOSITING_HELPER_H_
7
8#include <string>
9#include <vector>
10
11#include "base/memory/ref_counted.h"
12#include "base/memory/scoped_ptr.h"
13#include "base/memory/shared_memory.h"
14#include "cc/layers/delegated_frame_resource_collection.h"
15#include "content/common/content_export.h"
16#include "ui/gfx/size.h"
17
18namespace base {
19class SharedMemory;
20}
21
22namespace cc {
23class CompositorFrame;
24class CopyOutputResult;
25class Layer;
26class SolidColorLayer;
27class DelegatedFrameProvider;
28class DelegatedFrameResourceCollection;
29class DelegatedRendererLayer;
30}
31
32namespace blink {
33class WebFrame;
34class WebPluginContainer;
35class WebLayer;
36}
37
38namespace gfx {
39class Rect;
40class Size;
41}
42
43struct FrameHostMsg_CompositorFrameSwappedACK_Params;
44struct FrameHostMsg_BuffersSwappedACK_Params;
45struct FrameHostMsg_ReclaimCompositorResources_Params;
46
47namespace content {
48
49class BrowserPlugin;
50class BrowserPluginManager;
51class RenderFrameProxy;
52
53class CONTENT_EXPORT ChildFrameCompositingHelper
54    : public base::RefCounted<ChildFrameCompositingHelper>,
55      public cc::DelegatedFrameResourceCollectionClient {
56 public:
57  static ChildFrameCompositingHelper* CreateForBrowserPlugin(
58      const base::WeakPtr<BrowserPlugin>& browser_plugin);
59  static ChildFrameCompositingHelper* CreateForRenderFrameProxy(
60      RenderFrameProxy* render_frame_proxy);
61
62  void CopyFromCompositingSurface(int request_id,
63                                  gfx::Rect source_rect,
64                                  gfx::Size dest_size);
65  void DidCommitCompositorFrame();
66  void EnableCompositing(bool);
67  void OnContainerDestroy();
68  void OnCompositorFrameSwapped(scoped_ptr<cc::CompositorFrame> frame,
69                                int route_id,
70                                uint32 output_surface_id,
71                                int host_id,
72                                base::SharedMemoryHandle handle);
73  void UpdateVisibility(bool);
74  void ChildFrameGone();
75
76  // cc::DelegatedFrameProviderClient implementation.
77  virtual void UnusedResourcesAreAvailable() OVERRIDE;
78  void SetContentsOpaque(bool);
79
80 protected:
81  // Friend RefCounted so that the dtor can be non-public.
82  friend class base::RefCounted<ChildFrameCompositingHelper>;
83
84 private:
85  ChildFrameCompositingHelper(
86      const base::WeakPtr<BrowserPlugin>& browser_plugin,
87      blink::WebFrame* frame,
88      RenderFrameProxy* render_frame_proxy,
89      int host_routing_id);
90
91  virtual ~ChildFrameCompositingHelper();
92
93  BrowserPluginManager* GetBrowserPluginManager();
94  blink::WebPluginContainer* GetContainer();
95  int GetInstanceID();
96
97  void SendCompositorFrameSwappedACKToBrowser(
98      FrameHostMsg_CompositorFrameSwappedACK_Params& params);
99  void SendReclaimCompositorResourcesToBrowser(
100      FrameHostMsg_ReclaimCompositorResources_Params& params);
101  void CheckSizeAndAdjustLayerProperties(const gfx::Size& new_size,
102                                         float device_scale_factor,
103                                         cc::Layer* layer);
104  void SendReturnedDelegatedResources();
105  void CopyFromCompositingSurfaceHasResult(
106      int request_id,
107      gfx::Size dest_size,
108      scoped_ptr<cc::CopyOutputResult> result);
109
110  int host_routing_id_;
111  int last_route_id_;
112  uint32 last_output_surface_id_;
113  int last_host_id_;
114  bool ack_pending_;
115  bool opaque_;
116
117  gfx::Size buffer_size_;
118
119  // The lifetime of this weak pointer should be greater than the lifetime of
120  // other member objects, as they may access this pointer during their
121  // destruction.
122  base::WeakPtr<BrowserPlugin> browser_plugin_;
123  RenderFrameProxy* render_frame_proxy_;
124
125  scoped_refptr<cc::DelegatedFrameResourceCollection> resource_collection_;
126  scoped_refptr<cc::DelegatedFrameProvider> frame_provider_;
127
128  scoped_refptr<cc::SolidColorLayer> background_layer_;
129  scoped_refptr<cc::DelegatedRendererLayer> delegated_layer_;
130  scoped_ptr<blink::WebLayer> web_layer_;
131  blink::WebFrame* frame_;
132
133  DISALLOW_COPY_AND_ASSIGN(ChildFrameCompositingHelper);
134};
135
136}  // namespace content
137
138#endif  // CONTENT_RENDERER_CHILD_FRAME_COMPOSITING_HELPER_H_
139