15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_TEST_BASE_BROWSER_WITH_TEST_WINDOW_TEST_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_TEST_BASE_BROWSER_WITH_TEST_WINDOW_TEST_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/at_exit.h"
99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/test_browser_window.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
14a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#include "content/public/test/test_browser_thread_bundle.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_renderer_host.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/login/user_manager.h"
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/cros_settings.h"
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/chromeos/settings/device_settings_service.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/win/scoped_ole_initializer.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(USE_ASH)
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace ash {
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace test {
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class AshTestHelper;
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace aura {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AuraTestHelper;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NavigationController;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Base class for browser based unit tests. BrowserWithTestWindowTest creates a
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Browser with a TestingProfile and TestBrowserWindow. To add a tab use
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AddTab. For example, the following adds a tab and navigates to
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// two URLs that target the TestWebContents:
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   // Add a new tab and navigate it. This will be at index 0.
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   AddTab(browser(), GURL("http://foo/1"));
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   NavigationController* controller =
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//       &browser()->tab_strip_model()->GetWebContentsAt(0)->GetController();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   // Navigate somewhere else.
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   GURL url2("http://foo/2");
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   NavigateAndCommit(controller, url2);
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   // This is equivalent to the above, and lets you test pending navigations.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   browser()->OpenURL(OpenURLParams(
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       GURL("http://foo/2"), GURL(), CURRENT_TAB,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//       content::PAGE_TRANSITION_TYPED, false));
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//   CommitPendingLoad(controller);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Subclasses must invoke BrowserWithTestWindowTest::SetUp as it is responsible
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for creating the various objects of this class.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserWithTestWindowTest : public testing::Test {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates a BrowserWithTestWindowTest for which the initial window will be
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // created on the native desktop.
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BrowserWithTestWindowTest();
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BrowserWithTestWindowTest();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Sets the desktop on which the initial window will be created. Must be
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // called before SetUp().
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void SetHostDesktopType(chrome::HostDesktopType host_desktop_type);
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUp() OVERRIDE;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void TearDown() OVERRIDE;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  BrowserWindow* window() const { return window_.get(); }
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Browser* browser() const { return browser_.get(); }
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_browser(Browser* browser) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    browser_.reset(browser);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  Browser* release_browser() WARN_UNUSED_RESULT {
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return browser_.release();
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestingProfile* profile() const { return profile_.get(); }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  TestingProfile* GetProfile() { return profile_.get(); }
1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  BrowserWindow* release_browser_window() WARN_UNUSED_RESULT {
1037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    return window_.release();
1047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
1057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds a tab to |browser| with the given URL and commits the load.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is a convenience function. The new tab will be added at index 0.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AddTab(Browser* browser, const GURL& url);
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Commits the pending load on the given controller. It will keep the
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // URL of the pending load. If there is no pending load, this does nothing.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CommitPendingLoad(content::NavigationController* controller);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a pending navigation on the given navigation controller to the
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // given URL with the default parameters and the commits the load with a page
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ID one larger than any seen. This emulates what happens on a new
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigation.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NavigateAndCommit(content::NavigationController* controller,
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         const GURL& url);
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Navigates the current tab. This is a wrapper around NavigateAndCommit.
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NavigateAndCommitActiveTab(const GURL& url);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Set the |title| of the current tab.
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void NavigateAndCommitActiveTabWithTitle(
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Browser* browser,
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const GURL& url,
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const string16& title);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Destroys the browser, window, and profile created by this class. This is
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // invoked from the destructor.
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DestroyBrowserAndProfile();
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates the profile used by this test. The caller owns the return value.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual TestingProfile* CreateProfile();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Creates the BrowserWindow used by this test. The caller owns the return
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // value. Can return NULL to use the default window created by Browser.
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual BrowserWindow* CreateBrowserWindow();
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We need to create a MessageLoop, otherwise a bunch of things fails.
143a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  content::TestBrowserThreadBundle thread_bundle_;
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ShadowingAtExitManager at_exit_manager_;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::ScopedTestDeviceSettingsService test_device_settings_service_;
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::ScopedTestCrosSettings test_cros_settings_;
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  chromeos::ScopedTestUserManager test_user_manager_;
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<TestingProfile> profile_;
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<BrowserWindow> window_;  // Usually a TestBrowserWindow.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<Browser> browser_;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The existence of this object enables tests via
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // RenderViewHostTester.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderViewHostTestEnabler rvh_test_enabler_;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(USE_ASH)
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  scoped_ptr<ash::test::AshTestHelper> ash_test_helper_;
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_AURA)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<aura::test::AuraTestHelper> aura_test_helper_;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::ScopedOleInitializer ole_initializer_;
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The desktop to create the initial window on.
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::HostDesktopType host_desktop_type_;
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BrowserWithTestWindowTest);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_TEST_BASE_BROWSER_WITH_TEST_WINDOW_TEST_H_
178