extension_browsertest.h revision f2477e01787aa58f445919b809d89e252beef54f
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_BROWSERTEST_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_EXTENSIONS_EXTENSION_BROWSERTEST_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/file_path.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/extension_host.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/extensions/extension_system.h" 168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/extensions/extension_test_notification_observer.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" 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/feature_switch.h" 233551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtensionService; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtensionSet; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Profile; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace extensions { 30f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ProcessManager; 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Base class for extension browser tests. Provides utilities for loading, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unloading, and installing extensions. 358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class ExtensionBrowserTest : virtual public InProcessBrowserTest { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Flags used to configure how the tests are run. 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Flags { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFlagNone = 0, 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow the extension to run in incognito mode. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFlagEnableIncognito = 1 << 0, 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow file access for the extension. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFlagEnableFileAccess = 1 << 1, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't fail when the loaded manifest has warnings (should only be used 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when testing deprecated features). 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFlagIgnoreManifestWarnings = 1 << 2, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow older manifest versions (typically these can't be loaded - we allow 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // them for testing). 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFlagAllowOldManifestVersions = 1 << 3, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionBrowserTest(); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ExtensionBrowserTest(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Useful accessors. 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extension_service() { 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return extensions::ExtensionSystem::Get(profile())->extension_service(); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& last_loaded_extension_id() { 658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->last_loaded_extension_id(); 668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get the profile to use. 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile(); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const extensions::Extension* GetExtensionByPath( 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const ExtensionSet* extensions, const base::FilePath& path); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InProcessBrowserTest 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUpCommandLine(CommandLine* command_line) OVERRIDE; 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* LoadExtension(const base::FilePath& path); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same as above, but enables the extension in incognito mode first. 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* LoadExtensionIncognito( 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* LoadExtensionWithFlags( 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, int flags); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Loads unpacked extension from |path| with manifest |manifest_relative_path| 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and imitates that it is a component extension. 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |manifest_relative_path| is relative to |path|. 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* LoadExtensionAsComponentWithManifest( 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::CharType* manifest_relative_path); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Loads unpacked extension from |path| and imitates that it is a component 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // extension. Equivalent to 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LoadExtensionAsComponentWithManifest(path, extensions::kManifestFilename). 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* LoadExtensionAsComponent( 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pack the extension in |dir_path| into a crx file and return its path. 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return an empty FilePath if there were errors. 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath PackExtension(const base::FilePath& dir_path); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pack the extension in |dir_path| into a crx file at |crx_path|, using the 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // key |pem_path|. If |pem_path| does not exist, create a new key at 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |pem_out_path|. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return the path to the crx file, or an empty FilePath if there were errors. 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath PackExtensionWithOptions(const base::FilePath& dir_path, 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& crx_path, 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& pem_path, 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& pem_out_path); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |expected_change| indicates how many extensions should be installed (or 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // disabled, if negative). 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1 means you expect a new install, 0 means you expect an upgrade, -1 means 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you expect a failed upgrade. 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* InstallExtension(const base::FilePath& path, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_change) { 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return InstallOrUpdateExtension( 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), path, INSTALL_UI_TYPE_NONE, expected_change); 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Same as above, but an install source other than Manifest::INTERNAL can be 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified. 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* InstallExtension( 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_change, 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::Manifest::Location install_source) { 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return InstallOrUpdateExtension(std::string(), 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) path, 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) INSTALL_UI_TYPE_NONE, 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) expected_change, 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) install_source); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Installs extension as if it came from the Chrome Webstore. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* InstallExtensionFromWebstore( 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, int expected_change); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same as above but passes an id to CrxInstaller and does not allow a 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // privilege increase. 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* UpdateExtension(const std::string& id, 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_change) { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InstallOrUpdateExtension(id, path, INSTALL_UI_TYPE_NONE, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_change); 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Same as UpdateExtension but waits for the extension to be idle first. 150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const extensions::Extension* UpdateExtensionWaitForIdle( 151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& id, const base::FilePath& path, int expected_change); 152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same as |InstallExtension| but with the normal extension UI showing up 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (for e.g. info bar on success). 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* InstallExtensionWithUI( 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int expected_change) { 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return InstallOrUpdateExtension( 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), path, INSTALL_UI_TYPE_NORMAL, expected_change); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* InstallExtensionWithUIAutoConfirm( 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_change, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser) { 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return InstallOrUpdateExtension(std::string(), 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) path, 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) INSTALL_UI_TYPE_AUTO_CONFIRM, 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) expected_change, 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser, 1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::Extension::NO_FLAGS); 1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const extensions::Extension* InstallExtensionWithSourceAndFlags( 1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const base::FilePath& path, 1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int expected_change, 1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::Manifest::Location install_source, 1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::Extension::InitFromValueFlags creation_flags) { 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return InstallOrUpdateExtension(std::string(), path, INSTALL_UI_TYPE_NONE, 1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected_change, install_source, browser(), creation_flags, false); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Begins install process but simulates a user cancel. 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* StartInstallButCancel( 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) { 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return InstallOrUpdateExtension( 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), path, INSTALL_UI_TYPE_CANCEL, 0); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void ReloadExtension(const std::string extension_id); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UnloadExtension(const std::string& extension_id); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UninstallExtension(const std::string& extension_id); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DisableExtension(const std::string& extension_id); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void EnableExtension(const std::string& extension_id); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the total number of page actions to change to |count|. 2018bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForPageActionCountChangeTo(int count) { 2028bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForPageActionCountChangeTo(count); 2038bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the number of visible page actions to change to |count|. 2068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForPageActionVisibilityChangeTo(int count) { 2078bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForPageActionVisibilityChangeTo(count); 2088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Waits until an extension is installed and loaded. Returns true if an 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // install happened before timeout. 2128bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForExtensionInstall() { 2138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionInstall(); 2148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for an extension install error to be raised. Returns true if an 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // error was raised. 2188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForExtensionInstallError() { 2198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionInstallError(); 2208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Waits until an extension is loaded and all view have loaded. 2238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void WaitForExtensionAndViewLoad() { 2248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionAndViewLoad(); 2258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Waits until an extension is loaded. 2288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void WaitForExtensionLoad() { 2298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionLoad(); 2308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Waits for an extension load error. Returns true if the error really 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // happened. 2348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForExtensionLoadError() { 2358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionLoadError(); 2368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the specified extension to crash. Returns true if it really 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // crashed. 2408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForExtensionCrash(const std::string& extension_id) { 2418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionCrash(extension_id); 2428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the crx installer to be done. Returns true if it really is done. 2458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForCrxInstallerDone() { 2468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForCrxInstallerDone(); 2478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Wait for all extension views to load. 2508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForExtensionViewsToLoad() { 2518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionViewsToLoad(); 2528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulates a page calling window.open on an URL and waits for the 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation. 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenWindow(content::WebContents* contents, 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool newtab_process_should_equal_opener, 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents** newtab_result); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulates a page navigating itself to an URL and waits for the 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation. 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateInRenderer(content::WebContents* contents, const GURL& url); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Looks for an ExtensionHost whose URL has the given path component 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (including leading slash). Also verifies that the expected number of hosts 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are loaded. 268f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extensions::ExtensionHost* FindHostWithPath( 269f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extensions::ProcessManager* manager, 270f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& path, 271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int expected_hosts); 272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 27358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Returns 27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // extensions::browsertest_util::ExecuteScriptInBackgroundPage(profile(), 27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // extension_id, script). 27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string ExecuteScriptInBackgroundPage(const std::string& extension_id, 27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& script); 27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool loaded_; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool installed_; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test_data/extensions. 2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_data_dir_; 2848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<ExtensionTestNotificationObserver> observer_; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Temporary directory for testing. 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir_; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Specifies the type of UI (if any) to show during installation and what 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // user action to simulate. 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum InstallUIType { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALL_UI_TYPE_NONE, 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALL_UI_TYPE_CANCEL, 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALL_UI_TYPE_NORMAL, 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALL_UI_TYPE_AUTO_CONFIRM, 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* InstallOrUpdateExtension( 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& id, 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstallUIType ui_type, 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int expected_change); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* InstallOrUpdateExtension( 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& id, 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstallUIType ui_type, 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int expected_change, 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* browser, 3114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::Extension::InitFromValueFlags creation_flags); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* InstallOrUpdateExtension( 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& id, 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallUIType ui_type, 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_change, 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::Manifest::Location install_source); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* InstallOrUpdateExtension( 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& id, 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallUIType ui_type, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_change, 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::Manifest::Location install_source, 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser, 3254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::Extension::InitFromValueFlags creation_flags, 326a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool wait_for_idle); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make the current channel "dev" for the duration of the test. 329ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch extensions::ScopedCurrentChannel current_channel_; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable external install UI. 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::FeatureSwitch::ScopedOverride 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) override_prompt_for_external_extensions_; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The default profile to be used. 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile_; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_BROWSERTEST_H_ 340