OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/renderer/render_frame_proxy.h" | 5 #include "content/renderer/render_frame_proxy.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 | 8 |
9 #include "base/lazy_instance.h" | 9 #include "base/lazy_instance.h" |
10 #include "content/common/frame_messages.h" | 10 #include "content/common/frame_messages.h" |
11 #include "content/common/swapped_out_messages.h" | 11 #include "content/common/swapped_out_messages.h" |
| 12 #include "content/renderer/child_frame_compositing_helper.h" |
12 #include "content/renderer/render_frame_impl.h" | 13 #include "content/renderer/render_frame_impl.h" |
13 #include "content/renderer/render_thread_impl.h" | 14 #include "content/renderer/render_thread_impl.h" |
14 #include "content/renderer/render_view_impl.h" | 15 #include "content/renderer/render_view_impl.h" |
| 16 #include "third_party/WebKit/public/web/WebView.h" |
15 | 17 |
16 namespace content { | 18 namespace content { |
17 | 19 |
18 namespace { | 20 namespace { |
19 | 21 |
20 typedef std::map<int, RenderFrameProxy*> RoutingIDProxyMap; | 22 typedef std::map<int, RenderFrameProxy*> RoutingIDProxyMap; |
21 static base::LazyInstance<RoutingIDProxyMap> g_routing_id_proxy_map = | 23 static base::LazyInstance<RoutingIDProxyMap> g_routing_id_proxy_map = |
22 LAZY_INSTANCE_INITIALIZER; | 24 LAZY_INSTANCE_INITIALIZER; |
23 | 25 |
24 } // namespace | 26 } // namespace |
(...skipping 16 matching lines...) Expand all Loading... |
41 RenderFrameProxy::RenderFrameProxy(int routing_id, int frame_routing_id) | 43 RenderFrameProxy::RenderFrameProxy(int routing_id, int frame_routing_id) |
42 : routing_id_(routing_id), | 44 : routing_id_(routing_id), |
43 frame_routing_id_(frame_routing_id) { | 45 frame_routing_id_(frame_routing_id) { |
44 std::pair<RoutingIDProxyMap::iterator, bool> result = | 46 std::pair<RoutingIDProxyMap::iterator, bool> result = |
45 g_routing_id_proxy_map.Get().insert(std::make_pair(routing_id_, this)); | 47 g_routing_id_proxy_map.Get().insert(std::make_pair(routing_id_, this)); |
46 CHECK(result.second) << "Inserting a duplicate item."; | 48 CHECK(result.second) << "Inserting a duplicate item."; |
47 RenderThread::Get()->AddRoute(routing_id_, this); | 49 RenderThread::Get()->AddRoute(routing_id_, this); |
48 | 50 |
49 render_frame_ = RenderFrameImpl::FromRoutingID(frame_routing_id); | 51 render_frame_ = RenderFrameImpl::FromRoutingID(frame_routing_id); |
50 CHECK(render_frame_); | 52 CHECK(render_frame_); |
| 53 render_frame_->render_view()->RegisterRenderFrameProxy(this); |
51 } | 54 } |
52 | 55 |
53 RenderFrameProxy::~RenderFrameProxy() { | 56 RenderFrameProxy::~RenderFrameProxy() { |
| 57 render_frame_->render_view()->UnregisterRenderFrameProxy(this); |
54 RenderThread::Get()->RemoveRoute(routing_id_); | 58 RenderThread::Get()->RemoveRoute(routing_id_); |
55 g_routing_id_proxy_map.Get().erase(routing_id_); | 59 g_routing_id_proxy_map.Get().erase(routing_id_); |
56 } | 60 } |
57 | 61 |
| 62 blink::WebFrame* RenderFrameProxy::GetWebFrame() { |
| 63 return render_frame_->GetWebFrame(); |
| 64 } |
| 65 |
| 66 void RenderFrameProxy::DidCommitCompositorFrame() { |
| 67 if (compositing_helper_) |
| 68 compositing_helper_->DidCommitCompositorFrame(); |
| 69 } |
| 70 |
58 bool RenderFrameProxy::OnMessageReceived(const IPC::Message& msg) { | 71 bool RenderFrameProxy::OnMessageReceived(const IPC::Message& msg) { |
59 bool handled = true; | 72 bool handled = true; |
60 IPC_BEGIN_MESSAGE_MAP(RenderFrameProxy, msg) | 73 IPC_BEGIN_MESSAGE_MAP(RenderFrameProxy, msg) |
61 IPC_MESSAGE_HANDLER(FrameMsg_DeleteProxy, OnDeleteProxy) | 74 IPC_MESSAGE_HANDLER(FrameMsg_DeleteProxy, OnDeleteProxy) |
| 75 IPC_MESSAGE_HANDLER(FrameMsg_ChildFrameProcessGone, OnChildFrameProcessGone) |
| 76 IPC_MESSAGE_HANDLER(FrameMsg_BuffersSwapped, OnBuffersSwapped) |
| 77 IPC_MESSAGE_HANDLER_GENERIC(FrameMsg_CompositorFrameSwapped, |
| 78 OnCompositorFrameSwapped(msg)) |
62 IPC_MESSAGE_UNHANDLED(handled = false) | 79 IPC_MESSAGE_UNHANDLED(handled = false) |
63 IPC_END_MESSAGE_MAP() | 80 IPC_END_MESSAGE_MAP() |
64 | 81 |
65 if (!handled) | 82 if (!handled) |
66 return render_frame_->OnMessageReceived(msg); | 83 return render_frame_->OnMessageReceived(msg); |
67 | 84 |
68 return handled; | 85 return handled; |
69 } | 86 } |
70 | 87 |
71 bool RenderFrameProxy::Send(IPC::Message* message) { | 88 bool RenderFrameProxy::Send(IPC::Message* message) { |
72 if (!SwappedOutMessages::CanSendWhileSwappedOut(message)) { | 89 if (!SwappedOutMessages::CanSendWhileSwappedOut(message)) { |
73 delete message; | 90 delete message; |
74 return false; | 91 return false; |
75 } | 92 } |
76 message->set_routing_id(routing_id_); | 93 message->set_routing_id(routing_id_); |
77 return RenderThread::Get()->Send(message); | 94 return RenderThread::Get()->Send(message); |
78 } | 95 } |
79 | 96 |
80 void RenderFrameProxy::OnDeleteProxy() { | 97 void RenderFrameProxy::OnDeleteProxy() { |
81 RenderFrameImpl* render_frame = | 98 RenderFrameImpl* render_frame = |
82 RenderFrameImpl::FromRoutingID(frame_routing_id_); | 99 RenderFrameImpl::FromRoutingID(frame_routing_id_); |
83 CHECK(render_frame); | 100 CHECK(render_frame); |
84 render_frame->set_render_frame_proxy(NULL); | 101 render_frame->set_render_frame_proxy(NULL); |
85 | 102 |
86 delete this; | 103 delete this; |
87 } | 104 } |
88 | 105 |
| 106 void RenderFrameProxy::OnChildFrameProcessGone() { |
| 107 if (compositing_helper_) |
| 108 compositing_helper_->ChildFrameGone(); |
| 109 } |
| 110 |
| 111 void RenderFrameProxy::OnBuffersSwapped( |
| 112 const FrameMsg_BuffersSwapped_Params& params) { |
| 113 if (!compositing_helper_.get()) { |
| 114 compositing_helper_ = |
| 115 ChildFrameCompositingHelper::CreateCompositingHelperForRenderFrame( |
| 116 GetWebFrame(), this, routing_id_); |
| 117 compositing_helper_->EnableCompositing(true); |
| 118 } |
| 119 compositing_helper_->OnBuffersSwapped( |
| 120 params.size, |
| 121 params.mailbox, |
| 122 params.gpu_route_id, |
| 123 params.gpu_host_id, |
| 124 render_frame_->render_view()->GetWebView()->deviceScaleFactor()); |
| 125 } |
| 126 |
| 127 void RenderFrameProxy::OnCompositorFrameSwapped(const IPC::Message& message) { |
| 128 FrameMsg_CompositorFrameSwapped::Param param; |
| 129 if (!FrameMsg_CompositorFrameSwapped::Read(&message, ¶m)) |
| 130 return; |
| 131 |
| 132 scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); |
| 133 param.a.frame.AssignTo(frame.get()); |
| 134 |
| 135 if (!compositing_helper_.get()) { |
| 136 compositing_helper_ = |
| 137 ChildFrameCompositingHelper::CreateCompositingHelperForRenderFrame( |
| 138 GetWebFrame(), this, routing_id_); |
| 139 compositing_helper_->EnableCompositing(true); |
| 140 } |
| 141 compositing_helper_->OnCompositorFrameSwapped(frame.Pass(), |
| 142 param.a.producing_route_id, |
| 143 param.a.output_surface_id, |
| 144 param.a.producing_host_id, |
| 145 param.a.shared_memory_handle); |
| 146 } |
| 147 |
89 } // namespace | 148 } // namespace |
OLD | NEW |