1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file. 4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/files/file_path.h" 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/macros.h" 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/stringprintf.h" 8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/extensions/active_script_controller.h" 9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/extensions/extension_action.h" 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/extensions/extension_browsertest.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/extensions/tab_helper.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/extensions/test_extension_dir.h" 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/ui/browser.h" 14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/ui/tabs/tab_strip_model.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/test/base/ui_test_utils.h" 1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "content/public/test/browser_test_utils.h" 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/common/feature_switch.h" 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "extensions/common/switches.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "extensions/test/extension_test_message_listener.h" 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "net/test/embedded_test_server/embedded_test_server.h" 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace extensions { 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace { 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kAllHostsScheme[] = "*://*/*"; 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kExplicitHostsScheme[] = "http://127.0.0.1/*"; 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kBackgroundScript[] = 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "\"background\": {\"scripts\": [\"script.js\"]}"; 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kBackgroundScriptSource[] = 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "var listener = function(tabId) {\n" 33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " chrome.tabs.onUpdated.removeListener(listener);\n" 34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " chrome.tabs.executeScript(tabId, {\n" 35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " code: \"chrome.test.sendMessage('inject succeeded');\"\n" 36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " });" 37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "};\n" 38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "chrome.tabs.onUpdated.addListener(listener);"; 39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kContentScriptSource[] = 40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "chrome.test.sendMessage('inject succeeded');"; 41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kInjectSucceeded[] = "inject succeeded"; 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)enum InjectionType { 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CONTENT_SCRIPT, 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXECUTE_SCRIPT 47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)enum HostType { 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ALL_HOSTS, 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPLICIT_HOSTS 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)enum RequiresConsent { 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) REQUIRES_CONSENT, 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DOES_NOT_REQUIRE_CONSENT 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Runs all pending tasks in the renderer associated with |web_contents|. 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Returns true on success. 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool RunAllPendingInRenderer(content::WebContents* web_contents) { 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // This is slight hack to achieve a RunPendingInRenderer() method. Since IPCs 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // are sent synchronously, anything started prior to this method will finish 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // before this method returns (as content::ExecuteScript() is synchronous). 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return content::ExecuteScript(web_contents, "1 == 1;"); 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ActiveScriptControllerBrowserTest : public ExtensionBrowserTest { 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ActiveScriptControllerBrowserTest() {} 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE; 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void TearDownOnMainThread() OVERRIDE; 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 77cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Returns an extension with the given |host_type| and |injection_type|. If 78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // one already exists, the existing extension will be returned. Othewrwise, 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // one will be created. 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This could potentially return NULL if LoadExtension() fails. 8146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const Extension* CreateExtension(HostType host_type, 8246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) InjectionType injection_type); 83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScopedVector<TestExtensionDir> test_extension_dirs_; 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::vector<const Extension*> extensions_; 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void ActiveScriptControllerBrowserTest::SetUpCommandLine( 90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::CommandLine* command_line) { 91cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ExtensionBrowserTest::SetUpCommandLine(command_line); 92cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // We append the actual switch to the commandline because it needs to be 93cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // passed over to the renderer, which a FeatureSwitch::ScopedOverride will 94cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // not do. 95cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) command_line->AppendSwitch(switches::kEnableScriptsRequireAction); 96cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 97cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void ActiveScriptControllerBrowserTest::TearDownOnMainThread() { 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_extension_dirs_.clear(); 100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 10246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)const Extension* ActiveScriptControllerBrowserTest::CreateExtension( 103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) HostType host_type, InjectionType injection_type) { 104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string name = 105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::StringPrintf( 106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "%s %s", 107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) injection_type == CONTENT_SCRIPT ? 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "content_script" : "execute_script", 109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) host_type == ALL_HOSTS ? "all_hosts" : "explicit_hosts"); 110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const char* permission_scheme = 112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) host_type == ALL_HOSTS ? kAllHostsScheme : kExplicitHostsScheme; 113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string permissions = base::StringPrintf( 115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "\"permissions\": [\"tabs\", \"%s\"]", permission_scheme); 116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string scripts; 118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string script_source; 119cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (injection_type == CONTENT_SCRIPT) { 120cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scripts = base::StringPrintf( 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "\"content_scripts\": [" 122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " {" 123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " \"matches\": [\"%s\"]," 124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " \"js\": [\"script.js\"]," 125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " \"run_at\": \"document_start\"" 126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " }" 127cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "]", 128cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) permission_scheme); 129cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } else { 130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scripts = kBackgroundScript; 131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 133cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string manifest = base::StringPrintf( 134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "{" 135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " \"name\": \"%s\"," 136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " \"version\": \"1.0\"," 137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " \"manifest_version\": 2," 138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " %s," 139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) " %s" 140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "}", 141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) name.c_str(), 142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) permissions.c_str(), 143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scripts.c_str()); 144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<TestExtensionDir> dir(new TestExtensionDir); 146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dir->WriteManifest(manifest); 147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) dir->WriteFile(FILE_PATH_LITERAL("script.js"), 148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) injection_type == CONTENT_SCRIPT ? kContentScriptSource : 149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kBackgroundScriptSource); 150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const Extension* extension = LoadExtension(dir->unpacked_path()); 152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (extension) { 153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_extension_dirs_.push_back(dir.release()); 154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) extensions_.push_back(extension); 155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If extension is NULL here, it will be caught later in the test. 158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return extension; 159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 160cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class ActiveScriptTester { 162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public: 163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ActiveScriptTester(const std::string& name, 164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const Extension* extension, 165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Browser* browser, 166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequiresConsent requires_consent, 167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InjectionType type); 168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ~ActiveScriptTester(); 169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) testing::AssertionResult Verify(); 171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Returns the active script controller, or NULL if one does not exist. 174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ActiveScriptController* GetActiveScriptController(); 175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Returns true if the extension has a pending request with the active script 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // controller. 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool WantsToRun(); 179cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The name of the extension, and also the message it sends. 181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) std::string name_; 182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 183cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The extension associated with this tester. 184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const Extension* extension_; 185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The browser the tester is running in. 187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Browser* browser_; 188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Whether or not the extension has permission to run the script without 190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // asking the user. 191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequiresConsent requires_consent_; 192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The type of injection this tester uses. 194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InjectionType type_; 195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // All of these extensions should inject a script (either through content 197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // scripts or through chrome.tabs.executeScript()) that sends a message with 198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // the |kInjectSucceeded| message. 199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) linked_ptr<ExtensionTestMessageListener> inject_success_listener_; 200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ActiveScriptTester::ActiveScriptTester(const std::string& name, 203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const Extension* extension, 204cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Browser* browser, 205cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) RequiresConsent requires_consent, 206cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) InjectionType type) 207cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : name_(name), 208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) extension_(extension), 209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) browser_(browser), 210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) requires_consent_(requires_consent), 211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) type_(type), 212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) inject_success_listener_( 213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new ExtensionTestMessageListener(kInjectSucceeded, 214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) false /* won't reply */)) { 215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) inject_success_listener_->set_extension_id(extension->id()); 216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)ActiveScriptTester::~ActiveScriptTester() { 219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)testing::AssertionResult ActiveScriptTester::Verify() { 222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!extension_) 223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return testing::AssertionFailure() << "Could not load extension: " << name_; 224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch content::WebContents* web_contents = 226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch browser_ ? browser_->tab_strip_model()->GetActiveWebContents() : NULL; 227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!web_contents) 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return testing::AssertionFailure() << "No web contents."; 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Give the extension plenty of time to inject. 231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (!RunAllPendingInRenderer(web_contents)) 232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return testing::AssertionFailure() << "Could not run pending in renderer."; 233cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 234cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Make sure all running tasks are complete. 235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ActiveScriptController* controller = GetActiveScriptController(); 238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!controller) 239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return testing::AssertionFailure() << "Could not find controller."; 240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool wants_to_run = WantsToRun(); 242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // An extension should have an action displayed iff it requires user consent. 2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if ((requires_consent_ == REQUIRES_CONSENT && !wants_to_run) || 2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (requires_consent_ == DOES_NOT_REQUIRE_CONSENT && wants_to_run)) { 246cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return testing::AssertionFailure() 2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << "Improper wants to run for " << name_ << ": expected " 2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << (requires_consent_ == REQUIRES_CONSENT) << ", found " 2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << wants_to_run; 250cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 251cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If the extension has permission, we should be able to simply wait for it 253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // to execute. 254cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (requires_consent_ == DOES_NOT_REQUIRE_CONSENT) { 255cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) inject_success_listener_->WaitUntilSatisfied(); 256cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return testing::AssertionSuccess(); 257cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 258cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 259cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Otherwise, we don't have permission, and have to grant it. Ensure the 260cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // script has *not* already executed. 261cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (inject_success_listener_->was_satisfied()) { 262cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return testing::AssertionFailure() << 263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) name_ << "'s script ran without permission."; 264cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // If we reach this point, we should always want to run. 2671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK(wants_to_run); 268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Grant permission by clicking on the extension action. 2701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci controller->OnClicked(extension_); 271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Now, the extension should be able to inject the script. 273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) inject_success_listener_->WaitUntilSatisfied(); 274cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // The extension should no longer want to run. 2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci wants_to_run = WantsToRun(); 2771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (wants_to_run) { 278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return testing::AssertionFailure() 2791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci << "Extension " << name_ << " still wants to run after injecting."; 280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return testing::AssertionSuccess(); 283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciActiveScriptController* ActiveScriptTester::GetActiveScriptController() { 286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::WebContents* web_contents = 287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) browser_ ? browser_->tab_strip_model()->GetActiveWebContents() : NULL; 288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (!web_contents) 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return NULL; 291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) TabHelper* tab_helper = TabHelper::FromWebContents(web_contents); 2931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return tab_helper ? tab_helper->active_script_controller() : NULL; 294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 2961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool ActiveScriptTester::WantsToRun() { 297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ActiveScriptController* controller = GetActiveScriptController(); 2981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return controller ? controller->WantsToRun(extension_) : false; 299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(ActiveScriptControllerBrowserTest, 302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ActiveScriptsAreDisplayedAndDelayExecution) { 303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::FilePath active_script_path = 304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) test_data_dir_.AppendASCII("active_script"); 305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const char* kExtensionNames[] = { 307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "inject_scripts_all_hosts", 308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "inject_scripts_explicit_hosts", 309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "content_scripts_all_hosts", 310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "content_scripts_explicit_hosts" 311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }; 312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // First, we load up three extensions: 314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // - An extension that injects scripts into all hosts, 315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // - An extension that injects scripts into explicit hosts, 316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // - An extension with a content script that runs on all hosts, 317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // - An extension with a content script that runs on explicit hosts. 318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // The extensions that operate on explicit hosts have permission; the ones 319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // that request all hosts require user consent. 320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ActiveScriptTester testers[] = { 321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ActiveScriptTester( 322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kExtensionNames[0], 32346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateExtension(ALL_HOSTS, EXECUTE_SCRIPT), 324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) browser(), 325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) REQUIRES_CONSENT, 326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXECUTE_SCRIPT), 327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ActiveScriptTester( 328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kExtensionNames[1], 32946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateExtension(EXPLICIT_HOSTS, EXECUTE_SCRIPT), 330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) browser(), 331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DOES_NOT_REQUIRE_CONSENT, 332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXECUTE_SCRIPT), 333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ActiveScriptTester( 334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kExtensionNames[2], 33546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateExtension(ALL_HOSTS, CONTENT_SCRIPT), 336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) browser(), 337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) REQUIRES_CONSENT, 338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CONTENT_SCRIPT), 339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ActiveScriptTester( 340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kExtensionNames[3], 34146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateExtension(EXPLICIT_HOSTS, CONTENT_SCRIPT), 342cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) browser(), 343cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DOES_NOT_REQUIRE_CONSENT, 344cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CONTENT_SCRIPT), 345cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }; 346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Navigate to an URL (which matches the explicit host specified in the 348cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // extension content_scripts_explicit_hosts). All four extensions should 349cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // inject the script. 350cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui_test_utils::NavigateToURL( 352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) browser(), embedded_test_server()->GetURL("/extensions/test_file.html")); 353cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 354cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t i = 0u; i < arraysize(testers); ++i) 355cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(testers[i].Verify()) << kExtensionNames[i]; 356cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 35846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Test that removing an extension with pending injections a) removes the 35946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// pending injections for that extension, and b) does not affect pending 36046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// injections for other extensions. 36146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)IN_PROC_BROWSER_TEST_F(ActiveScriptControllerBrowserTest, 36246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) RemoveExtensionWithPendingInjections) { 36346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Load up two extensions, each with content scripts. 36446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const Extension* extension1 = CreateExtension(ALL_HOSTS, CONTENT_SCRIPT); 36546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_TRUE(extension1); 36646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const Extension* extension2 = CreateExtension(ALL_HOSTS, CONTENT_SCRIPT); 36746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_TRUE(extension2); 36846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 36946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_NE(extension1->id(), extension2->id()); 37046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 37146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) content::WebContents* web_contents = 37246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) browser()->tab_strip_model()->GetActiveWebContents(); 37346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_TRUE(web_contents); 37446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ActiveScriptController* active_script_controller = 37546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ActiveScriptController::GetForWebContents(web_contents); 37646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_TRUE(active_script_controller); 37746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 37846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 37946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ui_test_utils::NavigateToURL( 38046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) browser(), embedded_test_server()->GetURL("/extensions/test_file.html")); 38146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 38246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Both extensions should have pending requests. 3831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(active_script_controller->WantsToRun(extension1)); 3841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(active_script_controller->WantsToRun(extension2)); 38546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 38646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // Unload one of the extensions. 38746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) UnloadExtension(extension2->id()); 38846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 389116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_TRUE(RunAllPendingInRenderer(web_contents)); 39046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 39146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // We should have pending requests for extension1, but not the removed 39246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // extension2. 3931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_TRUE(active_script_controller->WantsToRun(extension1)); 3941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_FALSE(active_script_controller->WantsToRun(extension2)); 39546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 39646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // We should still be able to run the request for extension1. 39746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) ExtensionTestMessageListener inject_success_listener( 39846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) new ExtensionTestMessageListener(kInjectSucceeded, 39946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) false /* won't reply */)); 40046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) inject_success_listener.set_extension_id(extension1->id()); 40146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) active_script_controller->OnClicked(extension1); 40246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) inject_success_listener.WaitUntilSatisfied(); 40346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 40446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 405cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// A version of the test with the flag off, in order to test that everything 406cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// still works as expected. 407cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class FlagOffActiveScriptControllerBrowserTest 408cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) : public ActiveScriptControllerBrowserTest { 409cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private: 410cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Simply don't append the flag. 411cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE { 412cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ExtensionBrowserTest::SetUpCommandLine(command_line); 413cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 414cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 415cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 416cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)IN_PROC_BROWSER_TEST_F(FlagOffActiveScriptControllerBrowserTest, 417cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ScriptsExecuteWhenFlagAbsent) { 418cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const char* kExtensionNames[] = { 419cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "content_scripts_all_hosts", 420cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) "inject_scripts_all_hosts", 421cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }; 422cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ActiveScriptTester testers[] = { 423cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ActiveScriptTester( 424cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kExtensionNames[0], 42546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateExtension(ALL_HOSTS, CONTENT_SCRIPT), 426cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) browser(), 427cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DOES_NOT_REQUIRE_CONSENT, 428cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CONTENT_SCRIPT), 429cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ActiveScriptTester( 430cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) kExtensionNames[1], 43146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CreateExtension(ALL_HOSTS, EXECUTE_SCRIPT), 432cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) browser(), 433cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DOES_NOT_REQUIRE_CONSENT, 434cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXECUTE_SCRIPT), 435cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) }; 436cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 437cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); 438cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ui_test_utils::NavigateToURL( 439cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) browser(), embedded_test_server()->GetURL("/extensions/test_file.html")); 440cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 441cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t i = 0u; i < arraysize(testers); ++i) 442cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) EXPECT_TRUE(testers[i].Verify()) << kExtensionNames[i]; 443cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 444cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 445cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace extensions 446