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

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

Issue 8760024: Cross-process postMessage (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Current checkpoint Created 9 years 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_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,
« no previous file with comments | « content/browser/renderer_host/render_view_host.h ('k') | content/browser/renderer_host/render_view_host_delegate.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698