Chromium Code Reviews| 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..47feb6a5d5ab73096e8a0b1584cef9db3b6f9c87 100644 |
| --- a/content/browser/renderer_host/render_widget_helper.cc |
| +++ b/content/browser/renderer_host/render_widget_helper.cc |
| @@ -11,6 +11,8 @@ |
| #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/frame_tree_node.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 +92,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 +101,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 +122,45 @@ 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() && |
|
alexmos
2016/12/13 18:41:40
I suppose it makes sense to check whether the fram
ncarter (slow)
2016/12/15 00:33:16
I didn't write a test for this, but I do think it'
alexmos
2016/12/15 18:36:48
Acknowledged.
|
| + opener->frame_tree_node()->current_frame_host() == opener) { |
|
alexmos
2016/12/13 18:41:40
Similarly, can you use opener->is_active() here? T
ncarter (slow)
2016/12/15 00:33:16
Done.
|
| + 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 house the renderer-created |
| + // RenderFrame/RenderView/RenderWidget; we must send a message to destroy |
| + // those objects. |
| + RenderProcessHost* rph = RenderProcessHost::FromID(render_process_id_); |
| + if (main_frame_route_id != MSG_ROUTING_NONE && rph != nullptr) { |
|
alexmos
2016/12/13 18:41:40
Why do we need to look up and null-check the rph,
ncarter (slow)
2016/12/15 00:33:16
Looking up the rph is nececessary for the rph->Sen
alexmos
2016/12/15 18:36:48
Acknowledged.
|
| + bool succeeded = RenderWidgetHostImpl::FromID( |
| + rph->GetID(), main_frame_widget_route_id) != nullptr; |
| + if (!succeeded) { |
| + DCHECK(!RenderFrameHostImpl::FromID(rph->GetID(), main_frame_route_id)); |
| + DCHECK(!RenderViewHostImpl::FromID(rph->GetID(), render_view_route_id)); |
| + |
| + rph->Send(new ViewMsg_Close(render_view_route_id)); |
| + } else { |
| + // If a RenderWidgetHost was created, there should also be a |
| + // RenderFrameHost and RenderViewHost. |
| + DCHECK(RenderFrameHostImpl::FromID(rph->GetID(), main_frame_route_id)); |
| + DCHECK(RenderViewHostImpl::FromID(rph->GetID(), render_view_route_id)); |
| + } |
| } |
|
alexmos
2016/12/13 18:41:40
Is it worth adding an else and DCHECKing that rend
ncarter (slow)
2016/12/15 00:33:16
I added this DCHECK to the top of the WebContentsI
|
| } |