Index: extensions/common/permissions/permissions_data_unittest.cc |
diff --git a/extensions/common/permissions/permissions_data_unittest.cc b/extensions/common/permissions/permissions_data_unittest.cc |
deleted file mode 100644 |
index 7374d3415a77c9567407eaaddcc22cc3c769ebab..0000000000000000000000000000000000000000 |
--- a/extensions/common/permissions/permissions_data_unittest.cc |
+++ /dev/null |
@@ -1,754 +0,0 @@ |
-// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include <vector> |
- |
-#include "base/command_line.h" |
-#include "base/memory/ref_counted.h" |
-#include "base/strings/string16.h" |
-#include "base/strings/utf_string_conversions.h" |
-#include "chrome/common/chrome_version_info.h" |
-#include "chrome/common/extensions/extension_test_util.h" |
-#include "chrome/common/extensions/features/feature_channel.h" |
-#include "components/crx_file/id_util.h" |
-#include "content/public/common/socket_permission_request.h" |
-#include "extensions/common/error_utils.h" |
-#include "extensions/common/extension.h" |
-#include "extensions/common/extension_builder.h" |
-#include "extensions/common/manifest.h" |
-#include "extensions/common/manifest_constants.h" |
-#include "extensions/common/permissions/api_permission.h" |
-#include "extensions/common/permissions/permission_set.h" |
-#include "extensions/common/permissions/permissions_data.h" |
-#include "extensions/common/permissions/socket_permission.h" |
-#include "extensions/common/switches.h" |
-#include "extensions/common/url_pattern_set.h" |
-#include "extensions/common/value_builder.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "url/gurl.h" |
- |
-using base::UTF16ToUTF8; |
-using content::SocketPermissionRequest; |
-using extension_test_util::LoadManifest; |
-using extension_test_util::LoadManifestUnchecked; |
-using extension_test_util::LoadManifestStrict; |
- |
-namespace extensions { |
- |
-namespace { |
- |
-const char kAllHostsPermission[] = "*://*/*"; |
- |
-bool CheckSocketPermission( |
- scoped_refptr<Extension> extension, |
- SocketPermissionRequest::OperationType type, |
- const char* host, |
- int port) { |
- SocketPermission::CheckParam param(type, host, port); |
- return extension->permissions_data()->CheckAPIPermissionWithParam( |
- APIPermission::kSocket, ¶m); |
-} |
- |
-// Creates and returns an extension with the given |id|, |host_permissions|, and |
-// manifest |location|. |
-scoped_refptr<const Extension> GetExtensionWithHostPermission( |
- const std::string& id, |
- const std::string& host_permissions, |
- Manifest::Location location) { |
- ListBuilder permissions; |
- if (!host_permissions.empty()) |
- permissions.Append(host_permissions); |
- |
- return ExtensionBuilder() |
- .SetManifest( |
- DictionaryBuilder() |
- .Set("name", id) |
- .Set("description", "an extension") |
- .Set("manifest_version", 2) |
- .Set("version", "1.0.0") |
- .Set("permissions", permissions.Pass()) |
- .Build()) |
- .SetLocation(location) |
- .SetID(id) |
- .Build(); |
-} |
- |
-// Checks that urls are properly restricted for the given extension. |
-void CheckRestrictedUrls(const Extension* extension, |
- bool block_chrome_urls) { |
- // We log the name so we know _which_ extension failed here. |
- const std::string& name = extension->name(); |
- const GURL chrome_settings_url("chrome://settings/"); |
- const GURL chrome_extension_url("chrome-extension://foo/bar.html"); |
- const GURL google_url("https://www.google.com/"); |
- const GURL self_url("chrome-extension://" + extension->id() + "/foo.html"); |
- const GURL invalid_url("chrome-debugger://foo/bar.html"); |
- |
- std::string error; |
- EXPECT_EQ(block_chrome_urls, |
- PermissionsData::IsRestrictedUrl( |
- chrome_settings_url, |
- chrome_settings_url, |
- extension, |
- &error)) << name; |
- if (block_chrome_urls) |
- EXPECT_EQ(manifest_errors::kCannotAccessChromeUrl, error) << name; |
- else |
- EXPECT_TRUE(error.empty()) << name; |
- |
- error.clear(); |
- EXPECT_EQ(block_chrome_urls, |
- PermissionsData::IsRestrictedUrl( |
- chrome_extension_url, |
- chrome_extension_url, |
- extension, |
- &error)) << name; |
- if (block_chrome_urls) |
- EXPECT_EQ(manifest_errors::kCannotAccessExtensionUrl, error) << name; |
- else |
- EXPECT_TRUE(error.empty()) << name; |
- |
- // Google should never be a restricted url. |
- error.clear(); |
- EXPECT_FALSE(PermissionsData::IsRestrictedUrl( |
- google_url, google_url, extension, &error)) << name; |
- EXPECT_TRUE(error.empty()) << name; |
- |
- // We should always be able to access our own extension pages. |
- error.clear(); |
- EXPECT_FALSE(PermissionsData::IsRestrictedUrl( |
- self_url, self_url, extension, &error)) << name; |
- EXPECT_TRUE(error.empty()) << name; |
- |
- // We should only allow other schemes for extensions when it's a whitelisted |
- // extension. |
- error.clear(); |
- bool allow_on_other_schemes = |
- PermissionsData::CanExecuteScriptEverywhere(extension); |
- EXPECT_EQ(!allow_on_other_schemes, |
- PermissionsData::IsRestrictedUrl( |
- invalid_url, invalid_url, extension, &error)) << name; |
- if (!allow_on_other_schemes) { |
- EXPECT_EQ(ErrorUtils::FormatErrorMessage( |
- manifest_errors::kCannotAccessPage, |
- invalid_url.spec()), |
- error) << name; |
- } else { |
- EXPECT_TRUE(error.empty()); |
- } |
-} |
- |
-} // namespace |
- |
-TEST(ExtensionPermissionsTest, EffectiveHostPermissions) { |
- scoped_refptr<Extension> extension; |
- URLPatternSet hosts; |
- |
- extension = LoadManifest("effective_host_permissions", "empty.json"); |
- EXPECT_EQ(0u, |
- extension->permissions_data() |
- ->GetEffectiveHostPermissions() |
- .patterns() |
- .size()); |
- EXPECT_FALSE(hosts.MatchesURL(GURL("http://www.google.com"))); |
- EXPECT_FALSE(extension->permissions_data()->HasEffectiveAccessToAllHosts()); |
- |
- extension = LoadManifest("effective_host_permissions", "one_host.json"); |
- hosts = extension->permissions_data()->GetEffectiveHostPermissions(); |
- EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.google.com"))); |
- EXPECT_FALSE(hosts.MatchesURL(GURL("https://www.google.com"))); |
- EXPECT_FALSE(extension->permissions_data()->HasEffectiveAccessToAllHosts()); |
- |
- extension = LoadManifest("effective_host_permissions", |
- "one_host_wildcard.json"); |
- hosts = extension->permissions_data()->GetEffectiveHostPermissions(); |
- EXPECT_TRUE(hosts.MatchesURL(GURL("http://google.com"))); |
- EXPECT_TRUE(hosts.MatchesURL(GURL("http://foo.google.com"))); |
- EXPECT_FALSE(extension->permissions_data()->HasEffectiveAccessToAllHosts()); |
- |
- extension = LoadManifest("effective_host_permissions", "two_hosts.json"); |
- hosts = extension->permissions_data()->GetEffectiveHostPermissions(); |
- EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.google.com"))); |
- EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.reddit.com"))); |
- EXPECT_FALSE(extension->permissions_data()->HasEffectiveAccessToAllHosts()); |
- |
- extension = LoadManifest("effective_host_permissions", |
- "https_not_considered.json"); |
- hosts = extension->permissions_data()->GetEffectiveHostPermissions(); |
- EXPECT_TRUE(hosts.MatchesURL(GURL("http://google.com"))); |
- EXPECT_TRUE(hosts.MatchesURL(GURL("https://google.com"))); |
- EXPECT_FALSE(extension->permissions_data()->HasEffectiveAccessToAllHosts()); |
- |
- extension = LoadManifest("effective_host_permissions", |
- "two_content_scripts.json"); |
- hosts = extension->permissions_data()->GetEffectiveHostPermissions(); |
- EXPECT_TRUE(hosts.MatchesURL(GURL("http://google.com"))); |
- EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.reddit.com"))); |
- EXPECT_TRUE(extension->permissions_data() |
- ->active_permissions() |
- ->HasEffectiveAccessToURL(GURL("http://www.reddit.com"))); |
- EXPECT_TRUE(hosts.MatchesURL(GURL("http://news.ycombinator.com"))); |
- EXPECT_TRUE( |
- extension->permissions_data() |
- ->active_permissions() |
- ->HasEffectiveAccessToURL(GURL("http://news.ycombinator.com"))); |
- EXPECT_FALSE(extension->permissions_data()->HasEffectiveAccessToAllHosts()); |
- |
- extension = LoadManifest("effective_host_permissions", "all_hosts.json"); |
- hosts = extension->permissions_data()->GetEffectiveHostPermissions(); |
- EXPECT_TRUE(hosts.MatchesURL(GURL("http://test/"))); |
- EXPECT_FALSE(hosts.MatchesURL(GURL("https://test/"))); |
- EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.google.com"))); |
- EXPECT_TRUE(extension->permissions_data()->HasEffectiveAccessToAllHosts()); |
- |
- extension = LoadManifest("effective_host_permissions", "all_hosts2.json"); |
- hosts = extension->permissions_data()->GetEffectiveHostPermissions(); |
- EXPECT_TRUE(hosts.MatchesURL(GURL("http://test/"))); |
- EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.google.com"))); |
- EXPECT_TRUE(extension->permissions_data()->HasEffectiveAccessToAllHosts()); |
- |
- extension = LoadManifest("effective_host_permissions", "all_hosts3.json"); |
- hosts = extension->permissions_data()->GetEffectiveHostPermissions(); |
- EXPECT_FALSE(hosts.MatchesURL(GURL("http://test/"))); |
- EXPECT_TRUE(hosts.MatchesURL(GURL("https://test/"))); |
- EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.google.com"))); |
- EXPECT_TRUE(extension->permissions_data()->HasEffectiveAccessToAllHosts()); |
-} |
- |
-TEST(ExtensionPermissionsTest, SocketPermissions) { |
- // Set feature current channel to appropriate value. |
- ScopedCurrentChannel scoped_channel(chrome::VersionInfo::CHANNEL_DEV); |
- scoped_refptr<Extension> extension; |
- std::string error; |
- |
- extension = LoadManifest("socket_permissions", "empty.json"); |
- EXPECT_FALSE(CheckSocketPermission(extension, |
- SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); |
- |
- extension = LoadManifestUnchecked("socket_permissions", |
- "socket1.json", |
- Manifest::INTERNAL, Extension::NO_FLAGS, |
- &error); |
- EXPECT_TRUE(extension.get() == NULL); |
- std::string expected_error_msg_header = ErrorUtils::FormatErrorMessage( |
- manifest_errors::kInvalidPermissionWithDetail, |
- "socket", |
- "NULL or empty permission list"); |
- EXPECT_EQ(expected_error_msg_header, error); |
- |
- extension = LoadManifest("socket_permissions", "socket2.json"); |
- EXPECT_TRUE(CheckSocketPermission(extension, |
- SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); |
- EXPECT_FALSE(CheckSocketPermission( |
- extension, SocketPermissionRequest::UDP_BIND, "", 80)); |
- EXPECT_TRUE(CheckSocketPermission( |
- extension, SocketPermissionRequest::UDP_BIND, "", 8888)); |
- |
- EXPECT_FALSE(CheckSocketPermission( |
- extension, SocketPermissionRequest::UDP_SEND_TO, "example.com", 1900)); |
- EXPECT_TRUE(CheckSocketPermission( |
- extension, |
- SocketPermissionRequest::UDP_SEND_TO, |
- "239.255.255.250", 1900)); |
-} |
- |
-TEST(ExtensionPermissionsTest, IsRestrictedUrl) { |
- scoped_refptr<const Extension> extension = |
- GetExtensionWithHostPermission("normal_extension", |
- kAllHostsPermission, |
- Manifest::INTERNAL); |
- // Chrome urls should be blocked for normal extensions. |
- CheckRestrictedUrls(extension.get(), true); |
- |
- scoped_refptr<const Extension> component = |
- GetExtensionWithHostPermission("component", |
- kAllHostsPermission, |
- Manifest::COMPONENT); |
- // Chrome urls should be accessible by component extensions. |
- CheckRestrictedUrls(component.get(), false); |
- |
- base::CommandLine::ForCurrentProcess()->AppendSwitch( |
- switches::kExtensionsOnChromeURLs); |
- // Enabling the switch should allow all extensions to access chrome urls. |
- CheckRestrictedUrls(extension.get(), false); |
-} |
- |
-TEST(ExtensionPermissionsTest, GetPermissionMessages_ManyAPIPermissions) { |
- scoped_refptr<Extension> extension; |
- extension = LoadManifest("permissions", "many-apis.json"); |
- std::vector<base::string16> warnings = |
- extension->permissions_data()->GetPermissionMessageStrings(); |
- // Warning for "tabs" is suppressed by "history" permission. |
- ASSERT_EQ(5u, warnings.size()); |
- EXPECT_EQ("Read and change your data on api.flickr.com", |
- UTF16ToUTF8(warnings[0])); |
- EXPECT_EQ("Read and change your bookmarks", UTF16ToUTF8(warnings[1])); |
- EXPECT_EQ("Detect your physical location", UTF16ToUTF8(warnings[2])); |
- EXPECT_EQ("Read and change your browsing history", UTF16ToUTF8(warnings[3])); |
- EXPECT_EQ("Manage your apps, extensions, and themes", |
- UTF16ToUTF8(warnings[4])); |
-} |
- |
-TEST(ExtensionPermissionsTest, GetPermissionMessages_ManyHostsPermissions) { |
- scoped_refptr<Extension> extension; |
- extension = LoadManifest("permissions", "more-than-3-hosts.json"); |
- std::vector<base::string16> warnings = |
- extension->permissions_data()->GetPermissionMessageStrings(); |
- std::vector<base::string16> warnings_details = |
- extension->permissions_data()->GetPermissionMessageDetailsStrings(); |
- ASSERT_EQ(1u, warnings.size()); |
- ASSERT_EQ(1u, warnings_details.size()); |
- EXPECT_EQ("Read and change your data on a number of websites", |
- UTF16ToUTF8(warnings[0])); |
- EXPECT_EQ("- www.a.com\n- www.b.com\n- www.c.com\n- www.d.com\n- www.e.com", |
- UTF16ToUTF8(warnings_details[0])); |
-} |
- |
-TEST(ExtensionPermissionsTest, GetPermissionMessages_LocationApiPermission) { |
- scoped_refptr<Extension> extension; |
- extension = LoadManifest("permissions", |
- "location-api.json", |
- Manifest::COMPONENT, |
- Extension::NO_FLAGS); |
- std::vector<base::string16> warnings = |
- extension->permissions_data()->GetPermissionMessageStrings(); |
- ASSERT_EQ(1u, warnings.size()); |
- EXPECT_EQ("Detect your physical location", UTF16ToUTF8(warnings[0])); |
-} |
- |
-TEST(ExtensionPermissionsTest, GetPermissionMessages_ManyHosts) { |
- scoped_refptr<Extension> extension; |
- extension = LoadManifest("permissions", "many-hosts.json"); |
- std::vector<base::string16> warnings = |
- extension->permissions_data()->GetPermissionMessageStrings(); |
- ASSERT_EQ(1u, warnings.size()); |
- EXPECT_EQ( |
- "Read and change your data on encrypted.google.com and www.google.com", |
- UTF16ToUTF8(warnings[0])); |
-} |
- |
-TEST(ExtensionPermissionsTest, GetPermissionMessages_Plugins) { |
- scoped_refptr<Extension> extension; |
- extension = LoadManifest("permissions", "plugins.json"); |
- std::vector<base::string16> warnings = |
- extension->permissions_data()->GetPermissionMessageStrings(); |
-// We don't parse the plugins key on Chrome OS, so it should not ask for any |
-// permissions. |
-#if defined(OS_CHROMEOS) |
- ASSERT_EQ(0u, warnings.size()); |
-#else |
- ASSERT_EQ(1u, warnings.size()); |
- EXPECT_EQ( |
- "Read and change all your data on your computer and the websites you " |
- "visit", |
- UTF16ToUTF8(warnings[0])); |
-#endif |
-} |
- |
-// Base class for testing the CanAccessPage and CanCaptureVisiblePage |
-// methods of Extension for extensions with various permissions. |
-class ExtensionScriptAndCaptureVisibleTest : public testing::Test { |
- 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://" + |
- crx_file::id_util::GenerateIdForPath( |
- base::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); |
- // Ignore the policy delegate for this test. |
- PermissionsData::SetPolicyDelegate(NULL); |
- } |
- |
- bool AllowedScript(const Extension* extension, const GURL& url, |
- const GURL& top_url) { |
- return AllowedScript(extension, url, top_url, -1); |
- } |
- |
- bool AllowedScript(const Extension* extension, const GURL& url, |
- const GURL& top_url, int tab_id) { |
- return extension->permissions_data()->CanAccessPage( |
- extension, url, top_url, tab_id, -1, NULL); |
- } |
- |
- bool BlockedScript(const Extension* extension, const GURL& url, |
- const GURL& top_url) { |
- return !extension->permissions_data()->CanAccessPage( |
- extension, url, top_url, -1, -1, NULL); |
- } |
- |
- bool Allowed(const Extension* extension, const GURL& url) { |
- return Allowed(extension, url, -1); |
- } |
- |
- bool Allowed(const Extension* extension, const GURL& url, int tab_id) { |
- return (extension->permissions_data()->CanAccessPage( |
- extension, url, url, tab_id, -1, NULL) && |
- extension->permissions_data()->CanCaptureVisiblePage(tab_id, NULL)); |
- } |
- |
- bool CaptureOnly(const Extension* extension, const GURL& url) { |
- return CaptureOnly(extension, url, -1); |
- } |
- |
- bool CaptureOnly(const Extension* extension, const GURL& url, int tab_id) { |
- return !extension->permissions_data()->CanAccessPage( |
- extension, url, url, tab_id, -1, NULL) && |
- extension->permissions_data()->CanCaptureVisiblePage(tab_id, NULL); |
- } |
- |
- bool ScriptOnly(const Extension* extension, const GURL& url, |
- const GURL& top_url) { |
- return ScriptOnly(extension, url, top_url, -1); |
- } |
- |
- bool ScriptOnly(const Extension* extension, const GURL& url, |
- const GURL& top_url, int tab_id) { |
- return AllowedScript(extension, url, top_url, tab_id) && |
- !extension->permissions_data()->CanCaptureVisiblePage(tab_id, NULL); |
- } |
- |
- bool Blocked(const Extension* extension, const GURL& url) { |
- return Blocked(extension, url, -1); |
- } |
- |
- bool Blocked(const Extension* extension, const GURL& url, int tab_id) { |
- return !(extension->permissions_data()->CanAccessPage( |
- extension, url, url, tab_id, -1, NULL) || |
- extension->permissions_data()->CanCaptureVisiblePage(tab_id, |
- NULL)); |
- } |
- |
- bool ScriptAllowedExclusivelyOnTab( |
- 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 &= AllowedScript(extension, url, url, tab_id); |
- else |
- result &= Blocked(extension, url, tab_id); |
- } |
- return result; |
- } |
- |
- // URLs that are "safe" to provide scripting and capture visible tab access |
- // to if the permissions allow it. |
- 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. |
- const GURL favicon_url; |
- |
- // URLs that regular extensions should never get access to. |
- 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) { |
- // Test <all_urls> for regular extensions. |
- scoped_refptr<Extension> extension = LoadManifestStrict("script_and_capture", |
- "extension_regular_all.json"); |
- |
- EXPECT_TRUE(Allowed(extension.get(), http_url)); |
- EXPECT_TRUE(Allowed(extension.get(), https_url)); |
- EXPECT_TRUE(CaptureOnly(extension.get(), file_url)); |
- EXPECT_TRUE(CaptureOnly(extension.get(), settings_url)); |
- EXPECT_TRUE(CaptureOnly(extension.get(), favicon_url)); |
- EXPECT_TRUE(CaptureOnly(extension.get(), about_url)); |
- EXPECT_TRUE(CaptureOnly(extension.get(), extension_url)); |
- |
- // Test access to iframed content. |
- GURL within_extension_url = extension->GetResourceURL("page.html"); |
- EXPECT_TRUE(AllowedScript(extension.get(), http_url, http_url_with_path)); |
- EXPECT_TRUE(AllowedScript(extension.get(), https_url, http_url_with_path)); |
- EXPECT_TRUE(AllowedScript(extension.get(), http_url, within_extension_url)); |
- EXPECT_TRUE(AllowedScript(extension.get(), https_url, within_extension_url)); |
- EXPECT_TRUE(BlockedScript(extension.get(), http_url, extension_url)); |
- EXPECT_TRUE(BlockedScript(extension.get(), https_url, extension_url)); |
- |
- EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url)); |
- EXPECT_FALSE(extension->permissions_data()->HasHostPermission(about_url)); |
- EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); |
- |
- // Test * for scheme, which implies just the http/https schemes. |
- extension = LoadManifestStrict("script_and_capture", |
- "extension_wildcard.json"); |
- EXPECT_TRUE(ScriptOnly(extension.get(), http_url, http_url)); |
- EXPECT_TRUE(ScriptOnly(extension.get(), https_url, https_url)); |
- EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
- EXPECT_TRUE(Blocked(extension.get(), about_url)); |
- EXPECT_TRUE(Blocked(extension.get(), file_url)); |
- EXPECT_TRUE(Blocked(extension.get(), favicon_url)); |
- extension = |
- LoadManifest("script_and_capture", "extension_wildcard_settings.json"); |
- EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
- |
- // Having chrome://*/ should not work for regular extensions. Note that |
- // for favicon access, we require the explicit pattern chrome://favicon/*. |
- std::string error; |
- extension = LoadManifestUnchecked("script_and_capture", |
- "extension_wildcard_chrome.json", |
- Manifest::INTERNAL, Extension::NO_FLAGS, |
- &error); |
- std::vector<InstallWarning> warnings = extension->install_warnings(); |
- EXPECT_FALSE(warnings.empty()); |
- EXPECT_EQ(ErrorUtils::FormatErrorMessage( |
- manifest_errors::kInvalidPermissionScheme, |
- "chrome://*/"), |
- warnings[0].message); |
- EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
- EXPECT_TRUE(Blocked(extension.get(), favicon_url)); |
- EXPECT_TRUE(Blocked(extension.get(), about_url)); |
- |
- // Having chrome://favicon/* should not give you chrome://* |
- extension = LoadManifestStrict("script_and_capture", |
- "extension_chrome_favicon_wildcard.json"); |
- EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
- EXPECT_TRUE(Blocked(extension.get(), favicon_url)); |
- EXPECT_TRUE(Blocked(extension.get(), about_url)); |
- EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); |
- |
- // Having http://favicon should not give you chrome://favicon |
- extension = LoadManifestStrict("script_and_capture", |
- "extension_http_favicon.json"); |
- EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
- EXPECT_TRUE(Blocked(extension.get(), favicon_url)); |
- |
- // Component extensions with <all_urls> should get everything. |
- extension = LoadManifest("script_and_capture", "extension_component_all.json", |
- Manifest::COMPONENT, Extension::NO_FLAGS); |
- EXPECT_TRUE(Allowed(extension.get(), http_url)); |
- EXPECT_TRUE(Allowed(extension.get(), https_url)); |
- EXPECT_TRUE(Allowed(extension.get(), settings_url)); |
- EXPECT_TRUE(Allowed(extension.get(), about_url)); |
- EXPECT_TRUE(Allowed(extension.get(), favicon_url)); |
- EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); |
- |
- // Component extensions should only get access to what they ask for. |
- extension = LoadManifest("script_and_capture", |
- "extension_component_google.json", Manifest::COMPONENT, |
- Extension::NO_FLAGS); |
- EXPECT_TRUE(ScriptOnly(extension.get(), http_url, http_url)); |
- EXPECT_TRUE(Blocked(extension.get(), https_url)); |
- EXPECT_TRUE(Blocked(extension.get(), file_url)); |
- EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
- EXPECT_TRUE(Blocked(extension.get(), favicon_url)); |
- EXPECT_TRUE(Blocked(extension.get(), about_url)); |
- EXPECT_TRUE(Blocked(extension.get(), extension_url)); |
- EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url)); |
-} |
- |
-TEST_F(ExtensionScriptAndCaptureVisibleTest, PermissionsWithChromeURLsEnabled) { |
- CommandLine::ForCurrentProcess()->AppendSwitch( |
- switches::kExtensionsOnChromeURLs); |
- |
- scoped_refptr<Extension> extension; |
- |
- // Test <all_urls> for regular extensions. |
- extension = LoadManifestStrict("script_and_capture", |
- "extension_regular_all.json"); |
- EXPECT_TRUE(Allowed(extension.get(), http_url)); |
- EXPECT_TRUE(Allowed(extension.get(), https_url)); |
- EXPECT_TRUE(CaptureOnly(extension.get(), file_url)); |
- EXPECT_TRUE(CaptureOnly(extension.get(), settings_url)); |
- EXPECT_TRUE(Allowed(extension.get(), favicon_url)); // chrome:// requested |
- EXPECT_TRUE(CaptureOnly(extension.get(), about_url)); |
- EXPECT_TRUE(CaptureOnly(extension.get(), extension_url)); |
- |
- // Test access to iframed content. |
- GURL within_extension_url = extension->GetResourceURL("page.html"); |
- EXPECT_TRUE(AllowedScript(extension.get(), http_url, http_url_with_path)); |
- EXPECT_TRUE(AllowedScript(extension.get(), https_url, http_url_with_path)); |
- EXPECT_TRUE(AllowedScript(extension.get(), http_url, within_extension_url)); |
- EXPECT_TRUE(AllowedScript(extension.get(), https_url, within_extension_url)); |
- EXPECT_TRUE(AllowedScript(extension.get(), http_url, extension_url)); |
- EXPECT_TRUE(AllowedScript(extension.get(), https_url, extension_url)); |
- |
- const PermissionsData* permissions_data = extension->permissions_data(); |
- EXPECT_FALSE(permissions_data->HasHostPermission(settings_url)); |
- EXPECT_FALSE(permissions_data->HasHostPermission(about_url)); |
- EXPECT_TRUE(permissions_data->HasHostPermission(favicon_url)); |
- |
- // Test * for scheme, which implies just the http/https schemes. |
- extension = LoadManifestStrict("script_and_capture", |
- "extension_wildcard.json"); |
- EXPECT_TRUE(ScriptOnly(extension.get(), http_url, http_url)); |
- EXPECT_TRUE(ScriptOnly(extension.get(), https_url, https_url)); |
- EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
- EXPECT_TRUE(Blocked(extension.get(), about_url)); |
- EXPECT_TRUE(Blocked(extension.get(), file_url)); |
- EXPECT_TRUE(Blocked(extension.get(), favicon_url)); |
- extension = |
- LoadManifest("script_and_capture", "extension_wildcard_settings.json"); |
- EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
- |
- // Having chrome://*/ should work for regular extensions with the flag |
- // enabled. |
- std::string error; |
- extension = LoadManifestUnchecked("script_and_capture", |
- "extension_wildcard_chrome.json", |
- Manifest::INTERNAL, Extension::NO_FLAGS, |
- &error); |
- EXPECT_FALSE(extension.get() == NULL); |
- EXPECT_TRUE(Blocked(extension.get(), http_url)); |
- EXPECT_TRUE(Blocked(extension.get(), https_url)); |
- EXPECT_TRUE(ScriptOnly(extension.get(), settings_url, settings_url)); |
- EXPECT_TRUE(Blocked(extension.get(), about_url)); |
- EXPECT_TRUE(Blocked(extension.get(), file_url)); |
- EXPECT_TRUE(ScriptOnly(extension.get(), favicon_url, favicon_url)); |
- |
- // Having chrome://favicon/* should not give you chrome://* |
- extension = LoadManifestStrict("script_and_capture", |
- "extension_chrome_favicon_wildcard.json"); |
- EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
- EXPECT_TRUE(ScriptOnly(extension.get(), favicon_url, favicon_url)); |
- EXPECT_TRUE(Blocked(extension.get(), about_url)); |
- EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); |
- |
- // Having http://favicon should not give you chrome://favicon |
- extension = LoadManifestStrict("script_and_capture", |
- "extension_http_favicon.json"); |
- EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
- EXPECT_TRUE(Blocked(extension.get(), favicon_url)); |
- |
- // Component extensions with <all_urls> should get everything. |
- extension = LoadManifest("script_and_capture", "extension_component_all.json", |
- Manifest::COMPONENT, Extension::NO_FLAGS); |
- EXPECT_TRUE(Allowed(extension.get(), http_url)); |
- EXPECT_TRUE(Allowed(extension.get(), https_url)); |
- EXPECT_TRUE(Allowed(extension.get(), settings_url)); |
- EXPECT_TRUE(Allowed(extension.get(), about_url)); |
- EXPECT_TRUE(Allowed(extension.get(), favicon_url)); |
- EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); |
- |
- // Component extensions should only get access to what they ask for. |
- extension = LoadManifest("script_and_capture", |
- "extension_component_google.json", Manifest::COMPONENT, |
- Extension::NO_FLAGS); |
- EXPECT_TRUE(ScriptOnly(extension.get(), http_url, http_url)); |
- EXPECT_TRUE(Blocked(extension.get(), https_url)); |
- EXPECT_TRUE(Blocked(extension.get(), file_url)); |
- EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
- EXPECT_TRUE(Blocked(extension.get(), favicon_url)); |
- EXPECT_TRUE(Blocked(extension.get(), about_url)); |
- EXPECT_TRUE(Blocked(extension.get(), extension_url)); |
- EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url)); |
-} |
- |
-TEST_F(ExtensionScriptAndCaptureVisibleTest, TabSpecific) { |
- scoped_refptr<Extension> extension = |
- LoadManifestStrict("script_and_capture", "tab_specific.json"); |
- |
- const PermissionsData* permissions_data = extension->permissions_data(); |
- EXPECT_FALSE(permissions_data->GetTabSpecificPermissionsForTesting(0).get()); |
- EXPECT_FALSE(permissions_data->GetTabSpecificPermissionsForTesting(1).get()); |
- EXPECT_FALSE(permissions_data->GetTabSpecificPermissionsForTesting(2).get()); |
- |
- std::set<GURL> no_urls; |
- |
- EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 0)); |
- EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 1)); |
- EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), 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); |
- |
- { |
- scoped_refptr<PermissionSet> permissions( |
- new PermissionSet(APIPermissionSet(), ManifestPermissionSet(), |
- allowed_hosts, URLPatternSet())); |
- permissions_data->UpdateTabSpecificPermissions(0, permissions); |
- EXPECT_EQ(permissions->explicit_hosts(), |
- permissions_data->GetTabSpecificPermissionsForTesting(0) |
- ->explicit_hosts()); |
- } |
- |
- EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), allowed_urls, 0)); |
- EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 1)); |
- EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 2)); |
- |
- permissions_data->ClearTabSpecificPermissions(0); |
- EXPECT_FALSE(permissions_data->GetTabSpecificPermissionsForTesting(0).get()); |
- |
- EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 0)); |
- EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 1)); |
- EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), 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())); |
- |
- { |
- scoped_refptr<PermissionSet> permissions( |
- new PermissionSet(APIPermissionSet(), ManifestPermissionSet(), |
- allowed_hosts, URLPatternSet())); |
- permissions_data->UpdateTabSpecificPermissions(0, permissions); |
- EXPECT_EQ(permissions->explicit_hosts(), |
- permissions_data->GetTabSpecificPermissionsForTesting(0) |
- ->explicit_hosts()); |
- |
- permissions = new PermissionSet(APIPermissionSet(), |
- ManifestPermissionSet(), |
- more_allowed_hosts, |
- URLPatternSet()); |
- permissions_data->UpdateTabSpecificPermissions(1, permissions); |
- EXPECT_EQ(permissions->explicit_hosts(), |
- permissions_data->GetTabSpecificPermissionsForTesting(1) |
- ->explicit_hosts()); |
- } |
- |
- EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), allowed_urls, 0)); |
- EXPECT_TRUE( |
- ScriptAllowedExclusivelyOnTab(extension.get(), more_allowed_urls, 1)); |
- EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 2)); |
- |
- permissions_data->ClearTabSpecificPermissions(0); |
- EXPECT_FALSE(permissions_data->GetTabSpecificPermissionsForTesting(0).get()); |
- |
- EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 0)); |
- EXPECT_TRUE( |
- ScriptAllowedExclusivelyOnTab(extension.get(), more_allowed_urls, 1)); |
- EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 2)); |
- |
- permissions_data->ClearTabSpecificPermissions(1); |
- EXPECT_FALSE(permissions_data->GetTabSpecificPermissionsForTesting(1).get()); |
- |
- EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 0)); |
- EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 1)); |
- EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 2)); |
-} |
- |
-} // namespace extensions |