extension_browsertest.h revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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"
158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/extensions/extension_test_notification_observer.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile.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"
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/feature_switch.h"
243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtensionService;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Profile;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace extensions {
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ExtensionCacheFake;
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ExtensionSet;
32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ProcessManager;
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Base class for extension browser tests. Provides utilities for loading,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unloading, and installing extensions.
378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class ExtensionBrowserTest : virtual public InProcessBrowserTest {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Flags used to configure how the tests are run.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum Flags {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFlagNone = 0,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Allow the extension to run in incognito mode.
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFlagEnableIncognito = 1 << 0,
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Allow file access for the extension.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFlagEnableFileAccess = 1 << 1,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't fail when the loaded manifest has warnings (should only be used
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // when testing deprecated features).
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFlagIgnoreManifestWarnings = 1 << 2,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Allow older manifest versions (typically these can't be loaded - we allow
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // them for testing).
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFlagAllowOldManifestVersions = 1 << 3,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionBrowserTest();
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ExtensionBrowserTest();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Useful accessors.
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* extension_service() {
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return extensions::ExtensionSystem::Get(profile())->extension_service();
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  const std::string& last_loaded_extension_id() {
678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->last_loaded_extension_id();
688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get the profile to use.
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual Profile* profile();
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const extensions::Extension* GetExtensionByPath(
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const extensions::ExtensionSet* extensions, const base::FilePath& path);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // InProcessBrowserTest
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetUp() OVERRIDE;
78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE;
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* LoadExtension(const base::FilePath& path);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same as above, but enables the extension in incognito mode first.
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* LoadExtensionIncognito(
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* LoadExtensionWithFlags(
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path, int flags);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Loads unpacked extension from |path| with manifest |manifest_relative_path|
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and imitates that it is a component extension.
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |manifest_relative_path| is relative to |path|.
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* LoadExtensionAsComponentWithManifest(
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath::CharType* manifest_relative_path);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Loads unpacked extension from |path| and imitates that it is a component
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // extension. Equivalent to
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // LoadExtensionAsComponentWithManifest(path, extensions::kManifestFilename).
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* LoadExtensionAsComponent(
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pack the extension in |dir_path| into a crx file and return its path.
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return an empty FilePath if there were errors.
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath PackExtension(const base::FilePath& dir_path);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pack the extension in |dir_path| into a crx file at |crx_path|, using the
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // key |pem_path|. If |pem_path| does not exist, create a new key at
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |pem_out_path|.
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the path to the crx file, or an empty FilePath if there were errors.
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath PackExtensionWithOptions(const base::FilePath& dir_path,
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          const base::FilePath& crx_path,
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          const base::FilePath& pem_path,
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          const base::FilePath& pem_out_path);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |expected_change| indicates how many extensions should be installed (or
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disabled, if negative).
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1 means you expect a new install, 0 means you expect an upgrade, -1 means
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // you expect a failed upgrade.
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* InstallExtension(const base::FilePath& path,
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                int expected_change) {
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return InstallOrUpdateExtension(
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::string(), path, INSTALL_UI_TYPE_NONE, expected_change);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Same as above, but an install source other than Manifest::INTERNAL can be
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // specified.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* InstallExtension(
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int expected_change,
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::Manifest::Location install_source) {
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return InstallOrUpdateExtension(std::string(),
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    path,
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    INSTALL_UI_TYPE_NONE,
135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    expected_change,
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    install_source);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Installs extension as if it came from the Chrome Webstore.
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* InstallExtensionFromWebstore(
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path, int expected_change);
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same as above but passes an id to CrxInstaller and does not allow a
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // privilege increase.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* UpdateExtension(const std::string& id,
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               const base::FilePath& path,
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               int expected_change) {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return InstallOrUpdateExtension(id, path, INSTALL_UI_TYPE_NONE,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    expected_change);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Same as UpdateExtension but waits for the extension to be idle first.
153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const extensions::Extension* UpdateExtensionWaitForIdle(
154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      const std::string& id, const base::FilePath& path, int expected_change);
155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same as |InstallExtension| but with the normal extension UI showing up
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (for e.g. info bar on success).
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* InstallExtensionWithUI(
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int expected_change) {
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return InstallOrUpdateExtension(
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::string(), path, INSTALL_UI_TYPE_NORMAL, expected_change);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* InstallExtensionWithUIAutoConfirm(
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int expected_change,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser* browser) {
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return InstallOrUpdateExtension(std::string(),
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    path,
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    INSTALL_UI_TYPE_AUTO_CONFIRM,
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    expected_change,
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    browser,
1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    extensions::Extension::NO_FLAGS);
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const extensions::Extension* InstallExtensionWithSourceAndFlags(
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const base::FilePath& path,
1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      int expected_change,
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      extensions::Manifest::Location install_source,
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      extensions::Extension::InitFromValueFlags creation_flags) {
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return InstallOrUpdateExtension(std::string(), path, INSTALL_UI_TYPE_NONE,
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        expected_change, install_source, browser(), creation_flags, false);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Begins install process but simulates a user cancel.
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* StartInstallButCancel(
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path) {
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return InstallOrUpdateExtension(
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::string(), path, INSTALL_UI_TYPE_CANCEL, 0);
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void ReloadExtension(const std::string extension_id);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UnloadExtension(const std::string& extension_id);
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UninstallExtension(const std::string& extension_id);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DisableExtension(const std::string& extension_id);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EnableExtension(const std::string& extension_id);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the total number of page actions to change to |count|.
2048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForPageActionCountChangeTo(int count) {
2058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForPageActionCountChangeTo(count);
2068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the number of visible page actions to change to |count|.
2098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForPageActionVisibilityChangeTo(int count) {
2108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForPageActionVisibilityChangeTo(count);
2118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Waits until an extension is installed and loaded. Returns true if an
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // install happened before timeout.
2158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForExtensionInstall() {
2168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionInstall();
2178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for an extension install error to be raised. Returns true if an
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // error was raised.
2218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForExtensionInstallError() {
2228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionInstallError();
2238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Waits until an extension is loaded and all view have loaded.
2268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void WaitForExtensionAndViewLoad() {
2278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionAndViewLoad();
2288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Waits until an extension is loaded.
2318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void WaitForExtensionLoad() {
2328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionLoad();
2338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Waits for an extension load error. Returns true if the error really
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // happened.
2378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForExtensionLoadError() {
2388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionLoadError();
2398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the specified extension to crash. Returns true if it really
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // crashed.
2438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForExtensionCrash(const std::string& extension_id) {
2448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionCrash(extension_id);
2458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the crx installer to be done. Returns true if it really is done.
2488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForCrxInstallerDone() {
2498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForCrxInstallerDone();
2508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Wait for all extension views to load.
2538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForExtensionViewsToLoad() {
2548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionViewsToLoad();
2558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulates a page calling window.open on an URL and waits for the
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigation.
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OpenWindow(content::WebContents* contents,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const GURL& url,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  bool newtab_process_should_equal_opener,
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  content::WebContents** newtab_result);
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulates a page navigating itself to an URL and waits for the
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigation.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NavigateInRenderer(content::WebContents* contents, const GURL& url);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Looks for an ExtensionHost whose URL has the given path component
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (including leading slash).  Also verifies that the expected number of hosts
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are loaded.
271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  extensions::ExtensionHost* FindHostWithPath(
272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      extensions::ProcessManager* manager,
273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const std::string& path,
274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      int expected_hosts);
275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Returns
27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // extensions::browsertest_util::ExecuteScriptInBackgroundPage(profile(),
27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // extension_id, script).
27958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string ExecuteScriptInBackgroundPage(const std::string& extension_id,
28058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                            const std::string& script);
28158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool loaded_;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool installed_;
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS)
2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // True if the command line should be tweaked as if ChromeOS user is
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // already logged in.
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool set_chromeos_user_;
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // test_data/extensions.
2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath test_data_dir_;
2938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<ExtensionTestNotificationObserver> observer_;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporary directory for testing.
2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Specifies the type of UI (if any) to show during installation and what
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // user action to simulate.
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum InstallUIType {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSTALL_UI_TYPE_NONE,
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSTALL_UI_TYPE_CANCEL,
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSTALL_UI_TYPE_NORMAL,
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSTALL_UI_TYPE_AUTO_CONFIRM,
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* InstallOrUpdateExtension(
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& id,
3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      InstallUIType ui_type,
3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int expected_change);
3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* InstallOrUpdateExtension(
3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& id,
3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      InstallUIType ui_type,
3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int expected_change,
3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Browser* browser,
3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      extensions::Extension::InitFromValueFlags creation_flags);
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* InstallOrUpdateExtension(
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& id,
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InstallUIType ui_type,
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int expected_change,
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::Manifest::Location install_source);
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* InstallOrUpdateExtension(
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& id,
3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InstallUIType ui_type,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int expected_change,
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::Manifest::Location install_source,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser* browser,
3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      extensions::Extension::InitFromValueFlags creation_flags,
335a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      bool wait_for_idle);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make the current channel "dev" for the duration of the test.
338ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  extensions::ScopedCurrentChannel current_channel_;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable external install UI.
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::FeatureSwitch::ScopedOverride
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      override_prompt_for_external_extensions_;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The default profile to be used.
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Profile* profile_;
3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Cache cache implementation.
3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<extensions::ExtensionCacheFake> test_extension_cache_;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_BROWSERTEST_H_
352