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