Index: chrome/common/extensions/extension_unittest.cc |
diff --git a/chrome/common/extensions/extension_unittest.cc b/chrome/common/extensions/extension_unittest.cc |
index 4c5f57a5ea7307dc9d661a69a931a01dcf1494f3..eee2da692073c03d7767574b5a731339e8b4b2a7 100644 |
--- a/chrome/common/extensions/extension_unittest.cc |
+++ b/chrome/common/extensions/extension_unittest.cc |
@@ -615,62 +615,62 @@ TEST(ExtensionTest, WantsFileAccess) { |
// <all_urls> permission |
extension = LoadManifest("permissions", "permissions_all_urls.json"); |
EXPECT_TRUE(extension->wants_file_access()); |
- EXPECT_FALSE(extension->CanExecuteScriptOnPage(file_url, NULL, NULL)); |
+ EXPECT_FALSE(extension->CanExecuteScriptOnPage(file_url, -1, NULL, NULL)); |
extension = LoadManifest( |
"permissions", "permissions_all_urls.json", Extension::ALLOW_FILE_ACCESS); |
EXPECT_TRUE(extension->wants_file_access()); |
- EXPECT_TRUE(extension->CanExecuteScriptOnPage(file_url, NULL, NULL)); |
+ EXPECT_TRUE(extension->CanExecuteScriptOnPage(file_url, -1, NULL, NULL)); |
// file:///* permission |
extension = LoadManifest("permissions", "permissions_file_scheme.json"); |
EXPECT_TRUE(extension->wants_file_access()); |
- EXPECT_FALSE(extension->CanExecuteScriptOnPage(file_url, NULL, NULL)); |
+ EXPECT_FALSE(extension->CanExecuteScriptOnPage(file_url, -1, NULL, NULL)); |
extension = LoadManifest("permissions", "permissions_file_scheme.json", |
Extension::ALLOW_FILE_ACCESS); |
EXPECT_TRUE(extension->wants_file_access()); |
- EXPECT_TRUE(extension->CanExecuteScriptOnPage(file_url, NULL, NULL)); |
+ EXPECT_TRUE(extension->CanExecuteScriptOnPage(file_url, -1, NULL, NULL)); |
// http://* permission |
extension = LoadManifest("permissions", "permissions_http_scheme.json"); |
EXPECT_FALSE(extension->wants_file_access()); |
- EXPECT_FALSE(extension->CanExecuteScriptOnPage(file_url, NULL, NULL)); |
+ EXPECT_FALSE(extension->CanExecuteScriptOnPage(file_url, -1, NULL, NULL)); |
extension = LoadManifest("permissions", "permissions_http_scheme.json", |
Extension::ALLOW_FILE_ACCESS); |
EXPECT_FALSE(extension->wants_file_access()); |
- EXPECT_FALSE(extension->CanExecuteScriptOnPage(file_url, NULL, NULL)); |
+ EXPECT_FALSE(extension->CanExecuteScriptOnPage(file_url, -1, NULL, NULL)); |
// <all_urls> content script match |
extension = LoadManifest("permissions", "content_script_all_urls.json"); |
EXPECT_TRUE(extension->wants_file_access()); |
EXPECT_FALSE(extension->CanExecuteScriptOnPage( |
- file_url, &extension->content_scripts()[0], NULL)); |
+ file_url, -1, &extension->content_scripts()[0], NULL)); |
extension = LoadManifest("permissions", "content_script_all_urls.json", |
Extension::ALLOW_FILE_ACCESS); |
EXPECT_TRUE(extension->wants_file_access()); |
EXPECT_TRUE(extension->CanExecuteScriptOnPage( |
- file_url, &extension->content_scripts()[0], NULL)); |
+ file_url, -1, &extension->content_scripts()[0], NULL)); |
// file:///* content script match |
extension = LoadManifest("permissions", "content_script_file_scheme.json"); |
EXPECT_TRUE(extension->wants_file_access()); |
EXPECT_FALSE(extension->CanExecuteScriptOnPage( |
- file_url, &extension->content_scripts()[0], NULL)); |
+ file_url, -1, &extension->content_scripts()[0], NULL)); |
extension = LoadManifest("permissions", "content_script_file_scheme.json", |
Extension::ALLOW_FILE_ACCESS); |
EXPECT_TRUE(extension->wants_file_access()); |
EXPECT_TRUE(extension->CanExecuteScriptOnPage( |
- file_url, &extension->content_scripts()[0], NULL)); |
+ file_url, -1, &extension->content_scripts()[0], NULL)); |
// http://* content script match |
extension = LoadManifest("permissions", "content_script_http_scheme.json"); |
EXPECT_FALSE(extension->wants_file_access()); |
EXPECT_FALSE(extension->CanExecuteScriptOnPage( |
- file_url, &extension->content_scripts()[0], NULL)); |
+ file_url, -1, &extension->content_scripts()[0], NULL)); |
extension = LoadManifest("permissions", "content_script_http_scheme.json", |
Extension::ALLOW_FILE_ACCESS); |
EXPECT_FALSE(extension->wants_file_access()); |
EXPECT_FALSE(extension->CanExecuteScriptOnPage( |
- file_url, &extension->content_scripts()[0], NULL)); |
+ file_url, -1, &extension->content_scripts()[0], NULL)); |
} |
TEST(ExtensionTest, ExtraFlags) { |
@@ -689,49 +689,92 @@ TEST(ExtensionTest, ExtraFlags) { |
// Base class for testing the CanExecuteScriptOnPage and CanCaptureVisiblePage |
// methods of Extension for extensions with various permissions. |
class ExtensionScriptAndCaptureVisibleTest : public testing::Test { |
- public: |
- ExtensionScriptAndCaptureVisibleTest() { |
- PathService::Get(chrome::DIR_TEST_DATA, &dirpath_); |
+ protected: |
+ ExtensionScriptAndCaptureVisibleTest() |
+ : http_url("http://www.google.com"), |
+ http_url_with_path("http://www.google.com/index.html"), |
+ https_url("https://www.google.com"), |
+ file_url("file:///foo/bar"), |
+ favicon_url("chrome://favicon/http://www.google.com"), |
+ extension_url("chrome-extension://" + |
+ Extension::GenerateIdForPath(FilePath(FILE_PATH_LITERAL("foo")))), |
+ settings_url("chrome://settings"), |
+ about_url("about:flags") { |
+ urls_.insert(http_url); |
+ urls_.insert(http_url_with_path); |
+ urls_.insert(https_url); |
+ urls_.insert(file_url); |
+ urls_.insert(favicon_url); |
+ urls_.insert(extension_url); |
+ urls_.insert(settings_url); |
+ urls_.insert(about_url); |
} |
bool Allowed(const Extension* extension, const GURL& url) { |
- return (extension->CanExecuteScriptOnPage(url, NULL, NULL) && |
- extension->CanCaptureVisiblePage(url, NULL)); |
+ return Allowed(extension, url, -1); |
+ } |
+ |
+ bool Allowed(const Extension* extension, const GURL& url, int tab_id) { |
+ return (extension->CanExecuteScriptOnPage(url, tab_id, NULL, NULL) && |
+ extension->CanCaptureVisiblePage(url, tab_id, NULL)); |
} |
bool CaptureOnly(const Extension* extension, const GURL& url) { |
- return !extension->CanExecuteScriptOnPage(url, NULL, NULL) && |
- extension->CanCaptureVisiblePage(url, NULL); |
+ return CaptureOnly(extension, url, -1); |
+ } |
+ |
+ bool CaptureOnly(const Extension* extension, const GURL& url, int tab_id) { |
+ return !extension->CanExecuteScriptOnPage(url, tab_id, NULL, NULL) && |
+ extension->CanCaptureVisiblePage(url, tab_id, NULL); |
} |
bool Blocked(const Extension* extension, const GURL& url) { |
- return !(extension->CanExecuteScriptOnPage(url, NULL, NULL) || |
- extension->CanCaptureVisiblePage(url, NULL)); |
+ return Blocked(extension, url, -1); |
} |
- protected: |
- FilePath dirpath_; |
-}; |
+ bool Blocked(const Extension* extension, const GURL& url, int tab_id) { |
+ return !(extension->CanExecuteScriptOnPage(url, tab_id, NULL, NULL) || |
+ extension->CanCaptureVisiblePage(url, tab_id, NULL)); |
+ } |
+ |
+ bool AllowedExclusivelyOnTab( |
+ const Extension* extension, |
+ const std::set<GURL>& allowed_urls, |
+ int tab_id) { |
+ bool result = true; |
+ for (std::set<GURL>::iterator it = urls_.begin(); it != urls_.end(); ++it) { |
+ const GURL& url = *it; |
+ if (allowed_urls.count(url)) |
+ result &= Allowed(extension, url, tab_id); |
+ else |
+ result &= Blocked(extension, url, tab_id); |
+ } |
+ return result; |
+ } |
-TEST_F(ExtensionScriptAndCaptureVisibleTest, Permissions) { |
- scoped_refptr<Extension> extension; |
// URLs that are "safe" to provide scripting and capture visible tab access |
// to if the permissions allow it. |
- GURL http_url("http://www.google.com"); |
- GURL https_url("https://www.google.com"); |
- GURL file_url("file:///foo/bar"); |
+ const GURL http_url; |
+ const GURL http_url_with_path; |
+ const GURL https_url; |
+ const GURL file_url; |
// We should allow host permission but not scripting permission for favicon |
// urls. |
- GURL favicon_url("chrome://favicon/http://www.google.com"); |
- |
- std::string dummy_id = |
- Extension::GenerateIdForPath(FilePath(FILE_PATH_LITERAL("whatever"))); |
+ const GURL favicon_url; |
// URLs that regular extensions should never get access to. |
- GURL extension_url("chrome-extension://" + dummy_id); |
- GURL settings_url("chrome://settings"); |
- GURL about_url("about:flags"); |
+ const GURL extension_url; |
+ const GURL settings_url; |
+ const GURL about_url; |
+ |
+ private: |
+ // The set of all URLs above. |
+ std::set<GURL> urls_; |
+}; |
+ |
+TEST_F(ExtensionScriptAndCaptureVisibleTest, Permissions) { |
+ scoped_refptr<Extension> extension; |
// Test <all_urls> for regular extensions. |
extension = LoadManifestStrict("script_and_capture", |
@@ -810,6 +853,74 @@ TEST_F(ExtensionScriptAndCaptureVisibleTest, Permissions) { |
EXPECT_FALSE(extension->HasHostPermission(settings_url)); |
} |
+TEST_F(ExtensionScriptAndCaptureVisibleTest, TabSpecific) { |
+ scoped_refptr<Extension> extension = |
+ LoadManifestStrict("script_and_capture", "tab_specific.json"); |
+ |
+ EXPECT_EQ(NULL, extension->GetTabSpecificHostPermissions(0)); |
+ EXPECT_EQ(NULL, extension->GetTabSpecificHostPermissions(1)); |
+ EXPECT_EQ(NULL, extension->GetTabSpecificHostPermissions(2)); |
+ |
+ std::set<GURL> no_urls; |
+ |
+ EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 0)); |
+ EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 1)); |
+ EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 2)); |
+ |
+ URLPatternSet allowed_hosts; |
+ allowed_hosts.AddPattern(URLPattern(URLPattern::SCHEME_ALL, |
+ http_url.spec())); |
+ std::set<GURL> allowed_urls; |
+ allowed_urls.insert(http_url); |
+ // http_url_with_path() will also be allowed, because Extension should be |
+ // considering the security origin of the URL not the URL itself, and |
+ // http_url is in allowed_hosts. |
+ allowed_urls.insert(http_url_with_path); |
+ |
+ extension->SetTabSpecificHostPermissions(0, allowed_hosts); |
+ EXPECT_EQ(allowed_hosts, *extension->GetTabSpecificHostPermissions(0)); |
+ |
+ EXPECT_TRUE(AllowedExclusivelyOnTab(extension, allowed_urls, 0)); |
+ EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 1)); |
+ EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 2)); |
+ |
+ extension->ClearTabSpecificHostPermissions(0); |
+ EXPECT_EQ(NULL, extension->GetTabSpecificHostPermissions(0)); |
+ |
+ EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 0)); |
+ EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 1)); |
+ EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 2)); |
+ |
+ std::set<GURL> more_allowed_urls = allowed_urls; |
+ more_allowed_urls.insert(https_url); |
+ URLPatternSet more_allowed_hosts = allowed_hosts; |
+ more_allowed_hosts.AddPattern(URLPattern(URLPattern::SCHEME_ALL, |
+ https_url.spec())); |
+ |
+ extension->SetTabSpecificHostPermissions(0, allowed_hosts); |
+ EXPECT_EQ(allowed_hosts, *extension->GetTabSpecificHostPermissions(0)); |
+ extension->SetTabSpecificHostPermissions(1, more_allowed_hosts); |
+ EXPECT_EQ(more_allowed_hosts, *extension->GetTabSpecificHostPermissions(1)); |
+ |
+ EXPECT_TRUE(AllowedExclusivelyOnTab(extension, allowed_urls, 0)); |
+ EXPECT_TRUE(AllowedExclusivelyOnTab(extension, more_allowed_urls, 1)); |
+ EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 2)); |
+ |
+ extension->ClearTabSpecificHostPermissions(0); |
+ EXPECT_EQ(NULL, extension->GetTabSpecificHostPermissions(0)); |
+ |
+ EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 0)); |
+ EXPECT_TRUE(AllowedExclusivelyOnTab(extension, more_allowed_urls, 1)); |
+ EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 2)); |
+ |
+ extension->ClearTabSpecificHostPermissions(1); |
+ EXPECT_EQ(NULL, extension->GetTabSpecificHostPermissions(1)); |
+ |
+ EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 0)); |
+ EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 1)); |
+ EXPECT_TRUE(AllowedExclusivelyOnTab(extension, no_urls, 2)); |
+} |
+ |
TEST(ExtensionTest, GenerateId) { |
std::string result; |
EXPECT_TRUE(Extension::GenerateId("", &result)); |