| Index: content/test/test_renderer_host.cc
|
| diff --git a/content/test/test_renderer_host.cc b/content/test/test_renderer_host.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b37dd1c35d50e99aaef5debfbd237948187e8740
|
| --- /dev/null
|
| +++ b/content/test/test_renderer_host.cc
|
| @@ -0,0 +1,211 @@
|
| +// Copyright (c) 2012 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_renderer_host.h"
|
| +
|
| +#include "content/browser/renderer_host/mock_render_process_host.h"
|
| +#include "content/browser/renderer_host/render_view_host_factory.h"
|
| +#include "content/browser/renderer_host/test_render_view_host.h"
|
| +#include "content/browser/site_instance_impl.h"
|
| +#include "content/browser/tab_contents/navigation_entry_impl.h"
|
| +#include "content/browser/tab_contents/test_tab_contents.h"
|
| +#include "content/test/test_browser_context.h"
|
| +
|
| +#if defined(USE_AURA)
|
| +#include "ui/aura/root_window.h"
|
| +#include "ui/aura/test/test_stacking_client.h"
|
| +#endif
|
| +
|
| +namespace content {
|
| +
|
| +// Manages creation of the RenderViewHosts using our special subclass. 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.
|
| +//
|
| +// This is an implementation detail of this file and used only via
|
| +// RenderViewHostTestEnabler.
|
| +class TestRenderViewHostFactory : public RenderViewHostFactory {
|
| + public:
|
| + explicit TestRenderViewHostFactory(
|
| + content::RenderProcessHostFactory* rph_factory);
|
| + virtual ~TestRenderViewHostFactory();
|
| +
|
| + virtual void set_render_process_host_factory(
|
| + content::RenderProcessHostFactory* rph_factory);
|
| + virtual content::RenderViewHost* CreateRenderViewHost(
|
| + content::SiteInstance* instance,
|
| + content::RenderViewHostDelegate* delegate,
|
| + int routing_id,
|
| + content::SessionStorageNamespace* session_storage) OVERRIDE;
|
| +
|
| + private:
|
| + // This is a bit of a hack. With the current design of the site instances /
|
| + // browsing instances, it's difficult to pass a RenderProcessHostFactory
|
| + // around properly.
|
| + //
|
| + // Instead, we set it right before we create a new RenderViewHost, which
|
| + // happens before the RenderProcessHost is created. This way, the instance
|
| + // has the correct factory and creates our special RenderProcessHosts.
|
| + content::RenderProcessHostFactory* render_process_host_factory_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TestRenderViewHostFactory);
|
| +};
|
| +
|
| +TestRenderViewHostFactory::TestRenderViewHostFactory(
|
| + content::RenderProcessHostFactory* rph_factory)
|
| + : render_process_host_factory_(rph_factory) {
|
| + RenderViewHostFactory::RegisterFactory(this);
|
| +}
|
| +
|
| +TestRenderViewHostFactory::~TestRenderViewHostFactory() {
|
| + RenderViewHostFactory::UnregisterFactory();
|
| +}
|
| +
|
| +void TestRenderViewHostFactory::set_render_process_host_factory(
|
| + content::RenderProcessHostFactory* rph_factory) {
|
| + render_process_host_factory_ = rph_factory;
|
| +}
|
| +
|
| +content::RenderViewHost* TestRenderViewHostFactory::CreateRenderViewHost(
|
| + SiteInstance* instance,
|
| + RenderViewHostDelegate* delegate,
|
| + int routing_id,
|
| + 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, routing_id);
|
| +}
|
| +
|
| +// static
|
| +RenderViewHostTester* RenderViewHostTester::For(RenderViewHost* host) {
|
| + return static_cast<TestRenderViewHost*>(host);
|
| +}
|
| +
|
| +// static
|
| +void RenderViewHostTester::EnableAccessibilityUpdatedNotifications(
|
| + RenderViewHost* host) {
|
| + static_cast<RenderViewHostImpl*>(
|
| + host)->set_send_accessibility_updated_notifications(true);
|
| +}
|
| +
|
| +// static
|
| +RenderViewHost* RenderViewHostTester::GetPendingForController(
|
| + NavigationController* controller) {
|
| + TabContents* tab_contents = static_cast<TabContents*>(
|
| + controller->GetWebContents());
|
| + return tab_contents->GetRenderManagerForTesting()->pending_render_view_host();
|
| +}
|
| +
|
| +// static
|
| +bool RenderViewHostTester::IsRenderViewHostSwappedOut(RenderViewHost* rvh) {
|
| + return static_cast<RenderViewHostImpl*>(rvh)->is_swapped_out();
|
| +}
|
| +
|
| +RenderViewHostTestEnabler::RenderViewHostTestEnabler()
|
| + : rph_factory_(new MockRenderProcessHostFactory()),
|
| + rvh_factory_(new TestRenderViewHostFactory(rph_factory_.get())) {
|
| +}
|
| +
|
| +RenderViewHostTestEnabler::~RenderViewHostTestEnabler() {
|
| +}
|
| +
|
| +RenderViewHostTestHarness::RenderViewHostTestHarness()
|
| + : contents_(NULL) {
|
| +}
|
| +
|
| +RenderViewHostTestHarness::~RenderViewHostTestHarness() {
|
| +}
|
| +
|
| +NavigationController& RenderViewHostTestHarness::controller() {
|
| + return contents()->GetController();
|
| +}
|
| +
|
| +TestTabContents* RenderViewHostTestHarness::contents() {
|
| + return contents_.get();
|
| +}
|
| +
|
| +RenderViewHost* RenderViewHostTestHarness::rvh() {
|
| + return contents()->GetRenderViewHost();
|
| +}
|
| +
|
| +RenderViewHost* RenderViewHostTestHarness::pending_rvh() {
|
| + return contents()->GetRenderManagerForTesting()->pending_render_view_host();
|
| +}
|
| +
|
| +RenderViewHost* RenderViewHostTestHarness::active_rvh() {
|
| + return pending_rvh() ? pending_rvh() : rvh();
|
| +}
|
| +
|
| +BrowserContext* RenderViewHostTestHarness::browser_context() {
|
| + return browser_context_.get();
|
| +}
|
| +
|
| +MockRenderProcessHost* RenderViewHostTestHarness::process() {
|
| + return static_cast<MockRenderProcessHost*>(active_rvh()->GetProcess());
|
| +}
|
| +
|
| +void RenderViewHostTestHarness::DeleteContents() {
|
| + SetContents(NULL);
|
| +}
|
| +
|
| +void RenderViewHostTestHarness::SetContents(TestTabContents* contents) {
|
| + contents_.reset(contents);
|
| +}
|
| +
|
| +TestTabContents* RenderViewHostTestHarness::CreateTestTabContents() {
|
| + // See comment above browser_context_ decl for why we check for NULL here.
|
| + if (!browser_context_.get())
|
| + browser_context_.reset(new TestBrowserContext());
|
| +
|
| + // This will be deleted when the TabContents goes away.
|
| + SiteInstance* instance = SiteInstance::Create(browser_context_.get());
|
| +
|
| + return new TestTabContents(browser_context_.get(), instance);
|
| +}
|
| +
|
| +void RenderViewHostTestHarness::NavigateAndCommit(const GURL& url) {
|
| + contents()->NavigateAndCommit(url);
|
| +}
|
| +
|
| +void RenderViewHostTestHarness::Reload() {
|
| + NavigationEntry* entry = controller().GetLastCommittedEntry();
|
| + DCHECK(entry);
|
| + controller().Reload(false);
|
| + static_cast<TestRenderViewHost*>(
|
| + rvh())->SendNavigate(entry->GetPageID(), entry->GetURL());
|
| +}
|
| +
|
| +void RenderViewHostTestHarness::SetUp() {
|
| +#if defined(USE_AURA)
|
| + root_window_.reset(new aura::RootWindow);
|
| + test_stacking_client_.reset(
|
| + new aura::test::TestStackingClient(root_window_.get()));
|
| +#endif
|
| + SetContents(CreateTestTabContents());
|
| +}
|
| +
|
| +void RenderViewHostTestHarness::TearDown() {
|
| + SetContents(NULL);
|
| +#if defined(USE_AURA)
|
| + test_stacking_client_.reset();
|
| + root_window_.reset();
|
| +#endif
|
| +
|
| + // Make sure that we flush any messages related to TabContents destruction
|
| + // before we destroy the browser context.
|
| + MessageLoop::current()->RunAllPending();
|
| +
|
| + // Release the browser context on the UI thread.
|
| + message_loop_.DeleteSoon(FROM_HERE, browser_context_.release());
|
| + message_loop_.RunAllPending();
|
| +}
|
| +
|
| +void RenderViewHostTestHarness::SetRenderProcessHostFactory(
|
| + RenderProcessHostFactory* factory) {
|
| + rvh_test_enabler_.rvh_factory_->set_render_process_host_factory(factory);
|
| +}
|
| +
|
| +} // namespace content
|
|
|