extension_browsertest.h revision 0529e5d033099cbfc42635f6f6183833b09dff6e
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) { 1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) return InstallOrUpdateExtension(std::string(), path, INSTALL_UI_TYPE_NONE, 1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) expected_change, install_source, browser(), creation_flags, false); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Begins install process but simulates a user cancel. 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* StartInstallButCancel( 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path) { 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return InstallOrUpdateExtension( 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string(), path, INSTALL_UI_TYPE_CANCEL, 0); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch void ReloadExtension(const std::string extension_id); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UnloadExtension(const std::string& extension_id); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UninstallExtension(const std::string& extension_id); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void DisableExtension(const std::string& extension_id); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void EnableExtension(const std::string& extension_id); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the total number of page actions to change to |count|. 2138bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForPageActionCountChangeTo(int count) { 2148bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForPageActionCountChangeTo(count); 2158bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the number of visible page actions to change to |count|. 2188bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForPageActionVisibilityChangeTo(int count) { 2198bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForPageActionVisibilityChangeTo(count); 2208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Waits until an extension is installed and loaded. Returns true if an 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // install happened before timeout. 2248bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForExtensionInstall() { 2258bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionInstall(); 2268bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for an extension install error to be raised. Returns true if an 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // error was raised. 2308bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForExtensionInstallError() { 2318bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionInstallError(); 2328bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Waits until an extension is loaded and all view have loaded. 2358bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void WaitForExtensionAndViewLoad() { 2368bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionAndViewLoad(); 2378bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Waits until an extension is loaded. 2408bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) void WaitForExtensionLoad() { 2418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionLoad(); 2428bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Waits for an extension load error. Returns true if the error really 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // happened. 2468bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForExtensionLoadError() { 2478bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionLoadError(); 2488bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the specified extension to crash. Returns true if it really 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // crashed. 2528bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForExtensionCrash(const std::string& extension_id) { 2538bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionCrash(extension_id); 2548bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Wait for the crx installer to be done. Returns true if it really is done. 2578bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForCrxInstallerDone() { 2588bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForCrxInstallerDone(); 2598bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2608bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 2618bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) // Wait for all extension views to load. 2628bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) bool WaitForExtensionViewsToLoad() { 2638bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) return observer_->WaitForExtensionViewsToLoad(); 2648bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) } 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulates a page calling window.open on an URL and waits for the 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OpenWindow(content::WebContents* contents, 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool newtab_process_should_equal_opener, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents** newtab_result); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Simulates a page navigating itself to an URL and waits for the 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigation. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void NavigateInRenderer(content::WebContents* contents, const GURL& url); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Looks for an ExtensionHost whose URL has the given path component 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (including leading slash). Also verifies that the expected number of hosts 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // are loaded. 280f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extensions::ExtensionHost* FindHostWithPath( 281f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) extensions::ProcessManager* manager, 282f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::string& path, 283f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int expected_hosts); 284f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 28558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Returns 28658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // extensions::browsertest_util::ExecuteScriptInBackgroundPage(profile(), 28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // extension_id, script). 28858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string ExecuteScriptInBackgroundPage(const std::string& extension_id, 28958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& script); 29058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2910529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Returns 2920529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // extensions::browsertest_util::ExecuteScriptInBackgroundPageNoWait( 2930529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // profile(), extension_id, script). 2940529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch bool ExecuteScriptInBackgroundPageNoWait(const std::string& extension_id, 2950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const std::string& script); 2960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool loaded_; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool installed_; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS) 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // True if the command line should be tweaked as if ChromeOS user is 3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // already logged in. 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool set_chromeos_user_; 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // test_data/extensions. 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath test_data_dir_; 3088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) 3098bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles) scoped_ptr<ExtensionTestNotificationObserver> observer_; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Temporary directory for testing. 3132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir_; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Specifies the type of UI (if any) to show during installation and what 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // user action to simulate. 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) enum InstallUIType { 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALL_UI_TYPE_NONE, 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALL_UI_TYPE_CANCEL, 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALL_UI_TYPE_NORMAL, 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) INSTALL_UI_TYPE_AUTO_CONFIRM, 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* InstallOrUpdateExtension( 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& id, 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 3272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstallUIType ui_type, 3282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int expected_change); 3292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* InstallOrUpdateExtension( 3302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& id, 3312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 3322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) InstallUIType ui_type, 3332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int expected_change, 3342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Browser* browser, 3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::Extension::InitFromValueFlags creation_flags); 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const extensions::Extension* InstallOrUpdateExtension( 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::string& id, 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallUIType ui_type, 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_change, 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::Manifest::Location install_source); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* InstallOrUpdateExtension( 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& id, 3442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const base::FilePath& path, 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InstallUIType ui_type, 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int expected_change, 3472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) extensions::Manifest::Location install_source, 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser, 3494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) extensions::Extension::InitFromValueFlags creation_flags, 350a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool wait_for_idle); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Make the current channel "dev" for the duration of the test. 353ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch extensions::ScopedCurrentChannel current_channel_; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Disable external install UI. 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extensions::FeatureSwitch::ScopedOverride 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) override_prompt_for_external_extensions_; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The default profile to be used. 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Profile* profile_; 3615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 3625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Cache cache implementation. 3635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<extensions::ExtensionCacheFake> test_extension_cache_; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_BROWSERTEST_H_ 367