extension_browsertest.h revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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" 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" 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "extensions/browser/extension_system.h" 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/extension.h" 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "extensions/common/feature_switch.h" 243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "extensions/common/manifest.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ExtensionService; 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Profile; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 29f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace extensions { 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ExtensionCacheFake; 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ExtensionSet; 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ProcessManager; 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Base class for extension browser tests. Provides utilities for loading, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// unloading, and installing extensions. 378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)class ExtensionBrowserTest : virtual public InProcessBrowserTest { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Flags used to configure how the tests are run. 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum Flags { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFlagNone = 0, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow the extension to run in incognito mode. 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFlagEnableIncognito = 1 << 0, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow file access for the extension. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFlagEnableFileAccess = 1 << 1, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't fail when the loaded manifest has warnings (should only be used 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when testing deprecated features). 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFlagIgnoreManifestWarnings = 1 << 2, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allow older manifest versions (typically these can't be loaded - we allow 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // them for testing). 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kFlagAllowOldManifestVersions = 1 << 3, 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionBrowserTest(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ExtensionBrowserTest(); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Useful accessors. 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ExtensionService* extension_service() { 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return extensions::ExtensionSystem::Get(profile())->extension_service(); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 668bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) const std::string& last_loaded_extension_id() { 678bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->last_loaded_extension_id(); 688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Get the profile to use. 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual Profile* profile(); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) static const extensions::Extension* GetExtensionByPath( 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const extensions::ExtensionSet* extensions, const base::FilePath& path); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // InProcessBrowserTest 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SetUp() OVERRIDE; 78a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUpOnMainThread() OVERRIDE; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* LoadExtension(const base::FilePath& path); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same as above, but enables the extension in incognito mode first. 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* LoadExtensionIncognito( 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* LoadExtensionWithFlags( 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, int flags); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Loads unpacked extension from |path| with manifest |manifest_relative_path| 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and imitates that it is a component extension. 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |manifest_relative_path| is relative to |path|. 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* LoadExtensionAsComponentWithManifest( 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::CharType* manifest_relative_path); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Loads unpacked extension from |path| and imitates that it is a component 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // extension. Equivalent to 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LoadExtensionAsComponentWithManifest(path, extensions::kManifestFilename). 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* LoadExtensionAsComponent( 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pack the extension in |dir_path| into a crx file and return its path. 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return an empty FilePath if there were errors. 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath PackExtension(const base::FilePath& dir_path); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pack the extension in |dir_path| into a crx file at |crx_path|, using the 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // key |pem_path|. If |pem_path| does not exist, create a new key at 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |pem_out_path|. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return the path to the crx file, or an empty FilePath if there were errors. 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath PackExtensionWithOptions(const base::FilePath& dir_path, 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& crx_path, 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& pem_path, 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& pem_out_path); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |expected_change| indicates how many extensions should be installed (or 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // disabled, if negative). 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1 means you expect a new install, 0 means you expect an upgrade, -1 means 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you expect a failed upgrade. 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* InstallExtension(const base::FilePath& path, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_change) { 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return InstallOrUpdateExtension( 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), path, INSTALL_UI_TYPE_NONE, expected_change); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Same as above, but an install source other than Manifest::INTERNAL can be 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified. 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* InstallExtension( 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_change, 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::Manifest::Location install_source) { 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return InstallOrUpdateExtension(std::string(), 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) path, 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) INSTALL_UI_TYPE_NONE, 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) expected_change, 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) install_source); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Installs extension as if it came from the Chrome Webstore. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* InstallExtensionFromWebstore( 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, int expected_change); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same as above but passes an id to CrxInstaller and does not allow a 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // privilege increase. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* UpdateExtension(const std::string& id, 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_change) { 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InstallOrUpdateExtension(id, path, INSTALL_UI_TYPE_NONE, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_change); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Same as UpdateExtension but waits for the extension to be idle first. 153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const extensions::Extension* UpdateExtensionWaitForIdle( 154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& id, const base::FilePath& path, int expected_change); 155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same as |InstallExtension| but with the normal extension UI showing up 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (for e.g. info bar on success). 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* InstallExtensionWithUI( 1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int expected_change) { 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return InstallOrUpdateExtension( 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), path, INSTALL_UI_TYPE_NORMAL, expected_change); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* InstallExtensionWithUIAutoConfirm( 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_change, 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser) { 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return InstallOrUpdateExtension(std::string(), 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) path, 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) INSTALL_UI_TYPE_AUTO_CONFIRM, 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) expected_change, 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser, 1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::Extension::NO_FLAGS); 1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const extensions::Extension* InstallExtensionWithSourceAndFlags( 1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const base::FilePath& path, 1794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int expected_change, 1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::Manifest::Location install_source, 1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::Extension::InitFromValueFlags creation_flags) { 1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return InstallOrUpdateExtension(std::string(), path, INSTALL_UI_TYPE_NONE, 1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected_change, install_source, browser(), creation_flags, false); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Begins install process but simulates a user cancel. 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* StartInstallButCancel( 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) { 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return InstallOrUpdateExtension( 190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), path, INSTALL_UI_TYPE_CANCEL, 0); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 193eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void ReloadExtension(const std::string extension_id); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UnloadExtension(const std::string& extension_id); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UninstallExtension(const std::string& extension_id); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DisableExtension(const std::string& extension_id); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void EnableExtension(const std::string& extension_id); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the total number of page actions to change to |count|. 2048bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForPageActionCountChangeTo(int count) { 2058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForPageActionCountChangeTo(count); 2068bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the number of visible page actions to change to |count|. 2098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForPageActionVisibilityChangeTo(int count) { 2108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForPageActionVisibilityChangeTo(count); 2118bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Waits until an extension is installed and loaded. Returns true if an 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // install happened before timeout. 2158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForExtensionInstall() { 2168bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionInstall(); 2178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for an extension install error to be raised. Returns true if an 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // error was raised. 2218bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForExtensionInstallError() { 2228bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionInstallError(); 2238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Waits until an extension is loaded and all view have loaded. 2268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void WaitForExtensionAndViewLoad() { 2278bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionAndViewLoad(); 2288bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Waits until an extension is loaded. 2318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void WaitForExtensionLoad() { 2328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionLoad(); 2338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Waits for an extension load error. Returns true if the error really 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // happened. 2378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForExtensionLoadError() { 2388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionLoadError(); 2398bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the specified extension to crash. Returns true if it really 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // crashed. 2438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForExtensionCrash(const std::string& extension_id) { 2448bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionCrash(extension_id); 2458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the crx installer to be done. Returns true if it really is done. 2488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForCrxInstallerDone() { 2498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForCrxInstallerDone(); 2508bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2518bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Wait for all extension views to load. 2538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForExtensionViewsToLoad() { 2548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionViewsToLoad(); 2558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulates a page calling window.open on an URL and waits for the 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation. 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenWindow(content::WebContents* contents, 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool newtab_process_should_equal_opener, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents** newtab_result); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulates a page navigating itself to an URL and waits for the 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation. 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateInRenderer(content::WebContents* contents, const GURL& url); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Looks for an ExtensionHost whose URL has the given path component 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (including leading slash). Also verifies that the expected number of hosts 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are loaded. 271f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extensions::ExtensionHost* FindHostWithPath( 272f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extensions::ProcessManager* manager, 273f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& path, 274f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int expected_hosts); 275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Returns 27758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // extensions::browsertest_util::ExecuteScriptInBackgroundPage(profile(), 27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // extension_id, script). 27958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string ExecuteScriptInBackgroundPage(const std::string& extension_id, 28058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& script); 28158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool loaded_; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool installed_; 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS) 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // True if the command line should be tweaked as if ChromeOS user is 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // already logged in. 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool set_chromeos_user_; 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test_data/extensions. 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_data_dir_; 2938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2948bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<ExtensionTestNotificationObserver> observer_; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Temporary directory for testing. 2982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir_; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Specifies the type of UI (if any) to show during installation and what 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // user action to simulate. 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum InstallUIType { 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALL_UI_TYPE_NONE, 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALL_UI_TYPE_CANCEL, 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALL_UI_TYPE_NORMAL, 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALL_UI_TYPE_AUTO_CONFIRM, 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* InstallOrUpdateExtension( 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& id, 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstallUIType ui_type, 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int expected_change); 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* InstallOrUpdateExtension( 3152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& id, 3162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 3172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstallUIType ui_type, 3182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int expected_change, 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* browser, 3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::Extension::InitFromValueFlags creation_flags); 3212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* InstallOrUpdateExtension( 3222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& id, 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallUIType ui_type, 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_change, 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::Manifest::Location install_source); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* InstallOrUpdateExtension( 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& id, 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallUIType ui_type, 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_change, 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::Manifest::Location install_source, 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser, 3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::Extension::InitFromValueFlags creation_flags, 335a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool wait_for_idle); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make the current channel "dev" for the duration of the test. 338ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch extensions::ScopedCurrentChannel current_channel_; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable external install UI. 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::FeatureSwitch::ScopedOverride 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) override_prompt_for_external_extensions_; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The default profile to be used. 3452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile_; 3465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Cache cache implementation. 3485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<extensions::ExtensionCacheFake> test_extension_cache_; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_BROWSERTEST_H_ 352