extension_browsertest.h revision effb81e5f8246d0db0270817048dc992db66e9fb
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"
148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/extensions/extension_test_notification_observer.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h"
17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/common/extensions/features/feature_channel.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "extensions/browser/extension_host.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)
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Load extension and enable it in incognito mode.
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* LoadExtensionIncognito(
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path);
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Load extension from the |path| folder. |flags| is bit mask of values from
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // |Flags| enum.
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* LoadExtensionWithFlags(
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path, int flags);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Same as above, but sets the installation parameter to the extension
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // preferences.
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const extensions::Extension* LoadExtensionWithInstallParam(
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const base::FilePath& path,
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      int flags,
97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const std::string& install_param);
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Loads unpacked extension from |path| with manifest |manifest_relative_path|
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and imitates that it is a component extension.
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |manifest_relative_path| is relative to |path|.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* LoadExtensionAsComponentWithManifest(
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath::CharType* manifest_relative_path);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Loads unpacked extension from |path| and imitates that it is a component
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // extension. Equivalent to
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // LoadExtensionAsComponentWithManifest(path, extensions::kManifestFilename).
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* LoadExtensionAsComponent(
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pack the extension in |dir_path| into a crx file and return its path.
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return an empty FilePath if there were errors.
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath PackExtension(const base::FilePath& dir_path);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pack the extension in |dir_path| into a crx file at |crx_path|, using the
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // key |pem_path|. If |pem_path| does not exist, create a new key at
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |pem_out_path|.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the path to the crx file, or an empty FilePath if there were errors.
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath PackExtensionWithOptions(const base::FilePath& dir_path,
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          const base::FilePath& crx_path,
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          const base::FilePath& pem_path,
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          const base::FilePath& pem_out_path);
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |expected_change| indicates how many extensions should be installed (or
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disabled, if negative).
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1 means you expect a new install, 0 means you expect an upgrade, -1 means
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // you expect a failed upgrade.
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* InstallExtension(const base::FilePath& path,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                int expected_change) {
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return InstallOrUpdateExtension(
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::string(), path, INSTALL_UI_TYPE_NONE, expected_change);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Same as above, but an install source other than Manifest::INTERNAL can be
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // specified.
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* InstallExtension(
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int expected_change,
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::Manifest::Location install_source) {
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return InstallOrUpdateExtension(std::string(),
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    path,
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    INSTALL_UI_TYPE_NONE,
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    expected_change,
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    install_source);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Installs extension as if it came from the Chrome Webstore.
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* InstallExtensionFromWebstore(
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path, int expected_change);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same as above but passes an id to CrxInstaller and does not allow a
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // privilege increase.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* UpdateExtension(const std::string& id,
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               const base::FilePath& path,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               int expected_change) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return InstallOrUpdateExtension(id, path, INSTALL_UI_TYPE_NONE,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    expected_change);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Same as UpdateExtension but waits for the extension to be idle first.
162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const extensions::Extension* UpdateExtensionWaitForIdle(
163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      const std::string& id, const base::FilePath& path, int expected_change);
164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same as |InstallExtension| but with the normal extension UI showing up
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (for e.g. info bar on success).
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* InstallExtensionWithUI(
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int expected_change) {
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return InstallOrUpdateExtension(
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::string(), path, INSTALL_UI_TYPE_NORMAL, expected_change);
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* InstallExtensionWithUIAutoConfirm(
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int expected_change,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser* browser) {
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return InstallOrUpdateExtension(std::string(),
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    path,
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    INSTALL_UI_TYPE_AUTO_CONFIRM,
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    expected_change,
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    browser,
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    extensions::Extension::NO_FLAGS);
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const extensions::Extension* InstallExtensionWithSourceAndFlags(
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const base::FilePath& path,
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      int expected_change,
1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      extensions::Manifest::Location install_source,
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      extensions::Extension::InitFromValueFlags creation_flags) {
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    return InstallOrUpdateExtension(std::string(), path, INSTALL_UI_TYPE_NONE,
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        expected_change, install_source, browser(), creation_flags, false);
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Begins install process but simulates a user cancel.
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* StartInstallButCancel(
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path) {
198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return InstallOrUpdateExtension(
199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::string(), path, INSTALL_UI_TYPE_CANCEL, 0);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void ReloadExtension(const std::string extension_id);
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UnloadExtension(const std::string& extension_id);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UninstallExtension(const std::string& extension_id);
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DisableExtension(const std::string& extension_id);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EnableExtension(const std::string& extension_id);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the total number of page actions to change to |count|.
2138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForPageActionCountChangeTo(int count) {
2148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForPageActionCountChangeTo(count);
2158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the number of visible page actions to change to |count|.
2188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForPageActionVisibilityChangeTo(int count) {
2198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForPageActionVisibilityChangeTo(count);
2208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Waits until an extension is installed and loaded. Returns true if an
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // install happened before timeout.
2248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForExtensionInstall() {
2258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionInstall();
2268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for an extension install error to be raised. Returns true if an
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // error was raised.
2308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForExtensionInstallError() {
2318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionInstallError();
2328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Waits until an extension is loaded and all view have loaded.
2358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void WaitForExtensionAndViewLoad() {
2368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionAndViewLoad();
2378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Waits until an extension is loaded.
2408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void WaitForExtensionLoad() {
2418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionLoad();
2428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Waits for an extension load error. Returns true if the error really
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // happened.
2468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForExtensionLoadError() {
2478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionLoadError();
2488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the specified extension to crash. Returns true if it really
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // crashed.
2528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForExtensionCrash(const std::string& extension_id) {
2538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionCrash(extension_id);
2548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the crx installer to be done. Returns true if it really is done.
2578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForCrxInstallerDone() {
2588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForCrxInstallerDone();
2598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Wait for all extension views to load.
2628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForExtensionViewsToLoad() {
2638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionViewsToLoad();
2648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulates a page calling window.open on an URL and waits for the
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigation.
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OpenWindow(content::WebContents* contents,
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const GURL& url,
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  bool newtab_process_should_equal_opener,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  content::WebContents** newtab_result);
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulates a page navigating itself to an URL and waits for the
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigation.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NavigateInRenderer(content::WebContents* contents, const GURL& url);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Looks for an ExtensionHost whose URL has the given path component
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (including leading slash).  Also verifies that the expected number of hosts
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are loaded.
280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  extensions::ExtensionHost* FindHostWithPath(
281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      extensions::ProcessManager* manager,
282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const std::string& path,
283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      int expected_hosts);
284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
28558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Returns
28658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // extensions::browsertest_util::ExecuteScriptInBackgroundPage(profile(),
28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // extension_id, script).
28858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string ExecuteScriptInBackgroundPage(const std::string& extension_id,
28958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                            const std::string& script);
29058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool loaded_;
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool installed_;
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS)
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // True if the command line should be tweaked as if ChromeOS user is
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // already logged in.
2975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool set_chromeos_user_;
2985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // test_data/extensions.
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath test_data_dir_;
3028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<ExtensionTestNotificationObserver> observer_;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporary directory for testing.
3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Specifies the type of UI (if any) to show during installation and what
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // user action to simulate.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum InstallUIType {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSTALL_UI_TYPE_NONE,
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSTALL_UI_TYPE_CANCEL,
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSTALL_UI_TYPE_NORMAL,
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSTALL_UI_TYPE_AUTO_CONFIRM,
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* InstallOrUpdateExtension(
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& id,
3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      InstallUIType ui_type,
3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int expected_change);
3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* InstallOrUpdateExtension(
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& id,
3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      InstallUIType ui_type,
3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int expected_change,
3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Browser* browser,
3294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      extensions::Extension::InitFromValueFlags creation_flags);
3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* InstallOrUpdateExtension(
3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& id,
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InstallUIType ui_type,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int expected_change,
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::Manifest::Location install_source);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* InstallOrUpdateExtension(
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& id,
3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InstallUIType ui_type,
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int expected_change,
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::Manifest::Location install_source,
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser* browser,
3434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      extensions::Extension::InitFromValueFlags creation_flags,
344a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      bool wait_for_idle);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make the current channel "dev" for the duration of the test.
347ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  extensions::ScopedCurrentChannel current_channel_;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable external install UI.
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::FeatureSwitch::ScopedOverride
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      override_prompt_for_external_extensions_;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The default profile to be used.
3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Profile* profile_;
3555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Cache cache implementation.
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<extensions::ExtensionCacheFake> test_extension_cache_;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_BROWSERTEST_H_
361