Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(420)

Side by Side Diff: content/renderer/render_frame_proxy.cc

Issue 1312643002: Plumb opener information when creating RenderFrames and RenderFrameProxies for subframes. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@opener-CreateOpenerProxiesIfNeeded
Patch Set: Fix param ordering in RenderThreadImpl::OnCreateNewFrameProxy Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/renderer/render_frame_proxy.h ('k') | content/renderer/render_thread_impl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 // always come from WebRemoteFrame::create and a call to WebFrame::swap must 52 // always come from WebRemoteFrame::create and a call to WebFrame::swap must
53 // follow later. 53 // follow later.
54 blink::WebRemoteFrame* web_frame = 54 blink::WebRemoteFrame* web_frame =
55 blink::WebRemoteFrame::create(scope, proxy.get()); 55 blink::WebRemoteFrame::create(scope, proxy.get());
56 proxy->Init(web_frame, frame_to_replace->render_view()); 56 proxy->Init(web_frame, frame_to_replace->render_view());
57 return proxy.release(); 57 return proxy.release();
58 } 58 }
59 59
60 RenderFrameProxy* RenderFrameProxy::CreateFrameProxy( 60 RenderFrameProxy* RenderFrameProxy::CreateFrameProxy(
61 int routing_id, 61 int routing_id,
62 int render_view_routing_id,
63 int opener_routing_id,
62 int parent_routing_id, 64 int parent_routing_id,
63 int render_view_routing_id,
64 const FrameReplicationState& replicated_state) { 65 const FrameReplicationState& replicated_state) {
65 scoped_ptr<RenderFrameProxy> proxy( 66 scoped_ptr<RenderFrameProxy> proxy(
66 new RenderFrameProxy(routing_id, MSG_ROUTING_NONE)); 67 new RenderFrameProxy(routing_id, MSG_ROUTING_NONE));
67 RenderViewImpl* render_view = NULL; 68 RenderViewImpl* render_view = NULL;
68 blink::WebRemoteFrame* web_frame = NULL; 69 blink::WebRemoteFrame* web_frame = NULL;
69 if (parent_routing_id == MSG_ROUTING_NONE) { 70 if (parent_routing_id == MSG_ROUTING_NONE) {
70 // Create a top level WebRemoteFrame. 71 // Create a top level WebRemoteFrame.
71 render_view = RenderViewImpl::FromRoutingID(render_view_routing_id); 72 render_view = RenderViewImpl::FromRoutingID(render_view_routing_id);
72 web_frame = 73 web_frame =
73 blink::WebRemoteFrame::create(replicated_state.scope, proxy.get()); 74 blink::WebRemoteFrame::create(replicated_state.scope, proxy.get());
74 render_view->webview()->setMainFrame(web_frame); 75 render_view->webview()->setMainFrame(web_frame);
75 } else { 76 } else {
76 // Create a frame under an existing parent. The parent is always expected 77 // Create a frame under an existing parent. The parent is always expected
77 // to be a RenderFrameProxy, because navigations initiated by local frames 78 // to be a RenderFrameProxy, because navigations initiated by local frames
78 // should not wind up here. 79 // should not wind up here.
79 RenderFrameProxy* parent = 80 RenderFrameProxy* parent =
80 RenderFrameProxy::FromRoutingID(parent_routing_id); 81 RenderFrameProxy::FromRoutingID(parent_routing_id);
81 web_frame = parent->web_frame()->createRemoteChild( 82 web_frame = parent->web_frame()->createRemoteChild(
82 replicated_state.scope, 83 replicated_state.scope,
83 blink::WebString::fromUTF8(replicated_state.name), 84 blink::WebString::fromUTF8(replicated_state.name),
84 replicated_state.sandbox_flags, proxy.get()); 85 replicated_state.sandbox_flags, proxy.get());
85 render_view = parent->render_view(); 86 render_view = parent->render_view();
86 } 87 }
87 88
89 blink::WebFrame* opener =
90 RenderFrameImpl::ResolveOpener(opener_routing_id, nullptr);
91 web_frame->setOpener(opener);
92
88 proxy->Init(web_frame, render_view); 93 proxy->Init(web_frame, render_view);
89 94
90 // Initialize proxy's WebRemoteFrame with the security origin and other 95 // Initialize proxy's WebRemoteFrame with the security origin and other
91 // replicated information. 96 // replicated information.
92 // TODO(dcheng): Calling this when parent_routing_id != MSG_ROUTING_NONE is 97 // TODO(dcheng): Calling this when parent_routing_id != MSG_ROUTING_NONE is
93 // mostly redundant, since we already pass the name and sandbox flags in 98 // mostly redundant, since we already pass the name and sandbox flags in
94 // createLocalChild(). We should update the Blink interface so it also takes 99 // createLocalChild(). We should update the Blink interface so it also takes
95 // the origin. Then it will be clear that the replication call is only needed 100 // the origin. Then it will be clear that the replication call is only needed
96 // for the case of setting up a main frame proxy. 101 // for the case of setting up a main frame proxy.
97 proxy->SetReplicatedState(replicated_state); 102 proxy->SetReplicatedState(replicated_state);
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
422 // Only a LocalFrame (i.e., the caller of window.open) should be able to 427 // Only a LocalFrame (i.e., the caller of window.open) should be able to
423 // update another frame's opener. 428 // update another frame's opener.
424 DCHECK(opener->isWebLocalFrame()); 429 DCHECK(opener->isWebLocalFrame());
425 430
426 int opener_routing_id = 431 int opener_routing_id =
427 RenderFrameImpl::FromWebFrame(opener->toWebLocalFrame())->GetRoutingID(); 432 RenderFrameImpl::FromWebFrame(opener->toWebLocalFrame())->GetRoutingID();
428 Send(new FrameHostMsg_DidChangeOpener(routing_id_, opener_routing_id)); 433 Send(new FrameHostMsg_DidChangeOpener(routing_id_, opener_routing_id));
429 } 434 }
430 435
431 } // namespace 436 } // namespace
OLDNEW
« no previous file with comments | « content/renderer/render_frame_proxy.h ('k') | content/renderer/render_thread_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698