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

Unified Diff: content/renderer/render_view_impl.cc

Issue 1202593002: Move browser-to-renderer opener plumbing to frame routing IDs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@opener-create-opener-render-views
Patch Set: Remove suppress_opener Created 5 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/public/test/test_renderer_host.h ('k') | content/test/data/post_message.html » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/render_view_impl.cc
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index bb881cbbd0bdf2581d61e758bd9e8c9974b8a082..2caf0ae9e3dca31b94a2a7b69a38739a3414e617 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -611,6 +611,42 @@ void ApplyBlinkSettings(const base::CommandLine& command_line,
}
}
+// Looks up and returns the WebFrame corresponding to a given opener frame
+// routing ID. Also stores the opener's RenderView routing ID into
+// |opener_view_routing_id|.
+WebFrame* ResolveOpener(int opener_frame_routing_id,
+ int* opener_view_routing_id) {
+ *opener_view_routing_id = MSG_ROUTING_NONE;
+ if (opener_frame_routing_id == MSG_ROUTING_NONE)
+ return nullptr;
+
+ // Opener routing ID could refer to either a RenderFrameProxy or a
+ // RenderFrame, so need to check both.
+ RenderFrameProxy* opener_proxy =
+ RenderFrameProxy::FromRoutingID(opener_frame_routing_id);
+ if (opener_proxy) {
+ *opener_view_routing_id = opener_proxy->render_view()->GetRoutingID();
+
+ // TODO(nasko,alexmos): This check won't be needed once swapped-out:// is
+ // gone.
+ if (opener_proxy->IsMainFrameDetachedFromTree()) {
+ DCHECK(!RenderFrameProxy::IsSwappedOutStateForbidden());
+ return opener_proxy->render_view()->webview()->mainFrame();
+ } else {
+ return opener_proxy->web_frame();
+ }
+ }
+
+ RenderFrameImpl* opener_frame =
+ RenderFrameImpl::FromRoutingID(opener_frame_routing_id);
+ if (opener_frame) {
+ *opener_view_routing_id = opener_frame->render_view()->GetRoutingID();
+ return opener_frame->GetWebFrame();
+ }
+
+ return nullptr;
+}
+
} // namespace
RenderViewImpl::RenderViewImpl(const ViewMsg_New_Params& params)
@@ -662,8 +698,13 @@ void RenderViewImpl::Initialize(const ViewMsg_New_Params& params,
bool was_created_by_renderer) {
routing_id_ = params.view_id;
surface_id_ = params.surface_id;
- if (params.opener_route_id != MSG_ROUTING_NONE && was_created_by_renderer)
- opener_id_ = params.opener_route_id;
+
+ int opener_view_routing_id;
+ WebFrame* opener_frame =
+ ResolveOpener(params.opener_frame_route_id, &opener_view_routing_id);
+ if (opener_view_routing_id != MSG_ROUTING_NONE && was_created_by_renderer)
+ opener_id_ = opener_view_routing_id;
+
display_mode_= params.initial_size.display_mode;
// Ensure we start with a valid next_page_id_ from the browser.
@@ -818,13 +859,10 @@ void RenderViewImpl::Initialize(const ViewMsg_New_Params& params,
GetContentClient()->renderer()->RenderViewCreated(this);
- // If we have an opener_id but we weren't created by a renderer, then
- // it's the browser asking us to set our opener to another RenderView.
- if (params.opener_route_id != MSG_ROUTING_NONE && !was_created_by_renderer) {
- RenderViewImpl* opener_view = FromRoutingID(params.opener_route_id);
- if (opener_view)
- webview()->mainFrame()->setOpener(opener_view->webview()->mainFrame());
- }
+ // If we have an opener_frame but we weren't created by a renderer, then it's
+ // the browser asking us to set our opener to another frame.
+ if (opener_frame && !was_created_by_renderer)
+ webview()->mainFrame()->setOpener(opener_frame);
// If we are initially swapped out, navigate to kSwappedOutURL.
// This ensures we are in a unique origin that others cannot script.
@@ -1610,7 +1648,11 @@ WebView* RenderViewImpl::createView(WebLocalFrame* creator,
// and rely on the browser sending a WasHidden / WasShown message if it
// disagrees.
ViewMsg_New_Params view_params;
- view_params.opener_route_id = routing_id_;
+
+ RenderFrameImpl* creator_frame = RenderFrameImpl::FromWebFrame(creator);
+ view_params.opener_frame_route_id = creator_frame->GetRoutingID();
+ DCHECK_EQ(routing_id_, creator_frame->render_view()->GetRoutingID());
+
view_params.window_was_created_with_opener = true;
view_params.renderer_preferences = renderer_preferences_;
view_params.web_preferences = webkit_preferences_;
« no previous file with comments | « content/public/test/test_renderer_host.h ('k') | content/test/data/post_message.html » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698