1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_BROWSERTEST_H_
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#define CHROME_BROWSER_EXTENSIONS_EXTENSION_BROWSERTEST_H_
73345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#pragma once
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/command_line.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_path.h"
13ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_temp_dir.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/in_process_browser_test.h"
15ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_details.h"
16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h"
17ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_type.h"
18ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
19ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsenclass Extension;
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Base class for extension browser tests. Provides utilities for loading,
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// unloading, and installing extensions.
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass ExtensionBrowserTest
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    : public InProcessBrowserTest, public NotificationObserver {
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ExtensionBrowserTest();
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetUpCommandLine(CommandLine* command_line);
29ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const Extension* LoadExtension(const FilePath& path);
30ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
31ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Same as above, but enables the extension in incognito mode first.
32ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const Extension* LoadExtensionIncognito(const FilePath& path);
33ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
34ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // By default, unpacked extensions have file access: this loads them with
35ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // that permission removed.
36ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const Extension* LoadExtensionNoFileAccess(const FilePath& path);
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Same as above, but enables the extension in incognito mode first.
39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const Extension* LoadExtensionIncognitoNoFileAccess(const FilePath& path);
40ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
41ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Loads extension and imitates that it is a component extension.
42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  bool LoadExtensionAsComponent(const FilePath& path);
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Pack the extension in |dir_path| into a crx file and return its path.
4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Return an empty FilePath if there were errors.
4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  FilePath PackExtension(const FilePath& dir_path);
4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // |expected_change| indicates how many extensions should be installed (or
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // disabled, if negative).
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // 1 means you expect a new install, 0 means you expect an upgrade, -1 means
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // you expect a failed upgrade.
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool InstallExtension(const FilePath& path, int expected_change) {
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return InstallOrUpdateExtension("", path, INSTALL_UI_TYPE_NONE,
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    expected_change);
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Same as above but passes an id to CrxInstaller and does not allow a
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // privilege increase.
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool UpdateExtension(const std::string& id, const FilePath& path,
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       int expected_change) {
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return InstallOrUpdateExtension(id, path, INSTALL_UI_TYPE_NONE,
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    expected_change);
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Same as |InstallExtension| but with the normal extension UI showing up
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // (for e.g. info bar on success).
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool InstallExtensionWithUI(const FilePath& path, int expected_change) {
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return InstallOrUpdateExtension("", path, INSTALL_UI_TYPE_NORMAL,
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                    expected_change);
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool InstallExtensionWithUIAutoConfirm(const FilePath& path,
7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                         int expected_change,
7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                         Profile* profile) {
7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    return InstallOrUpdateExtension("", path, INSTALL_UI_TYPE_AUTO_CONFIRM,
7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                    expected_change, profile);
7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  }
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Begins install process but simulates a user cancel.
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool StartInstallButCancel(const FilePath& path) {
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    return InstallOrUpdateExtension("", path, INSTALL_UI_TYPE_CANCEL, 0);
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void ReloadExtension(const std::string& extension_id);
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UnloadExtension(const std::string& extension_id);
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void UninstallExtension(const std::string& extension_id);
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void DisableExtension(const std::string& extension_id);
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void EnableExtension(const std::string& extension_id);
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Wait for the total number of page actions to change to |count|.
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool WaitForPageActionCountChangeTo(int count);
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Wait for the number of visible page actions to change to |count|.
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool WaitForPageActionVisibilityChangeTo(int count);
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Waits until an extension is installed and loaded. Returns true if an
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // install happened before timeout.
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool WaitForExtensionInstall();
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Wait for an extension install error to be raised. Returns true if an
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // error was raised.
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool WaitForExtensionInstallError();
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Waits until an extension is loaded.
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void WaitForExtensionLoad();
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Wait for the specified extension to crash. Returns true if it really
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // crashed.
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool WaitForExtensionCrash(const std::string& extension_id);
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // NotificationObserver
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void Observe(NotificationType type,
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationSource& source,
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                       const NotificationDetails& details);
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool loaded_;
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool installed_;
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // test_data/extensions.
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  FilePath test_data_dir_;
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  std::string last_loaded_extension_id_;
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int extension_installs_observed_;
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
128ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  // Temporary directory for testing.
129ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  ScopedTempDir temp_dir_;
130ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Specifies the type of UI (if any) to show during installation and what
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // user action to simulate.
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  enum InstallUIType {
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    INSTALL_UI_TYPE_NONE,
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    INSTALL_UI_TYPE_CANCEL,
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    INSTALL_UI_TYPE_NORMAL,
13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    INSTALL_UI_TYPE_AUTO_CONFIRM,
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  };
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool InstallOrUpdateExtension(const std::string& id, const FilePath& path,
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                InstallUIType ui_type,
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                int expected_change);
14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  bool InstallOrUpdateExtension(const std::string& id, const FilePath& path,
14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                InstallUIType ui_type,
14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                int expected_change,
14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                                Profile* profile);
147ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen  const Extension* LoadExtensionImpl(const FilePath& path,
148ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     bool incognito_enabled,
149ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen                                     bool fileaccess_enabled);
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  bool WaitForExtensionHostsToLoad();
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // When waiting for page action count to change, we wait until it reaches this
154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // value.
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int target_page_action_count_;
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // When waiting for visible page action count to change, we wait until it
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // reaches this value.
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int target_visible_page_action_count_;
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_BROWSERTEST_H_
163