Chromium Code Reviews| 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..574802452b35eefc8d4d77ada0e9ec0cbef6bfda 100644 |
| --- a/content/renderer/render_view_impl.cc |
| +++ b/content/renderer/render_view_impl.cc |
| @@ -611,6 +611,40 @@ 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()) |
|
nasko
2015/07/07 16:26:21
Can we DCHECK the IsSwappedOutForbidden() value? T
alexmos
2015/07/08 04:42:18
Done. Added a check for IsSwappedOutForbidden() b
|
| + 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 +696,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; |
|
alexmos
2015/07/06 23:56:42
Unfortunately, I had to keep this around as a view
|
| + |
| + 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 +857,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); |
|
alexmos
2015/07/06 23:56:42
Note that previously, if this RenderView was opene
nasko
2015/07/07 16:26:21
Acknowledged.
|
| // If we are initially swapped out, navigate to kSwappedOutURL. |
| // This ensures we are in a unique origin that others cannot script. |
| @@ -1610,7 +1646,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_; |