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)); |
+ } |
} |
} |