blob: 91b0844ebde69a50045e0f2038a74f58ebd676be [file] [log] [blame]
// 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.
#pragma once
#include "base/memory/scoped_ptr.h"
#include "base/message_loop.h"
#include "content/public/browser/render_view_host.h"
#include "content/public/common/page_transition_types.h"
#include "testing/gtest/include/gtest/gtest.h"
#if defined(USE_AURA)
namespace aura {
class RootWindow;
namespace test {
class TestStackingClient;
namespace content {
class BrowserContext;
class MockRenderProcessHost;
class MockRenderProcessHostFactory;
class NavigationController;
class RenderProcessHostFactory;
class RenderViewHostDelegate;
class TestRenderViewHostFactory;
class WebContents;
// An interface and utility for driving tests of RenderViewHost.
class RenderViewHostTester {
// Retrieves the RenderViewHostTester that drives the specified
// RenderViewHost. The RenderViewHost must have been created while
// RenderViewHost testing was enabled; use a
// RenderViewHostTestEnabler instance (see below) to do this.
static RenderViewHostTester* For(RenderViewHost* host);
// This removes the need to expose
// RenderViewHostImpl::set_send_accessibility_updated_notifications()
// outside of content.
static void EnableAccessibilityUpdatedNotifications(RenderViewHost* host);
// If the given WebContentsImpl has a pending RVH, returns it, otherwise NULL.
static RenderViewHost* GetPendingForController(
NavigationController* controller);
// This removes the need to expose
// RenderViewHostImpl::is_swapped_out() outside of content.
// This is safe to call on any RenderViewHost, not just ones
// constructed while a RenderViewHostTestEnabler is in play.
static bool IsRenderViewHostSwappedOut(RenderViewHost* rvh);
// Calls the RenderViewHosts' private OnMessageReceived function with the
// given message.
static bool TestOnMessageReceived(RenderViewHost* rvh,
const IPC::Message& msg);
virtual ~RenderViewHostTester() {}
// Gives tests access to RenderViewHostImpl::CreateRenderView.
virtual bool CreateRenderView(const string16& frame_name,
int32 max_page_id) = 0;
// Calls OnMsgNavigate on the RenderViewHost with the given information,
// setting the rest of the parameters in the message to the "typical" values.
// This is a helper function for simulating the most common types of loads.
virtual void SendNavigate(int page_id, const GURL& url) = 0;
// Calls OnMsgNavigate on the RenderViewHost with the given information,
// including a custom PageTransition. Sets the rest of the
// parameters in the message to the "typical" values. This is a helper
// function for simulating the most common types of loads.
virtual void SendNavigateWithTransition(int page_id, const GURL& url,
PageTransition transition) = 0;
// Calls OnMsgShouldCloseACK on the RenderViewHost with the given parameter.
virtual void SendShouldCloseACK(bool proceed) = 0;
// If set, future loads will have |mime_type| set as the mime type.
// If not set, the mime type will default to "text/html".
virtual void SetContentsMimeType(const std::string& mime_type) = 0;
// Simulates the SwapOut_ACK that fires if you commit a cross-site
// navigation without making any network requests.
virtual void SimulateSwapOutACK() = 0;
// Makes the WasHidden/WasRestored calls to the RenderWidget that
// tell it it has been hidden or restored from having been hidden.
virtual void SimulateWasHidden() = 0;
virtual void SimulateWasRestored() = 0;
// You can instantiate only one class like this at a time. During its
// lifetime, RenderViewHost objects created may be used via
// RenderViewHostTester.
class RenderViewHostTestEnabler {
friend class RenderViewHostTestHarness;
scoped_ptr<MockRenderProcessHostFactory> rph_factory_;
scoped_ptr<TestRenderViewHostFactory> rvh_factory_;
// RenderViewHostTestHarness ---------------------------------------------------
class RenderViewHostTestHarness : public testing::Test {
virtual ~RenderViewHostTestHarness();
NavigationController& controller();
virtual WebContents* web_contents();
RenderViewHost* rvh();
RenderViewHost* pending_rvh();
RenderViewHost* active_rvh();
BrowserContext* browser_context();
MockRenderProcessHost* process();
// Frees the current tab contents for tests that want to test destruction.
void DeleteContents();
// Sets the current tab contents for tests that want to alter it. Takes
// ownership of the WebContents passed.
virtual void SetContents(WebContents* contents);
// Creates a new test-enabled WebContents. Ownership passes to the
// caller.
WebContents* CreateTestWebContents();
// Cover for |contents()->NavigateAndCommit(url)|. See
// WebContentsTester::NavigateAndCommit for details.
void NavigateAndCommit(const GURL& url);
// Simulates a reload of the current page.
void Reload();
// testing::Test
virtual void SetUp() OVERRIDE;
virtual void TearDown() OVERRIDE;
#if defined(USE_AURA)
aura::RootWindow* root_window() const { return root_window_.get(); }
// Replaces the RPH being used.
void SetRenderProcessHostFactory(RenderProcessHostFactory* factory);
// This browser context will be created in SetUp if it has not already been
// created. This allows tests to override the browser context if they so
// choose in their own SetUp function before calling the base class's (us)
// SetUp().
scoped_ptr<BrowserContext> browser_context_;
MessageLoopForUI message_loop_;
// It is important not to use this directly in the implementation as
// web_contents() and SetContents() are virtual and may be
// overridden by subclasses.
scoped_ptr<WebContents> contents_;
#if defined(USE_AURA)
scoped_ptr<aura::RootWindow> root_window_;
scoped_ptr<aura::test::TestStackingClient> test_stacking_client_;
RenderViewHostTestEnabler rvh_test_enabler_;
} // namespace content