Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1365)

Unified Diff: content/browser/renderer_host/render_widget_helper.cc

Issue 2506183002: Make window.open() IPCs be frame-based (Closed)
Patch Set: Rebase. Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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(&params), *route_id, *main_frame_route_id,
- *main_frame_widget_route_id,
+ base::Bind(&RenderWidgetHelper::OnCreateNewWindowOnUI, this,
+ base::Passed(&params), *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));
+ }
}
}
« no previous file with comments | « content/browser/renderer_host/render_widget_helper.h ('k') | content/browser/security_exploit_browsertest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698