Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stdint.h> | 5 #include <stdint.h> |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| 11 #include "base/memory/ref_counted.h" | 11 #include "base/memory/ref_counted.h" |
| 12 #include "base/strings/string16.h" | 12 #include "base/strings/string16.h" |
| 13 #include "base/strings/utf_string_conversions.h" | 13 #include "base/strings/utf_string_conversions.h" |
| 14 #include "build/build_config.h" | 14 #include "build/build_config.h" |
| 15 #include "chrome/common/extensions/extension_test_util.h" | 15 #include "chrome/common/extensions/extension_test_util.h" |
| 16 #include "components/crx_file/id_util.h" | 16 #include "components/crx_file/id_util.h" |
| 17 #include "content/public/common/socket_permission_request.h" | 17 #include "content/public/common/socket_permission_request.h" |
| 18 #include "extensions/common/constants.h" | |
| 18 #include "extensions/common/error_utils.h" | 19 #include "extensions/common/error_utils.h" |
| 19 #include "extensions/common/extension.h" | 20 #include "extensions/common/extension.h" |
| 20 #include "extensions/common/extension_builder.h" | 21 #include "extensions/common/extension_builder.h" |
| 21 #include "extensions/common/manifest.h" | 22 #include "extensions/common/manifest.h" |
| 22 #include "extensions/common/manifest_constants.h" | 23 #include "extensions/common/manifest_constants.h" |
| 23 #include "extensions/common/permissions/api_permission.h" | 24 #include "extensions/common/permissions/api_permission.h" |
| 24 #include "extensions/common/permissions/permission_message_test_util.h" | 25 #include "extensions/common/permissions/permission_message_test_util.h" |
| 25 #include "extensions/common/permissions/permission_set.h" | 26 #include "extensions/common/permissions/permission_set.h" |
| 26 #include "extensions/common/permissions/permissions_data.h" | 27 #include "extensions/common/permissions/permissions_data.h" |
| 27 #include "extensions/common/permissions/socket_permission.h" | 28 #include "extensions/common/permissions/socket_permission.h" |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 70 .Set("version", "1.0.0") | 71 .Set("version", "1.0.0") |
| 71 .Set("permissions", permissions.Build()) | 72 .Set("permissions", permissions.Build()) |
| 72 .Build()) | 73 .Build()) |
| 73 .SetLocation(location) | 74 .SetLocation(location) |
| 74 .SetID(id) | 75 .SetID(id) |
| 75 .Build(); | 76 .Build(); |
| 76 } | 77 } |
| 77 | 78 |
| 78 // Checks that urls are properly restricted for the given extension. | 79 // Checks that urls are properly restricted for the given extension. |
| 79 void CheckRestrictedUrls(const Extension* extension, | 80 void CheckRestrictedUrls(const Extension* extension, |
| 80 bool block_chrome_urls) { | 81 bool block_chrome_urls, |
| 82 bool block_google_urls) { | |
| 81 // We log the name so we know _which_ extension failed here. | 83 // We log the name so we know _which_ extension failed here. |
| 82 const std::string& name = extension->name(); | 84 const std::string& name = extension->name(); |
| 83 const GURL chrome_settings_url("chrome://settings/"); | 85 const GURL chrome_settings_url("chrome://settings/"); |
| 84 const GURL chrome_extension_url("chrome-extension://foo/bar.html"); | 86 const GURL chrome_extension_url("chrome-extension://foo/bar.html"); |
| 85 const GURL google_url("https://www.google.com/"); | 87 const GURL google_url("https://www.google.com/"); |
| 86 const GURL self_url("chrome-extension://" + extension->id() + "/foo.html"); | 88 const GURL self_url("chrome-extension://" + extension->id() + "/foo.html"); |
| 87 const GURL invalid_url("chrome-debugger://foo/bar.html"); | 89 const GURL invalid_url("chrome-debugger://foo/bar.html"); |
| 88 | 90 |
| 89 std::string error; | 91 std::string error; |
| 90 EXPECT_EQ(block_chrome_urls, | 92 EXPECT_EQ(block_chrome_urls, |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 101 EXPECT_EQ(block_chrome_urls, | 103 EXPECT_EQ(block_chrome_urls, |
| 102 PermissionsData::IsRestrictedUrl( | 104 PermissionsData::IsRestrictedUrl( |
| 103 chrome_extension_url, | 105 chrome_extension_url, |
| 104 extension, | 106 extension, |
| 105 &error)) << name; | 107 &error)) << name; |
| 106 if (block_chrome_urls) | 108 if (block_chrome_urls) |
| 107 EXPECT_EQ(manifest_errors::kCannotAccessExtensionUrl, error) << name; | 109 EXPECT_EQ(manifest_errors::kCannotAccessExtensionUrl, error) << name; |
| 108 else | 110 else |
| 109 EXPECT_TRUE(error.empty()) << name; | 111 EXPECT_TRUE(error.empty()) << name; |
| 110 | 112 |
| 111 // Google should never be a restricted url. | 113 // Google shouldn't be restricted unless a runtime host restriction is applied |
| 114 // by policy. | |
| 112 error.clear(); | 115 error.clear(); |
| 113 EXPECT_FALSE(PermissionsData::IsRestrictedUrl( | 116 EXPECT_EQ(block_google_urls, |
| 114 google_url, extension, &error)) << name; | 117 PermissionsData::IsRestrictedUrl(google_url, extension, &error)) |
| 115 EXPECT_TRUE(error.empty()) << name; | 118 << name; |
| 119 if (block_google_urls) | |
| 120 EXPECT_EQ(extension_misc::kPolicyBlockedScripting, error) << name; | |
| 121 else | |
| 122 EXPECT_TRUE(error.empty()) << name; | |
| 116 | 123 |
| 117 // We should always be able to access our own extension pages. | 124 // We should always be able to access our own extension pages. |
| 118 error.clear(); | 125 error.clear(); |
| 119 EXPECT_FALSE(PermissionsData::IsRestrictedUrl( | 126 EXPECT_FALSE(PermissionsData::IsRestrictedUrl( |
| 120 self_url, extension, &error)) << name; | 127 self_url, extension, &error)) << name; |
| 121 EXPECT_TRUE(error.empty()) << name; | 128 EXPECT_TRUE(error.empty()) << name; |
| 122 | 129 |
| 123 // We should only allow other schemes for extensions when it's a whitelisted | 130 // We should only allow other schemes for extensions when it's a whitelisted |
| 124 // extension. | 131 // extension. |
| 125 error.clear(); | 132 error.clear(); |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 217 EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.google.com"))); | 224 EXPECT_TRUE(hosts.MatchesURL(GURL("http://www.google.com"))); |
| 218 EXPECT_TRUE(extension->permissions_data()->HasEffectiveAccessToAllHosts()); | 225 EXPECT_TRUE(extension->permissions_data()->HasEffectiveAccessToAllHosts()); |
| 219 | 226 |
| 220 // Tab-specific permissions should be included in the effective hosts. | 227 // Tab-specific permissions should be included in the effective hosts. |
| 221 GURL tab_url("http://www.example.com/"); | 228 GURL tab_url("http://www.example.com/"); |
| 222 URLPatternSet new_hosts; | 229 URLPatternSet new_hosts; |
| 223 new_hosts.AddOrigin(URLPattern::SCHEME_ALL, tab_url); | 230 new_hosts.AddOrigin(URLPattern::SCHEME_ALL, tab_url); |
| 224 extension->permissions_data()->UpdateTabSpecificPermissions( | 231 extension->permissions_data()->UpdateTabSpecificPermissions( |
| 225 1, PermissionSet(APIPermissionSet(), ManifestPermissionSet(), new_hosts, | 232 1, PermissionSet(APIPermissionSet(), ManifestPermissionSet(), new_hosts, |
| 226 URLPatternSet())); | 233 URLPatternSet())); |
| 227 EXPECT_TRUE(extension->permissions_data()->GetEffectiveHostPermissions(). | 234 EXPECT_TRUE( |
|
nrpeter
2017/04/05 23:13:26
I ran git cl format, and this happened....
Do yo
Devlin
2017/04/07 00:40:27
nah, git cl format changes are fine, as long as th
nrpeter
2017/04/12 23:35:45
Done.
| |
| 228 MatchesURL(tab_url)); | 235 extension->permissions_data()->GetEffectiveHostPermissions().MatchesURL( |
| 236 tab_url)); | |
| 229 extension->permissions_data()->ClearTabSpecificPermissions(1); | 237 extension->permissions_data()->ClearTabSpecificPermissions(1); |
| 230 EXPECT_FALSE(extension->permissions_data()->GetEffectiveHostPermissions(). | 238 EXPECT_FALSE( |
| 231 MatchesURL(tab_url)); | 239 extension->permissions_data()->GetEffectiveHostPermissions().MatchesURL( |
| 240 tab_url)); | |
| 232 } | 241 } |
| 233 | 242 |
| 234 TEST(PermissionsDataTest, SocketPermissions) { | 243 TEST(PermissionsDataTest, SocketPermissions) { |
| 235 scoped_refptr<Extension> extension; | 244 scoped_refptr<Extension> extension; |
| 236 std::string error; | 245 std::string error; |
| 237 | 246 |
| 238 extension = LoadManifest("socket_permissions", "empty.json"); | 247 extension = LoadManifest("socket_permissions", "empty.json"); |
| 239 EXPECT_FALSE(CheckSocketPermission(extension, | 248 EXPECT_FALSE(CheckSocketPermission( |
| 240 SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); | 249 extension, SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); |
|
nrpeter
2017/04/05 23:13:27
Ditto
nrpeter
2017/04/12 23:35:45
Done.
| |
| 241 | 250 |
| 242 extension = LoadManifestUnchecked("socket_permissions", | 251 extension = LoadManifestUnchecked("socket_permissions", |
| 243 "socket1.json", | 252 "socket1.json", |
| 244 Manifest::INTERNAL, Extension::NO_FLAGS, | 253 Manifest::INTERNAL, Extension::NO_FLAGS, |
| 245 &error); | 254 &error); |
| 246 EXPECT_TRUE(extension.get() == NULL); | 255 EXPECT_TRUE(extension.get() == NULL); |
| 247 std::string expected_error_msg_header = ErrorUtils::FormatErrorMessage( | 256 std::string expected_error_msg_header = ErrorUtils::FormatErrorMessage( |
| 248 manifest_errors::kInvalidPermissionWithDetail, | 257 manifest_errors::kInvalidPermissionWithDetail, |
| 249 "socket", | 258 "socket", |
| 250 "NULL or empty permission list"); | 259 "NULL or empty permission list"); |
| 251 EXPECT_EQ(expected_error_msg_header, error); | 260 EXPECT_EQ(expected_error_msg_header, error); |
| 252 | 261 |
| 253 extension = LoadManifest("socket_permissions", "socket2.json"); | 262 extension = LoadManifest("socket_permissions", "socket2.json"); |
| 254 EXPECT_TRUE(CheckSocketPermission(extension, | 263 EXPECT_TRUE(CheckSocketPermission( |
| 255 SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); | 264 extension, SocketPermissionRequest::TCP_CONNECT, "www.example.com", 80)); |
| 256 EXPECT_FALSE(CheckSocketPermission( | 265 EXPECT_FALSE(CheckSocketPermission( |
| 257 extension, SocketPermissionRequest::UDP_BIND, "", 80)); | 266 extension, SocketPermissionRequest::UDP_BIND, "", 80)); |
| 258 EXPECT_TRUE(CheckSocketPermission( | 267 EXPECT_TRUE(CheckSocketPermission( |
| 259 extension, SocketPermissionRequest::UDP_BIND, "", 8888)); | 268 extension, SocketPermissionRequest::UDP_BIND, "", 8888)); |
| 260 | 269 |
| 261 EXPECT_FALSE(CheckSocketPermission( | 270 EXPECT_FALSE(CheckSocketPermission( |
| 262 extension, SocketPermissionRequest::UDP_SEND_TO, "example.com", 1900)); | 271 extension, SocketPermissionRequest::UDP_SEND_TO, "example.com", 1900)); |
| 263 EXPECT_TRUE(CheckSocketPermission( | 272 EXPECT_TRUE(CheckSocketPermission(extension, |
| 264 extension, | 273 SocketPermissionRequest::UDP_SEND_TO, |
| 265 SocketPermissionRequest::UDP_SEND_TO, | 274 "239.255.255.250", 1900)); |
|
nrpeter
2017/04/05 23:13:27
Ditto
nrpeter
2017/04/12 23:35:45
Done.
| |
| 266 "239.255.255.250", 1900)); | |
| 267 } | 275 } |
| 268 | 276 |
| 269 TEST(PermissionsDataTest, IsRestrictedUrl) { | 277 TEST(PermissionsDataTest, IsRestrictedUrl) { |
| 270 scoped_refptr<const Extension> extension = | 278 scoped_refptr<const Extension> extension = |
| 271 GetExtensionWithHostPermission("normal_extension", | 279 GetExtensionWithHostPermission("normal_extension", |
| 272 kAllHostsPermission, | 280 kAllHostsPermission, |
| 273 Manifest::INTERNAL); | 281 Manifest::INTERNAL); |
| 274 // Chrome urls should be blocked for normal extensions. | 282 // Chrome urls should be blocked for normal extensions, but not Google. |
| 275 CheckRestrictedUrls(extension.get(), true); | 283 CheckRestrictedUrls(extension.get(), true, false); |
| 284 | |
| 285 scoped_refptr<const Extension> policy_extension = | |
|
Devlin
2017/04/07 00:40:27
Let's make new tests for this. Unit tests are che
nrpeter
2017/04/12 23:35:44
Moved out of IsRestrictedUrl to this is no longer
| |
| 286 GetExtensionWithHostPermission("policy_host_restriction_extension", | |
| 287 kAllHostsPermission, Manifest::INTERNAL); | |
| 288 URLPatternSet blocked; | |
| 289 URLPatternSet allowed; | |
| 290 blocked.AddPattern( | |
| 291 URLPattern(URLPattern::SCHEME_ALL, "https://*.google.com/*")); | |
| 292 policy_extension->permissions_data()->SetPolicyHostRestrictions(blocked, | |
| 293 allowed); | |
| 294 // Chrome urls should be blocked & Google urls should be blocked by policy. | |
| 295 CheckRestrictedUrls(policy_extension.get(), true, true); | |
| 276 | 296 |
| 277 scoped_refptr<const Extension> component = | 297 scoped_refptr<const Extension> component = |
| 278 GetExtensionWithHostPermission("component", | 298 GetExtensionWithHostPermission("component", |
| 279 kAllHostsPermission, | 299 kAllHostsPermission, |
| 280 Manifest::COMPONENT); | 300 Manifest::COMPONENT); |
| 281 // Chrome urls should be accessible by component extensions. | 301 // Chrome urls should be accessible by component extensions. |
| 282 CheckRestrictedUrls(component.get(), false); | 302 CheckRestrictedUrls(component.get(), false, false); |
| 303 | |
| 304 scoped_refptr<const Extension> policy_component = | |
| 305 GetExtensionWithHostPermission("component", kAllHostsPermission, | |
| 306 Manifest::COMPONENT); | |
| 307 // Chrome urls should be accessible by component extensions & Google urls | |
| 308 // should be blocked by policy. | |
| 309 policy_component->permissions_data()->SetPolicyHostRestrictions(blocked, | |
| 310 allowed); | |
| 311 CheckRestrictedUrls(policy_component.get(), false, true); | |
| 283 | 312 |
| 284 base::CommandLine::ForCurrentProcess()->AppendSwitch( | 313 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
| 285 switches::kExtensionsOnChromeURLs); | 314 switches::kExtensionsOnChromeURLs); |
| 286 // Enabling the switch should allow all extensions to access chrome urls. | 315 // Enabling the switch should allow all extensions to access chrome urls. |
| 287 CheckRestrictedUrls(extension.get(), false); | 316 CheckRestrictedUrls(extension.get(), false, false); |
| 288 } | 317 } |
| 289 | 318 |
| 290 TEST(PermissionsDataTest, GetPermissionMessages_ManyAPIPermissions) { | 319 TEST(PermissionsDataTest, GetPermissionMessages_ManyAPIPermissions) { |
| 291 scoped_refptr<Extension> extension; | 320 scoped_refptr<Extension> extension; |
| 292 extension = LoadManifest("permissions", "many-apis.json"); | 321 extension = LoadManifest("permissions", "many-apis.json"); |
| 293 // Warning for "tabs" is suppressed by "history" permission. | 322 // Warning for "tabs" is suppressed by "history" permission. |
| 294 std::vector<std::string> expected_messages; | 323 std::vector<std::string> expected_messages; |
| 295 expected_messages.push_back("Read and change your data on api.flickr.com"); | 324 expected_messages.push_back("Read and change your data on api.flickr.com"); |
| 296 expected_messages.push_back("Read and change your bookmarks"); | 325 expected_messages.push_back("Read and change your bookmarks"); |
| 297 expected_messages.push_back("Detect your physical location"); | 326 expected_messages.push_back("Detect your physical location"); |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 374 } | 403 } |
| 375 | 404 |
| 376 // Base class for testing the CanAccessPage and CanCaptureVisiblePage | 405 // Base class for testing the CanAccessPage and CanCaptureVisiblePage |
| 377 // methods of Extension for extensions with various permissions. | 406 // methods of Extension for extensions with various permissions. |
| 378 class ExtensionScriptAndCaptureVisibleTest : public testing::Test { | 407 class ExtensionScriptAndCaptureVisibleTest : public testing::Test { |
| 379 protected: | 408 protected: |
| 380 ExtensionScriptAndCaptureVisibleTest() | 409 ExtensionScriptAndCaptureVisibleTest() |
| 381 : http_url("http://www.google.com"), | 410 : http_url("http://www.google.com"), |
| 382 http_url_with_path("http://www.google.com/index.html"), | 411 http_url_with_path("http://www.google.com/index.html"), |
| 383 https_url("https://www.google.com"), | 412 https_url("https://www.google.com"), |
| 413 https_url_diff_subdomain("https://example.google.com"), | |
| 384 file_url("file:///foo/bar"), | 414 file_url("file:///foo/bar"), |
| 385 favicon_url("chrome://favicon/http://www.google.com"), | 415 favicon_url("chrome://favicon/http://www.google.com"), |
| 386 extension_url("chrome-extension://" + | 416 extension_url("chrome-extension://" + |
| 387 crx_file::id_util::GenerateIdForPath( | 417 crx_file::id_util::GenerateIdForPath( |
| 388 base::FilePath(FILE_PATH_LITERAL("foo")))), | 418 base::FilePath(FILE_PATH_LITERAL("foo")))), |
| 389 settings_url("chrome://settings"), | 419 settings_url("chrome://settings"), |
| 390 about_url("about:flags") { | 420 about_url("about:flags") { |
| 391 urls_.insert(http_url); | 421 urls_.insert(http_url); |
| 392 urls_.insert(http_url_with_path); | 422 urls_.insert(http_url_with_path); |
| 393 urls_.insert(https_url); | 423 urls_.insert(https_url); |
| 424 urls_.insert(https_url_diff_subdomain); | |
| 394 urls_.insert(file_url); | 425 urls_.insert(file_url); |
| 395 urls_.insert(favicon_url); | 426 urls_.insert(favicon_url); |
| 396 urls_.insert(extension_url); | 427 urls_.insert(extension_url); |
| 397 urls_.insert(settings_url); | 428 urls_.insert(settings_url); |
| 398 urls_.insert(about_url); | 429 urls_.insert(about_url); |
| 399 // Ignore the policy delegate for this test. | 430 // Ignore the policy delegate for this test. |
| 400 PermissionsData::SetPolicyDelegate(NULL); | 431 PermissionsData::SetPolicyDelegate(NULL); |
| 401 } | 432 } |
| 402 | 433 |
| 403 bool AllowedScript(const Extension* extension, const GURL& url) { | 434 bool AllowedScript(const Extension* extension, const GURL& url) { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 469 result &= Blocked(extension, url, tab_id); | 500 result &= Blocked(extension, url, tab_id); |
| 470 } | 501 } |
| 471 return result; | 502 return result; |
| 472 } | 503 } |
| 473 | 504 |
| 474 // URLs that are "safe" to provide scripting and capture visible tab access | 505 // URLs that are "safe" to provide scripting and capture visible tab access |
| 475 // to if the permissions allow it. | 506 // to if the permissions allow it. |
| 476 const GURL http_url; | 507 const GURL http_url; |
| 477 const GURL http_url_with_path; | 508 const GURL http_url_with_path; |
| 478 const GURL https_url; | 509 const GURL https_url; |
| 510 const GURL https_url_diff_subdomain; | |
| 479 const GURL file_url; | 511 const GURL file_url; |
| 480 | 512 |
| 481 // We should allow host permission but not scripting permission for favicon | 513 // We should allow host permission but not scripting permission for favicon |
| 482 // urls. | 514 // urls. |
| 483 const GURL favicon_url; | 515 const GURL favicon_url; |
| 484 | 516 |
| 485 // URLs that regular extensions should never get access to. | 517 // URLs that regular extensions should never get access to. |
| 486 const GURL extension_url; | 518 const GURL extension_url; |
| 487 const GURL settings_url; | 519 const GURL settings_url; |
| 488 const GURL about_url; | 520 const GURL about_url; |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 585 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url)); | 617 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url)); |
| 586 } | 618 } |
| 587 | 619 |
| 588 TEST_F(ExtensionScriptAndCaptureVisibleTest, PermissionsWithChromeURLsEnabled) { | 620 TEST_F(ExtensionScriptAndCaptureVisibleTest, PermissionsWithChromeURLsEnabled) { |
| 589 base::CommandLine::ForCurrentProcess()->AppendSwitch( | 621 base::CommandLine::ForCurrentProcess()->AppendSwitch( |
| 590 switches::kExtensionsOnChromeURLs); | 622 switches::kExtensionsOnChromeURLs); |
| 591 | 623 |
| 592 scoped_refptr<Extension> extension; | 624 scoped_refptr<Extension> extension; |
| 593 | 625 |
| 594 // Test <all_urls> for regular extensions. | 626 // Test <all_urls> for regular extensions. |
| 595 extension = LoadManifestStrict("script_and_capture", | 627 extension = |
| 596 "extension_regular_all.json"); | 628 LoadManifestStrict("script_and_capture", "extension_regular_all.json"); |
|
nrpeter
2017/04/05 23:13:27
Ditto
nrpeter
2017/04/12 23:35:44
Done.
| |
| 597 EXPECT_TRUE(Allowed(extension.get(), http_url)); | 629 EXPECT_TRUE(Allowed(extension.get(), http_url)); |
| 598 EXPECT_TRUE(Allowed(extension.get(), https_url)); | 630 EXPECT_TRUE(Allowed(extension.get(), https_url)); |
| 599 EXPECT_TRUE(CaptureOnly(extension.get(), file_url)); | 631 EXPECT_TRUE(CaptureOnly(extension.get(), file_url)); |
| 600 EXPECT_TRUE(CaptureOnly(extension.get(), settings_url)); | 632 EXPECT_TRUE(CaptureOnly(extension.get(), settings_url)); |
| 601 EXPECT_TRUE(Allowed(extension.get(), favicon_url)); // chrome:// requested | 633 EXPECT_TRUE(Allowed(extension.get(), favicon_url)); // chrome:// requested |
| 602 EXPECT_TRUE(CaptureOnly(extension.get(), about_url)); | 634 EXPECT_TRUE(CaptureOnly(extension.get(), about_url)); |
| 603 EXPECT_TRUE(CaptureOnly(extension.get(), extension_url)); | 635 EXPECT_TRUE(CaptureOnly(extension.get(), extension_url)); |
| 604 | 636 |
| 605 // Test access to iframed content. | 637 // Test access to iframed content. |
| 606 GURL within_extension_url = extension->GetResourceURL("page.html"); | 638 GURL within_extension_url = extension->GetResourceURL("page.html"); |
| 607 EXPECT_TRUE(AllowedScript(extension.get(), http_url)); | 639 EXPECT_TRUE(AllowedScript(extension.get(), http_url)); |
| 608 EXPECT_TRUE(AllowedScript(extension.get(), http_url_with_path)); | 640 EXPECT_TRUE(AllowedScript(extension.get(), http_url_with_path)); |
| 609 EXPECT_TRUE(AllowedScript(extension.get(), https_url)); | 641 EXPECT_TRUE(AllowedScript(extension.get(), https_url)); |
| 610 EXPECT_TRUE(BlockedScript(extension.get(), within_extension_url)); | 642 EXPECT_TRUE(BlockedScript(extension.get(), within_extension_url)); |
| 611 EXPECT_TRUE(BlockedScript(extension.get(), extension_url)); | 643 EXPECT_TRUE(BlockedScript(extension.get(), extension_url)); |
| 612 | 644 |
| 613 const PermissionsData* permissions_data = extension->permissions_data(); | 645 const PermissionsData* permissions_data = extension->permissions_data(); |
| 614 EXPECT_FALSE(permissions_data->HasHostPermission(settings_url)); | 646 EXPECT_FALSE(permissions_data->HasHostPermission(settings_url)); |
| 615 EXPECT_FALSE(permissions_data->HasHostPermission(about_url)); | 647 EXPECT_FALSE(permissions_data->HasHostPermission(about_url)); |
| 616 EXPECT_TRUE(permissions_data->HasHostPermission(favicon_url)); | 648 EXPECT_TRUE(permissions_data->HasHostPermission(favicon_url)); |
| 617 | 649 |
| 618 // Test * for scheme, which implies just the http/https schemes. | 650 // Test * for scheme, which implies just the http/https schemes. |
| 619 extension = LoadManifestStrict("script_and_capture", | 651 extension = |
| 620 "extension_wildcard.json"); | 652 LoadManifestStrict("script_and_capture", "extension_wildcard.json"); |
| 621 EXPECT_TRUE(ScriptOnly(extension.get(), http_url)); | 653 EXPECT_TRUE(ScriptOnly(extension.get(), http_url)); |
| 622 EXPECT_TRUE(ScriptOnly(extension.get(), https_url)); | 654 EXPECT_TRUE(ScriptOnly(extension.get(), https_url)); |
| 623 EXPECT_TRUE(Blocked(extension.get(), settings_url)); | 655 EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
| 624 EXPECT_TRUE(Blocked(extension.get(), about_url)); | 656 EXPECT_TRUE(Blocked(extension.get(), about_url)); |
| 625 EXPECT_TRUE(Blocked(extension.get(), file_url)); | 657 EXPECT_TRUE(Blocked(extension.get(), file_url)); |
| 626 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); | 658 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); |
| 627 extension = | 659 extension = |
| 628 LoadManifest("script_and_capture", "extension_wildcard_settings.json"); | 660 LoadManifest("script_and_capture", "extension_wildcard_settings.json"); |
| 629 EXPECT_TRUE(Blocked(extension.get(), settings_url)); | 661 EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
| 630 | 662 |
| 631 // Having chrome://*/ should work for regular extensions with the flag | 663 // Having chrome://*/ should work for regular extensions with the flag |
| 632 // enabled. | 664 // enabled. |
| 633 std::string error; | 665 std::string error; |
| 634 extension = LoadManifestUnchecked("script_and_capture", | 666 extension = LoadManifestUnchecked("script_and_capture", |
| 635 "extension_wildcard_chrome.json", | 667 "extension_wildcard_chrome.json", |
| 636 Manifest::INTERNAL, Extension::NO_FLAGS, | 668 Manifest::INTERNAL, Extension::NO_FLAGS, |
| 637 &error); | 669 &error); |
| 638 EXPECT_FALSE(extension.get() == NULL); | 670 EXPECT_FALSE(extension.get() == NULL); |
| 639 EXPECT_TRUE(Blocked(extension.get(), http_url)); | 671 EXPECT_TRUE(Blocked(extension.get(), http_url)); |
| 640 EXPECT_TRUE(Blocked(extension.get(), https_url)); | 672 EXPECT_TRUE(Blocked(extension.get(), https_url)); |
| 641 EXPECT_TRUE(ScriptOnly(extension.get(), settings_url)); | 673 EXPECT_TRUE(ScriptOnly(extension.get(), settings_url)); |
| 642 EXPECT_TRUE(Blocked(extension.get(), about_url)); | 674 EXPECT_TRUE(Blocked(extension.get(), about_url)); |
| 643 EXPECT_TRUE(Blocked(extension.get(), file_url)); | 675 EXPECT_TRUE(Blocked(extension.get(), file_url)); |
| 644 EXPECT_TRUE(ScriptOnly(extension.get(), favicon_url)); | 676 EXPECT_TRUE(ScriptOnly(extension.get(), favicon_url)); |
| 645 | 677 |
| 646 // Having chrome://favicon/* should not give you chrome://* | 678 // Having chrome://favicon/* should not give you chrome://* |
| 647 extension = LoadManifestStrict("script_and_capture", | 679 extension = LoadManifestStrict("script_and_capture", |
| 648 "extension_chrome_favicon_wildcard.json"); | 680 "extension_chrome_favicon_wildcard.json"); |
| 649 EXPECT_TRUE(Blocked(extension.get(), settings_url)); | 681 EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
| 650 EXPECT_TRUE(ScriptOnly(extension.get(), favicon_url)); | 682 EXPECT_TRUE(ScriptOnly(extension.get(), favicon_url)); |
| 651 EXPECT_TRUE(Blocked(extension.get(), about_url)); | 683 EXPECT_TRUE(Blocked(extension.get(), about_url)); |
| 652 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); | 684 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); |
| 653 | 685 |
| 654 // Having http://favicon should not give you chrome://favicon | 686 // Having http://favicon should not give you chrome://favicon |
| 655 extension = LoadManifestStrict("script_and_capture", | 687 extension = |
| 656 "extension_http_favicon.json"); | 688 LoadManifestStrict("script_and_capture", "extension_http_favicon.json"); |
| 657 EXPECT_TRUE(Blocked(extension.get(), settings_url)); | 689 EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
| 658 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); | 690 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); |
| 659 | 691 |
| 660 // Component extensions with <all_urls> should get everything. | 692 // Component extensions with <all_urls> should get everything. |
| 661 extension = LoadManifest("script_and_capture", "extension_component_all.json", | 693 extension = LoadManifest("script_and_capture", "extension_component_all.json", |
| 662 Manifest::COMPONENT, Extension::NO_FLAGS); | 694 Manifest::COMPONENT, Extension::NO_FLAGS); |
| 663 EXPECT_TRUE(Allowed(extension.get(), http_url)); | 695 EXPECT_TRUE(Allowed(extension.get(), http_url)); |
| 664 EXPECT_TRUE(Allowed(extension.get(), https_url)); | 696 EXPECT_TRUE(Allowed(extension.get(), https_url)); |
| 665 EXPECT_TRUE(Allowed(extension.get(), settings_url)); | 697 EXPECT_TRUE(Allowed(extension.get(), settings_url)); |
| 666 EXPECT_TRUE(Allowed(extension.get(), about_url)); | 698 EXPECT_TRUE(Allowed(extension.get(), about_url)); |
| 667 EXPECT_TRUE(Allowed(extension.get(), favicon_url)); | 699 EXPECT_TRUE(Allowed(extension.get(), favicon_url)); |
| 668 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); | 700 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); |
| 669 | 701 |
| 670 // Component extensions should only get access to what they ask for. | 702 // Component extensions should only get access to what they ask for. |
| 671 extension = LoadManifest("script_and_capture", | 703 extension = |
| 672 "extension_component_google.json", Manifest::COMPONENT, | 704 LoadManifest("script_and_capture", "extension_component_google.json", |
| 673 Extension::NO_FLAGS); | 705 Manifest::COMPONENT, Extension::NO_FLAGS); |
| 674 EXPECT_TRUE(ScriptOnly(extension.get(), http_url)); | 706 EXPECT_TRUE(ScriptOnly(extension.get(), http_url)); |
| 675 EXPECT_TRUE(Blocked(extension.get(), https_url)); | 707 EXPECT_TRUE(Blocked(extension.get(), https_url)); |
| 676 EXPECT_TRUE(Blocked(extension.get(), file_url)); | 708 EXPECT_TRUE(Blocked(extension.get(), file_url)); |
| 677 EXPECT_TRUE(Blocked(extension.get(), settings_url)); | 709 EXPECT_TRUE(Blocked(extension.get(), settings_url)); |
| 678 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); | 710 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); |
| 679 EXPECT_TRUE(Blocked(extension.get(), about_url)); | 711 EXPECT_TRUE(Blocked(extension.get(), about_url)); |
| 680 EXPECT_TRUE(Blocked(extension.get(), extension_url)); | 712 EXPECT_TRUE(Blocked(extension.get(), extension_url)); |
| 681 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url)); | 713 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url)); |
| 682 } | 714 } |
| 683 | 715 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 762 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 2)); | 794 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 2)); |
| 763 | 795 |
| 764 permissions_data->ClearTabSpecificPermissions(1); | 796 permissions_data->ClearTabSpecificPermissions(1); |
| 765 EXPECT_FALSE(permissions_data->GetTabSpecificPermissionsForTesting(1)); | 797 EXPECT_FALSE(permissions_data->GetTabSpecificPermissionsForTesting(1)); |
| 766 | 798 |
| 767 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 0)); | 799 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 0)); |
| 768 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 1)); | 800 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 1)); |
| 769 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 2)); | 801 EXPECT_TRUE(ScriptAllowedExclusivelyOnTab(extension.get(), no_urls, 2)); |
| 770 } | 802 } |
| 771 | 803 |
| 804 TEST_F(ExtensionScriptAndCaptureVisibleTest, PolicyHostRestrictionsSwap) { | |
| 805 // Makes sure when an extension gets an individual policy for host | |
| 806 // restrictions it overrides the default policy. Also tests transitioning back | |
| 807 // to the default policy when an individual policy is removed. | |
| 808 URLPatternSet default_blocked; | |
| 809 URLPatternSet default_allowed; | |
| 810 default_blocked.AddPattern( | |
| 811 URLPattern(URLPattern::SCHEME_ALL, "https://*.google.com/*")); | |
| 812 default_allowed.AddPattern( | |
| 813 URLPattern(URLPattern::SCHEME_ALL, "https://example.google.com/*")); | |
| 814 | |
| 815 // Test <all_urls> for regular extensions. | |
| 816 scoped_refptr<Extension> extension = | |
| 817 LoadManifestStrict("script_and_capture", "extension_regular_all.json"); | |
| 818 extension->permissions_data()->SetDefaultPolicyHostRestrictions( | |
| 819 default_blocked, default_allowed); | |
| 820 | |
| 821 // Default policy example.google.com OK, any other google subdomain blocked. | |
| 822 EXPECT_TRUE(CaptureOnly(extension.get(), https_url)); | |
|
Devlin
2017/04/07 00:40:26
These variables (https_url, https_url_diff_subdoma
nrpeter
2017/04/12 23:35:45
Done.
| |
| 823 EXPECT_TRUE(Allowed(extension.get(), https_url_diff_subdomain)); | |
| 824 | |
| 825 URLPatternSet blocked; | |
| 826 blocked.AddPattern( | |
| 827 URLPattern(URLPattern::SCHEME_ALL, "https://example.google.com/*")); | |
| 828 URLPatternSet allowed; | |
| 829 extension->permissions_data()->SetPolicyHostRestrictions(blocked, allowed); | |
| 830 // Individual poilcy example.google.com BLOCKED. | |
|
Devlin
2017/04/07 00:40:27
typo: policy
nrpeter
2017/04/12 23:35:45
Done.
nrpeter
2017/04/12 23:35:45
Done.
| |
| 831 EXPECT_TRUE(Allowed(extension.get(), https_url)); | |
| 832 EXPECT_TRUE(CaptureOnly(extension.get(), https_url_diff_subdomain)); | |
| 833 | |
| 834 // Individual policy example.google.com OK, other google subdomains blocked. | |
| 835 // Tests that URL is allowed if same URL in blocked and allowed. | |
|
Devlin
2017/04/07 00:40:27
Use proper grammar in comments, e.g. "Tests that a
nrpeter
2017/04/12 23:35:45
Done.
| |
| 836 blocked.AddPattern( | |
| 837 URLPattern(URLPattern::SCHEME_ALL, "https://*.google.com/*")); | |
| 838 allowed.AddPattern( | |
| 839 URLPattern(URLPattern::SCHEME_ALL, "https://example.google.com/*")); | |
| 840 extension->permissions_data()->SetPolicyHostRestrictions(blocked, allowed); | |
| 841 EXPECT_TRUE(CaptureOnly(extension.get(), https_url)); | |
| 842 EXPECT_TRUE(Allowed(extension.get(), https_url_diff_subdomain)); | |
| 843 | |
| 844 // Clear Individual plan. | |
| 845 blocked.ClearPatterns(); | |
| 846 allowed.ClearPatterns(); | |
| 847 extension->permissions_data()->SetPolicyHostRestrictions(blocked, allowed); | |
| 848 EXPECT_TRUE(Allowed(extension.get(), https_url)); | |
| 849 EXPECT_TRUE(Allowed(extension.get(), https_url_diff_subdomain)); | |
| 850 | |
| 851 // Flip back to using default policy for this extension. | |
| 852 extension->permissions_data()->SetUsesDefaultHostRestrictions(); | |
| 853 | |
| 854 // Default policy example.google.com OK, any other google subdomain blocked. | |
| 855 EXPECT_TRUE(CaptureOnly(extension.get(), https_url)); | |
| 856 EXPECT_TRUE(Allowed(extension.get(), https_url_diff_subdomain)); | |
| 857 } | |
| 858 | |
| 859 TEST_F(ExtensionScriptAndCaptureVisibleTest, PolicyHostRestrictions) { | |
| 860 URLPatternSet default_blocked; | |
| 861 URLPatternSet default_allowed; | |
| 862 default_blocked.AddPattern( | |
| 863 URLPattern(URLPattern::SCHEME_ALL, "https://*.google.com/*")); | |
| 864 default_allowed.AddPattern( | |
| 865 URLPattern(URLPattern::SCHEME_ALL, "https://example.google.com/*")); | |
| 866 | |
| 867 // Test <all_urls> for regular extensions. | |
| 868 scoped_refptr<Extension> extension = | |
| 869 LoadManifestStrict("script_and_capture", "extension_regular_all.json"); | |
| 870 extension->permissions_data()->SetDefaultPolicyHostRestrictions( | |
| 871 default_blocked, default_allowed); | |
| 872 | |
| 873 EXPECT_TRUE(Allowed(extension.get(), http_url)); | |
| 874 EXPECT_TRUE(CaptureOnly(extension.get(), https_url)); | |
| 875 EXPECT_TRUE(Allowed(extension.get(), https_url_diff_subdomain)); | |
| 876 EXPECT_TRUE(CaptureOnly(extension.get(), file_url)); | |
| 877 EXPECT_TRUE(CaptureOnly(extension.get(), settings_url)); | |
| 878 EXPECT_TRUE(CaptureOnly(extension.get(), favicon_url)); | |
| 879 EXPECT_TRUE(CaptureOnly(extension.get(), about_url)); | |
| 880 EXPECT_TRUE(CaptureOnly(extension.get(), extension_url)); | |
| 881 | |
| 882 // Test access to iframed content. | |
| 883 GURL within_extension_url = extension->GetResourceURL("page.html"); | |
| 884 EXPECT_TRUE(AllowedScript(extension.get(), http_url)); | |
| 885 EXPECT_TRUE(AllowedScript(extension.get(), http_url_with_path)); | |
| 886 EXPECT_TRUE(AllowedScript(extension.get(), https_url_diff_subdomain)); | |
| 887 EXPECT_TRUE(BlockedScript(extension.get(), https_url)); | |
| 888 EXPECT_TRUE(BlockedScript(extension.get(), within_extension_url)); | |
| 889 EXPECT_TRUE(BlockedScript(extension.get(), extension_url)); | |
| 890 | |
| 891 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url)); | |
| 892 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(about_url)); | |
| 893 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); | |
| 894 | |
| 895 // Test * for scheme, which implies just the http/https schemes. | |
| 896 extension = | |
| 897 LoadManifestStrict("script_and_capture", "extension_wildcard.json"); | |
| 898 extension->permissions_data()->SetDefaultPolicyHostRestrictions( | |
| 899 default_blocked, default_allowed); | |
| 900 EXPECT_TRUE(ScriptOnly(extension.get(), http_url)); | |
| 901 EXPECT_TRUE(ScriptOnly(extension.get(), https_url_diff_subdomain)); | |
| 902 EXPECT_TRUE(Blocked(extension.get(), https_url)); | |
| 903 EXPECT_TRUE(Blocked(extension.get(), settings_url)); | |
| 904 EXPECT_TRUE(Blocked(extension.get(), about_url)); | |
| 905 EXPECT_TRUE(Blocked(extension.get(), file_url)); | |
| 906 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); | |
| 907 extension = | |
| 908 LoadManifest("script_and_capture", "extension_wildcard_settings.json"); | |
| 909 extension->permissions_data()->SetDefaultPolicyHostRestrictions( | |
| 910 default_blocked, default_allowed); | |
| 911 EXPECT_TRUE(Blocked(extension.get(), settings_url)); | |
| 912 | |
| 913 // Having chrome://*/ should not work for regular extensions. Note that | |
| 914 // for favicon access, we require the explicit pattern chrome://favicon/*. | |
| 915 std::string error; | |
| 916 extension = LoadManifestUnchecked( | |
| 917 "script_and_capture", "extension_wildcard_chrome.json", | |
| 918 Manifest::INTERNAL, Extension::NO_FLAGS, &error); | |
| 919 extension->permissions_data()->SetDefaultPolicyHostRestrictions( | |
| 920 default_blocked, default_allowed); | |
| 921 std::vector<InstallWarning> warnings = extension->install_warnings(); | |
| 922 EXPECT_FALSE(warnings.empty()); | |
| 923 EXPECT_EQ(ErrorUtils::FormatErrorMessage( | |
| 924 manifest_errors::kInvalidPermissionScheme, "chrome://*/"), | |
| 925 warnings[0].message); | |
| 926 EXPECT_TRUE(Blocked(extension.get(), settings_url)); | |
| 927 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); | |
| 928 EXPECT_TRUE(Blocked(extension.get(), about_url)); | |
| 929 | |
| 930 // Having chrome://favicon/* should not give you chrome://* | |
|
Devlin
2017/04/07 00:40:27
A lot of this test seems duplicative. Can we eith
nrpeter
2017/04/12 23:35:45
Good point, all the tests after the component test
| |
| 931 extension = LoadManifestStrict("script_and_capture", | |
| 932 "extension_chrome_favicon_wildcard.json"); | |
| 933 extension->permissions_data()->SetDefaultPolicyHostRestrictions( | |
| 934 default_blocked, default_allowed); | |
| 935 EXPECT_TRUE(Blocked(extension.get(), settings_url)); | |
| 936 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); | |
| 937 EXPECT_TRUE(Blocked(extension.get(), about_url)); | |
| 938 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); | |
| 939 | |
| 940 // Having http://favicon should not give you chrome://favicon | |
| 941 extension = | |
| 942 LoadManifestStrict("script_and_capture", "extension_http_favicon.json"); | |
| 943 extension->permissions_data()->SetDefaultPolicyHostRestrictions( | |
| 944 default_blocked, default_allowed); | |
| 945 EXPECT_TRUE(Blocked(extension.get(), settings_url)); | |
| 946 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); | |
| 947 | |
| 948 // Component extensions with <all_urls> should get everything. | |
| 949 extension = LoadManifest("script_and_capture", "extension_component_all.json", | |
| 950 Manifest::COMPONENT, Extension::NO_FLAGS); | |
| 951 extension->permissions_data()->SetDefaultPolicyHostRestrictions( | |
| 952 default_blocked, default_allowed); | |
| 953 EXPECT_TRUE(Allowed(extension.get(), http_url)); | |
| 954 EXPECT_TRUE(CaptureOnly(extension.get(), https_url)); | |
| 955 EXPECT_TRUE(Allowed(extension.get(), https_url_diff_subdomain)); | |
| 956 EXPECT_TRUE(Allowed(extension.get(), settings_url)); | |
| 957 EXPECT_TRUE(Allowed(extension.get(), about_url)); | |
| 958 EXPECT_TRUE(Allowed(extension.get(), favicon_url)); | |
| 959 EXPECT_TRUE(extension->permissions_data()->HasHostPermission(favicon_url)); | |
| 960 | |
| 961 // Component extensions should only get access to what they ask for. | |
| 962 extension = | |
| 963 LoadManifest("script_and_capture", "extension_component_google.json", | |
| 964 Manifest::COMPONENT, Extension::NO_FLAGS); | |
| 965 extension->permissions_data()->SetDefaultPolicyHostRestrictions( | |
| 966 default_blocked, default_allowed); | |
| 967 EXPECT_TRUE(ScriptOnly(extension.get(), http_url)); | |
| 968 EXPECT_TRUE(Blocked(extension.get(), https_url)); | |
| 969 EXPECT_TRUE(Blocked(extension.get(), https_url_diff_subdomain)); | |
| 970 EXPECT_TRUE(Blocked(extension.get(), file_url)); | |
| 971 EXPECT_TRUE(Blocked(extension.get(), settings_url)); | |
| 972 EXPECT_TRUE(Blocked(extension.get(), favicon_url)); | |
| 973 EXPECT_TRUE(Blocked(extension.get(), about_url)); | |
| 974 EXPECT_TRUE(Blocked(extension.get(), extension_url)); | |
| 975 EXPECT_FALSE(extension->permissions_data()->HasHostPermission(settings_url)); | |
| 976 } | |
| 977 | |
| 772 } // namespace extensions | 978 } // namespace extensions |
| OLD | NEW |