diff options
author | nick@chromium.org <nick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-21 07:52:44 +0000 |
---|---|---|
committer | nick@chromium.org <nick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-11-21 07:52:44 +0000 |
commit | 2a18ee22a155ffc01988b068272be69b0cb94748 (patch) | |
tree | 436ed9a500d9da7e5b39c6670da8b281712a34ff /content | |
parent | 75874a8a5b8566809541ff1c64dc57048af8e4d5 (diff) | |
download | chromium_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.cc | 8 | ||||
-rw-r--r-- | content/browser/frame_host/frame_tree_unittest.cc | 11 | ||||
-rw-r--r-- | content/browser/frame_host/render_frame_host_factory.cc | 43 | ||||
-rw-r--r-- | content/browser/frame_host/render_frame_host_factory.h | 65 | ||||
-rw-r--r-- | content/browser/frame_host/render_frame_host_impl.h | 19 | ||||
-rw-r--r-- | content/browser/frame_host/test_render_frame_host.cc | 20 | ||||
-rw-r--r-- | content/browser/frame_host/test_render_frame_host.h | 30 | ||||
-rw-r--r-- | content/browser/renderer_host/DEPS | 1 | ||||
-rw-r--r-- | content/browser/renderer_host/render_view_host_impl.cc | 6 | ||||
-rw-r--r-- | content/content_browser.gypi | 2 | ||||
-rw-r--r-- | content/content_tests.gypi | 4 | ||||
-rw-r--r-- | content/public/test/test_renderer_host.cc | 5 | ||||
-rw-r--r-- | content/public/test/test_renderer_host.h | 2 | ||||
-rw-r--r-- | content/test/test_render_frame_host_factory.cc | 34 | ||||
-rw-r--r-- | content/test/test_render_frame_host_factory.h | 43 |
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_ |