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, |