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"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/test/scoped_path_override.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"
2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "extensions/browser/extension_host.h"
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h"
23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h"
24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/feature_switch.h"
253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h"
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtensionService;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Profile;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace extensions {
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ExtensionCacheFake;
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ExtensionSet;
33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ProcessManager;
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}
35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Base class for extension browser tests. Provides utilities for loading,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unloading, and installing extensions.
388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class ExtensionBrowserTest : virtual public InProcessBrowserTest {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Flags used to configure how the tests are run.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum Flags {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFlagNone = 0,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Allow the extension to run in incognito mode.
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFlagEnableIncognito = 1 << 0,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Allow file access for the extension.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFlagEnableFileAccess = 1 << 1,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Don't fail when the loaded manifest has warnings (should only be used
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // when testing deprecated features).
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFlagIgnoreManifestWarnings = 1 << 2,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Allow older manifest versions (typically these can't be loaded - we allow
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // them for testing).
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    kFlagAllowOldManifestVersions = 1 << 3,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionBrowserTest();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ExtensionBrowserTest();
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Useful accessors.
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ExtensionService* extension_service() {
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return extensions::ExtensionSystem::Get(profile())->extension_service();
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  const std::string& last_loaded_extension_id() {
688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->last_loaded_extension_id();
698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Get the profile to use.
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual Profile* profile();
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static const extensions::Extension* GetExtensionByPath(
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const extensions::ExtensionSet* extensions, const base::FilePath& path);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // InProcessBrowserTest
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void SetUp() OVERRIDE;
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE;
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SetUpOnMainThread() OVERRIDE;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* LoadExtension(const base::FilePath& path);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Load extension and enable it in incognito mode.
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* LoadExtensionIncognito(
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Load extension from the |path| folder. |flags| is bit mask of values from
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // |Flags| enum.
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* LoadExtensionWithFlags(
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path, int flags);
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Same as above, but sets the installation parameter to the extension
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // preferences.
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  const extensions::Extension* LoadExtensionWithInstallParam(
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const base::FilePath& path,
97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      int flags,
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      const std::string& install_param);
99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Loads unpacked extension from |path| with manifest |manifest_relative_path|
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // and imitates that it is a component extension.
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // |manifest_relative_path| is relative to |path|.
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* LoadExtensionAsComponentWithManifest(
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath::CharType* manifest_relative_path);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Loads unpacked extension from |path| and imitates that it is a component
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // extension. Equivalent to
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // LoadExtensionAsComponentWithManifest(path, extensions::kManifestFilename).
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* LoadExtensionAsComponent(
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pack the extension in |dir_path| into a crx file and return its path.
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return an empty FilePath if there were errors.
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath PackExtension(const base::FilePath& dir_path);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Pack the extension in |dir_path| into a crx file at |crx_path|, using the
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // key |pem_path|. If |pem_path| does not exist, create a new key at
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |pem_out_path|.
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the path to the crx file, or an empty FilePath if there were errors.
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath PackExtensionWithOptions(const base::FilePath& dir_path,
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          const base::FilePath& crx_path,
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          const base::FilePath& pem_path,
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                          const base::FilePath& pem_out_path);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |expected_change| indicates how many extensions should be installed (or
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // disabled, if negative).
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // 1 means you expect a new install, 0 means you expect an upgrade, -1 means
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // you expect a failed upgrade.
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* InstallExtension(const base::FilePath& path,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                int expected_change) {
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return InstallOrUpdateExtension(
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::string(), path, INSTALL_UI_TYPE_NONE, expected_change);
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Same as above, but an install source other than Manifest::INTERNAL can be
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // specified.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* InstallExtension(
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int expected_change,
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::Manifest::Location install_source) {
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return InstallOrUpdateExtension(std::string(),
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    path,
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    INSTALL_UI_TYPE_NONE,
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    expected_change,
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    install_source);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Installs extension as if it came from the Chrome Webstore.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* InstallExtensionFromWebstore(
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path, int expected_change);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same as above but passes an id to CrxInstaller and does not allow a
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // privilege increase.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* UpdateExtension(const std::string& id,
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                               const base::FilePath& path,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               int expected_change) {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return InstallOrUpdateExtension(id, path, INSTALL_UI_TYPE_NONE,
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                    expected_change);
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // Same as UpdateExtension but waits for the extension to be idle first.
163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const extensions::Extension* UpdateExtensionWaitForIdle(
164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      const std::string& id, const base::FilePath& path, int expected_change);
165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Same as |InstallExtension| but with the normal extension UI showing up
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (for e.g. info bar on success).
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* InstallExtensionWithUI(
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int expected_change) {
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return InstallOrUpdateExtension(
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::string(), path, INSTALL_UI_TYPE_NORMAL, expected_change);
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* InstallExtensionWithUIAutoConfirm(
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int expected_change,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser* browser) {
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return InstallOrUpdateExtension(std::string(),
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    path,
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    INSTALL_UI_TYPE_AUTO_CONFIRM,
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    expected_change,
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                    browser,
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                    extensions::Extension::NO_FLAGS);
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const extensions::Extension* InstallExtensionWithSourceAndFlags(
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      const base::FilePath& path,
1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      int expected_change,
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      extensions::Manifest::Location install_source,
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      extensions::Extension::InitFromValueFlags creation_flags) {
192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return InstallOrUpdateExtension(std::string(),
193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    path,
194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    INSTALL_UI_TYPE_NONE,
195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    expected_change,
196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    install_source,
197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    browser(),
198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    creation_flags,
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    false,
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    false);
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const extensions::Extension* InstallEphemeralAppWithSourceAndFlags(
204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const base::FilePath& path,
205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      int expected_change,
206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      extensions::Manifest::Location install_source,
207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      extensions::Extension::InitFromValueFlags creation_flags) {
208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return InstallOrUpdateExtension(std::string(),
209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    path,
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    INSTALL_UI_TYPE_NONE,
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    expected_change,
212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    install_source,
213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    browser(),
214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    creation_flags,
215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    false,
216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                    true);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Begins install process but simulates a user cancel.
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* StartInstallButCancel(
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path) {
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    return InstallOrUpdateExtension(
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        std::string(), path, INSTALL_UI_TYPE_CANCEL, 0);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
226eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  void ReloadExtension(const std::string extension_id);
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UnloadExtension(const std::string& extension_id);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UninstallExtension(const std::string& extension_id);
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DisableExtension(const std::string& extension_id);
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EnableExtension(const std::string& extension_id);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the number of visible page actions to change to |count|.
2378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForPageActionVisibilityChangeTo(int count) {
2388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForPageActionVisibilityChangeTo(count);
2398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Waits until an extension is installed and loaded. Returns true if an
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // install happened before timeout.
2438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForExtensionInstall() {
2448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionInstall();
2458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for an extension install error to be raised. Returns true if an
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // error was raised.
2498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForExtensionInstallError() {
2508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionInstallError();
2518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Waits until an extension is loaded and all view have loaded.
2548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void WaitForExtensionAndViewLoad() {
2558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionAndViewLoad();
2568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Waits until an extension is loaded.
2598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void WaitForExtensionLoad() {
2608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionLoad();
2618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Waits for an extension load error. Returns true if the error really
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // happened.
2658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForExtensionLoadError() {
2668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionLoadError();
2678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the specified extension to crash. Returns true if it really
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // crashed.
2718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForExtensionCrash(const std::string& extension_id) {
2728bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionCrash(extension_id);
2738bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wait for the crx installer to be done. Returns true if it really is done.
2768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForCrxInstallerDone() {
2778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForCrxInstallerDone();
2788bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2798bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
2808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // Wait for all extension views to load.
2818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  bool WaitForExtensionViewsToLoad() {
2828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)    return observer_->WaitForExtensionViewsToLoad();
2838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  }
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulates a page calling window.open on an URL and waits for the
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigation.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OpenWindow(content::WebContents* contents,
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  const GURL& url,
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  bool newtab_process_should_equal_opener,
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  content::WebContents** newtab_result);
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Simulates a page navigating itself to an URL and waits for the
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // navigation.
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NavigateInRenderer(content::WebContents* contents, const GURL& url);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Looks for an ExtensionHost whose URL has the given path component
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // (including leading slash).  Also verifies that the expected number of hosts
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // are loaded.
299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  extensions::ExtensionHost* FindHostWithPath(
300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      extensions::ProcessManager* manager,
301f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      const std::string& path,
302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      int expected_hosts);
303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
30458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // Returns
30558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // extensions::browsertest_util::ExecuteScriptInBackgroundPage(profile(),
30658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // extension_id, script).
30758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  std::string ExecuteScriptInBackgroundPage(const std::string& extension_id,
30858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                            const std::string& script);
30958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3100529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // Returns
3110529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // extensions::browsertest_util::ExecuteScriptInBackgroundPageNoWait(
3120529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  // profile(), extension_id, script).
3130529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch  bool ExecuteScriptInBackgroundPageNoWait(const std::string& extension_id,
3140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch                                           const std::string& script);
3150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool loaded_;
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool installed_;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS)
3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // True if the command line should be tweaked as if ChromeOS user is
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // already logged in.
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  bool set_chromeos_user_;
3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // test_data/extensions.
3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::FilePath test_data_dir_;
3278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  scoped_ptr<ExtensionTestNotificationObserver> observer_;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Temporary directory for testing.
3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::ScopedTempDir temp_dir_;
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Specifies the type of UI (if any) to show during installation and what
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // user action to simulate.
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum InstallUIType {
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSTALL_UI_TYPE_NONE,
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSTALL_UI_TYPE_CANCEL,
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSTALL_UI_TYPE_NORMAL,
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    INSTALL_UI_TYPE_AUTO_CONFIRM,
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* InstallOrUpdateExtension(
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& id,
3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
3462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      InstallUIType ui_type,
3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int expected_change);
3482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* InstallOrUpdateExtension(
3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& id,
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      InstallUIType ui_type,
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int expected_change,
3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Browser* browser,
3544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      extensions::Extension::InitFromValueFlags creation_flags);
3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const extensions::Extension* InstallOrUpdateExtension(
3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const std::string& id,
3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InstallUIType ui_type,
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int expected_change,
3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::Manifest::Location install_source);
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const extensions::Extension* InstallOrUpdateExtension(
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const std::string& id,
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const base::FilePath& path,
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      InstallUIType ui_type,
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      int expected_change,
3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      extensions::Manifest::Location install_source,
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Browser* browser,
3684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      extensions::Extension::InitFromValueFlags creation_flags,
369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      bool wait_for_idle,
370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      bool is_ephemeral);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Make the current channel "dev" for the duration of the test.
373ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch  extensions::ScopedCurrentChannel current_channel_;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable external install UI.
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  extensions::FeatureSwitch::ScopedOverride
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      override_prompt_for_external_extensions_;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_WIN)
3801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Use mock shortcut directories to ensure app shortcuts are cleaned up.
3811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::ScopedPathOverride user_desktop_override_;
3821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::ScopedPathOverride common_desktop_override_;
3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::ScopedPathOverride user_quick_launch_override_;
3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::ScopedPathOverride start_menu_override_;
3851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::ScopedPathOverride common_start_menu_override_;
3861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif
3871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
3882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // The default profile to be used.
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Profile* profile_;
3905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
3915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Cache cache implementation.
3925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<extensions::ExtensionCacheFake> test_extension_cache_;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_BROWSERTEST_H_
396