| Index: content/browser/renderer_host/render_widget_helper.cc
|
| diff --git a/content/browser/renderer_host/render_widget_helper.cc b/content/browser/renderer_host/render_widget_helper.cc
|
| index fce786a8ccae10e00b86b151a5d429a7b6b879c2..ddc2e13a671e2ad3ac4a710ed39f0ce7d1af075e 100644
|
| --- a/content/browser/renderer_host/render_widget_helper.cc
|
| +++ b/content/browser/renderer_host/render_widget_helper.cc
|
| @@ -11,6 +11,7 @@
|
| #include "base/threading/thread.h"
|
| #include "base/threading/thread_restrictions.h"
|
| #include "content/browser/dom_storage/session_storage_namespace_impl.h"
|
| +#include "content/browser/frame_host/render_frame_host_impl.h"
|
| #include "content/browser/loader/resource_dispatcher_host_impl.h"
|
| #include "content/browser/renderer_host/render_process_host_impl.h"
|
| #include "content/browser/renderer_host/render_view_host_impl.h"
|
| @@ -90,8 +91,7 @@ void RenderWidgetHelper::OnResumeDeferredNavigation(
|
| void RenderWidgetHelper::CreateNewWindow(
|
| mojom::CreateNewWindowParamsPtr params,
|
| bool no_javascript_access,
|
| - base::ProcessHandle render_process,
|
| - int32_t* route_id,
|
| + int32_t* render_view_route_id,
|
| int32_t* main_frame_route_id,
|
| int32_t* main_frame_widget_route_id,
|
| SessionStorageNamespace* session_storage_namespace) {
|
| @@ -100,17 +100,17 @@ void RenderWidgetHelper::CreateNewWindow(
|
| // open the window in a new BrowsingInstance, and thus a new process. That
|
| // means the current renderer process will not be able to route messages to
|
| // it. Because of this, we will immediately show and navigate the window
|
| - // in OnCreateWindowOnUI, using the params provided here.
|
| - *route_id = MSG_ROUTING_NONE;
|
| + // in OnCreateNewWindowOnUI, using the params provided here.
|
| + *render_view_route_id = MSG_ROUTING_NONE;
|
| *main_frame_route_id = MSG_ROUTING_NONE;
|
| *main_frame_widget_route_id = MSG_ROUTING_NONE;
|
| } else {
|
| - *route_id = GetNextRoutingID();
|
| + *render_view_route_id = GetNextRoutingID();
|
| *main_frame_route_id = GetNextRoutingID();
|
| // TODO(avi): When RenderViewHostImpl has-a RenderWidgetHostImpl, this
|
| // should be updated to give the widget a distinct routing ID.
|
| // https://crbug.com/545684
|
| - *main_frame_widget_route_id = *route_id;
|
| + *main_frame_widget_route_id = *render_view_route_id;
|
| // Block resource requests until the frame is created, since the HWND might
|
| // be needed if a response ends up creating a plugin. We'll only have a
|
| // single frame at this point. These requests will be resumed either in
|
| @@ -121,24 +121,43 @@ void RenderWidgetHelper::CreateNewWindow(
|
|
|
| BrowserThread::PostTask(
|
| BrowserThread::UI, FROM_HERE,
|
| - base::Bind(&RenderWidgetHelper::OnCreateWindowOnUI, this,
|
| - base::Passed(¶ms), *route_id, *main_frame_route_id,
|
| - *main_frame_widget_route_id,
|
| + base::Bind(&RenderWidgetHelper::OnCreateNewWindowOnUI, this,
|
| + base::Passed(¶ms), *render_view_route_id,
|
| + *main_frame_route_id, *main_frame_widget_route_id,
|
| base::RetainedRef(session_storage_namespace)));
|
| }
|
|
|
| -void RenderWidgetHelper::OnCreateWindowOnUI(
|
| +void RenderWidgetHelper::OnCreateNewWindowOnUI(
|
| mojom::CreateNewWindowParamsPtr params,
|
| - int32_t route_id,
|
| + int32_t render_view_route_id,
|
| int32_t main_frame_route_id,
|
| int32_t main_frame_widget_route_id,
|
| SessionStorageNamespace* session_storage_namespace) {
|
| - RenderViewHostImpl* host =
|
| - RenderViewHostImpl::FromID(render_process_id_, params->opener_id);
|
| - if (host) {
|
| - host->CreateNewWindow(route_id, main_frame_route_id,
|
| - main_frame_widget_route_id, *params,
|
| - session_storage_namespace);
|
| + RenderFrameHostImpl* opener = RenderFrameHostImpl::FromID(
|
| + render_process_id_, params->opener_render_frame_id);
|
| + if (opener && opener->IsRenderFrameLive()) {
|
| + opener->OnCreateNewWindow(render_view_route_id, main_frame_route_id,
|
| + main_frame_widget_route_id, *params,
|
| + session_storage_namespace);
|
| + }
|
| +
|
| + // If we did not create a WebContents to host the renderer-created
|
| + // RenderFrame/RenderView/RenderWidget objects, destroy them.
|
| + RenderProcessHost* rph = RenderProcessHost::FromID(render_process_id_);
|
| + if (main_frame_route_id != MSG_ROUTING_NONE && rph != nullptr) {
|
| + bool succeeded =
|
| + RenderWidgetHost::FromID(render_process_id_,
|
| + main_frame_widget_route_id) != nullptr;
|
| + if (!succeeded) {
|
| + DCHECK(!RenderFrameHost::FromID(render_process_id_, main_frame_route_id));
|
| + DCHECK(!RenderViewHost::FromID(render_process_id_, render_view_route_id));
|
| +
|
| + rph->Send(new ViewMsg_Close(render_view_route_id));
|
| + } else {
|
| + // If a RWH was created, there should also be an RFH and RVH.
|
| + DCHECK(RenderFrameHost::FromID(render_process_id_, main_frame_route_id));
|
| + DCHECK(RenderViewHost::FromID(render_process_id_, render_view_route_id));
|
| + }
|
| }
|
| }
|
|
|
|
|