summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authornasko@chromium.org <nasko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-31 22:43:04 +0000
committernasko@chromium.org <nasko@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-05-31 22:43:04 +0000
commit227692c5deb033cd21a89573b4b16ca20a345811 (patch)
tree14ab87198605cad1f4b41a13c92d1b434909e64e /content
parentd5023e98df77204c2d0a27000ddf7cfeaec02a32 (diff)
downloadchromium_src-227692c5deb033cd21a89573b4b16ca20a345811.zip
chromium_src-227692c5deb033cd21a89573b4b16ca20a345811.tar.gz
chromium_src-227692c5deb033cd21a89573b4b16ca20a345811.tar.bz2
Create RenderFrame/RenderFrameHost for the main frame of a page.
This CL is the first in a series that will move frame specific functionality from RenderView/RenderViewHost to RenderFrame/RenderFrameHost. In this change, I'm only creating the objects for the top level frame and keeping them as members of RenderView/RenderViewHost for now. BUG=245126 Review URL: https://chromiumcodereview.appspot.com/16032007 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@203500 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r--content/browser/renderer_host/media/web_contents_video_capture_device_unittest.cc7
-rw-r--r--content/browser/renderer_host/render_frame_host_impl.cc34
-rw-r--r--content/browser/renderer_host/render_frame_host_impl.h41
-rw-r--r--content/browser/renderer_host/render_message_filter.cc3
-rw-r--r--content/browser/renderer_host/render_message_filter.h1
-rw-r--r--content/browser/renderer_host/render_view_host_browsertest.cc23
-rw-r--r--content/browser/renderer_host/render_view_host_delegate.h1
-rw-r--r--content/browser/renderer_host/render_view_host_factory.cc7
-rw-r--r--content/browser/renderer_host/render_view_host_factory.h2
-rw-r--r--content/browser/renderer_host/render_view_host_impl.cc13
-rw-r--r--content/browser/renderer_host/render_view_host_impl.h11
-rw-r--r--content/browser/renderer_host/render_widget_helper.cc11
-rw-r--r--content/browser/renderer_host/render_widget_helper.h2
-rw-r--r--content/browser/renderer_host/test_render_view_host.cc2
-rw-r--r--content/browser/renderer_host/test_render_view_host.h1
-rw-r--r--content/browser/web_contents/interstitial_page_impl.cc3
-rw-r--r--content/browser/web_contents/interstitial_page_impl.h1
-rw-r--r--content/browser/web_contents/render_view_host_manager.cc7
-rw-r--r--content/browser/web_contents/render_view_host_manager.h3
-rw-r--r--content/browser/web_contents/render_view_host_manager_unittest.cc16
-rw-r--r--content/browser/web_contents/web_contents_impl.cc7
-rw-r--r--content/browser/web_contents/web_contents_impl.h1
-rw-r--r--content/browser/web_contents/web_contents_impl_unittest.cc2
-rw-r--r--content/common/view_messages.h6
-rw-r--r--content/content_browser.gypi3
-rw-r--r--content/content_renderer.gypi3
-rw-r--r--content/public/browser/render_frame_host.h25
-rw-r--r--content/public/browser/web_contents.cc2
-rw-r--r--content/public/browser/web_contents.h1
-rw-r--r--content/public/renderer/render_frame.h30
-rw-r--r--content/public/test/mock_render_thread.cc8
-rw-r--r--content/public/test/mock_render_thread.h2
-rw-r--r--content/public/test/render_view_test.cc4
-rw-r--r--content/renderer/render_frame_impl.cc32
-rw-r--r--content/renderer/render_frame_impl.h38
-rw-r--r--content/renderer/render_thread_impl.cc1
-rw-r--r--content/renderer/render_view_browsertest.cc6
-rw-r--r--content/renderer/render_view_impl.cc9
-rw-r--r--content/renderer/render_view_impl.h5
-rw-r--r--content/renderer/render_view_impl_params.cc2
-rw-r--r--content/renderer/render_view_impl_params.h2
-rw-r--r--content/test/test_render_view_host_factory.cc4
-rw-r--r--content/test/test_render_view_host_factory.h1
-rw-r--r--content/test/test_web_contents.cc1
-rw-r--r--content/test/test_web_contents.h1
45 files changed, 359 insertions, 26 deletions
diff --git a/content/browser/renderer_host/media/web_contents_video_capture_device_unittest.cc b/content/browser/renderer_host/media/web_contents_video_capture_device_unittest.cc
index 953442a..304dc2e 100644
--- a/content/browser/renderer_host/media/web_contents_video_capture_device_unittest.cc
+++ b/content/browser/renderer_host/media/web_contents_video_capture_device_unittest.cc
@@ -227,10 +227,11 @@ class CaptureTestRenderViewHost : public TestRenderViewHost {
RenderViewHostDelegate* delegate,
RenderWidgetHostDelegate* widget_delegate,
int routing_id,
+ int main_frame_routing_id,
bool swapped_out,
CaptureTestSourceController* controller)
: TestRenderViewHost(instance, delegate, widget_delegate, routing_id,
- swapped_out),
+ main_frame_routing_id, swapped_out),
controller_(controller) {
// Override the default view installed by TestRenderViewHost; we need
// our special subclass which has mocked-out tab capture support.
@@ -287,10 +288,12 @@ class CaptureTestRenderViewHostFactory : public RenderViewHostFactory {
RenderViewHostDelegate* delegate,
RenderWidgetHostDelegate* widget_delegate,
int routing_id,
+ int main_frame_routing_id,
bool swapped_out,
SessionStorageNamespace* session_storage_namespace) OVERRIDE {
return new CaptureTestRenderViewHost(instance, delegate, widget_delegate,
- routing_id, swapped_out, controller_);
+ routing_id, main_frame_routing_id,
+ swapped_out, controller_);
}
private:
CaptureTestSourceController* controller_;
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc
new file mode 100644
index 0000000..ea511d0
--- /dev/null
+++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -0,0 +1,34 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/browser/renderer_host/render_frame_host_impl.h"
+
+#include "content/browser/renderer_host/render_view_host_impl.h"
+
+namespace content {
+
+RenderFrameHostImpl::RenderFrameHostImpl(
+ RenderViewHostImpl* render_view_host,
+ int routing_id,
+ bool swapped_out)
+ : render_view_host_(render_view_host),
+ routing_id_(routing_id) {
+}
+
+RenderFrameHostImpl::~RenderFrameHostImpl() {
+}
+
+bool RenderFrameHostImpl::Send(IPC::Message* message) {
+ // Use the RenderViewHost object to send the message. It inherits it from
+ // RenderWidgetHost, which ultimately uses the current process's |Send|.
+ return render_view_host_->Send(message);
+}
+
+bool RenderFrameHostImpl::OnMessageReceived(const IPC::Message &msg) {
+ // Pass the message up to the RenderViewHost, until we have enough
+ // infrastructure to start processing messages in this object.
+ return render_view_host_->OnMessageReceived(msg);
+}
+
+} // namespace content
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h
new file mode 100644
index 0000000..bb94c8e
--- /dev/null
+++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -0,0 +1,41 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_BROWSER_RENDERER_HOST_RENDER_FRAME_HOST_IMPL_H_
+#define CONTENT_BROWSER_RENDERER_HOST_RENDER_FRAME_HOST_IMPL_H_
+
+#include "base/compiler_specific.h"
+#include "content/public/browser/render_frame_host.h"
+
+namespace content {
+
+class RenderViewHostImpl;
+
+class CONTENT_EXPORT RenderFrameHostImpl : public RenderFrameHost {
+ public:
+ RenderFrameHostImpl(
+ RenderViewHostImpl* render_view_host,
+ int routing_id,
+ bool swapped_out);
+ virtual ~RenderFrameHostImpl();
+
+ // IPC::Sender
+ virtual bool Send(IPC::Message* msg) OVERRIDE;
+
+ // IPC::Listener
+ virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
+
+ int routing_id() { return routing_id_; }
+
+ private:
+ RenderViewHostImpl* render_view_host_;
+
+ int routing_id_;
+
+ DISALLOW_COPY_AND_ASSIGN(RenderFrameHostImpl);
+};
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_RENDERER_HOST_RENDER_FRAME_HOST_IMPL_H_
diff --git a/content/browser/renderer_host/render_message_filter.cc b/content/browser/renderer_host/render_message_filter.cc
index f7059a9..1e8b640 100644
--- a/content/browser/renderer_host/render_message_filter.cc
+++ b/content/browser/renderer_host/render_message_filter.cc
@@ -446,6 +446,7 @@ bool RenderMessageFilter::OffTheRecord() const {
void RenderMessageFilter::OnCreateWindow(
const ViewHostMsg_CreateWindow_Params& params,
int* route_id,
+ int* main_frame_route_id,
int* surface_id,
int64* cloned_session_storage_namespace_id) {
bool no_javascript_access;
@@ -460,6 +461,7 @@ void RenderMessageFilter::OnCreateWindow(
if (!can_create_window) {
*route_id = MSG_ROUTING_NONE;
+ *main_frame_route_id = MSG_ROUTING_NONE;
*surface_id = 0;
return;
}
@@ -474,6 +476,7 @@ void RenderMessageFilter::OnCreateWindow(
no_javascript_access,
peer_handle(),
route_id,
+ main_frame_route_id,
surface_id,
cloned_namespace);
}
diff --git a/content/browser/renderer_host/render_message_filter.h b/content/browser/renderer_host/render_message_filter.h
index fb45016..6e907a7 100644
--- a/content/browser/renderer_host/render_message_filter.h
+++ b/content/browser/renderer_host/render_message_filter.h
@@ -121,6 +121,7 @@ class RenderMessageFilter : public BrowserMessageFilter {
void OnGetProcessMemorySizes(size_t* private_bytes, size_t* shared_bytes);
void OnCreateWindow(const ViewHostMsg_CreateWindow_Params& params,
int* route_id,
+ int* main_frame_route_id,
int* surface_id,
int64* cloned_session_storage_namespace_id);
void OnCreateWidget(int opener_id,
diff --git a/content/browser/renderer_host/render_view_host_browsertest.cc b/content/browser/renderer_host/render_view_host_browsertest.cc
index 8fb43e5..0bd8f1e 100644
--- a/content/browser/renderer_host/render_view_host_browsertest.cc
+++ b/content/browser/renderer_host/render_view_host_browsertest.cc
@@ -92,4 +92,27 @@ IN_PROC_BROWSER_TEST_F(RenderViewHostTest, BaseURLParam) {
EXPECT_EQ("http://www.google.com/", observer.base_url().spec());
}
+// This test ensures a RenderFrameHost object is created for the top level frame
+// in each RenderViewHost.
+IN_PROC_BROWSER_TEST_F(RenderViewHostTest, BasicRenderFrameHost) {
+ ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
+
+ GURL test_url = embedded_test_server()->GetURL("/simple_page.html");
+ NavigateToURL(shell(), test_url);
+
+ RenderViewHostImpl* rvh = static_cast<RenderViewHostImpl*>(
+ shell()->web_contents()->GetRenderViewHost());
+ EXPECT_TRUE(rvh->main_render_frame_host_.get());
+
+ ShellAddedObserver new_shell_observer;
+ EXPECT_TRUE(ExecuteScript(shell()->web_contents(), "window.open();"));
+ Shell* new_shell = new_shell_observer.GetShell();
+ RenderViewHostImpl* new_rvh = static_cast<RenderViewHostImpl*>(
+ new_shell->web_contents()->GetRenderViewHost());
+
+ EXPECT_TRUE(new_rvh->main_render_frame_host_.get());
+ EXPECT_NE(rvh->main_render_frame_host_->routing_id(),
+ new_rvh->main_render_frame_host_->routing_id());
+}
+
} // namespace content
diff --git a/content/browser/renderer_host/render_view_host_delegate.h b/content/browser/renderer_host/render_view_host_delegate.h
index d9ad8ef..2c7bf68 100644
--- a/content/browser/renderer_host/render_view_host_delegate.h
+++ b/content/browser/renderer_host/render_view_host_delegate.h
@@ -364,6 +364,7 @@ class CONTENT_EXPORT RenderViewHostDelegate {
// the Windows function which is actually a #define.
virtual void CreateNewWindow(
int route_id,
+ int main_frame_route_id,
const ViewHostMsg_CreateWindow_Params& params,
SessionStorageNamespace* session_storage_namespace) {}
diff --git a/content/browser/renderer_host/render_view_host_factory.cc b/content/browser/renderer_host/render_view_host_factory.cc
index c2b6c92..4f01d54 100644
--- a/content/browser/renderer_host/render_view_host_factory.cc
+++ b/content/browser/renderer_host/render_view_host_factory.cc
@@ -18,15 +18,18 @@ RenderViewHost* RenderViewHostFactory::Create(
RenderViewHostDelegate* delegate,
RenderWidgetHostDelegate* widget_delegate,
int routing_id,
+ int main_frame_routing_id,
bool swapped_out,
SessionStorageNamespace* session_storage_namespace) {
if (factory_) {
return factory_->CreateRenderViewHost(instance, delegate, widget_delegate,
- routing_id, swapped_out,
+ routing_id, main_frame_routing_id,
+ swapped_out,
session_storage_namespace);
}
return new RenderViewHostImpl(instance, delegate, widget_delegate, routing_id,
- swapped_out, session_storage_namespace);
+ main_frame_routing_id, swapped_out,
+ session_storage_namespace);
}
// static
diff --git a/content/browser/renderer_host/render_view_host_factory.h b/content/browser/renderer_host/render_view_host_factory.h
index 0b7465d..df61552 100644
--- a/content/browser/renderer_host/render_view_host_factory.h
+++ b/content/browser/renderer_host/render_view_host_factory.h
@@ -28,6 +28,7 @@ class RenderViewHostFactory {
RenderViewHostDelegate* delegate,
RenderWidgetHostDelegate* widget_delegate,
int routing_id,
+ int main_frame_routing_id,
bool swapped_out,
SessionStorageNamespace* session_storage);
@@ -47,6 +48,7 @@ class RenderViewHostFactory {
RenderViewHostDelegate* delegate,
RenderWidgetHostDelegate* widget_delegate,
int routing_id,
+ int main_frame_routing_id,
bool swapped_out,
SessionStorageNamespace* session_storage_namespace) = 0;
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index 44017ad..e6b59ba 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -159,6 +159,7 @@ RenderViewHostImpl::RenderViewHostImpl(
RenderViewHostDelegate* delegate,
RenderWidgetHostDelegate* widget_delegate,
int routing_id,
+ int main_frame_routing_id,
bool swapped_out,
SessionStorageNamespace* session_storage)
: RenderWidgetHostImpl(widget_delegate, instance->GetProcess(), routing_id),
@@ -191,6 +192,12 @@ RenderViewHostImpl::RenderViewHostImpl(
DCHECK(instance_);
CHECK(delegate_); // http://crbug.com/82827
+ if (main_frame_routing_id == MSG_ROUTING_NONE)
+ main_frame_routing_id = GetProcess()->GetNextRoutingID();
+
+ main_render_frame_host_.reset(
+ new RenderFrameHostImpl(this, main_frame_routing_id, is_swapped_out_));
+
GetProcess()->EnableSendQueue();
for (size_t i = 0; i < g_created_callbacks.Get().size(); i++)
@@ -253,6 +260,7 @@ bool RenderViewHostImpl::CreateRenderView(
delegate_->GetRendererPrefs(GetProcess()->GetBrowserContext());
params.web_preferences = delegate_->GetWebkitPrefs();
params.view_id = GetRoutingID();
+ params.main_frame_routing_id = main_render_frame_host_->routing_id();
params.surface_id = surface_id();
params.session_storage_namespace_id = session_storage_namespace_->id();
params.frame_name = frame_name;
@@ -1035,6 +1043,7 @@ bool RenderViewHostImpl::IsRenderView() const {
void RenderViewHostImpl::CreateNewWindow(
int route_id,
+ int main_frame_route_id,
const ViewHostMsg_CreateWindow_Params& params,
SessionStorageNamespace* session_storage_namespace) {
ViewHostMsg_CreateWindow_Params validated_params(params);
@@ -1045,8 +1054,8 @@ void RenderViewHostImpl::CreateNewWindow(
FilterURL(policy, GetProcess(), true,
&validated_params.opener_security_origin);
- delegate_->CreateNewWindow(route_id, validated_params,
- session_storage_namespace);
+ delegate_->CreateNewWindow(route_id, main_frame_route_id,
+ validated_params, session_storage_namespace);
}
void RenderViewHostImpl::CreateNewWidget(int route_id,
diff --git a/content/browser/renderer_host/render_view_host_impl.h b/content/browser/renderer_host/render_view_host_impl.h
index 2d5249f..bee7b78 100644
--- a/content/browser/renderer_host/render_view_host_impl.h
+++ b/content/browser/renderer_host/render_view_host_impl.h
@@ -14,6 +14,7 @@
#include "base/memory/scoped_ptr.h"
#include "base/observer_list.h"
#include "base/process_util.h"
+#include "content/browser/renderer_host/render_frame_host_impl.h"
#include "content/browser/renderer_host/render_widget_host_impl.h"
#include "content/browser/site_instance_impl.h"
#include "content/common/accessibility_node_data.h"
@@ -62,6 +63,7 @@ namespace content {
class ChildProcessSecurityPolicyImpl;
class PageState;
class PowerSaveBlocker;
+class RenderFrameHostImpl;
class RenderViewHostObserver;
class RenderWidgetHostDelegate;
class SessionStorageNamespace;
@@ -120,6 +122,7 @@ class CONTENT_EXPORT RenderViewHostImpl
RenderViewHostDelegate* delegate,
RenderWidgetHostDelegate* widget_delegate,
int routing_id,
+ int main_frame_routing_id,
bool swapped_out,
SessionStorageNamespace* session_storage_namespace);
virtual ~RenderViewHostImpl();
@@ -364,6 +367,7 @@ class CONTENT_EXPORT RenderViewHostImpl
// Creates a new RenderView with the given route id.
void CreateNewWindow(
int route_id,
+ int main_frame_route_id,
const ViewHostMsg_CreateWindow_Params& params,
SessionStorageNamespace* session_storage_namespace);
@@ -567,6 +571,7 @@ class CONTENT_EXPORT RenderViewHostImpl
private:
friend class TestRenderViewHost;
+ FRIEND_TEST_ALL_PREFIXES(RenderViewHostTest, BasicRenderFrameHost);
// Sets whether this RenderViewHost is swapped out in favor of another,
// and clears any waiting state that is no longer relevant.
@@ -576,6 +581,12 @@ class CONTENT_EXPORT RenderViewHostImpl
bool CanAccessFilesOfPageState(const PageState& state) const;
+ // This is an RenderFrameHost object associated with the top-level frame in
+ // the page rendered by this RenderViewHost.
+ // TODO(nasko): Remove this pointer once we have enough infrastructure to
+ // move this to the top-level FrameTreeNode.
+ scoped_ptr<RenderFrameHostImpl> main_render_frame_host_;
+
// Our delegate, which wants to know about changes in the RenderView.
RenderViewHostDelegate* delegate_;
diff --git a/content/browser/renderer_host/render_widget_helper.cc b/content/browser/renderer_host/render_widget_helper.cc
index d244da7..9d6a4be 100644
--- a/content/browser/renderer_host/render_widget_helper.cc
+++ b/content/browser/renderer_host/render_widget_helper.cc
@@ -250,6 +250,7 @@ void RenderWidgetHelper::CreateNewWindow(
bool no_javascript_access,
base::ProcessHandle render_process,
int* route_id,
+ int* main_frame_route_id,
int* surface_id,
SessionStorageNamespace* session_storage_namespace) {
if (params.opener_suppressed || no_javascript_access) {
@@ -259,32 +260,38 @@ void RenderWidgetHelper::CreateNewWindow(
// it. Because of this, we will immediately show and navigate the window
// in OnCreateWindowOnUI, using the params provided here.
*route_id = MSG_ROUTING_NONE;
+ *main_frame_route_id = MSG_ROUTING_NONE;
*surface_id = 0;
} else {
*route_id = GetNextRoutingID();
+ *main_frame_route_id = GetNextRoutingID();
*surface_id = GpuSurfaceTracker::Get()->AddSurfaceForRenderer(
render_process_id_, *route_id);
// Block resource requests until the view is created, since the HWND might
// be needed if a response ends up creating a plugin.
resource_dispatcher_host_->BlockRequestsForRoute(
render_process_id_, *route_id);
+ resource_dispatcher_host_->BlockRequestsForRoute(
+ render_process_id_, *main_frame_route_id);
}
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
base::Bind(&RenderWidgetHelper::OnCreateWindowOnUI,
- this, params, *route_id,
+ this, params, *route_id, *main_frame_route_id,
make_scoped_refptr(session_storage_namespace)));
}
void RenderWidgetHelper::OnCreateWindowOnUI(
const ViewHostMsg_CreateWindow_Params& params,
int route_id,
+ int main_frame_route_id,
SessionStorageNamespace* session_storage_namespace) {
RenderViewHostImpl* host =
RenderViewHostImpl::FromID(render_process_id_, params.opener_id);
if (host)
- host->CreateNewWindow(route_id, params, session_storage_namespace);
+ host->CreateNewWindow(route_id, main_frame_route_id, params,
+ session_storage_namespace);
}
void RenderWidgetHelper::OnResumeRequestsForView(int route_id) {
diff --git a/content/browser/renderer_host/render_widget_helper.h b/content/browser/renderer_host/render_widget_helper.h
index 733130a..638c9a7 100644
--- a/content/browser/renderer_host/render_widget_helper.h
+++ b/content/browser/renderer_host/render_widget_helper.h
@@ -148,6 +148,7 @@ class RenderWidgetHelper
bool no_javascript_access,
base::ProcessHandle render_process,
int* route_id,
+ int* main_frame_route_id,
int* surface_id,
SessionStorageNamespace* session_storage_namespace);
void CreateNewWidget(int opener_id,
@@ -196,6 +197,7 @@ class RenderWidgetHelper
void OnCreateWindowOnUI(
const ViewHostMsg_CreateWindow_Params& params,
int route_id,
+ int main_frame_route_id,
SessionStorageNamespace* session_storage_namespace);
// Called on the IO thread after a window was created on the UI thread.
diff --git a/content/browser/renderer_host/test_render_view_host.cc b/content/browser/renderer_host/test_render_view_host.cc
index a3a8b43..b54efc5 100644
--- a/content/browser/renderer_host/test_render_view_host.cc
+++ b/content/browser/renderer_host/test_render_view_host.cc
@@ -240,11 +240,13 @@ TestRenderViewHost::TestRenderViewHost(
RenderViewHostDelegate* delegate,
RenderWidgetHostDelegate* widget_delegate,
int routing_id,
+ int main_frame_routing_id,
bool swapped_out)
: RenderViewHostImpl(instance,
delegate,
widget_delegate,
routing_id,
+ main_frame_routing_id,
swapped_out,
CreateSessionStorageNamespace(instance)),
render_view_created_(false),
diff --git a/content/browser/renderer_host/test_render_view_host.h b/content/browser/renderer_host/test_render_view_host.h
index 9fb3cfc..f384e86 100644
--- a/content/browser/renderer_host/test_render_view_host.h
+++ b/content/browser/renderer_host/test_render_view_host.h
@@ -227,6 +227,7 @@ class TestRenderViewHost
RenderViewHostDelegate* delegate,
RenderWidgetHostDelegate* widget_delegate,
int routing_id,
+ int main_frame_routing_id,
bool swapped_out);
virtual ~TestRenderViewHost();
diff --git a/content/browser/web_contents/interstitial_page_impl.cc b/content/browser/web_contents/interstitial_page_impl.cc
index 9b6ada9..02d3e5a 100644
--- a/content/browser/web_contents/interstitial_page_impl.cc
+++ b/content/browser/web_contents/interstitial_page_impl.cc
@@ -497,7 +497,7 @@ RenderViewHost* InterstitialPageImpl::CreateRenderViewHost() {
new SessionStorageNamespaceImpl(dom_storage_context);
RenderViewHostImpl* render_view_host = new RenderViewHostImpl(
- site_instance, this, this, MSG_ROUTING_NONE, false,
+ site_instance, this, this, MSG_ROUTING_NONE, MSG_ROUTING_NONE, false,
session_storage_namespace_impl);
web_contents_->RenderViewForInterstitialPageCreated(render_view_host);
return render_view_host;
@@ -666,6 +666,7 @@ gfx::Rect InterstitialPageImpl::GetRootWindowResizerRect() const {
void InterstitialPageImpl::CreateNewWindow(
int route_id,
+ int main_frame_route_id,
const ViewHostMsg_CreateWindow_Params& params,
SessionStorageNamespace* session_storage_namespace) {
NOTREACHED() << "InterstitialPage does not support showing popups yet.";
diff --git a/content/browser/web_contents/interstitial_page_impl.h b/content/browser/web_contents/interstitial_page_impl.h
index 532dcc29..476b062 100644
--- a/content/browser/web_contents/interstitial_page_impl.h
+++ b/content/browser/web_contents/interstitial_page_impl.h
@@ -113,6 +113,7 @@ class CONTENT_EXPORT InterstitialPageImpl
virtual gfx::Rect GetRootWindowResizerRect() const OVERRIDE;
virtual void CreateNewWindow(
int route_id,
+ int main_frame_route_id,
const ViewHostMsg_CreateWindow_Params& params,
SessionStorageNamespace* session_storage_namespace) OVERRIDE;
virtual void CreateNewWidget(int route_id,
diff --git a/content/browser/web_contents/render_view_host_manager.cc b/content/browser/web_contents/render_view_host_manager.cc
index 4cbd0fc..73cd00a 100644
--- a/content/browser/web_contents/render_view_host_manager.cc
+++ b/content/browser/web_contents/render_view_host_manager.cc
@@ -64,7 +64,8 @@ RenderViewHostManager::~RenderViewHostManager() {
void RenderViewHostManager::Init(BrowserContext* browser_context,
SiteInstance* site_instance,
- int routing_id) {
+ int routing_id,
+ int main_frame_routing_id) {
// Create a RenderViewHost, once we have an instance. It is important to
// immediately give this SiteInstance to a RenderViewHost so that it is
// ref counted.
@@ -73,7 +74,7 @@ void RenderViewHostManager::Init(BrowserContext* browser_context,
render_view_host_ = static_cast<RenderViewHostImpl*>(
RenderViewHostFactory::Create(
site_instance, render_view_delegate_, render_widget_delegate_,
- routing_id, false, delegate_->
+ routing_id, main_frame_routing_id, false, delegate_->
GetControllerForRenderManager().GetSessionStorageNamespace(
site_instance)));
@@ -624,7 +625,7 @@ int RenderViewHostManager::CreateRenderView(
new_render_view_host = static_cast<RenderViewHostImpl*>(
RenderViewHostFactory::Create(instance,
render_view_delegate_, render_widget_delegate_, MSG_ROUTING_NONE,
- swapped_out, delegate_->
+ MSG_ROUTING_NONE, swapped_out, delegate_->
GetControllerForRenderManager().GetSessionStorageNamespace(
instance)));
diff --git a/content/browser/web_contents/render_view_host_manager.h b/content/browser/web_contents/render_view_host_manager.h
index d8b4001..d178680 100644
--- a/content/browser/web_contents/render_view_host_manager.h
+++ b/content/browser/web_contents/render_view_host_manager.h
@@ -116,7 +116,8 @@ class CONTENT_EXPORT RenderViewHostManager
// For arguments, see WebContentsImpl constructor.
void Init(BrowserContext* browser_context,
SiteInstance* site_instance,
- int routing_id);
+ int routing_id,
+ int main_frame_routing_id);
// Returns the currently active RenderViewHost.
//
diff --git a/content/browser/web_contents/render_view_host_manager_unittest.cc b/content/browser/web_contents/render_view_host_manager_unittest.cc
index 0ad1f7f..6223e4f 100644
--- a/content/browser/web_contents/render_view_host_manager_unittest.cc
+++ b/content/browser/web_contents/render_view_host_manager_unittest.cc
@@ -332,7 +332,7 @@ TEST_F(RenderViewHostManagerTest, Init) {
RenderViewHostManager manager(web_contents.get(), web_contents.get(),
web_contents.get());
- manager.Init(browser_context(), instance, MSG_ROUTING_NONE);
+ manager.Init(browser_context(), instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE);
RenderViewHost* host = manager.current_host();
ASSERT_TRUE(host);
@@ -359,7 +359,7 @@ TEST_F(RenderViewHostManagerTest, Navigate) {
RenderViewHostManager manager(web_contents.get(), web_contents.get(),
web_contents.get());
- manager.Init(browser_context(), instance, MSG_ROUTING_NONE);
+ manager.Init(browser_context(), instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE);
RenderViewHost* host;
@@ -452,7 +452,7 @@ TEST_F(RenderViewHostManagerTest, NavigateWithEarlyReNavigation) {
RenderViewHostManager manager(web_contents.get(), web_contents.get(),
web_contents.get());
- manager.Init(browser_context(), instance, MSG_ROUTING_NONE);
+ manager.Init(browser_context(), instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE);
// 1) The first navigation. --------------------------
const GURL kUrl1("http://www.google.com/");
@@ -599,7 +599,7 @@ TEST_F(RenderViewHostManagerTest, WebUI) {
RenderViewHostManager manager(web_contents.get(), web_contents.get(),
web_contents.get());
- manager.Init(browser_context(), instance, MSG_ROUTING_NONE);
+ manager.Init(browser_context(), instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE);
EXPECT_FALSE(manager.current_host()->IsRenderViewLive());
const GURL kUrl("chrome://foo");
@@ -645,7 +645,8 @@ TEST_F(RenderViewHostManagerTest, WebUIInNewTab) {
TestWebContents::Create(browser_context(), blank_instance));
RenderViewHostManager manager1(web_contents1.get(), web_contents1.get(),
web_contents1.get());
- manager1.Init(browser_context(), blank_instance, MSG_ROUTING_NONE);
+ manager1.Init(
+ browser_context(), blank_instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE);
// Test the case that new RVH is considered live.
manager1.current_host()->CreateRenderView(string16(), -1, -1);
@@ -674,7 +675,8 @@ TEST_F(RenderViewHostManagerTest, WebUIInNewTab) {
TestWebContents::Create(browser_context(), webui_instance));
RenderViewHostManager manager2(web_contents2.get(), web_contents2.get(),
web_contents2.get());
- manager2.Init(browser_context(), webui_instance, MSG_ROUTING_NONE);
+ manager2.Init(
+ browser_context(), webui_instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE);
// Make sure the new RVH is considered live. This is usually done in
// RenderWidgetHost::Init when opening a new tab from a link.
manager2.current_host()->CreateRenderView(string16(), -1, -1);
@@ -901,7 +903,7 @@ TEST_F(RenderViewHostManagerTest, NoSwapOnGuestNavigations) {
RenderViewHostManager manager(web_contents.get(), web_contents.get(),
web_contents.get());
- manager.Init(browser_context(), instance, MSG_ROUTING_NONE);
+ manager.Init(browser_context(), instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE);
RenderViewHost* host;
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index 0e1b8c5..fabd43a 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -1162,7 +1162,8 @@ void WebContentsImpl::Observe(int type,
void WebContentsImpl::Init(const WebContents::CreateParams& params) {
render_manager_.Init(
- params.browser_context, params.site_instance, params.routing_id);
+ params.browser_context, params.site_instance, params.routing_id,
+ params.main_frame_routing_id);
view_.reset(GetContentClient()->browser()->
OverrideCreateWebContentsView(this, &render_view_host_delegate_view_));
@@ -1378,12 +1379,15 @@ void WebContentsImpl::LostMouseLock() {
void WebContentsImpl::CreateNewWindow(
int route_id,
+ int main_frame_route_id,
const ViewHostMsg_CreateWindow_Params& params,
SessionStorageNamespace* session_storage_namespace) {
if (delegate_ && !delegate_->ShouldCreateWebContents(
this, route_id, params.window_container_type, params.frame_name,
params.target_url)) {
GetRenderViewHost()->GetProcess()->ResumeRequestsForView(route_id);
+ GetRenderViewHost()->GetProcess()->ResumeRequestsForView(
+ main_frame_route_id);
return;
}
@@ -1424,6 +1428,7 @@ void WebContentsImpl::CreateNewWindow(
session_storage_namespace);
CreateParams create_params(GetBrowserContext(), site_instance);
create_params.routing_id = route_id;
+ create_params.main_frame_routing_id = main_frame_route_id;
if (!is_guest) {
create_params.context = view_->GetNativeView();
create_params.initial_size = view_->GetContainerSize();
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index 2af13f8..008162e2 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -420,6 +420,7 @@ class CONTENT_EXPORT WebContentsImpl
virtual void LostMouseLock() OVERRIDE;
virtual void CreateNewWindow(
int route_id,
+ int main_frame_route_id,
const ViewHostMsg_CreateWindow_Params& params,
SessionStorageNamespace* session_storage_namespace) OVERRIDE;
virtual void CreateNewWidget(int route_id,
diff --git a/content/browser/web_contents/web_contents_impl_unittest.cc b/content/browser/web_contents/web_contents_impl_unittest.cc
index b75fc5b..657950d 100644
--- a/content/browser/web_contents/web_contents_impl_unittest.cc
+++ b/content/browser/web_contents/web_contents_impl_unittest.cc
@@ -184,7 +184,7 @@ class TestInterstitialPage : public InterstitialPageImpl {
virtual RenderViewHost* CreateRenderViewHost() OVERRIDE {
return new TestRenderViewHost(
SiteInstance::Create(web_contents()->GetBrowserContext()),
- this, this, MSG_ROUTING_NONE, false);
+ this, this, MSG_ROUTING_NONE, MSG_ROUTING_NONE, false);
}
virtual WebContentsView* CreateWebContentsView() OVERRIDE {
diff --git a/content/common/view_messages.h b/content/common/view_messages.h
index 844ee5e..b50c6e2 100644
--- a/content/common/view_messages.h
+++ b/content/common/view_messages.h
@@ -655,6 +655,9 @@ IPC_STRUCT_BEGIN(ViewMsg_New_Params)
// The ID of the view to be created.
IPC_STRUCT_MEMBER(int32, view_id)
+ // The ID of the main frame hosted in the view.
+ IPC_STRUCT_MEMBER(int32, main_frame_routing_id)
+
// The ID of the rendering surface.
IPC_STRUCT_MEMBER(int32, surface_id)
@@ -1325,9 +1328,10 @@ IPC_MESSAGE_ROUTED1(ViewMsg_Snapshot,
// Sent by the renderer when it is creating a new window. The browser creates
// a tab for it and responds with a ViewMsg_CreatingNew_ACK. If route_id is
// MSG_ROUTING_NONE, the view couldn't be created.
-IPC_SYNC_MESSAGE_CONTROL1_3(ViewHostMsg_CreateWindow,
+IPC_SYNC_MESSAGE_CONTROL1_4(ViewHostMsg_CreateWindow,
ViewHostMsg_CreateWindow_Params,
int /* route_id */,
+ int /* main_frame_route_id */,
int32 /* surface_id */,
int64 /* cloned_session_storage_namespace_id */)
diff --git a/content/content_browser.gypi b/content/content_browser.gypi
index 8ec7782..c09639f6 100644
--- a/content/content_browser.gypi
+++ b/content/content_browser.gypi
@@ -135,6 +135,7 @@
'public/browser/profiler_controller.h',
'public/browser/profiler_subscriber.h',
'public/browser/quota_permission_context.h',
+ 'public/browser/render_frame_host.h',
'public/browser/render_process_host.h',
'public/browser/render_process_host_factory.h',
'public/browser/render_view_host.h',
@@ -859,6 +860,8 @@
'browser/renderer_host/popup_menu_helper_mac.mm',
'browser/renderer_host/quota_dispatcher_host.cc',
'browser/renderer_host/quota_dispatcher_host.h',
+ 'browser/renderer_host/render_frame_host_impl.cc',
+ 'browser/renderer_host/render_frame_host_impl.h',
'browser/renderer_host/render_message_filter.cc',
'browser/renderer_host/render_message_filter.h',
'browser/renderer_host/render_process_host_impl.cc',
diff --git a/content/content_renderer.gypi b/content/content_renderer.gypi
index d1e0cb4..99c34cb 100644
--- a/content/content_renderer.gypi
+++ b/content/content_renderer.gypi
@@ -44,6 +44,7 @@
'public/renderer/navigation_state.h',
'public/renderer/password_form_conversion_utils.h',
'public/renderer/renderer_ppapi_host.h',
+ 'public/renderer/render_frame.h',
'public/renderer/render_process_observer.cc',
'public/renderer/render_process_observer.h',
'public/renderer/render_thread.cc',
@@ -266,6 +267,8 @@
'renderer/fetchers/resource_fetcher.h',
'renderer/ime_event_guard.cc',
'renderer/ime_event_guard.h',
+ 'renderer/render_frame_impl.cc',
+ 'renderer/render_frame_impl.h',
'renderer/render_process.h',
'renderer/render_process_impl.cc',
'renderer/render_process_impl.h',
diff --git a/content/public/browser/render_frame_host.h b/content/public/browser/render_frame_host.h
new file mode 100644
index 0000000..a5a49f2
--- /dev/null
+++ b/content/public/browser/render_frame_host.h
@@ -0,0 +1,25 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_PUBLIC_BROWSER_RENDER_FRAME_HOST_H_
+#define CONTENT_PUBLIC_BROWSER_RENDER_FRAME_HOST_H_
+
+#include "content/common/content_export.h"
+#include "ipc/ipc_listener.h"
+#include "ipc/ipc_sender.h"
+
+namespace content {
+
+// The interface provides a communication conduit with a frame in the renderer.
+class CONTENT_EXPORT RenderFrameHost : public IPC::Listener,
+ public IPC::Sender {
+ private:
+ // This interface should only be implemented inside content.
+ friend class RenderFrameHostImpl;
+ RenderFrameHost() {}
+};
+
+} // namespace content
+
+#endif // CONTENT_PUBLIC_BROWSER_RENDER_FRAME_HOST_H_
diff --git a/content/public/browser/web_contents.cc b/content/public/browser/web_contents.cc
index 0c27483..f4de54a 100644
--- a/content/public/browser/web_contents.cc
+++ b/content/public/browser/web_contents.cc
@@ -12,6 +12,7 @@ WebContents::CreateParams::CreateParams(BrowserContext* context)
: browser_context(context),
site_instance(NULL),
routing_id(MSG_ROUTING_NONE),
+ main_frame_routing_id(MSG_ROUTING_NONE),
context(NULL) {}
WebContents::CreateParams::CreateParams(
@@ -19,6 +20,7 @@ WebContents::CreateParams::CreateParams(
: browser_context(context),
site_instance(site),
routing_id(MSG_ROUTING_NONE),
+ main_frame_routing_id(MSG_ROUTING_NONE),
context(NULL) {}
} // namespace content
diff --git a/content/public/browser/web_contents.h b/content/public/browser/web_contents.h
index caaee98..ebf2352 100644
--- a/content/public/browser/web_contents.h
+++ b/content/public/browser/web_contents.h
@@ -78,6 +78,7 @@ class WebContents : public PageNavigator,
BrowserContext* browser_context;
SiteInstance* site_instance;
int routing_id;
+ int main_frame_routing_id;
// Initial size of the new WebContent's view. Can be (0, 0) if not needed.
gfx::Size initial_size;
diff --git a/content/public/renderer/render_frame.h b/content/public/renderer/render_frame.h
new file mode 100644
index 0000000..47ace3e
--- /dev/null
+++ b/content/public/renderer/render_frame.h
@@ -0,0 +1,30 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_PUBLIC_RENDERER_RENDER_FRAME_H_
+#define CONTENT_PUBLIC_RENDERER_RENDER_FRAME_H_
+
+#include "content/common/content_export.h"
+#include "ipc/ipc_listener.h"
+#include "ipc/ipc_sender.h"
+
+namespace content {
+
+// This interface wraps functionality, which is specific to frames, such as
+// navigation. It provides communication with a corresponding RenderFrameHost
+// in the browser process.
+class CONTENT_EXPORT RenderFrame : public IPC::Listener,
+ public IPC::Sender {
+ protected:
+ virtual ~RenderFrame() {}
+
+ private:
+ // This interface should only be implemented inside content.
+ friend class RenderFrameImpl;
+ RenderFrame() {}
+};
+
+} // namespace content
+
+#endif // CONTENT_PUBLIC_RENDERER_RENDER_FRAME_H_
diff --git a/content/public/test/mock_render_thread.cc b/content/public/test/mock_render_thread.cc
index ec75926..6c0dee1 100644
--- a/content/public/test/mock_render_thread.cc
+++ b/content/public/test/mock_render_thread.cc
@@ -14,7 +14,11 @@
namespace content {
MockRenderThread::MockRenderThread()
- : routing_id_(0), surface_id_(0), opener_id_(0), new_window_routing_id_(0) {
+ : routing_id_(0),
+ surface_id_(0),
+ opener_id_(0),
+ new_window_routing_id_(0),
+ new_window_main_frame_routing_id_(0) {
}
MockRenderThread::~MockRenderThread() {
@@ -208,9 +212,11 @@ void MockRenderThread::OnCreateWidget(int opener_id,
void MockRenderThread::OnCreateWindow(
const ViewHostMsg_CreateWindow_Params& params,
int* route_id,
+ int* main_frame_route_id,
int* surface_id,
int64* cloned_session_storage_namespace_id) {
*route_id = new_window_routing_id_;
+ *main_frame_route_id = new_window_main_frame_routing_id_;
*surface_id = surface_id_;
*cloned_session_storage_namespace_id = 0;
}
diff --git a/content/public/test/mock_render_thread.h b/content/public/test/mock_render_thread.h
index d90275c..b4503f8 100644
--- a/content/public/test/mock_render_thread.h
+++ b/content/public/test/mock_render_thread.h
@@ -120,6 +120,7 @@ class MockRenderThread : public RenderThread {
void OnCreateWindow(
const ViewHostMsg_CreateWindow_Params& params,
int* route_id,
+ int* main_frame_route_id,
int* surface_id,
int64* cloned_session_storage_namespace_id);
@@ -146,6 +147,7 @@ class MockRenderThread : public RenderThread {
// Routing id that will be assigned to a CreateWindow Widget.
int32 new_window_routing_id_;
+ int32 new_window_main_frame_routing_id_;
// The last known good deserializer for sync messages.
scoped_ptr<IPC::MessageReplyDeserializer> reply_deserializer_;
diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc
index cd2f720..3add61a 100644
--- a/content/public/test/render_view_test.cc
+++ b/content/public/test/render_view_test.cc
@@ -39,7 +39,8 @@ using WebKit::WebURLRequest;
namespace {
const int32 kOpenerId = -2;
const int32 kRouteId = 5;
-const int32 kNewWindowRouteId = 6;
+const int32 kMainFrameRouteId = 6;
+const int32 kNewWindowRouteId = 7;
const int32 kSurfaceId = 42;
} // namespace
@@ -170,6 +171,7 @@ void RenderViewTest::SetUp() {
WebPreferences(),
new SharedRenderViewCounter(0),
kRouteId,
+ kMainFrameRouteId,
kSurfaceId,
dom_storage::kInvalidSessionStorageNamespaceId,
string16(),
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc
new file mode 100644
index 0000000..8c6d03b
--- /dev/null
+++ b/content/renderer/render_frame_impl.cc
@@ -0,0 +1,32 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/renderer/render_frame_impl.h"
+
+#include "content/renderer/render_thread_impl.h"
+#include "content/renderer/render_view_impl.h"
+
+namespace content {
+
+RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id)
+ : render_view_(render_view),
+ routing_id_(routing_id) {
+}
+
+RenderFrameImpl::~RenderFrameImpl() {
+}
+
+bool RenderFrameImpl::Send(IPC::Message* message) {
+ // TODO(nasko): Move away from using the RenderView's Send method once we
+ // have enough infrastructure and state to make the right checks here.
+ return render_view_->Send(message);
+}
+
+bool RenderFrameImpl::OnMessageReceived(const IPC::Message &msg) {
+ // Pass the message up to the RenderView, until we have enough
+ // infrastructure to start processing messages in this object.
+ return render_view_->OnMessageReceived(msg);
+}
+
+} // namespace content
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h
new file mode 100644
index 0000000..a74077e
--- /dev/null
+++ b/content/renderer/render_frame_impl.h
@@ -0,0 +1,38 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_RENDERER_RENDER_FRAME_IMPL_H_
+#define CONTENT_RENDERER_RENDER_FRAME_IMPL_H_
+
+#include "base/basictypes.h"
+#include "content/public/renderer/render_frame.h"
+#include "ipc/ipc_message.h"
+
+namespace content {
+
+class RenderViewImpl;
+
+class CONTENT_EXPORT RenderFrameImpl : public RenderFrame {
+ public:
+ RenderFrameImpl(RenderViewImpl* render_view, int routing_id);
+ virtual ~RenderFrameImpl();
+
+ // IPC::Sender
+ virtual bool Send(IPC::Message* msg) OVERRIDE;
+
+ // IPC::Listener
+ virtual bool OnMessageReceived(const IPC::Message& msg) OVERRIDE;
+
+ int routing_id() { return routing_id_; }
+
+ private:
+ RenderViewImpl* render_view_;
+ int routing_id_;
+
+ DISALLOW_COPY_AND_ASSIGN(RenderFrameImpl);
+};
+
+} // namespace content
+
+#endif // CONTENT_RENDERER_RENDER_FRAME_IMPL_H_
diff --git a/content/renderer/render_thread_impl.cc b/content/renderer/render_thread_impl.cc
index 386e442..75b73e1 100644
--- a/content/renderer/render_thread_impl.cc
+++ b/content/renderer/render_thread_impl.cc
@@ -1197,6 +1197,7 @@ void RenderThreadImpl::OnCreateNewView(const ViewMsg_New_Params& params) {
params.web_preferences,
new SharedRenderViewCounter(0),
params.view_id,
+ params.main_frame_routing_id,
params.surface_id,
params.session_storage_namespace_id,
params.frame_name,
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc
index da95ec0..4dafdb8 100644
--- a/content/renderer/render_view_browsertest.cc
+++ b/content/renderer/render_view_browsertest.cc
@@ -1861,4 +1861,10 @@ TEST_F(RenderViewImplTest, NavigateFrame) {
EXPECT_EQ(output, L"hello \n\nworld");
}
+// This test ensures that a RenderFrame object is created for the top level
+// frame in the RenderView.
+TEST_F(RenderViewImplTest, BasicRenderFrame) {
+ EXPECT_TRUE(view()->main_render_frame_.get());
+}
+
} // namespace content
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc
index 2a8fc58..e5740cd4 100644
--- a/content/renderer/render_view_impl.cc
+++ b/content/renderer/render_view_impl.cc
@@ -101,6 +101,7 @@
#include "content/renderer/notification_provider.h"
#include "content/renderer/pepper/pepper_plugin_delegate_impl.h"
#include "content/renderer/plugin_channel_host.h"
+#include "content/renderer/render_frame_impl.h"
#include "content/renderer/render_process.h"
#include "content/renderer/render_thread_impl.h"
#include "content/renderer/render_view_impl_params.h"
@@ -756,6 +757,9 @@ RenderViewImpl::RenderViewImpl(RenderViewImplParams* params)
}
void RenderViewImpl::Initialize(RenderViewImplParams* params) {
+ main_render_frame_.reset(new RenderFrameImpl(
+ this, params->main_frame_routing_id));
+
#if defined(ENABLE_PLUGINS)
pepper_helper_.reset(new PepperPluginDelegateImpl(this));
#else
@@ -970,6 +974,7 @@ RenderViewImpl* RenderViewImpl::Create(
const WebPreferences& webkit_prefs,
SharedRenderViewCounter* counter,
int32 routing_id,
+ int32 main_frame_routing_id,
int32 surface_id,
int64 session_storage_namespace_id,
const string16& frame_name,
@@ -986,6 +991,7 @@ RenderViewImpl* RenderViewImpl::Create(
webkit_prefs,
counter,
routing_id,
+ main_frame_routing_id,
surface_id,
session_storage_namespace_id,
frame_name,
@@ -2044,12 +2050,14 @@ WebView* RenderViewImpl::createView(
params.target_url = request.url();
int32 routing_id = MSG_ROUTING_NONE;
+ int32 main_frame_routing_id = MSG_ROUTING_NONE;
int32 surface_id = 0;
int64 cloned_session_storage_namespace_id;
RenderThread::Get()->Send(
new ViewHostMsg_CreateWindow(params,
&routing_id,
+ &main_frame_routing_id,
&surface_id,
&cloned_session_storage_namespace_id));
if (routing_id == MSG_ROUTING_NONE)
@@ -2077,6 +2085,7 @@ WebView* RenderViewImpl::createView(
transferred_preferences,
shared_popup_counter_,
routing_id,
+ main_frame_routing_id,
surface_id,
cloned_session_storage_namespace_id,
string16(), // WebCore will take care of setting the correct name.
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h
index 8d73ee9..29fb368 100644
--- a/content/renderer/render_view_impl.h
+++ b/content/renderer/render_view_impl.h
@@ -35,6 +35,7 @@
#include "content/public/common/top_controls_state.h"
#include "content/public/renderer/render_view.h"
#include "content/renderer/mouse_lock_dispatcher.h"
+#include "content/renderer/render_frame_impl.h"
#include "content/renderer/render_view_pepper_helper.h"
#include "content/renderer/render_widget.h"
#include "content/renderer/renderer_webcookiejar_impl.h"
@@ -214,6 +215,7 @@ class CONTENT_EXPORT RenderViewImpl
const WebPreferences& webkit_prefs,
SharedRenderViewCounter* counter,
int32 routing_id,
+ int32 main_frame_routing_id,
int32 surface_id,
int64 session_storage_namespace_id,
const string16& frame_name,
@@ -874,6 +876,7 @@ class CONTENT_EXPORT RenderViewImpl
FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, NavigateFrame);
FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest,
ShouldUpdateSelectionTextFromContextMenuParams);
+ FRIEND_TEST_ALL_PREFIXES(RenderViewImplTest, BasicRenderFrame);
typedef std::map<GURL, double> HostZoomLevels;
@@ -1375,6 +1378,8 @@ class CONTENT_EXPORT RenderViewImpl
// Helper objects ------------------------------------------------------------
+ scoped_ptr<RenderFrameImpl> main_render_frame_;
+
RendererWebCookieJarImpl cookie_jar_;
// The next group of objects all implement RenderViewObserver, so are deleted
diff --git a/content/renderer/render_view_impl_params.cc b/content/renderer/render_view_impl_params.cc
index 521778b..daceb5b 100644
--- a/content/renderer/render_view_impl_params.cc
+++ b/content/renderer/render_view_impl_params.cc
@@ -12,6 +12,7 @@ RenderViewImplParams::RenderViewImplParams(
const WebPreferences& webkit_prefs,
SharedRenderViewCounter* counter,
int32 routing_id,
+ int32 main_frame_routing_id,
int32 surface_id,
int64 session_storage_namespace_id,
const string16& frame_name,
@@ -26,6 +27,7 @@ RenderViewImplParams::RenderViewImplParams(
webkit_prefs(webkit_prefs),
counter(counter),
routing_id(routing_id),
+ main_frame_routing_id(main_frame_routing_id),
surface_id(surface_id),
session_storage_namespace_id(session_storage_namespace_id),
frame_name(frame_name),
diff --git a/content/renderer/render_view_impl_params.h b/content/renderer/render_view_impl_params.h
index da29fea..27835be 100644
--- a/content/renderer/render_view_impl_params.h
+++ b/content/renderer/render_view_impl_params.h
@@ -29,6 +29,7 @@ struct CONTENT_EXPORT RenderViewImplParams {
const WebPreferences& webkit_prefs,
SharedRenderViewCounter* counter,
int32 routing_id,
+ int32 main_frame_routing_id,
int32 surface_id,
int64 session_storage_namespace_id,
const string16& frame_name,
@@ -45,6 +46,7 @@ struct CONTENT_EXPORT RenderViewImplParams {
const WebPreferences& webkit_prefs;
SharedRenderViewCounter* counter;
int32 routing_id;
+ int32 main_frame_routing_id;
int32 surface_id;
int64 session_storage_namespace_id;
const string16& frame_name;
diff --git a/content/test/test_render_view_host_factory.cc b/content/test/test_render_view_host_factory.cc
index 3a2b0f3..3211dd0 100644
--- a/content/test/test_render_view_host_factory.cc
+++ b/content/test/test_render_view_host_factory.cc
@@ -30,13 +30,15 @@ RenderViewHost* TestRenderViewHostFactory::CreateRenderViewHost(
RenderViewHostDelegate* delegate,
RenderWidgetHostDelegate* widget_delegate,
int routing_id,
+ int main_frame_routing_id,
bool swapped_out,
SessionStorageNamespace* session_storage) {
// See declaration of render_process_host_factory_ below.
static_cast<SiteInstanceImpl*>(instance)->
set_render_process_host_factory(render_process_host_factory_);
return new TestRenderViewHost(
- instance, delegate, widget_delegate, routing_id, swapped_out);
+ instance, delegate, widget_delegate, routing_id, main_frame_routing_id,
+ swapped_out);
}
} // namespace content
diff --git a/content/test/test_render_view_host_factory.h b/content/test/test_render_view_host_factory.h
index 3a30b46..6b9b45e 100644
--- a/content/test/test_render_view_host_factory.h
+++ b/content/test/test_render_view_host_factory.h
@@ -32,6 +32,7 @@ class TestRenderViewHostFactory : public RenderViewHostFactory {
RenderViewHostDelegate* delegate,
RenderWidgetHostDelegate* widget_delegate,
int routing_id,
+ int main_frame_routing_id,
bool swapped_out,
SessionStorageNamespace* session_storage) OVERRIDE;
diff --git a/content/test/test_web_contents.cc b/content/test/test_web_contents.cc
index bdcc948..72f4f62 100644
--- a/content/test/test_web_contents.cc
+++ b/content/test/test_web_contents.cc
@@ -221,6 +221,7 @@ void TestWebContents::TestDidFailLoadWithError(
void TestWebContents::CreateNewWindow(
int route_id,
+ int main_frame_route_id,
const ViewHostMsg_CreateWindow_Params& params,
SessionStorageNamespace* session_storage_namespace) {
}
diff --git a/content/test/test_web_contents.h b/content/test/test_web_contents.h
index fce9fa8..55024b8 100644
--- a/content/test/test_web_contents.h
+++ b/content/test/test_web_contents.h
@@ -107,6 +107,7 @@ class TestWebContents : public WebContentsImpl, public WebContentsTester {
// WebContentsImpl overrides
virtual void CreateNewWindow(
int route_id,
+ int main_frame_route_id,
const ViewHostMsg_CreateWindow_Params& params,
SessionStorageNamespace* session_storage_namespace) OVERRIDE;
virtual void CreateNewWidget(int route_id,