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 ab0ce6d23f64f9ee510787c6bb60f74f9ec52da2..3eac6072e4284561ccae9ab8990467a2028b3762 100644 |
--- a/content/browser/renderer_host/render_view_host.cc |
+++ b/content/browser/renderer_host/render_view_host.cc |
@@ -19,8 +19,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_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" |
@@ -261,6 +263,7 @@ void RenderViewHost::NavigateToURL(const GURL& url) { |
params.url = url; |
params.transition = content::PAGE_TRANSITION_LINK; |
params.navigation_type = ViewMsg_Navigate_Type::NORMAL; |
+ params.opener_browsing_instance_frame_id = -1; |
Navigate(params); |
} |
@@ -331,11 +334,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::FrameMap& 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 { |
@@ -1007,16 +1019,31 @@ void RenderViewHost::OnMsgToggleFullscreen(bool enter_fullscreen) { |
delegate_->ToggleFullscreenMode(enter_fullscreen); |
} |
-void RenderViewHost::OnMsgOpenURL(const GURL& url, |
- const content::Referrer& 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::FrameMap& 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( |