1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
7 #include "base/command_line.h"
8 #include "base/memory/ref_counted.h"
9 #include "base/strings/string16.h"
10 #include "base/strings/utf_string_conversions.h"
11 #include "chrome/common/chrome_version_info.h"
12 #include "chrome/common/extensions/extension.h"
13 #include "chrome/common/extensions/extension_test_util.h"
14 #include "chrome/common/extensions/features/feature_channel.h"
15 #include "chrome/common/extensions/permissions/permissions_data.h"
16 #include "chrome/common/extensions/permissions/socket_permission.h"
17 #include "content/public/common/socket_permission_request.h"
18 #include "extensions/common/error_utils.h"
19 #include "extensions/common/id_util.h"
20 #include "extensions/common/manifest_constants.h"
21 #include "extensions/common/permissions/api_permission.h"
22 #include "extensions/common/permissions/permission_set.h"
23 #include "extensions/common/switches.h"
24 #include "extensions/common/url_pattern_set.h"
25 #include "testing/gtest/include/gtest/gtest.h"
27 using content::SocketPermissionRequest;
28 using extension_test_util::LoadManifest;
29 using extension_test_util::LoadManifestUnchecked;
30 using extension_test_util::LoadManifestStrict;
32 namespace extensions {
36 bool CheckSocketPermission(
37 scoped_refptr<Extension> extension,
38 SocketPermissionRequest::OperationType type,
41 SocketPermission::CheckParam param(type, host, port);
42 return PermissionsData::CheckAPIPermissionWithParam(
43 extension.get(), APIPermission::kSocket, ¶m);
48 TEST(ExtensionPermissionsTest, EffectiveHostPermissions) {
49 scoped_refptr<Extension> extension;
52 extension = LoadManifest("effective_host_permissions", "empty.json");
54 PermissionsData::GetEffectiveHostPermissions(extension.get())
56 EXPECT_FALSE(hosts.MatchesURL(GURL("http://www.google.com")));
57 EXPECT_FALSE(PermissionsData::HasEffectiveAccessToAllHosts(extension.get()));
59 extension = LoadManifest("effective_host_permissions", "one_host.json");
60 hosts = PermissionsData::GetEffectiveHostPermissions(extension.get());
61 EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.google.com")));
62 EXPECT_FALSE(hosts.MatchesURL(GURL("https://www.google.com")));
63 EXPECT_FALSE(PermissionsData::HasEffectiveAccessToAllHosts(extension.get()));
65 extension = LoadManifest("effective_host_permissions",
66 "one_host_wildcard.json");
67 hosts = PermissionsData::GetEffectiveHostPermissions(extension.get());
68 EXPECT_TRUE(hosts.MatchesURL(GURL("http://google.com")));
69 EXPECT_TRUE(hosts.MatchesURL(GURL("http://foo.google.com")));
70 EXPECT_FALSE(PermissionsData::HasEffectiveAccessToAllHosts(extension.get()));
72 extension = LoadManifest("effective_host_permissions", "two_hosts.json");
73 hosts = PermissionsData::GetEffectiveHostPermissions(extension.get());
74 EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.google.com")));
75 EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.reddit.com")));
76 EXPECT_FALSE(PermissionsData::HasEffectiveAccessToAllHosts(extension.get()));
78 extension = LoadManifest("effective_host_permissions",
79 "https_not_considered.json");
80 hosts = PermissionsData::GetEffectiveHostPermissions(extension.get());
81 EXPECT_TRUE(hosts.MatchesURL(GURL("http://google.com")));
82 EXPECT_TRUE(hosts.MatchesURL(GURL("https://google.com")));
83 EXPECT_FALSE(PermissionsData::HasEffectiveAccessToAllHosts(extension.get()));
85 extension = LoadManifest("effective_host_permissions",
86 "two_content_scripts.json");
87 hosts = PermissionsData::GetEffectiveHostPermissions(extension.get());
88 EXPECT_TRUE(hosts.MatchesURL(GURL("http://google.com")));
89 EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.reddit.com")));
90 EXPECT_TRUE(extension->GetActivePermissions()->HasEffectiveAccessToURL(
91 GURL("http://www.reddit.com")));
92 EXPECT_TRUE(hosts.MatchesURL(GURL("http://news.ycombinator.com")));
93 EXPECT_TRUE(extension->GetActivePermissions()->HasEffectiveAccessToURL(
94 GURL("http://news.ycombinator.com")));
95 EXPECT_FALSE(PermissionsData::HasEffectiveAccessToAllHosts(extension.get()));
97 extension = LoadManifest("effective_host_permissions", "all_hosts.json");
98 hosts = PermissionsData::GetEffectiveHostPermissions(extension.get());
99 EXPECT_TRUE(hosts.MatchesURL(GURL("http://test/")));
100 EXPECT_FALSE(hosts.MatchesURL(GURL("https://test/")));
101 EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.google.com")));
102 EXPECT_TRUE(PermissionsData::HasEffectiveAccessToAllHosts(extension.get()));
104 extension = LoadManifest("effective_host_permissions", "all_hosts2.json");
105 hosts = PermissionsData::GetEffectiveHostPermissions(extension.get());
106 EXPECT_TRUE(hosts.MatchesURL(GURL("http://test/")));
107 EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.google.com")));
108 EXPECT_TRUE(PermissionsData::HasEffectiveAccessToAllHosts(extension.get()));
110 extension = LoadManifest("effective_host_permissions", "all_hosts3.json");
111 hosts = PermissionsData::GetEffectiveHostPermissions(extension.get());
112 EXPECT_FALSE(hosts.MatchesURL(GURL("http://test/")));
113 EXPECT_TRUE(hosts.MatchesURL(GURL("https://test/")));
114 EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.google.com")));
115 EXPECT_TRUE(PermissionsData::HasEffectiveAccessToAllHosts(extension.get()));
118 TEST(ExtensionPermissionsTest, SocketPermissions) {
119 // Set feature current channel to appropriate value.
120 ScopedCurrentChannel scoped_channel(chrome::VersionInfo::CHANNEL_DEV);
121 scoped_refptr<Extension> extension;
124 extension = LoadManifest("socket_permissions", "empty.json");
125 EXPECT_FALSE(CheckSocketPermission(extension,
126 SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80));
128 extension = LoadManifestUnchecked("socket_permissions",
130 Manifest::INTERNAL, Extension::NO_FLAGS,
132 EXPECT_TRUE(extension.get() == NULL);
133 ASSERT_EQ(ErrorUtils::FormatErrorMessage(
134 manifest_errors::kInvalidPermission, "socket"),
137 extension = LoadManifest("socket_permissions", "socket2.json");
138 EXPECT_TRUE(CheckSocketPermission(extension,
139 SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80));
140 EXPECT_FALSE(CheckSocketPermission(
141 extension, SocketPermissionRequest::UDP_BIND, "", 80));
142 EXPECT_TRUE(CheckSocketPermission(
143 extension, SocketPermissionRequest::UDP_BIND, "", 8888));
145 EXPECT_FALSE(CheckSocketPermission(
146 extension, SocketPermissionRequest::UDP_SEND_TO, "example.com", 1900));
147 EXPECT_TRUE(CheckSocketPermission(
149 SocketPermissionRequest::UDP_SEND_TO,
150 "239.255.255.250", 1900));
153 TEST(ExtensionPermissionsTest, GetPermissionMessages_ManyAPIPermissions) {
154 scoped_refptr<Extension> extension;
155 extension = LoadManifest("permissions", "many-apis.json");
156 std::vector<string16> warnings =
157 PermissionsData::GetPermissionMessageStrings(extension.get());
158 ASSERT_EQ(6u, warnings.size());
159 EXPECT_EQ("Access your data on api.flickr.com",
160 UTF16ToUTF8(warnings[0]));
161 EXPECT_EQ("Read and modify your bookmarks", UTF16ToUTF8(warnings[1]));
162 EXPECT_EQ("Detect your physical location", UTF16ToUTF8(warnings[2]));
163 EXPECT_EQ("Read and modify your browsing history", UTF16ToUTF8(warnings[3]));
164 EXPECT_EQ("Access your tabs and browsing activity", UTF16ToUTF8(warnings[4]));
165 EXPECT_EQ("Manage your apps, extensions, and themes",
166 UTF16ToUTF8(warnings[5]));
169 TEST(ExtensionPermissionsTest, GetPermissionMessages_ManyHostsPermissions) {
170 scoped_refptr<Extension> extension;
171 extension = LoadManifest("permissions", "more-than-3-hosts.json");
172 std::vector<string16> warnings =
173 PermissionsData::GetPermissionMessageStrings(extension.get());
174 std::vector<string16> warnings_details =
175 PermissionsData::GetPermissionMessageDetailsStrings(extension.get());
176 ASSERT_EQ(1u, warnings.size());
177 ASSERT_EQ(1u, warnings_details.size());
178 EXPECT_EQ("Access your data on 5 websites", UTF16ToUTF8(warnings[0]));
179 EXPECT_EQ("- www.a.com\n- www.b.com\n- www.c.com\n- www.d.com\n- www.e.com",
180 UTF16ToUTF8(warnings_details[0]));
183 TEST(ExtensionPermissionsTest, GetPermissionMessages_LocationApiPermission) {
184 scoped_refptr<Extension> extension;
185 extension = LoadManifest("permissions",
188 Extension::NO_FLAGS);
189 std::vector<string16> warnings =
190 PermissionsData::GetPermissionMessageStrings(extension.get());
191 ASSERT_EQ(1u, warnings.size());
192 EXPECT_EQ("Detect your physical location", UTF16ToUTF8(warnings[0]));
195 TEST(ExtensionPermissionsTest, GetPermissionMessages_ManyHosts) {
196 scoped_refptr<Extension> extension;
197 extension = LoadManifest("permissions", "many-hosts.json");
198 std::vector<string16> warnings =
199 PermissionsData::GetPermissionMessageStrings(extension.get());
200 ASSERT_EQ(1u, warnings.size());
201 EXPECT_EQ("Access your data on encrypted.google.com and www.google.com",
202 UTF16ToUTF8(warnings[0]));
205 TEST(ExtensionPermissionsTest, GetPermissionMessages_Plugins) {
206 scoped_refptr<Extension> extension;
207 extension = LoadManifest("permissions", "plugins.json");
208 std::vector<string16> warnings =
209 PermissionsData::GetPermissionMessageStrings(extension.get());
210 // We don't parse the plugins key on Chrome OS, so it should not ask for any
212 #if defined(OS_CHROMEOS)
213 ASSERT_EQ(0u, warnings.size());
215 ASSERT_EQ(1u, warnings.size());
216 EXPECT_EQ("Access all data on your computer and the websites you visit",
217 UTF16ToUTF8(warnings[0]));
221 // Base class for testing the CanExecuteScriptOnPage and CanCaptureVisiblePage
222 // methods of Extension for extensions with various permissions.
223 class ExtensionScriptAndCaptureVisibleTest : public testing::Test {
225 ExtensionScriptAndCaptureVisibleTest()
226 : http_url("http://www.google.com"),
227 http_url_with_path("http://www.google.com/index.html"),
228 https_url("https://www.google.com"),
229 file_url("file:///foo/bar"),
230 favicon_url("chrome://favicon/http://www.google.com"),
231 extension_url("chrome-extension://" +
232 id_util::GenerateIdForPath(
233 base::FilePath(FILE_PATH_LITERAL("foo")))),
234 settings_url("chrome://settings"),
235 about_url("about:flags") {
236 urls_.insert(http_url);
237 urls_.insert(http_url_with_path);
238 urls_.insert(https_url);
239 urls_.insert(file_url);
240 urls_.insert(favicon_url);
241 urls_.insert(extension_url);
242 urls_.insert(settings_url);
243 urls_.insert(about_url);
244 // Ignore the policy delegate for this test.
245 PermissionsData::SetPolicyDelegate(NULL);
248 bool AllowedScript(const Extension* extension, const GURL& url,
249 const GURL& top_url) {
250 return PermissionsData::CanExecuteScriptOnPage(
251 extension, url, top_url, -1, NULL, -1, NULL);
254 bool BlockedScript(const Extension* extension, const GURL& url,
255 const GURL& top_url) {
256 return !PermissionsData::CanExecuteScriptOnPage(
257 extension, url, top_url, -1, NULL, -1, NULL);
260 bool Allowed(const Extension* extension, const GURL& url) {
261 return Allowed(extension, url, -1);
264 bool Allowed(const Extension* extension, const GURL& url, int tab_id) {
265 return (PermissionsData::CanExecuteScriptOnPage(
266 extension, url, url, tab_id, NULL, -1, NULL) &&
267 PermissionsData::CanCaptureVisiblePage(
268 extension, url, tab_id, NULL));
271 bool CaptureOnly(const Extension* extension, const GURL& url) {
272 return CaptureOnly(extension, url, -1);
275 bool CaptureOnly(const Extension* extension, const GURL& url, int tab_id) {
276 return !PermissionsData::CanExecuteScriptOnPage(
277 extension, url, url, tab_id, NULL, -1, NULL) &&
278 PermissionsData::CanCaptureVisiblePage(extension, url, tab_id, NULL);
281 bool Blocked(const Extension* extension, const GURL& url) {
282 return Blocked(extension, url, -1);
285 bool Blocked(const Extension* extension, const GURL& url, int tab_id) {
286 return !(PermissionsData::CanExecuteScriptOnPage(
287 extension, url, url, tab_id, NULL, -1, NULL) ||
288 PermissionsData::CanCaptureVisiblePage(
289 extension, url, tab_id, NULL));
292 bool AllowedExclusivelyOnTab(
293 const Extension* extension,
294 const std::set<GURL>& allowed_urls,
297 for (std::set<GURL>::iterator it = urls_.begin(); it != urls_.end(); ++it) {
298 const GURL& url = *it;
299 if (allowed_urls.count(url))
300 result &= Allowed(extension, url, tab_id);
302 result &= Blocked(extension, url, tab_id);
307 // URLs that are "safe" to provide scripting and capture visible tab access
308 // to if the permissions allow it.
310 const GURL http_url_with_path;
311 const GURL https_url;
314 // We should allow host permission but not scripting permission for favicon
316 const GURL favicon_url;
318 // URLs that regular extensions should never get access to.
319 const GURL extension_url;
320 const GURL settings_url;
321 const GURL about_url;
324 // The set of all URLs above.
325 std::set<GURL> urls_;
328 TEST_F(ExtensionScriptAndCaptureVisibleTest, Permissions) {
329 // Test <all_urls> for regular extensions.
330 scoped_refptr<Extension> extension = LoadManifestStrict("script_and_capture",
331 "extension_regular_all.json");
333 EXPECT_TRUE(Allowed(extension.get(), http_url));
334 EXPECT_TRUE(Allowed(extension.get(), https_url));
335 EXPECT_TRUE(Blocked(extension.get(), file_url));
336 EXPECT_TRUE(Blocked(extension.get(), settings_url));
337 EXPECT_TRUE(CaptureOnly(extension.get(), favicon_url));
338 EXPECT_TRUE(Blocked(extension.get(), about_url));
339 EXPECT_TRUE(Blocked(extension.get(), extension_url));
341 // Test access to iframed content.
342 GURL within_extension_url = extension->GetResourceURL("page.html");
343 EXPECT_TRUE(AllowedScript(extension.get(), http_url, http_url_with_path));
344 EXPECT_TRUE(AllowedScript(extension.get(), https_url, http_url_with_path));
345 EXPECT_TRUE(AllowedScript(extension.get(), http_url, within_extension_url));
346 EXPECT_TRUE(AllowedScript(extension.get(), https_url, within_extension_url));
347 EXPECT_TRUE(BlockedScript(extension.get(), http_url, extension_url));
348 EXPECT_TRUE(BlockedScript(extension.get(), https_url, extension_url));
351 PermissionsData::HasHostPermission(extension.get(), settings_url));
352 EXPECT_FALSE(PermissionsData::HasHostPermission(extension.get(), about_url));
353 EXPECT_TRUE(PermissionsData::HasHostPermission(extension.get(), favicon_url));
355 // Test * for scheme, which implies just the http/https schemes.
356 extension = LoadManifestStrict("script_and_capture",
357 "extension_wildcard.json");
358 EXPECT_TRUE(Allowed(extension.get(), http_url));
359 EXPECT_TRUE(Allowed(extension.get(), https_url));
360 EXPECT_TRUE(Blocked(extension.get(), settings_url));
361 EXPECT_TRUE(Blocked(extension.get(), about_url));
362 EXPECT_TRUE(Blocked(extension.get(), file_url));
363 EXPECT_TRUE(Blocked(extension.get(), favicon_url));
365 LoadManifest("script_and_capture", "extension_wildcard_settings.json");
366 EXPECT_TRUE(Blocked(extension.get(), settings_url));
368 // Having chrome://*/ should not work for regular extensions. Note that
369 // for favicon access, we require the explicit pattern chrome://favicon/*.
371 extension = LoadManifestUnchecked("script_and_capture",
372 "extension_wildcard_chrome.json",
373 Manifest::INTERNAL, Extension::NO_FLAGS,
375 std::vector<InstallWarning> warnings = extension->install_warnings();
376 EXPECT_FALSE(warnings.empty());
377 EXPECT_EQ(ErrorUtils::FormatErrorMessage(
378 manifest_errors::kInvalidPermissionScheme,
380 warnings[0].message);
381 EXPECT_TRUE(Blocked(extension.get(), settings_url));
382 EXPECT_TRUE(Blocked(extension.get(), favicon_url));
383 EXPECT_TRUE(Blocked(extension.get(), about_url));
385 // Having chrome://favicon/* should not give you chrome://*
386 extension = LoadManifestStrict("script_and_capture",
387 "extension_chrome_favicon_wildcard.json");
388 EXPECT_TRUE(Blocked(extension.get(), settings_url));
389 EXPECT_TRUE(CaptureOnly(extension.get(), favicon_url));
390 EXPECT_TRUE(Blocked(extension.get(), about_url));
391 EXPECT_TRUE(PermissionsData::HasHostPermission(extension.get(), favicon_url));
393 // Having http://favicon should not give you chrome://favicon
394 extension = LoadManifestStrict("script_and_capture",
395 "extension_http_favicon.json");
396 EXPECT_TRUE(Blocked(extension.get(), settings_url));
397 EXPECT_TRUE(Blocked(extension.get(), favicon_url));
399 // Component extensions with <all_urls> should get everything.
400 extension = LoadManifest("script_and_capture", "extension_component_all.json",
401 Manifest::COMPONENT, Extension::NO_FLAGS);
402 EXPECT_TRUE(Allowed(extension.get(), http_url));
403 EXPECT_TRUE(Allowed(extension.get(), https_url));
404 EXPECT_TRUE(Allowed(extension.get(), settings_url));
405 EXPECT_TRUE(Allowed(extension.get(), about_url));
406 EXPECT_TRUE(Allowed(extension.get(), favicon_url));
407 EXPECT_TRUE(PermissionsData::HasHostPermission(extension.get(), favicon_url));
409 // Component extensions should only get access to what they ask for.
410 extension = LoadManifest("script_and_capture",
411 "extension_component_google.json", Manifest::COMPONENT,
412 Extension::NO_FLAGS);
413 EXPECT_TRUE(Allowed(extension.get(), http_url));
414 EXPECT_TRUE(Blocked(extension.get(), https_url));
415 EXPECT_TRUE(Blocked(extension.get(), file_url));
416 EXPECT_TRUE(Blocked(extension.get(), settings_url));
417 EXPECT_TRUE(Blocked(extension.get(), favicon_url));
418 EXPECT_TRUE(Blocked(extension.get(), about_url));
419 EXPECT_TRUE(Blocked(extension.get(), extension_url));
421 PermissionsData::HasHostPermission(extension.get(), settings_url));
424 TEST_F(ExtensionScriptAndCaptureVisibleTest, PermissionsWithChromeURLsEnabled) {
425 CommandLine::ForCurrentProcess()->AppendSwitch(
426 switches::kExtensionsOnChromeURLs);
428 scoped_refptr<Extension> extension;
430 // Test <all_urls> for regular extensions.
431 extension = LoadManifestStrict("script_and_capture",
432 "extension_regular_all.json");
433 EXPECT_TRUE(Allowed(extension.get(), http_url));
434 EXPECT_TRUE(Allowed(extension.get(), https_url));
435 EXPECT_TRUE(Blocked(extension.get(), file_url));
436 EXPECT_TRUE(Blocked(extension.get(), settings_url));
437 EXPECT_TRUE(Allowed(extension.get(), favicon_url)); // chrome:// requested
438 EXPECT_TRUE(Blocked(extension.get(), about_url));
439 EXPECT_TRUE(Blocked(extension.get(), extension_url));
441 // Test access to iframed content.
442 GURL within_extension_url = extension->GetResourceURL("page.html");
443 EXPECT_TRUE(AllowedScript(extension.get(), http_url, http_url_with_path));
444 EXPECT_TRUE(AllowedScript(extension.get(), https_url, http_url_with_path));
445 EXPECT_TRUE(AllowedScript(extension.get(), http_url, within_extension_url));
446 EXPECT_TRUE(AllowedScript(extension.get(), https_url, within_extension_url));
447 EXPECT_TRUE(BlockedScript(extension.get(), http_url, extension_url));
448 EXPECT_TRUE(BlockedScript(extension.get(), https_url, extension_url));
451 PermissionsData::HasHostPermission(extension.get(), settings_url));
452 EXPECT_FALSE(PermissionsData::HasHostPermission(extension.get(), about_url));
453 EXPECT_TRUE(PermissionsData::HasHostPermission(extension.get(), favicon_url));
455 // Test * for scheme, which implies just the http/https schemes.
456 extension = LoadManifestStrict("script_and_capture",
457 "extension_wildcard.json");
458 EXPECT_TRUE(Allowed(extension.get(), http_url));
459 EXPECT_TRUE(Allowed(extension.get(), https_url));
460 EXPECT_TRUE(Blocked(extension.get(), settings_url));
461 EXPECT_TRUE(Blocked(extension.get(), about_url));
462 EXPECT_TRUE(Blocked(extension.get(), file_url));
463 EXPECT_TRUE(Blocked(extension.get(), favicon_url));
465 LoadManifest("script_and_capture", "extension_wildcard_settings.json");
466 EXPECT_TRUE(Blocked(extension.get(), settings_url));
468 // Having chrome://*/ should work for regular extensions with the flag
471 extension = LoadManifestUnchecked("script_and_capture",
472 "extension_wildcard_chrome.json",
473 Manifest::INTERNAL, Extension::NO_FLAGS,
475 EXPECT_FALSE(extension.get() == NULL);
476 EXPECT_TRUE(Blocked(extension.get(), http_url));
477 EXPECT_TRUE(Blocked(extension.get(), https_url));
478 EXPECT_TRUE(Allowed(extension.get(), settings_url));
479 EXPECT_TRUE(Blocked(extension.get(), about_url));
480 EXPECT_TRUE(Blocked(extension.get(), file_url));
481 EXPECT_TRUE(Allowed(extension.get(), favicon_url)); // chrome:// requested
483 // Having chrome://favicon/* should not give you chrome://*
484 extension = LoadManifestStrict("script_and_capture",
485 "extension_chrome_favicon_wildcard.json");
486 EXPECT_TRUE(Blocked(extension.get(), settings_url));
487 EXPECT_TRUE(Allowed(extension.get(), favicon_url)); // chrome:// requested
488 EXPECT_TRUE(Blocked(extension.get(), about_url));
489 EXPECT_TRUE(PermissionsData::HasHostPermission(extension.get(), favicon_url));
491 // Having http://favicon should not give you chrome://favicon
492 extension = LoadManifestStrict("script_and_capture",
493 "extension_http_favicon.json");
494 EXPECT_TRUE(Blocked(extension.get(), settings_url));
495 EXPECT_TRUE(Blocked(extension.get(), favicon_url));
497 // Component extensions with <all_urls> should get everything.
498 extension = LoadManifest("script_and_capture", "extension_component_all.json",
499 Manifest::COMPONENT, Extension::NO_FLAGS);
500 EXPECT_TRUE(Allowed(extension.get(), http_url));
501 EXPECT_TRUE(Allowed(extension.get(), https_url));
502 EXPECT_TRUE(Allowed(extension.get(), settings_url));
503 EXPECT_TRUE(Allowed(extension.get(), about_url));
504 EXPECT_TRUE(Allowed(extension.get(), favicon_url));
505 EXPECT_TRUE(PermissionsData::HasHostPermission(extension.get(), favicon_url));
507 // Component extensions should only get access to what they ask for.
508 extension = LoadManifest("script_and_capture",
509 "extension_component_google.json", Manifest::COMPONENT,
510 Extension::NO_FLAGS);
511 EXPECT_TRUE(Allowed(extension.get(), http_url));
512 EXPECT_TRUE(Blocked(extension.get(), https_url));
513 EXPECT_TRUE(Blocked(extension.get(), file_url));
514 EXPECT_TRUE(Blocked(extension.get(), settings_url));
515 EXPECT_TRUE(Blocked(extension.get(), favicon_url));
516 EXPECT_TRUE(Blocked(extension.get(), about_url));
517 EXPECT_TRUE(Blocked(extension.get(), extension_url));
519 PermissionsData::HasHostPermission(extension.get(), settings_url));
522 TEST_F(ExtensionScriptAndCaptureVisibleTest, TabSpecific) {
523 scoped_refptr<Extension> extension =
524 LoadManifestStrict("script_and_capture", "tab_specific.json");
526 EXPECT_FALSE(PermissionsData::GetTabSpecificPermissions(extension.get(), 0)
528 EXPECT_FALSE(PermissionsData::GetTabSpecificPermissions(extension.get(), 1)
530 EXPECT_FALSE(PermissionsData::GetTabSpecificPermissions(extension.get(), 2)
533 std::set<GURL> no_urls;
535 EXPECT_TRUE(AllowedExclusivelyOnTab(extension.get(), no_urls, 0));
536 EXPECT_TRUE(AllowedExclusivelyOnTab(extension.get(), no_urls, 1));
537 EXPECT_TRUE(AllowedExclusivelyOnTab(extension.get(), no_urls, 2));
539 URLPatternSet allowed_hosts;
540 allowed_hosts.AddPattern(URLPattern(URLPattern::SCHEME_ALL,
542 std::set<GURL> allowed_urls;
543 allowed_urls.insert(http_url);
544 // http_url_with_path() will also be allowed, because Extension should be
545 // considering the security origin of the URL not the URL itself, and
546 // http_url is in allowed_hosts.
547 allowed_urls.insert(http_url_with_path);
550 scoped_refptr<PermissionSet> permissions(
551 new PermissionSet(APIPermissionSet(), allowed_hosts, URLPatternSet()));
552 PermissionsData::UpdateTabSpecificPermissions(
553 extension.get(), 0, permissions);
554 EXPECT_EQ(permissions->explicit_hosts(),
555 PermissionsData::GetTabSpecificPermissions(extension.get(), 0)
559 EXPECT_TRUE(AllowedExclusivelyOnTab(extension.get(), allowed_urls, 0));
560 EXPECT_TRUE(AllowedExclusivelyOnTab(extension.get(), no_urls, 1));
561 EXPECT_TRUE(AllowedExclusivelyOnTab(extension.get(), no_urls, 2));
563 PermissionsData::ClearTabSpecificPermissions(extension.get(), 0);
564 EXPECT_FALSE(PermissionsData::GetTabSpecificPermissions(extension.get(), 0)
567 EXPECT_TRUE(AllowedExclusivelyOnTab(extension.get(), no_urls, 0));
568 EXPECT_TRUE(AllowedExclusivelyOnTab(extension.get(), no_urls, 1));
569 EXPECT_TRUE(AllowedExclusivelyOnTab(extension.get(), no_urls, 2));
571 std::set<GURL> more_allowed_urls = allowed_urls;
572 more_allowed_urls.insert(https_url);
573 URLPatternSet more_allowed_hosts = allowed_hosts;
574 more_allowed_hosts.AddPattern(URLPattern(URLPattern::SCHEME_ALL,
578 scoped_refptr<PermissionSet> permissions(
579 new PermissionSet(APIPermissionSet(), allowed_hosts, URLPatternSet()));
580 PermissionsData::UpdateTabSpecificPermissions(
581 extension.get(), 0, permissions);
582 EXPECT_EQ(permissions->explicit_hosts(),
583 PermissionsData::GetTabSpecificPermissions(extension.get(), 0)
586 permissions = new PermissionSet(APIPermissionSet(),
589 PermissionsData::UpdateTabSpecificPermissions(
590 extension.get(), 1, permissions);
591 EXPECT_EQ(permissions->explicit_hosts(),
592 PermissionsData::GetTabSpecificPermissions(extension.get(), 1)
596 EXPECT_TRUE(AllowedExclusivelyOnTab(extension.get(), allowed_urls, 0));
597 EXPECT_TRUE(AllowedExclusivelyOnTab(extension.get(), more_allowed_urls, 1));
598 EXPECT_TRUE(AllowedExclusivelyOnTab(extension.get(), no_urls, 2));
600 PermissionsData::ClearTabSpecificPermissions(extension.get(), 0);
601 EXPECT_FALSE(PermissionsData::GetTabSpecificPermissions(extension.get(), 0)
604 EXPECT_TRUE(AllowedExclusivelyOnTab(extension.get(), no_urls, 0));
605 EXPECT_TRUE(AllowedExclusivelyOnTab(extension.get(), more_allowed_urls, 1));
606 EXPECT_TRUE(AllowedExclusivelyOnTab(extension.get(), no_urls, 2));
608 PermissionsData::ClearTabSpecificPermissions(extension.get(), 1);
609 EXPECT_FALSE(PermissionsData::GetTabSpecificPermissions(extension.get(), 1)
612 EXPECT_TRUE(AllowedExclusivelyOnTab(extension.get(), no_urls, 0));
613 EXPECT_TRUE(AllowedExclusivelyOnTab(extension.get(), no_urls, 1));
614 EXPECT_TRUE(AllowedExclusivelyOnTab(extension.get(), no_urls, 2));
617 } // namespace extensions