Chromium Code Reviews| Index: content/browser/renderer_host/render_view_host.cc |
| diff --git a/content/browser/renderer_host/render_view_host.cc b/content/browser/renderer_host/render_view_host.cc |
| index 96d76c814389bb1021fd63d2dc53a4ac6284bb62..bc15efda309a6517df71b1fe7c59d4bb8303ca89 100644 |
| --- a/content/browser/renderer_host/render_view_host.cc |
| +++ b/content/browser/renderer_host/render_view_host.cc |
| @@ -18,7 +18,9 @@ |
| #include "base/utf_string_conversions.h" |
| #include "base/values.h" |
| #include "content/browser/child_process_security_policy.h" |
| +#include "content/browser/content_frame.h" |
| #include "content/browser/cross_site_request_manager.h" |
| +#include "content/browser/frame_map.h" |
| #include "content/browser/host_zoom_map.h" |
| #include "content/browser/in_process_webkit/session_storage_namespace.h" |
| #include "content/browser/power_save_blocker.h" |
| @@ -161,6 +163,7 @@ RenderViewHost::~RenderViewHost() { |
| } |
| bool RenderViewHost::CreateRenderView(const string16& frame_name, |
| + int opener_route_id, |
| int32 max_page_id) { |
| DCHECK(!IsRenderViewLive()) << "Creating view twice"; |
| @@ -192,6 +195,7 @@ bool RenderViewHost::CreateRenderView(const string16& frame_name, |
| params.view_id = routing_id(); |
| params.session_storage_namespace_id = session_storage_namespace_->id(); |
| params.frame_name = frame_name; |
| + params.opener_route_id = opener_route_id; |
| params.next_page_id = next_page_id; |
| Send(new ViewMsg_New(params)); |
| @@ -329,6 +333,20 @@ void RenderViewHost::FirePageBeforeUnload(bool for_cross_site_transition) { |
| void RenderViewHost::SwapOut(int new_render_process_host_id, |
| int new_request_id) { |
| + content::FrameMap& frame_mapper = |
|
awong
2011/12/21 01:56:07
Should this be a const_ref?
|
| + process()->GetBrowserContext()->frame_mapper(); |
| + content::ContentFrame* topLevelFrame = |
| + frame_mapper.FindTopLevelFrame(process()->GetID(), routing_id()); |
| + // TODO(supersat): Sometimes this can be null. Why? |
| + DCHECK(topLevelFrame); |
|
jam
2011/12/22 20:06:53
nit: dcheck not needed, will crash below. also top
|
| + |
| + SwapOutAndProxy(new_render_process_host_id, new_request_id, |
| + topLevelFrame->id()); |
| +} |
| + |
| +void RenderViewHost::SwapOutAndProxy(int new_render_process_host_id, |
| + int new_request_id, |
| + int64 content_frame) { |
| // Start filtering IPC messages to avoid confusing the delegate. This will |
| // prevent any dialogs from appearing during unload handlers, but we've |
| // already decided to silence them in crbug.com/68780. We will set it back |
| @@ -346,6 +364,8 @@ void RenderViewHost::SwapOut(int new_render_process_host_id, |
| params.closing_route_id = routing_id(); |
| params.new_render_process_host_id = new_render_process_host_id; |
| params.new_request_id = new_request_id; |
| + params.content_frame_id = content_frame; |
| + |
| if (IsRenderViewLive()) { |
| Send(new ViewMsg_SwapOut(routing_id(), params)); |
| } else { |
| @@ -780,7 +800,14 @@ void RenderViewHost::CreateNewWindow( |
| if (!view) |
| return; |
| - view->CreateNewWindow(route_id, params); |
| + // Translate the opener_frame_id into a ContentFrame while we still know what |
| + // process it was created on. |
| + |
| + content::FrameMap& frame_map = |
|
awong
2011/12/21 01:56:07
const ref?
|
| + process()->GetBrowserContext()->frame_mapper(); |
| + content::ContentFrame* opener = |
| + frame_map.FindRendererFrame(process()->GetID(), params.opener_frame_id); |
| + view->CreateNewWindow(route_id, params, opener); |
| } |
| void RenderViewHost::CreateNewWidget(int route_id, |