extension_browsertest.h revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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" 148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#include "chrome/browser/extensions/extension_test_notification_observer.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/browser.h" 17ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch#include "chrome/common/extensions/features/feature_channel.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/in_process_browser_test.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h" 2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "extensions/browser/extension_host.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) 83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Load extension and enable it in incognito mode. 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* LoadExtensionIncognito( 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Load extension from the |path| folder. |flags| is bit mask of values from 88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // |Flags| enum. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* LoadExtensionWithFlags( 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, int flags); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Same as above, but sets the installation parameter to the extension 93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // preferences. 94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const extensions::Extension* LoadExtensionWithInstallParam( 95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const base::FilePath& path, 96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int flags, 97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::string& install_param); 98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Loads unpacked extension from |path| with manifest |manifest_relative_path| 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and imitates that it is a component extension. 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // |manifest_relative_path| is relative to |path|. 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* LoadExtensionAsComponentWithManifest( 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath::CharType* manifest_relative_path); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Loads unpacked extension from |path| and imitates that it is a component 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // extension. Equivalent to 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // LoadExtensionAsComponentWithManifest(path, extensions::kManifestFilename). 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* LoadExtensionAsComponent( 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pack the extension in |dir_path| into a crx file and return its path. 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return an empty FilePath if there were errors. 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath PackExtension(const base::FilePath& dir_path); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Pack the extension in |dir_path| into a crx file at |crx_path|, using the 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // key |pem_path|. If |pem_path| does not exist, create a new key at 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |pem_out_path|. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return the path to the crx file, or an empty FilePath if there were errors. 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath PackExtensionWithOptions(const base::FilePath& dir_path, 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& crx_path, 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& pem_path, 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& pem_out_path); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |expected_change| indicates how many extensions should be installed (or 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // disabled, if negative). 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1 means you expect a new install, 0 means you expect an upgrade, -1 means 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // you expect a failed upgrade. 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* InstallExtension(const base::FilePath& path, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_change) { 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return InstallOrUpdateExtension( 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), path, INSTALL_UI_TYPE_NONE, expected_change); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Same as above, but an install source other than Manifest::INTERNAL can be 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // specified. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* InstallExtension( 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_change, 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::Manifest::Location install_source) { 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return InstallOrUpdateExtension(std::string(), 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) path, 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) INSTALL_UI_TYPE_NONE, 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) expected_change, 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) install_source); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Installs extension as if it came from the Chrome Webstore. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* InstallExtensionFromWebstore( 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, int expected_change); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same as above but passes an id to CrxInstaller and does not allow a 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // privilege increase. 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* UpdateExtension(const std::string& id, 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_change) { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InstallOrUpdateExtension(id, path, INSTALL_UI_TYPE_NONE, 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_change); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Same as UpdateExtension but waits for the extension to be idle first. 162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const extensions::Extension* UpdateExtensionWaitForIdle( 163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const std::string& id, const base::FilePath& path, int expected_change); 164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Same as |InstallExtension| but with the normal extension UI showing up 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (for e.g. info bar on success). 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* InstallExtensionWithUI( 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int expected_change) { 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return InstallOrUpdateExtension( 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), path, INSTALL_UI_TYPE_NORMAL, expected_change); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* InstallExtensionWithUIAutoConfirm( 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_change, 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser) { 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return InstallOrUpdateExtension(std::string(), 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) path, 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) INSTALL_UI_TYPE_AUTO_CONFIRM, 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) expected_change, 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) browser, 1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::Extension::NO_FLAGS); 1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const extensions::Extension* InstallExtensionWithSourceAndFlags( 1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) const base::FilePath& path, 1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) int expected_change, 1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::Manifest::Location install_source, 1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::Extension::InitFromValueFlags creation_flags) { 191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return InstallOrUpdateExtension(std::string(), 192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) path, 193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) INSTALL_UI_TYPE_NONE, 194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) expected_change, 195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) install_source, 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) browser(), 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) creation_flags, 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false, 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false); 200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const extensions::Extension* InstallEphemeralAppWithSourceAndFlags( 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::FilePath& path, 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int expected_change, 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) extensions::Manifest::Location install_source, 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) extensions::Extension::InitFromValueFlags creation_flags) { 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return InstallOrUpdateExtension(std::string(), 208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) path, 209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) INSTALL_UI_TYPE_NONE, 210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) expected_change, 211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) install_source, 212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) browser(), 213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) creation_flags, 214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false, 215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) true); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Begins install process but simulates a user cancel. 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* StartInstallButCancel( 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) { 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return InstallOrUpdateExtension( 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), path, INSTALL_UI_TYPE_CANCEL, 0); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void ReloadExtension(const std::string extension_id); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UnloadExtension(const std::string& extension_id); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UninstallExtension(const std::string& extension_id); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DisableExtension(const std::string& extension_id); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void EnableExtension(const std::string& extension_id); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the total number of page actions to change to |count|. 2368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForPageActionCountChangeTo(int count) { 2378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForPageActionCountChangeTo(count); 2388bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the number of visible page actions to change to |count|. 2418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForPageActionVisibilityChangeTo(int count) { 2428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForPageActionVisibilityChangeTo(count); 2438bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Waits until an extension is installed and loaded. Returns true if an 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // install happened before timeout. 2478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForExtensionInstall() { 2488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionInstall(); 2498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for an extension install error to be raised. Returns true if an 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // error was raised. 2538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForExtensionInstallError() { 2548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionInstallError(); 2558bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2568bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Waits until an extension is loaded and all view have loaded. 2588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void WaitForExtensionAndViewLoad() { 2598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionAndViewLoad(); 2608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Waits until an extension is loaded. 2638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void WaitForExtensionLoad() { 2648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionLoad(); 2658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Waits for an extension load error. Returns true if the error really 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // happened. 2698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForExtensionLoadError() { 2708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionLoadError(); 2718bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the specified extension to crash. Returns true if it really 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // crashed. 2758bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForExtensionCrash(const std::string& extension_id) { 2768bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionCrash(extension_id); 2778bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the crx installer to be done. Returns true if it really is done. 2808bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForCrxInstallerDone() { 2818bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForCrxInstallerDone(); 2828bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2838bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2848bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Wait for all extension views to load. 2858bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForExtensionViewsToLoad() { 2868bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionViewsToLoad(); 2878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulates a page calling window.open on an URL and waits for the 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation. 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenWindow(content::WebContents* contents, 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool newtab_process_should_equal_opener, 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents** newtab_result); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulates a page navigating itself to an URL and waits for the 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation. 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateInRenderer(content::WebContents* contents, const GURL& url); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Looks for an ExtensionHost whose URL has the given path component 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (including leading slash). Also verifies that the expected number of hosts 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are loaded. 303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extensions::ExtensionHost* FindHostWithPath( 304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extensions::ProcessManager* manager, 305f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& path, 306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int expected_hosts); 307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 30858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Returns 30958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // extensions::browsertest_util::ExecuteScriptInBackgroundPage(profile(), 31058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // extension_id, script). 31158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string ExecuteScriptInBackgroundPage(const std::string& extension_id, 31258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& script); 31358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3140529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Returns 3150529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // extensions::browsertest_util::ExecuteScriptInBackgroundPageNoWait( 3160529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // profile(), extension_id, script). 3170529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool ExecuteScriptInBackgroundPageNoWait(const std::string& extension_id, 3180529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const std::string& script); 3190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool loaded_; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool installed_; 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS) 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // True if the command line should be tweaked as if ChromeOS user is 3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // already logged in. 3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool set_chromeos_user_; 3275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 3285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test_data/extensions. 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_data_dir_; 3318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<ExtensionTestNotificationObserver> observer_; 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Temporary directory for testing. 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir_; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Specifies the type of UI (if any) to show during installation and what 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // user action to simulate. 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum InstallUIType { 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALL_UI_TYPE_NONE, 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALL_UI_TYPE_CANCEL, 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALL_UI_TYPE_NORMAL, 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALL_UI_TYPE_AUTO_CONFIRM, 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* InstallOrUpdateExtension( 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& id, 3492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstallUIType ui_type, 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int expected_change); 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* InstallOrUpdateExtension( 3532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& id, 3542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 3552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstallUIType ui_type, 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int expected_change, 3572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* browser, 3584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::Extension::InitFromValueFlags creation_flags); 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* InstallOrUpdateExtension( 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& id, 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallUIType ui_type, 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_change, 3642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::Manifest::Location install_source); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* InstallOrUpdateExtension( 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& id, 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallUIType ui_type, 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_change, 3702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::Manifest::Location install_source, 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser, 3724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::Extension::InitFromValueFlags creation_flags, 373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool wait_for_idle, 374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) bool is_ephemeral); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make the current channel "dev" for the duration of the test. 377ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch extensions::ScopedCurrentChannel current_channel_; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable external install UI. 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::FeatureSwitch::ScopedOverride 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) override_prompt_for_external_extensions_; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The default profile to be used. 3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile_; 3855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Cache cache implementation. 3875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<extensions::ExtensionCacheFake> test_extension_cache_; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_BROWSERTEST_H_ 391