diff options
Diffstat (limited to 'chrome/common/extensions/extension_unittest.cc')
-rw-r--r-- | chrome/common/extensions/extension_unittest.cc | 183 |
1 files changed, 147 insertions, 36 deletions
diff --git a/chrome/common/extensions/extension_unittest.cc b/chrome/common/extensions/extension_unittest.cc index 4c5f57a..eee2da6 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)); |