Chromium Code Reviews| Index: content/renderer/render_frame_impl.cc |
| diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc |
| index 63ab694e12698d2fc7483b90c10e6358d8559c8a..cf588201bf4509f18e7a518bdb22d4109412641a 100644 |
| --- a/content/renderer/render_frame_impl.cc |
| +++ b/content/renderer/render_frame_impl.cc |
| @@ -496,24 +496,36 @@ RenderFrameImpl* RenderFrameImpl::FromRoutingID(int32 routing_id) { |
| } |
| // static |
| -void RenderFrameImpl::CreateFrame(int routing_id, int parent_routing_id) { |
| +void RenderFrameImpl::CreateFrame(int routing_id, |
| + int parent_routing_id, |
| + int proxy_routing_id) { |
| // TODO(nasko): For now, this message is only sent for subframes, as the |
| // top level frame is created when the RenderView is created through the |
| // ViewMsg_New IPC. |
| CHECK_NE(MSG_ROUTING_NONE, parent_routing_id); |
| - RenderFrameProxy* proxy = RenderFrameProxy::FromRoutingID(parent_routing_id); |
| - |
| - // If the browser is sending a valid parent routing id, it should already be |
| - // created and registered. |
| - CHECK(proxy); |
| - blink::WebRemoteFrame* parent_web_frame = proxy->web_frame(); |
| - |
| - // Create the RenderFrame and WebLocalFrame, linking the two. |
| - RenderFrameImpl* render_frame = |
| - RenderFrameImpl::Create(proxy->render_view(), routing_id); |
| - blink::WebLocalFrame* web_frame = |
| - parent_web_frame->createLocalChild("", render_frame); |
| + blink::WebLocalFrame* web_frame; |
| + RenderFrameImpl* render_frame; |
| + if (proxy_routing_id == MSG_ROUTING_NONE) { |
| + RenderFrameProxy* proxy = |
|
nasko
2014/10/27 22:52:55
nit: I'd rename this to proxy_parent or something
Nate Chapin
2014/10/28 19:59:20
parent_proxy to better match the existing parent_w
|
| + RenderFrameProxy::FromRoutingID(parent_routing_id); |
| + // If the browser is sending a valid parent routing id, it should already |
| + // be created and registered. |
| + CHECK(proxy); |
| + blink::WebRemoteFrame* parent_web_frame = proxy->web_frame(); |
| + |
| + // Create the RenderFrame and WebLocalFrame, linking the two. |
| + render_frame = RenderFrameImpl::Create(proxy->render_view(), routing_id); |
| + web_frame = parent_web_frame->createLocalChild("", render_frame); |
| + } else { |
|
Charlie Reis
2014/10/28 16:38:29
Why do we ignore parent_routing_id in this case?
Nate Chapin
2014/10/28 19:59:20
The existing RemoteFrame that we're replacing alre
|
| + RenderFrameProxy* proxy = |
| + RenderFrameProxy::FromRoutingID(proxy_routing_id); |
| + CHECK(proxy); |
| + render_frame = RenderFrameImpl::Create(proxy->render_view(), routing_id); |
| + web_frame = blink::WebLocalFrame::create(render_frame); |
| + render_frame->proxy_routing_id_ = proxy_routing_id; |
| + web_frame->initializeToReplaceRemoteFrame(proxy->web_frame()); |
| + } |
| render_frame->SetWebFrame(web_frame); |
| render_frame->Initialize(); |
| } |
| @@ -546,6 +558,7 @@ RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id) |
| is_swapped_out_(false), |
| render_frame_proxy_(NULL), |
| is_detaching_(false), |
| + proxy_routing_id_(MSG_ROUTING_NONE), |
| cookie_jar_(this), |
| selection_text_offset_(0), |
| selection_range_(gfx::Range::InvalidRange()), |
| @@ -2219,6 +2232,14 @@ void RenderFrameImpl::didCommitProvisionalLoad( |
| DocumentState::FromDataSource(frame->dataSource()); |
| NavigationState* navigation_state = document_state->navigation_state(); |
| + if (proxy_routing_id_ != MSG_ROUTING_NONE) { |
| + RenderFrameProxy* proxy = |
| + RenderFrameProxy::FromRoutingID(proxy_routing_id_); |
| + CHECK(proxy); |
| + proxy->web_frame()->swap(frame_); |
| + proxy_routing_id_ = MSG_ROUTING_NONE; |
| + } |
| + |
| // When we perform a new navigation, we need to update the last committed |
| // session history entry with state for the page we are leaving. Do this |
| // before updating the HistoryController state. |