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 4669ff2eae1ee1bf69649415d7d6cdffccf769f8..1b6197363a85ba6fa2086e185d27245fd9a855bd 100644 |
--- a/content/browser/renderer_host/render_view_host.cc |
+++ b/content/browser/renderer_host/render_view_host.cc |
@@ -18,8 +18,10 @@ |
#include "base/values.h" |
#include "content/browser/browser_context.h" |
#include "content/browser/browser_message_filter.h" |
+#include "content/browser/browsing_instance_frame_id.h" |
#include "content/browser/child_process_security_policy.h" |
#include "content/browser/cross_site_request_manager.h" |
+#include "content/browser/frame_mapper.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" |
@@ -330,11 +332,20 @@ void RenderViewHost::SwapOut(int new_render_process_host_id, |
// Start the hang monitor in case the renderer hangs in the unload handler. |
StartHangMonitorTimeout(TimeDelta::FromMilliseconds(kUnloadTimeoutMS)); |
+ content::FrameMapper& frame_mapper = |
+ process()->GetBrowserContext()->frame_mapper(); |
+ content::BrowsingInstanceFrame* topLevelFrame = |
+ frame_mapper.FindTopLevelFrameByProcessAndRoute(process()->GetID(), |
+ routing_id()); |
+ DCHECK(topLevelFrame); |
+ |
ViewMsg_SwapOut_Params params; |
params.closing_process_id = process()->GetID(); |
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.browsing_instance_frame_id = topLevelFrame->id(); |
+ |
if (IsRenderViewLive()) { |
Send(new ViewMsg_SwapOut(routing_id(), params)); |
} else { |
@@ -379,6 +390,15 @@ void RenderViewHost::ClosePage() { |
// event and close the page. |
ClosePageIgnoringUnloadEvents(); |
} |
+ |
+ // Remove the top-level frame from the frame mapper |
+ content::FrameMapper& frame_mapper = |
+ process()->GetBrowserContext()->frame_mapper(); |
+ content::BrowsingInstanceFrame* topLevelFrame = |
+ frame_mapper.FindTopLevelFrameByProcessAndRoute(process()->GetID(), |
+ routing_id()); |
+ frame_mapper.RemoveFrame(topLevelFrame); |
+ // TODO(supersat): This should probably remove the proxy on the other side |
} |
void RenderViewHost::ClosePageIgnoringUnloadEvents() { |
@@ -1005,16 +1025,31 @@ void RenderViewHost::OnMsgToggleFullscreen(bool enter_fullscreen) { |
delegate_->ToggleFullscreenMode(enter_fullscreen); |
} |
-void RenderViewHost::OnMsgOpenURL(const GURL& url, |
- const GURL& referrer, |
- WindowOpenDisposition disposition, |
- int64 source_frame_id) { |
- GURL validated_url(url); |
+void RenderViewHost::OnMsgOpenURL(const ViewHostMsg_OpenURL_Params& params) { |
+ GURL validated_url(params.url); |
FilterURL(ChildProcessSecurityPolicy::GetInstance(), |
process()->GetID(), &validated_url); |
- delegate_->RequestOpenURL( |
- validated_url, referrer, disposition, source_frame_id); |
+ // Translate the RenderView's opener_frame_id to browsing instance frame id |
+ int64 opener_browsing_instance_frame_id = -1; |
+ DLOG(WARNING) << "OnMsgOpenURL, opener_frame_id = " << params.opener_frame_id; |
+ if (params.opener_frame_id) { |
+ DLOG(WARNING) << "Mapping opener_frame_id " << params.opener_frame_id; |
+ DLOG(WARNING) << "Process = " << process()->GetID(); |
+ content::FrameMapper& frame_mapper = |
+ process()->GetBrowserContext()->frame_mapper(); |
+ content::BrowsingInstanceFrame* opener = frame_mapper.FindByWebKitId( |
+ process()->GetID(), params.opener_frame_id); |
+ if (opener) { |
+ DLOG(WARNING) << "Opener is " << opener->id(); |
+ opener_browsing_instance_frame_id = opener->id(); |
+ } else { |
+ DLOG(WARNING) << "Opener not found"; |
+ } |
+ } |
+ delegate_->RequestOpenURL(validated_url, params.referrer, |
+ params.disposition, params.source_frame_id, |
+ opener_browsing_instance_frame_id); |
} |
void RenderViewHost::OnMsgDidContentsPreferredSizeChange( |