Index: chrome/browser/extensions/active_script_controller_unittest.cc |
diff --git a/chrome/browser/extensions/active_script_controller_unittest.cc b/chrome/browser/extensions/active_script_controller_unittest.cc |
index c2dfe62adda2e4923626ba2de4c0caadf143b505..01fe26ba0cf72bcc319482f4dd6684c120a1d75c 100644 |
--- a/chrome/browser/extensions/active_script_controller_unittest.cc |
+++ b/chrome/browser/extensions/active_script_controller_unittest.cc |
@@ -8,6 +8,7 @@ |
#include "chrome/browser/extensions/active_script_controller.h" |
#include "chrome/browser/extensions/active_tab_permission_granter.h" |
#include "chrome/browser/extensions/extension_util.h" |
+#include "chrome/browser/extensions/permissions_updater.h" |
#include "chrome/browser/extensions/tab_helper.h" |
#include "chrome/test/base/chrome_render_view_host_test_harness.h" |
#include "chrome/test/base/testing_profile.h" |
@@ -20,6 +21,7 @@ |
#include "extensions/common/feature_switch.h" |
#include "extensions/common/id_util.h" |
#include "extensions/common/manifest.h" |
+#include "extensions/common/user_script.h" |
#include "extensions/common/value_builder.h" |
namespace extensions { |
@@ -43,16 +45,25 @@ class ActiveScriptControllerUnitTest : public ChromeRenderViewHostTestHarness { |
// Creates an extension with all hosts permission and adds it to the registry. |
const Extension* AddExtension(); |
- // Returns a closure to use as a script execution for a given extension. |
- base::Closure GetExecutionCallbackForExtension( |
- const std::string& extension_id); |
+ // Returns true if the |extension| requires user consent before injecting |
+ // a script. |
+ bool RequiresUserConsent(const Extension* extension) const; |
+ |
+ // Request an injection for the given |extension|. |
+ void RequestInjection(const Extension* extension); |
// Returns the number of times a given extension has had a script execute. |
size_t GetExecutionCountForExtension(const std::string& extension_id) const; |
- ActiveScriptController* controller() { return active_script_controller_; } |
+ ActiveScriptController* controller() const { |
+ return active_script_controller_; |
+ } |
private: |
+ // Returns a closure to use as a script execution for a given extension. |
+ base::Closure GetExecutionCallbackForExtension( |
+ const std::string& extension_id); |
+ |
// Increment the number of executions for the given |extension_id|. |
void IncrementExecutionCount(const std::string& extension_id); |
@@ -95,16 +106,25 @@ const Extension* ActiveScriptControllerUnitTest::AddExtension() { |
.Build(); |
ExtensionRegistry::Get(profile())->AddEnabled(extension); |
+ PermissionsUpdater(profile()).InitializePermissions(extension); |
return extension; |
} |
-base::Closure ActiveScriptControllerUnitTest::GetExecutionCallbackForExtension( |
- const std::string& extension_id) { |
- // We use base unretained here, but if this ever gets executed outside of |
- // this test's lifetime, we have a major problem anyway. |
- return base::Bind(&ActiveScriptControllerUnitTest::IncrementExecutionCount, |
- base::Unretained(this), |
- extension_id); |
+bool ActiveScriptControllerUnitTest::RequiresUserConsent( |
+ const Extension* extension) const { |
+ PermissionsData::AccessType access_type = |
+ controller()->RequiresUserConsentForScriptInjectionForTesting( |
+ extension, UserScript::PROGRAMMATIC_SCRIPT); |
+ // We should never downright refuse access in these tests. |
+ DCHECK_NE(PermissionsData::ACCESS_DENIED, access_type); |
+ return access_type == PermissionsData::ACCESS_WITHHELD; |
+} |
+ |
+void ActiveScriptControllerUnitTest::RequestInjection( |
+ const Extension* extension) { |
+ controller()->RequestScriptInjectionForTesting( |
+ extension, |
+ GetExecutionCallbackForExtension(extension->id())); |
} |
size_t ActiveScriptControllerUnitTest::GetExecutionCountForExtension( |
@@ -116,6 +136,15 @@ size_t ActiveScriptControllerUnitTest::GetExecutionCountForExtension( |
return 0u; |
} |
+base::Closure ActiveScriptControllerUnitTest::GetExecutionCallbackForExtension( |
+ const std::string& extension_id) { |
+ // We use base unretained here, but if this ever gets executed outside of |
+ // this test's lifetime, we have a major problem anyway. |
+ return base::Bind(&ActiveScriptControllerUnitTest::IncrementExecutionCount, |
+ base::Unretained(this), |
+ extension_id); |
+} |
+ |
void ActiveScriptControllerUnitTest::IncrementExecutionCount( |
const std::string& extension_id) { |
++extension_executions_[extension_id]; |
@@ -147,13 +176,10 @@ TEST_F(ActiveScriptControllerUnitTest, RequestPermissionAndExecute) { |
ASSERT_FALSE(controller()->GetActionForExtension(extension)); |
// Since the extension requests all_hosts, we should require user consent. |
- EXPECT_TRUE( |
- controller()->RequiresUserConsentForScriptInjection(extension)); |
+ EXPECT_TRUE(RequiresUserConsent(extension)); |
// Request an injection. There should be an action visible, but no executions. |
- controller()->RequestScriptInjection( |
- extension, |
- GetExecutionCallbackForExtension(extension->id())); |
+ RequestInjection(extension); |
EXPECT_TRUE(controller()->GetActionForExtension(extension)); |
EXPECT_EQ(0u, GetExecutionCountForExtension(extension->id())); |
@@ -166,27 +192,22 @@ TEST_F(ActiveScriptControllerUnitTest, RequestPermissionAndExecute) { |
// Since we already executed on the given page, we shouldn't need permission |
// for a second time. |
- EXPECT_FALSE( |
- controller()->RequiresUserConsentForScriptInjection(extension)); |
+ EXPECT_FALSE(RequiresUserConsent(extension)); |
// Reloading should clear those permissions, and we should again require user |
// consent. |
Reload(); |
- EXPECT_TRUE( |
- controller()->RequiresUserConsentForScriptInjection(extension)); |
+ EXPECT_TRUE(RequiresUserConsent(extension)); |
// Grant access. |
- controller()->RequestScriptInjection( |
- extension, |
- GetExecutionCallbackForExtension(extension->id())); |
+ RequestInjection(extension); |
controller()->OnClicked(extension); |
EXPECT_EQ(2u, GetExecutionCountForExtension(extension->id())); |
EXPECT_FALSE(controller()->GetActionForExtension(extension)); |
// Navigating to another site should also clear the permissions. |
NavigateAndCommit(GURL("https://www.foo.com")); |
- EXPECT_TRUE( |
- controller()->RequiresUserConsentForScriptInjection(extension)); |
+ EXPECT_TRUE(RequiresUserConsent(extension)); |
} |
// Test that injections that are not executed by the time the user navigates are |
@@ -200,9 +221,7 @@ TEST_F(ActiveScriptControllerUnitTest, PendingInjectionsRemovedAtNavigation) { |
ASSERT_EQ(0u, GetExecutionCountForExtension(extension->id())); |
// Request an injection. There should be an action visible, but no executions. |
- controller()->RequestScriptInjection( |
- extension, |
- GetExecutionCallbackForExtension(extension->id())); |
+ RequestInjection(extension); |
EXPECT_TRUE(controller()->GetActionForExtension(extension)); |
EXPECT_EQ(0u, GetExecutionCountForExtension(extension->id())); |
@@ -213,9 +232,7 @@ TEST_F(ActiveScriptControllerUnitTest, PendingInjectionsRemovedAtNavigation) { |
EXPECT_EQ(0u, GetExecutionCountForExtension(extension->id())); |
// Request and accept a new injection. |
- controller()->RequestScriptInjection( |
- extension, |
- GetExecutionCallbackForExtension(extension->id())); |
+ RequestInjection(extension); |
controller()->OnClicked(extension); |
// The extension should only have executed once, even though a grand total |
@@ -235,11 +252,9 @@ TEST_F(ActiveScriptControllerUnitTest, MultiplePendingInjection) { |
const size_t kNumInjections = 3u; |
// Queue multiple pending injections. |
- for (size_t i = 0u; i < kNumInjections; ++i) { |
- controller()->RequestScriptInjection( |
- extension, |
- GetExecutionCallbackForExtension(extension->id())); |
- } |
+ for (size_t i = 0u; i < kNumInjections; ++i) |
+ RequestInjection(extension); |
+ |
EXPECT_EQ(0u, GetExecutionCountForExtension(extension->id())); |
controller()->OnClicked(extension); |
@@ -263,16 +278,14 @@ TEST_F(ActiveScriptControllerUnitTest, ActiveScriptsUseActiveTabPermissions) { |
// Since we have active tab permissions, we shouldn't need user consent |
// anymore. |
- EXPECT_FALSE(controller()->RequiresUserConsentForScriptInjection(extension)); |
+ EXPECT_FALSE(RequiresUserConsent(extension)); |
// Also test that granting active tab runs any pending tasks. |
Reload(); |
// Navigating should mean we need permission again. |
- EXPECT_TRUE(controller()->RequiresUserConsentForScriptInjection(extension)); |
+ EXPECT_TRUE(RequiresUserConsent(extension)); |
- controller()->RequestScriptInjection( |
- extension, |
- GetExecutionCallbackForExtension(extension->id())); |
+ RequestInjection(extension); |
EXPECT_TRUE(controller()->GetActionForExtension(extension)); |
EXPECT_EQ(0u, GetExecutionCountForExtension(extension->id())); |
@@ -290,23 +303,23 @@ TEST_F(ActiveScriptControllerUnitTest, ActiveScriptsCanHaveAllUrlsPref) { |
ASSERT_TRUE(extension); |
NavigateAndCommit(GURL("https://www.google.com")); |
- EXPECT_TRUE(controller()->RequiresUserConsentForScriptInjection(extension)); |
+ EXPECT_TRUE(RequiresUserConsent(extension)); |
// Enable the extension on all urls. |
util::SetAllowedScriptingOnAllUrls(extension->id(), profile(), true); |
- EXPECT_FALSE(controller()->RequiresUserConsentForScriptInjection(extension)); |
+ EXPECT_FALSE(RequiresUserConsent(extension)); |
// This should carry across navigations, and websites. |
NavigateAndCommit(GURL("http://www.foo.com")); |
- EXPECT_FALSE(controller()->RequiresUserConsentForScriptInjection(extension)); |
+ EXPECT_FALSE(RequiresUserConsent(extension)); |
// Turning off the preference should have instant effect. |
util::SetAllowedScriptingOnAllUrls(extension->id(), profile(), false); |
- EXPECT_TRUE(controller()->RequiresUserConsentForScriptInjection(extension)); |
+ EXPECT_TRUE(RequiresUserConsent(extension)); |
// And should also persist across navigations and websites. |
NavigateAndCommit(GURL("http://www.bar.com")); |
- EXPECT_TRUE(controller()->RequiresUserConsentForScriptInjection(extension)); |
+ EXPECT_TRUE(RequiresUserConsent(extension)); |
} |
} // namespace extensions |