summaryrefslogtreecommitdiffstats
path: root/content
diff options
context:
space:
mode:
authornick@chromium.org <nick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-21 07:52:44 +0000
committernick@chromium.org <nick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-21 07:52:44 +0000
commit2a18ee22a155ffc01988b068272be69b0cb94748 (patch)
tree436ed9a500d9da7e5b39c6670da8b281712a34ff /content
parent75874a8a5b8566809541ff1c64dc57048af8e4d5 (diff)
downloadchromium_src-2a18ee22a155ffc01988b068272be69b0cb94748.zip
chromium_src-2a18ee22a155ffc01988b068272be69b0cb94748.tar.gz
chromium_src-2a18ee22a155ffc01988b068272be69b0cb94748.tar.bz2
Instantiate RenderFrameHosts via a RenderFrameHostFactory indirection.
This relationship is analogous to the RenderViewHost/RenderViewHostFactory relationship. Introduce TestRenderFrameHost, a stubbable subclass of RenderFrameHostImpl, and its factory class, TestRenderFrameHostFactory. Augment RenderViewTestEnabler so that it installs a TestRenderFrameHostFactory. BUG=304341 TEST=unittests Review URL: https://codereview.chromium.org/76063005 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@236448 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r--content/browser/frame_host/frame_tree.cc8
-rw-r--r--content/browser/frame_host/frame_tree_unittest.cc11
-rw-r--r--content/browser/frame_host/render_frame_host_factory.cc43
-rw-r--r--content/browser/frame_host/render_frame_host_factory.h65
-rw-r--r--content/browser/frame_host/render_frame_host_impl.h19
-rw-r--r--content/browser/frame_host/test_render_frame_host.cc20
-rw-r--r--content/browser/frame_host/test_render_frame_host.h30
-rw-r--r--content/browser/renderer_host/DEPS1
-rw-r--r--content/browser/renderer_host/render_view_host_impl.cc6
-rw-r--r--content/content_browser.gypi2
-rw-r--r--content/content_tests.gypi4
-rw-r--r--content/public/test/test_renderer_host.cc5
-rw-r--r--content/public/test/test_renderer_host.h2
-rw-r--r--content/test/test_render_frame_host_factory.cc34
-rw-r--r--content/test/test_render_frame_host_factory.h43
15 files changed, 275 insertions, 18 deletions
diff --git a/content/browser/frame_host/frame_tree.cc b/content/browser/frame_host/frame_tree.cc
index 9e1dc16..92818c874 100644
--- a/content/browser/frame_host/frame_tree.cc
+++ b/content/browser/frame_host/frame_tree.cc
@@ -10,6 +10,7 @@
#include "base/callback.h"
#include "content/browser/frame_host/frame_tree_node.h"
#include "content/browser/frame_host/navigator.h"
+#include "content/browser/frame_host/render_frame_host_factory.h"
#include "content/browser/frame_host/render_frame_host_impl.h"
namespace content {
@@ -166,8 +167,11 @@ scoped_ptr<FrameTreeNode> FrameTree::CreateNode(
Navigator* navigator,
RenderProcessHost* render_process_host) {
scoped_ptr<RenderFrameHostImpl> render_frame_host(
- new RenderFrameHostImpl(root_->render_frame_host()->render_view_host(),
- this, render_frame_host_id, false));
+ RenderFrameHostFactory::Create(
+ root_->render_frame_host()->render_view_host(),
+ this,
+ render_frame_host_id,
+ false));
return make_scoped_ptr(new FrameTreeNode(navigator,
render_view_delegate_, render_widget_delegate_, manager_delegate_,
diff --git a/content/browser/frame_host/frame_tree_unittest.cc b/content/browser/frame_host/frame_tree_unittest.cc
index 6edc1e0..27b8167 100644
--- a/content/browser/frame_host/frame_tree_unittest.cc
+++ b/content/browser/frame_host/frame_tree_unittest.cc
@@ -7,6 +7,7 @@
#include "base/run_loop.h"
#include "base/strings/string_number_conversions.h"
#include "content/browser/frame_host/navigator.h"
+#include "content/browser/frame_host/render_frame_host_factory.h"
#include "content/browser/frame_host/render_frame_host_impl.h"
#include "content/browser/renderer_host/render_view_host_impl.h"
#include "content/public/test/mock_render_process_host.h"
@@ -105,10 +106,12 @@ TEST_F(FrameTreeTest, Shape) {
// Ensure the top-level node of the FrameTree is initialized by simulating a
// main frame swap here.
- RenderFrameHostImpl render_frame_host(static_cast<RenderViewHostImpl*>(rvh()),
- &frame_tree,
- process()->GetNextRoutingID(), false);
- frame_tree.SwapMainFrame(&render_frame_host);
+ scoped_ptr<RenderFrameHostImpl> render_frame_host =
+ RenderFrameHostFactory::Create(static_cast<RenderViewHostImpl*>(rvh()),
+ &frame_tree,
+ process()->GetNextRoutingID(),
+ false);
+ frame_tree.SwapMainFrame(render_frame_host.get());
frame_tree.OnFirstNavigationAfterSwap(5);
ASSERT_EQ("5: []", GetTreeState(&frame_tree));
diff --git a/content/browser/frame_host/render_frame_host_factory.cc b/content/browser/frame_host/render_frame_host_factory.cc
new file mode 100644
index 0000000..8e9215c
--- /dev/null
+++ b/content/browser/frame_host/render_frame_host_factory.cc
@@ -0,0 +1,43 @@
+// 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/frame_host/render_frame_host_factory.h"
+
+#include "base/logging.h"
+#include "content/browser/frame_host/render_frame_host_impl.h"
+
+namespace content {
+
+// static
+RenderFrameHostFactory* RenderFrameHostFactory::factory_ = NULL;
+
+// static
+scoped_ptr<RenderFrameHostImpl> RenderFrameHostFactory::Create(
+ RenderViewHostImpl* render_view_host,
+ FrameTree* frame_tree,
+ int routing_id,
+ bool is_swapped_out) {
+ if (factory_) {
+ return factory_->CreateRenderFrameHost(render_view_host,
+ frame_tree,
+ routing_id,
+ is_swapped_out).Pass();
+ }
+ return make_scoped_ptr(new RenderFrameHostImpl(
+ render_view_host, frame_tree, routing_id, is_swapped_out));
+}
+
+// static
+void RenderFrameHostFactory::RegisterFactory(RenderFrameHostFactory* factory) {
+ DCHECK(!factory_) << "Can't register two factories at once.";
+ factory_ = factory;
+}
+
+// static
+void RenderFrameHostFactory::UnregisterFactory() {
+ DCHECK(factory_) << "No factory to unregister.";
+ factory_ = NULL;
+}
+
+} // namespace content
diff --git a/content/browser/frame_host/render_frame_host_factory.h b/content/browser/frame_host/render_frame_host_factory.h
new file mode 100644
index 0000000..b851b62
--- /dev/null
+++ b/content/browser/frame_host/render_frame_host_factory.h
@@ -0,0 +1,65 @@
+// 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_FRAME_HOST_RENDER_FRAME_HOST_FACTORY_H_
+#define CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_FACTORY_H_
+
+#include "base/basictypes.h"
+#include "base/memory/scoped_ptr.h"
+#include "content/common/content_export.h"
+
+namespace content {
+
+class FrameTree;
+class RenderFrameHostImpl;
+class RenderViewHostImpl;
+
+// A factory for creating RenderFrameHosts. There is a global factory function
+// that can be installed for the purposes of testing to provide a specialized
+// RenderFrameHostImpl class.
+class CONTENT_EXPORT RenderFrameHostFactory {
+ public:
+ // Creates a new RenderFrameHostImpl using the currently registered factory,
+ // or a regular RenderFrameHostImpl if no factory is registered.
+ static scoped_ptr<RenderFrameHostImpl> Create(
+ RenderViewHostImpl* render_view_host,
+ FrameTree* frame_tree,
+ int routing_id,
+ bool is_swapped_out);
+
+ // Returns true if there is currently a globally-registered factory.
+ static bool has_factory() { return !!factory_; }
+
+ protected:
+ RenderFrameHostFactory() {}
+ virtual ~RenderFrameHostFactory() {}
+
+ // You can derive from this class and specify an implementation for this
+ // function to create an alternate kind of RenderFrameHostImpl for testing.
+ virtual scoped_ptr<RenderFrameHostImpl> CreateRenderFrameHost(
+ RenderViewHostImpl* render_view_host,
+ FrameTree* frame_tree,
+ int routing_id,
+ bool is_swapped_out) = 0;
+
+ // Registers a factory to be called when new RenderFrameHostImpls are created.
+ // We have only one global factory, so there must be no factory registered
+ // before the call. This class does NOT take ownership of the pointer.
+ static void RegisterFactory(RenderFrameHostFactory* factory);
+
+ // Unregister the previously registered factory. With no factory registered,
+ // regular RenderViewHostImpls will be created.
+ static void UnregisterFactory();
+
+ private:
+ // The current globally registered factory. This is NULL when we should create
+ // regular RenderFrameHostImpls.
+ static RenderFrameHostFactory* factory_;
+
+ DISALLOW_COPY_AND_ASSIGN(RenderFrameHostFactory);
+};
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_FRAME_HOST_RENDER_FRAME_HOST_FACTORY_H_
diff --git a/content/browser/frame_host/render_frame_host_impl.h b/content/browser/frame_host/render_frame_host_impl.h
index dbe8972..3c5e3ac 100644
--- a/content/browser/frame_host/render_frame_host_impl.h
+++ b/content/browser/frame_host/render_frame_host_impl.h
@@ -8,6 +8,7 @@
#include <string>
#include "base/compiler_specific.h"
+#include "content/common/content_export.h"
#include "content/public/browser/render_frame_host.h"
class GURL;
@@ -22,13 +23,6 @@ class CONTENT_EXPORT RenderFrameHostImpl : public RenderFrameHost {
public:
static RenderFrameHostImpl* FromID(int process_id, int routing_id);
- // TODO(nasko): Remove dependency on RenderViewHost here. RenderProcessHost
- // should be the abstraction needed here, but we need RenderViewHost to pass
- // into WebContentsObserver::FrameDetached for now.
- RenderFrameHostImpl(RenderViewHostImpl* render_view_host,
- FrameTree* frame_tree,
- int routing_id,
- bool is_swapped_out);
virtual ~RenderFrameHostImpl();
// IPC::Sender
@@ -49,6 +43,17 @@ class CONTENT_EXPORT RenderFrameHostImpl : public RenderFrameHost {
return render_view_host_;
}
+ protected:
+ friend class RenderFrameHostFactory;
+
+ // TODO(nasko): Remove dependency on RenderViewHost here. RenderProcessHost
+ // should be the abstraction needed here, but we need RenderViewHost to pass
+ // into WebContentsObserver::FrameDetached for now.
+ RenderFrameHostImpl(RenderViewHostImpl* render_view_host,
+ FrameTree* frame_tree,
+ int routing_id,
+ bool is_swapped_out);
+
private:
// IPC Message handlers.
void OnDetach(int64 parent_frame_id, int64 frame_id);
diff --git a/content/browser/frame_host/test_render_frame_host.cc b/content/browser/frame_host/test_render_frame_host.cc
new file mode 100644
index 0000000..040b232
--- /dev/null
+++ b/content/browser/frame_host/test_render_frame_host.cc
@@ -0,0 +1,20 @@
+// 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/frame_host/test_render_frame_host.h"
+
+namespace content {
+
+TestRenderFrameHost::TestRenderFrameHost(RenderViewHostImpl* render_view_host,
+ FrameTree* frame_tree,
+ int routing_id,
+ bool is_swapped_out)
+ : RenderFrameHostImpl(render_view_host,
+ frame_tree,
+ routing_id,
+ is_swapped_out) {}
+
+TestRenderFrameHost::~TestRenderFrameHost() {}
+
+} // namespace content
diff --git a/content/browser/frame_host/test_render_frame_host.h b/content/browser/frame_host/test_render_frame_host.h
new file mode 100644
index 0000000..18055d6
--- /dev/null
+++ b/content/browser/frame_host/test_render_frame_host.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_BROWSER_FRAME_HOST_TEST_RENDER_FRAME_HOST_H_
+#define CONTENT_BROWSER_FRAME_HOST_TEST_RENDER_FRAME_HOST_H_
+
+#include "base/basictypes.h"
+#include "content/browser/frame_host/render_frame_host_impl.h"
+
+namespace content {
+
+class TestRenderFrameHost : public RenderFrameHostImpl {
+ public:
+ TestRenderFrameHost(RenderViewHostImpl* render_view_host,
+ FrameTree* frame_tree,
+ int routing_id,
+ bool is_swapped_out);
+ virtual ~TestRenderFrameHost();
+
+ // TODO(nick): As necessary for testing, override behavior of RenderFrameHost
+ // here.
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(TestRenderFrameHost);
+};
+
+} // namespace content
+
+#endif // CONTENT_BROWSER_FRAME_HOST_TEST_RENDER_FRAME_HOST_H_
diff --git a/content/browser/renderer_host/DEPS b/content/browser/renderer_host/DEPS
index 7a58b2f..1d612c4 100644
--- a/content/browser/renderer_host/DEPS
+++ b/content/browser/renderer_host/DEPS
@@ -33,6 +33,7 @@ specific_include_rules = {
# of RenderViewHost on the FrameTree.
"render_view_host_impl\.(cc|h)": [
"+content/browser/frame_host/frame_tree.h",
+ "+content/browser/frame_host/render_frame_host_factory.h",
"+content/browser/frame_host/render_frame_host_impl.h",
],
}
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc
index 2372870..bb6635f 100644
--- a/content/browser/renderer_host/render_view_host_impl.cc
+++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -27,6 +27,7 @@
#include "content/browser/cross_site_request_manager.h"
#include "content/browser/dom_storage/session_storage_namespace_impl.h"
#include "content/browser/frame_host/frame_tree.h"
+#include "content/browser/frame_host/render_frame_host_factory.h"
#include "content/browser/gpu/compositor_util.h"
#include "content/browser/gpu/gpu_data_manager_impl.h"
#include "content/browser/gpu/gpu_process_host.h"
@@ -189,9 +190,8 @@ RenderViewHostImpl::RenderViewHostImpl(
if (main_frame_routing_id == MSG_ROUTING_NONE)
main_frame_routing_id = GetProcess()->GetNextRoutingID();
- main_render_frame_host_.reset(
- new RenderFrameHostImpl(this, delegate_->GetFrameTree(),
- main_frame_routing_id, is_swapped_out_));
+ main_render_frame_host_ = RenderFrameHostFactory::Create(
+ this, delegate_->GetFrameTree(), main_frame_routing_id, is_swapped_out_);
GetProcess()->EnableSendQueue();
diff --git a/content/content_browser.gypi b/content/content_browser.gypi
index 66eb8ff..bd6dd6f 100644
--- a/content/content_browser.gypi
+++ b/content/content_browser.gypi
@@ -520,6 +520,8 @@
'browser/frame_host/navigator.cc',
'browser/frame_host/navigator.h',
'browser/frame_host/navigator_delegate.h',
+ 'browser/frame_host/render_frame_host_factory.cc',
+ 'browser/frame_host/render_frame_host_factory.h',
'browser/frame_host/render_frame_host_impl.cc',
'browser/frame_host/render_frame_host_impl.h',
'browser/frame_host/render_frame_message_filter.cc',
diff --git a/content/content_tests.gypi b/content/content_tests.gypi
index acd67c5..4fc2131 100644
--- a/content/content_tests.gypi
+++ b/content/content_tests.gypi
@@ -110,6 +110,8 @@
'browser/renderer_host/media/mock_media_observer.h',
'browser/renderer_host/test_backing_store.cc',
'browser/renderer_host/test_backing_store.h',
+ 'browser/frame_host/test_render_frame_host.cc',
+ 'browser/frame_host/test_render_frame_host.h',
'browser/renderer_host/test_render_view_host.cc',
'browser/renderer_host/test_render_view_host.h',
'gpu/gpu_idirect3d9_mock_win.cc',
@@ -148,6 +150,8 @@
'test/test_content_client.h',
'test/test_media_stream_client.cc',
'test/test_media_stream_client.h',
+ 'test/test_render_frame_host_factory.cc',
+ 'test/test_render_frame_host_factory.h',
'test/test_render_view_host_factory.cc',
'test/test_render_view_host_factory.h',
'test/test_video_frame_provider.cc',
diff --git a/content/public/test/test_renderer_host.cc b/content/public/test/test_renderer_host.cc
index 80eada2..06986e6 100644
--- a/content/public/test/test_renderer_host.cc
+++ b/content/public/test/test_renderer_host.cc
@@ -14,6 +14,7 @@
#include "content/public/browser/web_contents.h"
#include "content/public/test/mock_render_process_host.h"
#include "content/public/test/test_browser_context.h"
+#include "content/test/test_render_frame_host_factory.h"
#include "content/test/test_render_view_host_factory.h"
#include "content/test/test_web_contents.h"
@@ -64,8 +65,8 @@ bool RenderViewHostTester::HasTouchEventHandler(RenderViewHost* rvh) {
RenderViewHostTestEnabler::RenderViewHostTestEnabler()
: rph_factory_(new MockRenderProcessHostFactory()),
- rvh_factory_(new TestRenderViewHostFactory(rph_factory_.get())) {
-}
+ rvh_factory_(new TestRenderViewHostFactory(rph_factory_.get())),
+ rfh_factory_(new TestRenderFrameHostFactory()) {}
RenderViewHostTestEnabler::~RenderViewHostTestEnabler() {
}
diff --git a/content/public/test/test_renderer_host.h b/content/public/test/test_renderer_host.h
index 192632d..69cfa8f 100644
--- a/content/public/test/test_renderer_host.h
+++ b/content/public/test/test_renderer_host.h
@@ -34,6 +34,7 @@ class MockRenderProcessHostFactory;
class NavigationController;
class RenderProcessHostFactory;
class RenderViewHostDelegate;
+class TestRenderFrameHostFactory;
class TestRenderViewHostFactory;
class WebContents;
@@ -116,6 +117,7 @@ class RenderViewHostTestEnabler {
scoped_ptr<MockRenderProcessHostFactory> rph_factory_;
scoped_ptr<TestRenderViewHostFactory> rvh_factory_;
+ scoped_ptr<TestRenderFrameHostFactory> rfh_factory_;
};
// RenderViewHostTestHarness ---------------------------------------------------
diff --git a/content/test/test_render_frame_host_factory.cc b/content/test/test_render_frame_host_factory.cc
new file mode 100644
index 0000000..c308aed
--- /dev/null
+++ b/content/test/test_render_frame_host_factory.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/test/test_render_frame_host_factory.h"
+
+#include "base/basictypes.h"
+#include "base/compiler_specific.h"
+#include "base/logging.h"
+#include "content/browser/frame_host/test_render_frame_host.h"
+
+namespace content {
+
+TestRenderFrameHostFactory::TestRenderFrameHostFactory() {
+ RenderFrameHostFactory::RegisterFactory(this);
+}
+
+TestRenderFrameHostFactory::~TestRenderFrameHostFactory() {
+ RenderFrameHostFactory::UnregisterFactory();
+}
+
+scoped_ptr<RenderFrameHostImpl>
+TestRenderFrameHostFactory::CreateRenderFrameHost(
+ RenderViewHostImpl* render_view_host,
+ FrameTree* frame_tree,
+ int routing_id,
+ bool is_swapped_out) {
+ return make_scoped_ptr(
+ new TestRenderFrameHost(
+ render_view_host, frame_tree, routing_id, is_swapped_out))
+ .PassAs<RenderFrameHostImpl>();
+}
+
+} // namespace content
diff --git a/content/test/test_render_frame_host_factory.h b/content/test/test_render_frame_host_factory.h
new file mode 100644
index 0000000..d16a244
--- /dev/null
+++ b/content/test/test_render_frame_host_factory.h
@@ -0,0 +1,43 @@
+// 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_TEST_TEST_RENDER_FRAME_HOST_FACTORY_H_
+#define CONTENT_TEST_TEST_RENDER_FRAME_HOST_FACTORY_H_
+
+#include "base/basictypes.h"
+#include "base/compiler_specific.h"
+#include "base/memory/scoped_ptr.h"
+#include "content/browser/frame_host/render_frame_host_factory.h"
+
+namespace content {
+
+class FrameTree;
+class RenderViewHostImpl;
+class RenderFrameHostImpl;
+
+// Manages creation of the RenderFrameHostImpls; when registered, all created
+// RenderFrameHostsImpls will be TestRenderFrameHosts. This
+// automatically registers itself when it goes in scope, and unregisters itself
+// when it goes out of scope. Since you can't have more than one factory
+// registered at a time, you can only have one of these objects at a time.
+class TestRenderFrameHostFactory : public RenderFrameHostFactory {
+ public:
+ TestRenderFrameHostFactory();
+ virtual ~TestRenderFrameHostFactory();
+
+ protected:
+ // RenderFrameHostFactory implementation.
+ virtual scoped_ptr<RenderFrameHostImpl> CreateRenderFrameHost(
+ RenderViewHostImpl* render_view_host,
+ FrameTree* frame_tree,
+ int routing_id,
+ bool is_swapped_out) OVERRIDE;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(TestRenderFrameHostFactory);
+};
+
+} // namespace content
+
+#endif // CONTENT_TEST_TEST_RENDER_FRAME_HOST_FACTORY_H_