Chromium Code Reviews| Index: content/renderer/render_frame_proxy.cc |
| diff --git a/content/renderer/render_frame_proxy.cc b/content/renderer/render_frame_proxy.cc |
| index 2e85a52ded03a713ed2fb61dc4909dccaa32566c..897c1891ec0e6c377ed45663461ada65986d8869 100644 |
| --- a/content/renderer/render_frame_proxy.cc |
| +++ b/content/renderer/render_frame_proxy.cc |
| @@ -19,18 +19,77 @@ namespace content { |
| namespace { |
| +// Facilitates lookup of RenderFrameProxy by routing_id. |
| typedef std::map<int, RenderFrameProxy*> RoutingIDProxyMap; |
| static base::LazyInstance<RoutingIDProxyMap> g_routing_id_proxy_map = |
| LAZY_INSTANCE_INITIALIZER; |
| +// Facilitates lookup of RenderFrameProxy by WebFrame. |
| +typedef std::map<blink::WebFrame*, RenderFrameProxy*> FrameMap; |
| +base::LazyInstance<FrameMap> g_frame_map = LAZY_INSTANCE_INITIALIZER; |
| + |
| } // namespace |
| // static |
| -RenderFrameProxy* RenderFrameProxy::CreateFrameProxy(int routing_id, |
| - int frame_routing_id) { |
| - DCHECK_NE(routing_id, MSG_ROUTING_NONE); |
| - RenderFrameProxy* proxy = new RenderFrameProxy(routing_id, frame_routing_id); |
| - return proxy; |
| +RenderFrameProxy* RenderFrameProxy::CreateProxyToReplaceFrame( |
| + int routing_id, |
| + int frame_routing_id) { |
| + CHECK_NE(routing_id, MSG_ROUTING_NONE); |
| + CHECK_NE(frame_routing_id, MSG_ROUTING_NONE); |
| + |
| + scoped_ptr<RenderFrameProxy> proxy( |
| + new RenderFrameProxy(routing_id, frame_routing_id)); |
| + RenderFrameImpl* render_frame = |
| + RenderFrameImpl::FromRoutingID(frame_routing_id); |
| + CHECK(render_frame); |
| +#if 0 |
| + // TODO(nick): Enable this code when we're ready to create WebRemoteFrames. |
| + blink::WebRemoteFrame* web_frame = NULL; |
| + |
| + if (render_frame->GetWebFrame()->parent() && |
| + render_frame->GetWebFrame()->parent()->isWebRemoteFrame()) { |
| + blink::WebRemoteFrame* parent_web_frame = |
| + render_frame->GetWebFrame()->parent()->toWebRemoteFrame(); |
| + web_frame = parent_web_frame->createRemoteChild("", proxy.get()); |
| + } else { |
| + web_frame = blink::WebRemoteFrame::create(proxy.get()); |
| + } |
| +#else |
| + blink::WebFrame* web_frame = render_frame->GetWebFrame(); |
| +#endif |
| + proxy->Init(web_frame, render_frame->render_view()); |
| + return proxy.release(); |
| +} |
| + |
| +RenderFrameProxy* RenderFrameProxy::CreateFrameProxy( |
| + int routing_id, |
| + int parent_routing_id, |
| + int render_view_routing_id) { |
| + scoped_ptr<RenderFrameProxy> proxy( |
| + new RenderFrameProxy(routing_id, MSG_ROUTING_NONE)); |
| + RenderViewImpl* render_view = NULL; |
| + blink::WebRemoteFrame* web_frame = NULL; |
| + if (parent_routing_id == MSG_ROUTING_NONE) { |
| + // Create a top level frame. |
| + render_view = RenderViewImpl::FromRoutingID(render_view_routing_id); |
| + web_frame = blink::WebRemoteFrame::create(proxy.get()); |
| + render_view->webview()->setMainFrame(web_frame); |
| + } else { |
| + // Create a frame under an existing parent. The parent is always expected to |
| + // be a RenderFrameProxy, because navigations initiated by local frames |
| + // should not wind up here. |
| + RenderFrameProxy* parent = |
| + RenderFrameProxy::FromRoutingID(parent_routing_id); |
| + CHECK(parent); |
| + CHECK(parent->web_frame()->isWebRemoteFrame()); |
| + web_frame = parent->web_frame()->toWebRemoteFrame()->createRemoteChild( |
| + "", proxy.get()); |
| + render_view = parent->render_view(); |
| + } |
| + |
| + proxy->Init(web_frame, render_view); |
| + |
| + return proxy.release(); |
| } |
| // static |
| @@ -40,27 +99,53 @@ RenderFrameProxy* RenderFrameProxy::FromRoutingID(int32 routing_id) { |
| return it == proxies->end() ? NULL : it->second; |
| } |
| +// static |
| +RenderFrameProxy* RenderFrameProxy::FromWebFrame(blink::WebFrame* web_frame) { |
| + FrameMap::iterator iter = g_frame_map.Get().find(web_frame); |
| + if (iter != g_frame_map.Get().end()) { |
| + RenderFrameProxy* proxy = iter->second; |
| + DCHECK_EQ(web_frame, proxy->web_frame()); |
| + return proxy; |
| + } |
| + return NULL; |
| +} |
| + |
| RenderFrameProxy::RenderFrameProxy(int routing_id, int frame_routing_id) |
| : routing_id_(routing_id), |
| - frame_routing_id_(frame_routing_id) { |
| + frame_routing_id_(frame_routing_id), |
| + web_frame_(NULL), |
| + render_view_(NULL) { |
| std::pair<RoutingIDProxyMap::iterator, bool> result = |
| - g_routing_id_proxy_map.Get().insert(std::make_pair(routing_id_, this)); |
| + g_routing_id_proxy_map.Get().insert(std::make_pair(routing_id_, this)); |
| CHECK(result.second) << "Inserting a duplicate item."; |
| RenderThread::Get()->AddRoute(routing_id_, this); |
| - |
| - render_frame_ = RenderFrameImpl::FromRoutingID(frame_routing_id); |
| - CHECK(render_frame_); |
| - render_frame_->render_view()->RegisterRenderFrameProxy(this); |
| } |
| 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.
|
| - render_frame_->render_view()->UnregisterRenderFrameProxy(this); |
| + render_view()->UnregisterRenderFrameProxy(this); |
| + |
| + FrameMap::iterator it = g_frame_map.Get().find(web_frame_); |
| + CHECK(it != g_frame_map.Get().end()); |
| + CHECK_EQ(it->second, this); |
| + g_frame_map.Get().erase(it); |
| + |
| RenderThread::Get()->RemoveRoute(routing_id_); |
| g_routing_id_proxy_map.Get().erase(routing_id_); |
| } |
| -blink::WebFrame* RenderFrameProxy::GetWebFrame() { |
| - return render_frame_->GetWebFrame(); |
| +void RenderFrameProxy::Init(blink::WebFrame* web_frame, |
| + RenderViewImpl* render_view) { |
| + CHECK(web_frame); |
| + CHECK(render_view); |
| + |
| + web_frame_ = web_frame; |
| + render_view_ = render_view; |
| + |
| + render_view_->RegisterRenderFrameProxy(this); |
| + |
| + std::pair<FrameMap::iterator, bool> result = |
| + g_frame_map.Get().insert(std::make_pair(web_frame_, this)); |
| + CHECK(result.second) << "Inserted a duplicate item."; |
| } |
| void RenderFrameProxy::DidCommitCompositorFrame() { |
| @@ -79,8 +164,10 @@ bool RenderFrameProxy::OnMessageReceived(const IPC::Message& msg) { |
| IPC_MESSAGE_UNHANDLED(handled = false) |
| IPC_END_MESSAGE_MAP() |
| - if (!handled) |
| - return render_frame_->OnMessageReceived(msg); |
| + RenderFrameImpl* render_frame = |
| + RenderFrameImpl::FromRoutingID(frame_routing_id_); |
| + if (!handled && render_frame) |
| + return render_frame->OnMessageReceived(msg); |
| return handled; |
| } |
| @@ -97,8 +184,9 @@ bool RenderFrameProxy::Send(IPC::Message* message) { |
| void RenderFrameProxy::OnDeleteProxy() { |
| RenderFrameImpl* render_frame = |
| RenderFrameImpl::FromRoutingID(frame_routing_id_); |
| - CHECK(render_frame); |
| - render_frame->set_render_frame_proxy(NULL); |
| + |
| + 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
|
| + render_frame->set_render_frame_proxy(NULL); |
| delete this; |
| } |
| @@ -110,10 +198,10 @@ void RenderFrameProxy::OnChildFrameProcessGone() { |
| void RenderFrameProxy::OnBuffersSwapped( |
| const FrameMsg_BuffersSwapped_Params& params) { |
| - if (!compositing_helper_.get()) { |
| + if (!compositing_helper_) { |
| compositing_helper_ = |
| ChildFrameCompositingHelper::CreateCompositingHelperForRenderFrame( |
| - GetWebFrame(), this, routing_id_); |
| + this); |
| compositing_helper_->EnableCompositing(true); |
| } |
| compositing_helper_->OnBuffersSwapped( |
| @@ -121,7 +209,7 @@ void RenderFrameProxy::OnBuffersSwapped( |
| params.mailbox, |
| params.gpu_route_id, |
| params.gpu_host_id, |
| - render_frame_->render_view()->GetWebView()->deviceScaleFactor()); |
| + web_frame()->view()->deviceScaleFactor()); |
| } |
| void RenderFrameProxy::OnCompositorFrameSwapped(const IPC::Message& message) { |
| @@ -132,10 +220,10 @@ void RenderFrameProxy::OnCompositorFrameSwapped(const IPC::Message& message) { |
| scoped_ptr<cc::CompositorFrame> frame(new cc::CompositorFrame); |
| param.a.frame.AssignTo(frame.get()); |
| - if (!compositing_helper_.get()) { |
| + if (!compositing_helper_) { |
| compositing_helper_ = |
| ChildFrameCompositingHelper::CreateCompositingHelperForRenderFrame( |
| - GetWebFrame(), this, routing_id_); |
| + this); |
| compositing_helper_->EnableCompositing(true); |
| } |
| compositing_helper_->OnCompositorFrameSwapped(frame.Pass(), |