extension_browsertest.h revision f2477e01787aa58f445919b809d89e252beef54f
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_BROWSER_EXTENSIONS_EXTENSION_BROWSERTEST_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_EXTENSION_BROWSERTEST_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_host.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_system.h"
168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/extensions/extension_test_notification_observer.h"
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/common/extensions/features/feature_channel.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/feature_switch.h"
233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtensionService;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtensionSet;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Profile;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace extensions {
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ProcessManager;
31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Base class for extension browser tests. Provides utilities for loading,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unloading, and installing extensions.
358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class ExtensionBrowserTest : virtual public InProcessBrowserTest {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Flags used to configure how the tests are run.
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum Flags {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFlagNone = 0,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Allow the extension to run in incognito mode.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFlagEnableIncognito = 1 << 0,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Allow file access for the extension.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFlagEnableFileAccess = 1 << 1,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't fail when the loaded manifest has warnings (should only be used
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // when testing deprecated features).
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFlagIgnoreManifestWarnings = 1 << 2,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Allow older manifest versions (typically these can't be loaded - we allow
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // them for testing).
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFlagAllowOldManifestVersions = 1 << 3,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionBrowserTest();
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ExtensionBrowserTest();
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Useful accessors.
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* extension_service() {
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return extensions::ExtensionSystem::Get(profile())->extension_service();
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  const std::string& last_loaded_extension_id() {
658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->last_loaded_extension_id();
668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get the profile to use.
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Profile* profile();
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const extensions::Extension* GetExtensionByPath(
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const ExtensionSet* extensions, const base::FilePath& path);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // InProcessBrowserTest
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE;
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* LoadExtension(const base::FilePath& path);
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same as above, but enables the extension in incognito mode first.
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* LoadExtensionIncognito(
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* LoadExtensionWithFlags(
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path, int flags);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Loads unpacked extension from |path| with manifest |manifest_relative_path|
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and imitates that it is a component extension.
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |manifest_relative_path| is relative to |path|.
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* LoadExtensionAsComponentWithManifest(
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath::CharType* manifest_relative_path);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Loads unpacked extension from |path| and imitates that it is a component
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // extension. Equivalent to
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // LoadExtensionAsComponentWithManifest(path, extensions::kManifestFilename).
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* LoadExtensionAsComponent(
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pack the extension in |dir_path| into a crx file and return its path.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return an empty FilePath if there were errors.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath PackExtension(const base::FilePath& dir_path);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pack the extension in |dir_path| into a crx file at |crx_path|, using the
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // key |pem_path|. If |pem_path| does not exist, create a new key at
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |pem_out_path|.
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the path to the crx file, or an empty FilePath if there were errors.
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath PackExtensionWithOptions(const base::FilePath& dir_path,
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          const base::FilePath& crx_path,
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          const base::FilePath& pem_path,
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          const base::FilePath& pem_out_path);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |expected_change| indicates how many extensions should be installed (or
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disabled, if negative).
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1 means you expect a new install, 0 means you expect an upgrade, -1 means
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // you expect a failed upgrade.
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* InstallExtension(const base::FilePath& path,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                int expected_change) {
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return InstallOrUpdateExtension(
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::string(), path, INSTALL_UI_TYPE_NONE, expected_change);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Same as above, but an install source other than Manifest::INTERNAL can be
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // specified.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* InstallExtension(
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int expected_change,
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::Manifest::Location install_source) {
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return InstallOrUpdateExtension(std::string(),
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    path,
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    INSTALL_UI_TYPE_NONE,
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    expected_change,
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    install_source);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Installs extension as if it came from the Chrome Webstore.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* InstallExtensionFromWebstore(
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path, int expected_change);
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same as above but passes an id to CrxInstaller and does not allow a
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // privilege increase.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* UpdateExtension(const std::string& id,
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               const base::FilePath& path,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               int expected_change) {
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return InstallOrUpdateExtension(id, path, INSTALL_UI_TYPE_NONE,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    expected_change);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Same as UpdateExtension but waits for the extension to be idle first.
150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const extensions::Extension* UpdateExtensionWaitForIdle(
151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      const std::string& id, const base::FilePath& path, int expected_change);
152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same as |InstallExtension| but with the normal extension UI showing up
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (for e.g. info bar on success).
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* InstallExtensionWithUI(
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int expected_change) {
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return InstallOrUpdateExtension(
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::string(), path, INSTALL_UI_TYPE_NORMAL, expected_change);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* InstallExtensionWithUIAutoConfirm(
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int expected_change,
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser* browser) {
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return InstallOrUpdateExtension(std::string(),
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    path,
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    INSTALL_UI_TYPE_AUTO_CONFIRM,
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    expected_change,
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    browser,
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    extensions::Extension::NO_FLAGS);
1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const extensions::Extension* InstallExtensionWithSourceAndFlags(
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const base::FilePath& path,
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      int expected_change,
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      extensions::Manifest::Location install_source,
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      extensions::Extension::InitFromValueFlags creation_flags) {
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return InstallOrUpdateExtension(std::string(), path, INSTALL_UI_TYPE_NONE,
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        expected_change, install_source, browser(), creation_flags, false);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Begins install process but simulates a user cancel.
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* StartInstallButCancel(
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path) {
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return InstallOrUpdateExtension(
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::string(), path, INSTALL_UI_TYPE_CANCEL, 0);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void ReloadExtension(const std::string extension_id);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UnloadExtension(const std::string& extension_id);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UninstallExtension(const std::string& extension_id);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DisableExtension(const std::string& extension_id);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EnableExtension(const std::string& extension_id);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the total number of page actions to change to |count|.
2018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForPageActionCountChangeTo(int count) {
2028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForPageActionCountChangeTo(count);
2038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the number of visible page actions to change to |count|.
2068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForPageActionVisibilityChangeTo(int count) {
2078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForPageActionVisibilityChangeTo(count);
2088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Waits until an extension is installed and loaded. Returns true if an
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // install happened before timeout.
2128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForExtensionInstall() {
2138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionInstall();
2148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for an extension install error to be raised. Returns true if an
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // error was raised.
2188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForExtensionInstallError() {
2198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionInstallError();
2208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Waits until an extension is loaded and all view have loaded.
2238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void WaitForExtensionAndViewLoad() {
2248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionAndViewLoad();
2258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Waits until an extension is loaded.
2288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void WaitForExtensionLoad() {
2298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionLoad();
2308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Waits for an extension load error. Returns true if the error really
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // happened.
2348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForExtensionLoadError() {
2358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionLoadError();
2368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the specified extension to crash. Returns true if it really
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // crashed.
2408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForExtensionCrash(const std::string& extension_id) {
2418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionCrash(extension_id);
2428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the crx installer to be done. Returns true if it really is done.
2458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForCrxInstallerDone() {
2468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForCrxInstallerDone();
2478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Wait for all extension views to load.
2508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForExtensionViewsToLoad() {
2518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionViewsToLoad();
2528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulates a page calling window.open on an URL and waits for the
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigation.
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OpenWindow(content::WebContents* contents,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const GURL& url,
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  bool newtab_process_should_equal_opener,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  content::WebContents** newtab_result);
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulates a page navigating itself to an URL and waits for the
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigation.
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NavigateInRenderer(content::WebContents* contents, const GURL& url);
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Looks for an ExtensionHost whose URL has the given path component
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (including leading slash).  Also verifies that the expected number of hosts
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are loaded.
268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  extensions::ExtensionHost* FindHostWithPath(
269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      extensions::ProcessManager* manager,
270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const std::string& path,
271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      int expected_hosts);
272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
27358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Returns
27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // extensions::browsertest_util::ExecuteScriptInBackgroundPage(profile(),
27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // extension_id, script).
27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string ExecuteScriptInBackgroundPage(const std::string& extension_id,
27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                            const std::string& script);
27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool loaded_;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool installed_;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // test_data/extensions.
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath test_data_dir_;
2848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<ExtensionTestNotificationObserver> observer_;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporary directory for testing.
2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Specifies the type of UI (if any) to show during installation and what
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // user action to simulate.
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum InstallUIType {
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSTALL_UI_TYPE_NONE,
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSTALL_UI_TYPE_CANCEL,
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSTALL_UI_TYPE_NORMAL,
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSTALL_UI_TYPE_AUTO_CONFIRM,
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* InstallOrUpdateExtension(
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& id,
3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      InstallUIType ui_type,
3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int expected_change);
3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* InstallOrUpdateExtension(
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& id,
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      InstallUIType ui_type,
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int expected_change,
3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Browser* browser,
3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      extensions::Extension::InitFromValueFlags creation_flags);
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* InstallOrUpdateExtension(
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& id,
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InstallUIType ui_type,
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int expected_change,
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::Manifest::Location install_source);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* InstallOrUpdateExtension(
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& id,
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InstallUIType ui_type,
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int expected_change,
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::Manifest::Location install_source,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser* browser,
3254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      extensions::Extension::InitFromValueFlags creation_flags,
326a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      bool wait_for_idle);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make the current channel "dev" for the duration of the test.
329ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  extensions::ScopedCurrentChannel current_channel_;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable external install UI.
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::FeatureSwitch::ScopedOverride
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      override_prompt_for_external_extensions_;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The default profile to be used.
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Profile* profile_;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_BROWSERTEST_H_
340