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/child_frame_compositing_helper.h" |
13 #include "content/renderer/render_frame_impl.h" | 13 #include "content/renderer/render_frame_impl.h" |
14 #include "content/renderer/render_thread_impl.h" | 14 #include "content/renderer/render_thread_impl.h" |
15 #include "content/renderer/render_view_impl.h" | 15 #include "content/renderer/render_view_impl.h" |
16 #include "third_party/WebKit/public/web/WebView.h" | 16 #include "third_party/WebKit/public/web/WebView.h" |
17 | 17 |
18 namespace content { | 18 namespace content { |
19 | 19 |
20 namespace { | 20 namespace { |
21 | 21 |
22 // Facilitates lookup of RenderFrameProxy by routing_id. | |
22 typedef std::map<int, RenderFrameProxy*> RoutingIDProxyMap; | 23 typedef std::map<int, RenderFrameProxy*> RoutingIDProxyMap; |
23 static base::LazyInstance<RoutingIDProxyMap> g_routing_id_proxy_map = | 24 static base::LazyInstance<RoutingIDProxyMap> g_routing_id_proxy_map = |
24 LAZY_INSTANCE_INITIALIZER; | 25 LAZY_INSTANCE_INITIALIZER; |
25 | 26 |
27 // Facilitates lookup of RenderFrameProxy by WebFrame. | |
28 typedef std::map<blink::WebFrame*, RenderFrameProxy*> FrameMap; | |
29 base::LazyInstance<FrameMap> g_frame_map = LAZY_INSTANCE_INITIALIZER; | |
30 | |
26 } // namespace | 31 } // namespace |
27 | 32 |
28 // static | 33 // static |
29 RenderFrameProxy* RenderFrameProxy::CreateFrameProxy(int routing_id, | 34 RenderFrameProxy* RenderFrameProxy::CreateProxyToReplaceFrame( |
30 int frame_routing_id) { | 35 int routing_id, |
31 DCHECK_NE(routing_id, MSG_ROUTING_NONE); | 36 int frame_routing_id) { |
32 RenderFrameProxy* proxy = new RenderFrameProxy(routing_id, frame_routing_id); | 37 CHECK_NE(routing_id, MSG_ROUTING_NONE); |
33 return proxy; | 38 CHECK_NE(frame_routing_id, MSG_ROUTING_NONE); |
39 | |
40 scoped_ptr<RenderFrameProxy> proxy( | |
41 new RenderFrameProxy(routing_id, frame_routing_id)); | |
42 RenderFrameImpl* render_frame = | |
43 RenderFrameImpl::FromRoutingID(frame_routing_id); | |
44 CHECK(render_frame); | |
45 #if 0 | |
46 // TODO(nick): Enable this code when we're ready to create WebRemoteFrames. | |
47 blink::WebRemoteFrame* web_frame = NULL; | |
48 | |
49 if (render_frame->GetWebFrame()->parent() && | |
50 render_frame->GetWebFrame()->parent()->isWebRemoteFrame()) { | |
51 blink::WebRemoteFrame* parent_web_frame = | |
52 render_frame->GetWebFrame()->parent()->toWebRemoteFrame(); | |
53 web_frame = parent_web_frame->createRemoteChild("", proxy.get()); | |
54 } else { | |
55 web_frame = blink::WebRemoteFrame::create(proxy.get()); | |
56 } | |
57 #else | |
58 blink::WebFrame* web_frame = render_frame->GetWebFrame(); | |
59 #endif | |
60 proxy->Init(web_frame, render_frame->render_view()); | |
61 return proxy.release(); | |
62 } | |
63 | |
64 RenderFrameProxy* RenderFrameProxy::CreateFrameProxy( | |
65 int routing_id, | |
66 int parent_routing_id, | |
67 int render_view_routing_id) { | |
68 scoped_ptr<RenderFrameProxy> proxy( | |
69 new RenderFrameProxy(routing_id, MSG_ROUTING_NONE)); | |
70 RenderViewImpl* render_view = NULL; | |
71 blink::WebRemoteFrame* web_frame = NULL; | |
72 if (parent_routing_id == MSG_ROUTING_NONE) { | |
73 // Create a top level frame. | |
74 render_view = RenderViewImpl::FromRoutingID(render_view_routing_id); | |
75 web_frame = blink::WebRemoteFrame::create(proxy.get()); | |
76 render_view->webview()->setMainFrame(web_frame); | |
77 } else { | |
78 // Create a frame under an existing parent. The parent is always expected to | |
79 // be a RenderFrameProxy, because navigations initiated by local frames | |
80 // should not wind up here. | |
81 RenderFrameProxy* parent = | |
82 RenderFrameProxy::FromRoutingID(parent_routing_id); | |
83 CHECK(parent); | |
84 CHECK(parent->web_frame()->isWebRemoteFrame()); | |
85 web_frame = parent->web_frame()->toWebRemoteFrame()->createRemoteChild( | |
86 "", proxy.get()); | |
87 render_view = parent->render_view(); | |
88 } | |
89 | |
90 proxy->Init(web_frame, render_view); | |
91 | |
92 return proxy.release(); | |
34 } | 93 } |
35 | 94 |
36 // static | 95 // static |
37 RenderFrameProxy* RenderFrameProxy::FromRoutingID(int32 routing_id) { | 96 RenderFrameProxy* RenderFrameProxy::FromRoutingID(int32 routing_id) { |
38 RoutingIDProxyMap* proxies = g_routing_id_proxy_map.Pointer(); | 97 RoutingIDProxyMap* proxies = g_routing_id_proxy_map.Pointer(); |
39 RoutingIDProxyMap::iterator it = proxies->find(routing_id); | 98 RoutingIDProxyMap::iterator it = proxies->find(routing_id); |
40 return it == proxies->end() ? NULL : it->second; | 99 return it == proxies->end() ? NULL : it->second; |
41 } | 100 } |
42 | 101 |
102 // static | |
103 RenderFrameProxy* RenderFrameProxy::FromWebFrame(blink::WebFrame* web_frame) { | |
104 FrameMap::iterator iter = g_frame_map.Get().find(web_frame); | |
105 if (iter != g_frame_map.Get().end()) { | |
106 RenderFrameProxy* proxy = iter->second; | |
107 DCHECK_EQ(web_frame, proxy->web_frame()); | |
108 return proxy; | |
109 } | |
110 return NULL; | |
111 } | |
112 | |
43 RenderFrameProxy::RenderFrameProxy(int routing_id, int frame_routing_id) | 113 RenderFrameProxy::RenderFrameProxy(int routing_id, int frame_routing_id) |
44 : routing_id_(routing_id), | 114 : routing_id_(routing_id), |
45 frame_routing_id_(frame_routing_id) { | 115 frame_routing_id_(frame_routing_id), |
116 web_frame_(NULL), | |
117 render_view_(NULL) { | |
46 std::pair<RoutingIDProxyMap::iterator, bool> result = | 118 std::pair<RoutingIDProxyMap::iterator, bool> result = |
47 g_routing_id_proxy_map.Get().insert(std::make_pair(routing_id_, this)); | 119 g_routing_id_proxy_map.Get().insert(std::make_pair(routing_id_, this)); |
48 CHECK(result.second) << "Inserting a duplicate item."; | 120 CHECK(result.second) << "Inserting a duplicate item."; |
49 RenderThread::Get()->AddRoute(routing_id_, this); | 121 RenderThread::Get()->AddRoute(routing_id_, this); |
50 | |
51 render_frame_ = RenderFrameImpl::FromRoutingID(frame_routing_id); | |
52 CHECK(render_frame_); | |
53 render_frame_->render_view()->RegisterRenderFrameProxy(this); | |
54 } | 122 } |
55 | 123 |
56 RenderFrameProxy::~RenderFrameProxy() { | 124 RenderFrameProxy::~RenderFrameProxy() { |
dcheng
2014/07/03 05:58:54
It appears that we're leaking web_frame_ because w
ncarter (slow)
2014/07/14 17:35:07
I fixed it and added a TODO.
| |
57 render_frame_->render_view()->UnregisterRenderFrameProxy(this); | 125 render_view()->UnregisterRenderFrameProxy(this); |
126 | |
127 FrameMap::iterator it = g_frame_map.Get().find(web_frame_); | |
128 CHECK(it != g_frame_map.Get().end()); | |
129 CHECK_EQ(it->second, this); | |
130 g_frame_map.Get().erase(it); | |
131 | |
58 RenderThread::Get()->RemoveRoute(routing_id_); | 132 RenderThread::Get()->RemoveRoute(routing_id_); |
59 g_routing_id_proxy_map.Get().erase(routing_id_); | 133 g_routing_id_proxy_map.Get().erase(routing_id_); |
60 } | 134 } |
61 | 135 |
62 blink::WebFrame* RenderFrameProxy::GetWebFrame() { | 136 void RenderFrameProxy::Init(blink::WebFrame* web_frame, |
63 return render_frame_->GetWebFrame(); | 137 RenderViewImpl* render_view) { |
138 CHECK(web_frame); | |
139 CHECK(render_view); | |
140 | |
141 web_frame_ = web_frame; | |
142 render_view_ = render_view; | |
143 | |
144 render_view_->RegisterRenderFrameProxy(this); | |
145 | |
146 std::pair<FrameMap::iterator, bool> result = | |
147 g_frame_map.Get().insert(std::make_pair(web_frame_, this)); | |
148 CHECK(result.second) << "Inserted a duplicate item."; | |
64 } | 149 } |
65 | 150 |
66 void RenderFrameProxy::DidCommitCompositorFrame() { | 151 void RenderFrameProxy::DidCommitCompositorFrame() { |
67 if (compositing_helper_) | 152 if (compositing_helper_) |
68 compositing_helper_->DidCommitCompositorFrame(); | 153 compositing_helper_->DidCommitCompositorFrame(); |
69 } | 154 } |
70 | 155 |
71 bool RenderFrameProxy::OnMessageReceived(const IPC::Message& msg) { | 156 bool RenderFrameProxy::OnMessageReceived(const IPC::Message& msg) { |
72 bool handled = true; | 157 bool handled = true; |
73 IPC_BEGIN_MESSAGE_MAP(RenderFrameProxy, msg) | 158 IPC_BEGIN_MESSAGE_MAP(RenderFrameProxy, msg) |
74 IPC_MESSAGE_HANDLER(FrameMsg_DeleteProxy, OnDeleteProxy) | 159 IPC_MESSAGE_HANDLER(FrameMsg_DeleteProxy, OnDeleteProxy) |
75 IPC_MESSAGE_HANDLER(FrameMsg_ChildFrameProcessGone, OnChildFrameProcessGone) | 160 IPC_MESSAGE_HANDLER(FrameMsg_ChildFrameProcessGone, OnChildFrameProcessGone) |
76 IPC_MESSAGE_HANDLER(FrameMsg_BuffersSwapped, OnBuffersSwapped) | 161 IPC_MESSAGE_HANDLER(FrameMsg_BuffersSwapped, OnBuffersSwapped) |
77 IPC_MESSAGE_HANDLER_GENERIC(FrameMsg_CompositorFrameSwapped, | 162 IPC_MESSAGE_HANDLER_GENERIC(FrameMsg_CompositorFrameSwapped, |
78 OnCompositorFrameSwapped(msg)) | 163 OnCompositorFrameSwapped(msg)) |
79 IPC_MESSAGE_UNHANDLED(handled = false) | 164 IPC_MESSAGE_UNHANDLED(handled = false) |
80 IPC_END_MESSAGE_MAP() | 165 IPC_END_MESSAGE_MAP() |
81 | 166 |
82 if (!handled) | 167 RenderFrameImpl* render_frame = |
83 return render_frame_->OnMessageReceived(msg); | 168 RenderFrameImpl::FromRoutingID(frame_routing_id_); |
169 if (!handled && render_frame) | |
170 return render_frame->OnMessageReceived(msg); | |
84 | 171 |
85 return handled; | 172 return handled; |
86 } | 173 } |
87 | 174 |
88 bool RenderFrameProxy::Send(IPC::Message* message) { | 175 bool RenderFrameProxy::Send(IPC::Message* message) { |
89 if (!SwappedOutMessages::CanSendWhileSwappedOut(message)) { | 176 if (!SwappedOutMessages::CanSendWhileSwappedOut(message)) { |
90 delete message; | 177 delete message; |
91 return false; | 178 return false; |
92 } | 179 } |
93 message->set_routing_id(routing_id_); | 180 message->set_routing_id(routing_id_); |
94 return RenderThread::Get()->Send(message); | 181 return RenderThread::Get()->Send(message); |
95 } | 182 } |
96 | 183 |
97 void RenderFrameProxy::OnDeleteProxy() { | 184 void RenderFrameProxy::OnDeleteProxy() { |
98 RenderFrameImpl* render_frame = | 185 RenderFrameImpl* render_frame = |
99 RenderFrameImpl::FromRoutingID(frame_routing_id_); | 186 RenderFrameImpl::FromRoutingID(frame_routing_id_); |
100 CHECK(render_frame); | 187 |
101 render_frame->set_render_frame_proxy(NULL); | 188 if (render_frame) |
dcheng
2014/07/03 05:58:54
I think this could use a comment explaining why we
ncarter (slow)
2014/07/14 17:35:07
I wouldn't know what to write.
dcheng
2014/07/15 18:44:14
Does anything explode if we don't do this null che
| |
189 render_frame->set_render_frame_proxy(NULL); | |
102 | 190 |
103 delete this; | 191 delete this; |
104 } | 192 } |
105 | 193 |
106 void RenderFrameProxy::OnChildFrameProcessGone() { | 194 void RenderFrameProxy::OnChildFrameProcessGone() { |
107 if (compositing_helper_) | 195 if (compositing_helper_) |
108 compositing_helper_->ChildFrameGone(); | 196 compositing_helper_->ChildFrameGone(); |
109 } | 197 } |
110 | 198 |
111 void RenderFrameProxy::OnBuffersSwapped( | 199 void RenderFrameProxy::OnBuffersSwapped( |
112 const FrameMsg_BuffersSwapped_Params& params) { | 200 const FrameMsg_BuffersSwapped_Params& params) { |
113 if (!compositing_helper_.get()) { | 201 if (!compositing_helper_) { |
114 compositing_helper_ = | 202 compositing_helper_ = |
115 ChildFrameCompositingHelper::CreateCompositingHelperForRenderFrame( | 203 ChildFrameCompositingHelper::CreateCompositingHelperForRenderFrame( |
116 GetWebFrame(), this, routing_id_); | 204 this); |
117 compositing_helper_->EnableCompositing(true); | 205 compositing_helper_->EnableCompositing(true); |
118 } | 206 } |
119 compositing_helper_->OnBuffersSwapped( | 207 compositing_helper_->OnBuffersSwapped( |
120 params.size, | 208 params.size, |
121 params.mailbox, | 209 params.mailbox, |
122 params.gpu_route_id, | 210 params.gpu_route_id, |
123 params.gpu_host_id, | 211 params.gpu_host_id, |
124 render_frame_->render_view()->GetWebView()->deviceScaleFactor()); | 212 web_frame()->view()->deviceScaleFactor()); |
125 } | 213 } |
126 | 214 |
127 void RenderFrameProxy::OnCompositorFrameSwapped(const IPC::Message& message) { | 215 void RenderFrameProxy::OnCompositorFrameSwapped(const IPC::Message& message) { |
128 FrameMsg_CompositorFrameSwapped::Param param; | 216 FrameMsg_CompositorFrameSwapped::Param param; |
129 if (!FrameMsg_CompositorFrameSwapped::Read(&message, ¶m)) | 217 if (!FrameMsg_CompositorFrameSwapped::Read(&message, ¶m)) |
130 return; | 218 return; |
131 | 219 |
132 scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); | 220 scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); |
133 param.a.frame.AssignTo(frame.get()); | 221 param.a.frame.AssignTo(frame.get()); |
134 | 222 |
135 if (!compositing_helper_.get()) { | 223 if (!compositing_helper_) { |
136 compositing_helper_ = | 224 compositing_helper_ = |
137 ChildFrameCompositingHelper::CreateCompositingHelperForRenderFrame( | 225 ChildFrameCompositingHelper::CreateCompositingHelperForRenderFrame( |
138 GetWebFrame(), this, routing_id_); | 226 this); |
139 compositing_helper_->EnableCompositing(true); | 227 compositing_helper_->EnableCompositing(true); |
140 } | 228 } |
141 compositing_helper_->OnCompositorFrameSwapped(frame.Pass(), | 229 compositing_helper_->OnCompositorFrameSwapped(frame.Pass(), |
142 param.a.producing_route_id, | 230 param.a.producing_route_id, |
143 param.a.output_surface_id, | 231 param.a.output_surface_id, |
144 param.a.producing_host_id, | 232 param.a.producing_host_id, |
145 param.a.shared_memory_handle); | 233 param.a.shared_memory_handle); |
146 } | 234 } |
147 | 235 |
148 } // namespace | 236 } // namespace |
OLD | NEW |