| 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..18503aa4d7950eae674a8a2f8a7983fb360a6784 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 =
|
| + process()->GetBrowserContext()->frame_mapper();
|
| + content::ContentFrame* topLevelFrame =
|
| + frame_mapper->FindTopLevelFrame(process()->GetID(), routing_id());
|
| + // TODO(supersat): Sometimes this can be null. Why?
|
| + DCHECK(topLevelFrame);
|
| +
|
| + 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 =
|
| + 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,
|
|
|