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