Chromium Code Reviews| Index: chrome/browser/extensions/active_script_controller_browsertest.cc |
| diff --git a/chrome/browser/extensions/active_script_controller_browsertest.cc b/chrome/browser/extensions/active_script_controller_browsertest.cc |
| index 6234be632b03aae07a700e022288c18b34e73c83..2088752f8c4b3acec079f284660e12ac96620ff3 100644 |
| --- a/chrome/browser/extensions/active_script_controller_browsertest.cc |
| +++ b/chrome/browser/extensions/active_script_controller_browsertest.cc |
| @@ -15,7 +15,9 @@ |
| #include "chrome/browser/ui/browser.h" |
| #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| #include "chrome/test/base/ui_test_utils.h" |
| +#include "content/public/test/browser_test_utils.h" |
| #include "extensions/common/feature_switch.h" |
| +#include "extensions/common/switches.h" |
| #include "net/test/embedded_test_server/embedded_test_server.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| @@ -61,10 +63,9 @@ enum RequiresConsent { |
| class ActiveScriptControllerBrowserTest : public ExtensionBrowserTest { |
| public: |
| - ActiveScriptControllerBrowserTest() |
| - : feature_override_(FeatureSwitch::scripts_require_action(), |
| - FeatureSwitch::OVERRIDE_ENABLED) {} |
| + ActiveScriptControllerBrowserTest() {} |
| + virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE; |
| virtual void CleanUpOnMainThread() OVERRIDE; |
| // Returns an extension with the given |host_type| and |injection_type|. If |
| @@ -75,11 +76,19 @@ class ActiveScriptControllerBrowserTest : public ExtensionBrowserTest { |
| InjectionType injection_type); |
| private: |
| - FeatureSwitch::ScopedOverride feature_override_; |
| ScopedVector<TestExtensionDir> test_extension_dirs_; |
| std::vector<const Extension*> extensions_; |
| }; |
| +void ActiveScriptControllerBrowserTest::SetUpCommandLine( |
| + base::CommandLine* command_line) { |
| + ExtensionBrowserTest::SetUpCommandLine(command_line); |
| + // We append the actual switch to the commandline because it needs to be |
| + // passed over to the renderer, which a FeatureSwitch::ScopedOverride will |
| + // not do. |
| + command_line->AppendSwitch(switches::kEnableScriptsRequireAction); |
| +} |
| + |
| void ActiveScriptControllerBrowserTest::CleanUpOnMainThread() { |
| test_extension_dirs_.clear(); |
| } |
| @@ -266,10 +275,7 @@ testing::AssertionResult ActiveScriptTester::Verify() { |
| // Otherwise, we don't have permission, and have to grant it. Ensure the |
| // script has *not* already executed. |
| - // Currently, it's okay for content scripts to execute, because we don't |
| - // block them. |
| - // TODO(rdevlin.cronin): Fix this. |
| - if (inject_success_listener_->was_satisfied() && type_ != CONTENT_SCRIPT) { |
| + if (inject_success_listener_->was_satisfied()) { |
| return testing::AssertionFailure() << |
| name_ << "'s script ran without permission."; |
| } |
| @@ -316,7 +322,7 @@ ExtensionAction* ActiveScriptTester::GetAction() { |
| } |
| IN_PROC_BROWSER_TEST_F(ActiveScriptControllerBrowserTest, |
| - ActiveScriptsAreDisplayed) { |
| + ActiveScriptsAreDisplayedAndDelayExecution) { |
| base::FilePath active_script_path = |
| test_data_dir_.AppendASCII("active_script"); |
| @@ -362,7 +368,7 @@ IN_PROC_BROWSER_TEST_F(ActiveScriptControllerBrowserTest, |
| }; |
| // Navigate to an URL (which matches the explicit host specified in the |
| - // extension content_scripts_explicit_hosts). All three extensions should |
| + // extension content_scripts_explicit_hosts). All four extensions should |
| // inject the script. |
| ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); |
| ui_test_utils::NavigateToURL( |
| @@ -372,4 +378,91 @@ IN_PROC_BROWSER_TEST_F(ActiveScriptControllerBrowserTest, |
| EXPECT_TRUE(testers[i].Verify()) << kExtensionNames[i]; |
| } |
| +// Test that removing an extension with pending injections a) removes the |
| +// pending injections for that extension, and b) does not affect pending |
| +// injections for other extensions. |
| +IN_PROC_BROWSER_TEST_F(ActiveScriptControllerBrowserTest, |
| + RemoveExtensionWithPendingInjections) { |
| + const Extension* extension1 = GetOrCreateExtension(ALL_HOSTS, CONTENT_SCRIPT); |
| + ASSERT_TRUE(extension1); |
| + const Extension* extension2 = GetOrCreateExtension(ALL_HOSTS, EXECUTE_SCRIPT); |
| + ASSERT_TRUE(extension2); |
| + |
| + content::WebContents* web_contents = |
| + browser()->tab_strip_model()->GetActiveWebContents(); |
| + ASSERT_TRUE(web_contents); |
| + ActiveScriptController* active_script_controller = |
| + ActiveScriptController::GetForWebContents(web_contents); |
| + ASSERT_TRUE(active_script_controller); |
| + |
| + ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); |
| + ui_test_utils::NavigateToURL( |
| + browser(), embedded_test_server()->GetURL("/extensions/test_file.html")); |
| + |
| + // Both extensions should have pending requests. |
| + EXPECT_TRUE(active_script_controller->GetActionForExtension(extension1)); |
| + EXPECT_TRUE(active_script_controller->GetActionForExtension(extension2)); |
| + |
| + // Unload one of the extensions. |
| + UnloadExtension(extension2->id()); |
| + |
| + // This is slight hack to achieve a RunPendingInRenderer() method. Since IPCs |
| + // are sent synchronously, the renderer will be notified of the extension |
| + // being unloaded before the script is executed, and, since ExecuteScript() is |
| + // synchronous, the renderer is guaranteed to be done updating scripts. |
| + EXPECT_TRUE(content::ExecuteScript(web_contents, "1 == 1;")); |
| + |
| + // We should have pending requests for extension1, but not the removed |
| + // extension2. |
| + EXPECT_TRUE(active_script_controller->GetActionForExtension(extension1)); |
| + EXPECT_FALSE(active_script_controller->GetActionForExtension(extension2)); |
| + |
| + // We should still be able to run the request for extension1. |
| + ExtensionTestMessageListener inject_success_listener( |
| + new ExtensionTestMessageListener(kInjectSucceeded, |
| + false /* won't reply */)); |
| + active_script_controller->OnClicked(extension1); |
| + inject_success_listener.WaitUntilSatisfied(); |
|
not at google - send to devlin
2014/06/02 21:28:17
it doesn't seem like you're necessarily testing re
Devlin
2014/06/02 22:19:16
We are testing that the script gets injected by wa
not at google - send to devlin
2014/06/02 22:20:19
good point. renderer is tested.
|
| +} |
| + |
| +// A version of the test with the flag off, in order to test that everything |
| +// still works as expected. |
| +class FlagOffActiveScriptControllerBrowserTest |
| + : public ActiveScriptControllerBrowserTest { |
| + private: |
| + // Simply don't append the flag. |
| + virtual void SetUpCommandLine(base::CommandLine* command_line) OVERRIDE { |
| + ExtensionBrowserTest::SetUpCommandLine(command_line); |
| + } |
| +}; |
| + |
| +IN_PROC_BROWSER_TEST_F(FlagOffActiveScriptControllerBrowserTest, |
| + ScriptsExecuteWhenFlagAbsent) { |
| + const char* kExtensionNames[] = { |
| + "content_scripts_all_hosts", |
| + "inject_scripts_all_hosts", |
| + }; |
| + ActiveScriptTester testers[] = { |
| + ActiveScriptTester( |
| + kExtensionNames[0], |
| + GetOrCreateExtension(ALL_HOSTS, CONTENT_SCRIPT), |
| + browser(), |
| + DOES_NOT_REQUIRE_CONSENT, |
| + CONTENT_SCRIPT), |
| + ActiveScriptTester( |
| + kExtensionNames[1], |
| + GetOrCreateExtension(ALL_HOSTS, EXECUTE_SCRIPT), |
| + browser(), |
| + DOES_NOT_REQUIRE_CONSENT, |
| + EXECUTE_SCRIPT), |
| + }; |
| + |
| + ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady()); |
| + ui_test_utils::NavigateToURL( |
| + browser(), embedded_test_server()->GetURL("/extensions/test_file.html")); |
| + |
| + for (size_t i = 0u; i < arraysize(testers); ++i) |
| + EXPECT_TRUE(testers[i].Verify()) << kExtensionNames[i]; |
| +} |
| + |
| } // namespace extensions |