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