| 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/command_line.h" | 9 #include "base/command_line.h" |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 base::LazyInstance<FrameMap> g_frame_map = LAZY_INSTANCE_INITIALIZER; | 37 base::LazyInstance<FrameMap> g_frame_map = LAZY_INSTANCE_INITIALIZER; |
| 38 | 38 |
| 39 } // namespace | 39 } // namespace |
| 40 | 40 |
| 41 // static | 41 // static |
| 42 RenderFrameProxy* RenderFrameProxy::CreateProxyToReplaceFrame( | 42 RenderFrameProxy* RenderFrameProxy::CreateProxyToReplaceFrame( |
| 43 RenderFrameImpl* frame_to_replace, | 43 RenderFrameImpl* frame_to_replace, |
| 44 int routing_id, | 44 int routing_id, |
| 45 blink::WebTreeScopeType scope) { | 45 blink::WebTreeScopeType scope) { |
| 46 CHECK_NE(routing_id, MSG_ROUTING_NONE); | 46 CHECK_NE(routing_id, MSG_ROUTING_NONE); |
| 47 LOG(ERROR) << "RFP::CreateProxyToReplaceFrame:" |
| 48 << " routing_id:" << routing_id |
| 49 << " frame_to_replace:" << frame_to_replace; |
| 47 | 50 |
| 48 scoped_ptr<RenderFrameProxy> proxy( | 51 scoped_ptr<RenderFrameProxy> proxy( |
| 49 new RenderFrameProxy(routing_id, frame_to_replace->GetRoutingID())); | 52 new RenderFrameProxy(routing_id, frame_to_replace->GetRoutingID())); |
| 50 | 53 |
| 51 // When a RenderFrame is replaced by a RenderProxy, the WebRemoteFrame should | 54 // When a RenderFrame is replaced by a RenderProxy, the WebRemoteFrame should |
| 52 // always come from WebRemoteFrame::create and a call to WebFrame::swap must | 55 // always come from WebRemoteFrame::create and a call to WebFrame::swap must |
| 53 // follow later. | 56 // follow later. |
| 54 blink::WebRemoteFrame* web_frame = | 57 blink::WebRemoteFrame* web_frame = |
| 55 blink::WebRemoteFrame::create(scope, proxy.get()); | 58 blink::WebRemoteFrame::create(scope, proxy.get()); |
| 56 proxy->Init(web_frame, frame_to_replace->render_view()); | 59 proxy->Init(web_frame, frame_to_replace->render_view()); |
| 57 return proxy.release(); | 60 return proxy.release(); |
| 58 } | 61 } |
| 59 | 62 |
| 60 RenderFrameProxy* RenderFrameProxy::CreateFrameProxy( | 63 RenderFrameProxy* RenderFrameProxy::CreateFrameProxy( |
| 61 int routing_id, | 64 int routing_id, |
| 62 int parent_routing_id, | 65 int parent_routing_id, |
| 63 int render_view_routing_id, | 66 int render_view_routing_id, |
| 64 const FrameReplicationState& replicated_state) { | 67 const FrameReplicationState& replicated_state) { |
| 68 LOG(ERROR) << "RFP::CreateFrameProxy:" |
| 69 << " routing_id:" << routing_id |
| 70 << " parent routing id:" << parent_routing_id; |
| 71 |
| 65 scoped_ptr<RenderFrameProxy> proxy( | 72 scoped_ptr<RenderFrameProxy> proxy( |
| 66 new RenderFrameProxy(routing_id, MSG_ROUTING_NONE)); | 73 new RenderFrameProxy(routing_id, MSG_ROUTING_NONE)); |
| 67 RenderViewImpl* render_view = NULL; | 74 RenderViewImpl* render_view = NULL; |
| 68 blink::WebRemoteFrame* web_frame = NULL; | 75 blink::WebRemoteFrame* web_frame = NULL; |
| 69 if (parent_routing_id == MSG_ROUTING_NONE) { | 76 if (parent_routing_id == MSG_ROUTING_NONE) { |
| 70 // Create a top level WebRemoteFrame. | 77 // Create a top level WebRemoteFrame. |
| 71 render_view = RenderViewImpl::FromRoutingID(render_view_routing_id); | 78 render_view = RenderViewImpl::FromRoutingID(render_view_routing_id); |
| 79 LOG(ERROR) << "RFP::CreateFrameProxy:" |
| 80 << " rv:" << render_view; |
| 72 web_frame = | 81 web_frame = |
| 73 blink::WebRemoteFrame::create(replicated_state.scope, proxy.get()); | 82 blink::WebRemoteFrame::create(replicated_state.scope, proxy.get()); |
| 74 render_view->webview()->setMainFrame(web_frame); | 83 render_view->webview()->setMainFrame(web_frame); |
| 75 } else { | 84 } else { |
| 76 // Create a frame under an existing parent. The parent is always expected | 85 // Create a frame under an existing parent. The parent is always expected |
| 77 // to be a RenderFrameProxy, because navigations initiated by local frames | 86 // to be a RenderFrameProxy, because navigations initiated by local frames |
| 78 // should not wind up here. | 87 // should not wind up here. |
| 79 RenderFrameProxy* parent = | 88 RenderFrameProxy* parent = |
| 80 RenderFrameProxy::FromRoutingID(parent_routing_id); | 89 RenderFrameProxy::FromRoutingID(parent_routing_id); |
| 81 web_frame = parent->web_frame()->createRemoteChild( | 90 web_frame = parent->web_frame()->createRemoteChild( |
| (...skipping 30 matching lines...) Expand all Loading... |
| 112 if (iter != g_frame_map.Get().end()) { | 121 if (iter != g_frame_map.Get().end()) { |
| 113 RenderFrameProxy* proxy = iter->second; | 122 RenderFrameProxy* proxy = iter->second; |
| 114 DCHECK_EQ(web_frame, proxy->web_frame()); | 123 DCHECK_EQ(web_frame, proxy->web_frame()); |
| 115 return proxy; | 124 return proxy; |
| 116 } | 125 } |
| 117 return NULL; | 126 return NULL; |
| 118 } | 127 } |
| 119 | 128 |
| 120 // static | 129 // static |
| 121 bool RenderFrameProxy::IsSwappedOutStateForbidden() { | 130 bool RenderFrameProxy::IsSwappedOutStateForbidden() { |
| 122 return base::CommandLine::ForCurrentProcess()->HasSwitch( | 131 return true; |
| 123 switches::kSitePerProcess); | |
| 124 } | 132 } |
| 125 | 133 |
| 126 RenderFrameProxy::RenderFrameProxy(int routing_id, int frame_routing_id) | 134 RenderFrameProxy::RenderFrameProxy(int routing_id, int frame_routing_id) |
| 127 : routing_id_(routing_id), | 135 : routing_id_(routing_id), |
| 128 frame_routing_id_(frame_routing_id), | 136 frame_routing_id_(frame_routing_id), |
| 129 web_frame_(NULL), | 137 web_frame_(NULL), |
| 130 render_view_(NULL) { | 138 render_view_(NULL) { |
| 139 LOG(ERROR) << "RFP[" << this << "]::RFP:" |
| 140 << " routing_id:" << routing_id_ |
| 141 << " frame:" << frame_routing_id; |
| 142 |
| 131 std::pair<RoutingIDProxyMap::iterator, bool> result = | 143 std::pair<RoutingIDProxyMap::iterator, bool> result = |
| 132 g_routing_id_proxy_map.Get().insert(std::make_pair(routing_id_, this)); | 144 g_routing_id_proxy_map.Get().insert(std::make_pair(routing_id_, this)); |
| 133 CHECK(result.second) << "Inserting a duplicate item."; | 145 CHECK(result.second) << "Inserting a duplicate item."; |
| 134 RenderThread::Get()->AddRoute(routing_id_, this); | 146 RenderThread::Get()->AddRoute(routing_id_, this); |
| 135 } | 147 } |
| 136 | 148 |
| 137 RenderFrameProxy::~RenderFrameProxy() { | 149 RenderFrameProxy::~RenderFrameProxy() { |
| 138 // TODO(nasko): Set the render_frame_proxy to null to avoid a double deletion | 150 // TODO(nasko): Set the render_frame_proxy to null to avoid a double deletion |
| 139 // when detaching the main frame. This can be removed once RenderFrameImpl and | 151 // when detaching the main frame. This can be removed once RenderFrameImpl and |
| 140 // RenderFrameProxy have been completely decoupled. See | 152 // RenderFrameProxy have been completely decoupled. See |
| 141 // https://crbug.com/357747. | 153 // https://crbug.com/357747. |
| 142 RenderFrameImpl* render_frame = | 154 RenderFrameImpl* render_frame = |
| 143 RenderFrameImpl::FromRoutingID(frame_routing_id_); | 155 RenderFrameImpl::FromRoutingID(frame_routing_id_); |
| 144 if (render_frame) | 156 if (render_frame) |
| 145 render_frame->set_render_frame_proxy(nullptr); | 157 render_frame->set_render_frame_proxy(nullptr); |
| 146 | 158 |
| 147 render_view()->UnregisterRenderFrameProxy(this); | 159 render_view()->UnregisterRenderFrameProxy(this); |
| 148 | 160 |
| 149 CHECK(!web_frame_); | 161 CHECK(!web_frame_); |
| 150 RenderThread::Get()->RemoveRoute(routing_id_); | 162 RenderThread::Get()->RemoveRoute(routing_id_); |
| 151 g_routing_id_proxy_map.Get().erase(routing_id_); | 163 g_routing_id_proxy_map.Get().erase(routing_id_); |
| 164 LOG(ERROR) << "RFP[" << this << "]::~RFP"; |
| 152 } | 165 } |
| 153 | 166 |
| 154 void RenderFrameProxy::Init(blink::WebRemoteFrame* web_frame, | 167 void RenderFrameProxy::Init(blink::WebRemoteFrame* web_frame, |
| 155 RenderViewImpl* render_view) { | 168 RenderViewImpl* render_view) { |
| 156 CHECK(web_frame); | 169 CHECK(web_frame); |
| 157 CHECK(render_view); | 170 CHECK(render_view); |
| 158 | 171 |
| 159 web_frame_ = web_frame; | 172 web_frame_ = web_frame; |
| 160 render_view_ = render_view; | 173 render_view_ = render_view; |
| 161 | 174 |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 285 if (!compositing_helper_.get()) { | 298 if (!compositing_helper_.get()) { |
| 286 compositing_helper_ = | 299 compositing_helper_ = |
| 287 ChildFrameCompositingHelper::CreateForRenderFrameProxy(this); | 300 ChildFrameCompositingHelper::CreateForRenderFrameProxy(this); |
| 288 compositing_helper_->EnableCompositing(true); | 301 compositing_helper_->EnableCompositing(true); |
| 289 } | 302 } |
| 290 compositing_helper_->OnSetSurface(surface_id, frame_size, scale_factor, | 303 compositing_helper_->OnSetSurface(surface_id, frame_size, scale_factor, |
| 291 sequence); | 304 sequence); |
| 292 } | 305 } |
| 293 | 306 |
| 294 void RenderFrameProxy::OnDisownOpener() { | 307 void RenderFrameProxy::OnDisownOpener() { |
| 308 LOG(ERROR) << "RFP[" << this << "]::OnDisownOpener"; |
| 295 // TODO(creis): We should only see this for main frames for now. To support | 309 // TODO(creis): We should only see this for main frames for now. To support |
| 296 // disowning the opener on subframes, we will need to move WebContentsImpl's | 310 // disowning the opener on subframes, we will need to move WebContentsImpl's |
| 297 // opener_ to FrameTreeNode. | 311 // opener_ to FrameTreeNode. |
| 298 CHECK(!web_frame_->parent()); | 312 CHECK(!web_frame_->parent()); |
| 299 | 313 |
| 300 // When there is a RenderFrame for this proxy, tell it to disown its opener. | 314 // When there is a RenderFrame for this proxy, tell it to disown its opener. |
| 301 // TODO(creis): Remove this when we only have WebRemoteFrames and make sure | 315 // TODO(creis): Remove this when we only have WebRemoteFrames and make sure |
| 302 // they know they have an opener. | 316 // they know they have an opener. |
| 303 if (!RenderFrameProxy::IsSwappedOutStateForbidden()) { | 317 if (!RenderFrameProxy::IsSwappedOutStateForbidden()) { |
| 304 RenderFrameImpl* render_frame = | 318 RenderFrameImpl* render_frame = |
| 305 RenderFrameImpl::FromRoutingID(frame_routing_id_); | 319 RenderFrameImpl::FromRoutingID(frame_routing_id_); |
| 306 if (render_frame) { | 320 if (render_frame) { |
| 321 CHECK(false); |
| 307 if (render_frame->GetWebFrame()->opener()) | 322 if (render_frame->GetWebFrame()->opener()) |
| 308 render_frame->GetWebFrame()->setOpener(NULL); | 323 render_frame->GetWebFrame()->setOpener(NULL); |
| 309 return; | 324 return; |
| 310 } | 325 } |
| 311 } | 326 } |
| 312 | 327 |
| 313 if (web_frame_->opener()) | 328 if (web_frame_->opener()) |
| 314 web_frame_->setOpener(NULL); | 329 web_frame_->setOpener(NULL); |
| 315 } | 330 } |
| 316 | 331 |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 420 blink::WebUserGestureIndicator::isProcessingUserGesture(); | 435 blink::WebUserGestureIndicator::isProcessingUserGesture(); |
| 421 blink::WebUserGestureIndicator::consumeUserGesture(); | 436 blink::WebUserGestureIndicator::consumeUserGesture(); |
| 422 Send(new FrameHostMsg_OpenURL(routing_id_, params)); | 437 Send(new FrameHostMsg_OpenURL(routing_id_, params)); |
| 423 } | 438 } |
| 424 | 439 |
| 425 void RenderFrameProxy::forwardInputEvent(const blink::WebInputEvent* event) { | 440 void RenderFrameProxy::forwardInputEvent(const blink::WebInputEvent* event) { |
| 426 Send(new FrameHostMsg_ForwardInputEvent(routing_id_, event)); | 441 Send(new FrameHostMsg_ForwardInputEvent(routing_id_, event)); |
| 427 } | 442 } |
| 428 | 443 |
| 429 } // namespace | 444 } // namespace |
| OLD | NEW |