Commit 7edce81a authored by Devlin Cronin's avatar Devlin Cronin Committed by Commit Bot

[Extensions Click-to-Script] Adjust permissions packing for getAll()

Adjust the permissions packing code in the chrome.permissions extension
API to include scriptable hosts, as well as explicit hosts. This will
result in permissions.getAll() returning origins that are specified in
the content_scripts section of the manifest, in addition to the hosts
specified in the permissions key.

Update tests for the same.

Bug: 889654
Change-Id: I5dba0bc225bdcb30b969f48f9405f92b1ec8bd58
Reviewed-on: https://chromium-review.googlesource.com/c/1347441Reviewed-by: default avatarKaran Bhatia <karandeepb@chromium.org>
Commit-Queue: Devlin <rdevlin.cronin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#612376}
parent df545846
...@@ -211,11 +211,9 @@ std::unique_ptr<Permissions> PackPermissionSet(const PermissionSet& set) { ...@@ -211,11 +211,9 @@ std::unique_ptr<Permissions> PackPermissionSet(const PermissionSet& set) {
// to apps/extensions via the permissions API. // to apps/extensions via the permissions API.
permissions->origins.reset(new std::vector<std::string>()); permissions->origins.reset(new std::vector<std::string>());
for (const URLPattern& pattern : set.explicit_hosts()) for (const URLPattern& pattern : set.effective_hosts())
permissions->origins->push_back(pattern.GetAsString()); permissions->origins->push_back(pattern.GetAsString());
// TODO(devlin): Add scriptable hosts.
return permissions; return permissions;
} }
......
...@@ -29,28 +29,23 @@ using extensions::permissions_test_util::GetPatternsAsStrings; ...@@ -29,28 +29,23 @@ using extensions::permissions_test_util::GetPatternsAsStrings;
namespace extensions { namespace extensions {
namespace {
static void AddPattern(URLPatternSet* extent, const std::string& pattern) {
int schemes = URLPattern::SCHEME_ALL;
extent->AddPattern(URLPattern(schemes, pattern));
}
} // namespace
// Tests that we can convert PermissionSets to the generated types. // Tests that we can convert PermissionSets to the generated types.
TEST(ExtensionPermissionsAPIHelpers, Pack) { TEST(ExtensionPermissionsAPIHelpers, Pack) {
APIPermissionSet apis; APIPermissionSet apis;
apis.insert(APIPermission::kTab); apis.insert(APIPermission::kTab);
apis.insert(APIPermission::kFileBrowserHandler); apis.insert(APIPermission::kFileBrowserHandler);
// Note: kFileBrowserHandler implies kFileBrowserHandlerInternal. // Note: kFileBrowserHandler implies kFileBrowserHandlerInternal.
URLPatternSet hosts;
AddPattern(&hosts, "http://a.com/*"); URLPatternSet explicit_hosts(
AddPattern(&hosts, "http://b.com/*"); {URLPattern(Extension::kValidHostPermissionSchemes, "http://a.com/*"),
URLPattern(Extension::kValidHostPermissionSchemes, "http://b.com/*")});
URLPatternSet scriptable_hosts(
{URLPattern(UserScript::ValidUserScriptSchemes(), "http://c.com/*"),
URLPattern(UserScript::ValidUserScriptSchemes(), "http://d.com/*")});
// Pack the permission set to value and verify its contents. // Pack the permission set to value and verify its contents.
std::unique_ptr<Permissions> pack_result(PackPermissionSet( std::unique_ptr<Permissions> pack_result(PackPermissionSet(PermissionSet(
PermissionSet(apis, ManifestPermissionSet(), hosts, URLPatternSet()))); apis, ManifestPermissionSet(), explicit_hosts, scriptable_hosts)));
ASSERT_TRUE(pack_result); ASSERT_TRUE(pack_result);
ASSERT_TRUE(pack_result->permissions); ASSERT_TRUE(pack_result->permissions);
EXPECT_THAT(*pack_result->permissions, EXPECT_THAT(*pack_result->permissions,
...@@ -59,7 +54,8 @@ TEST(ExtensionPermissionsAPIHelpers, Pack) { ...@@ -59,7 +54,8 @@ TEST(ExtensionPermissionsAPIHelpers, Pack) {
ASSERT_TRUE(pack_result->origins); ASSERT_TRUE(pack_result->origins);
EXPECT_THAT(*pack_result->origins, testing::UnorderedElementsAre( EXPECT_THAT(*pack_result->origins, testing::UnorderedElementsAre(
"http://a.com/*", "http://b.com/*")); "http://a.com/*", "http://b.com/*",
"http://c.com/*", "http://d.com/*"));
} }
// Tests various error conditions and edge cases when unpacking values // Tests various error conditions and edge cases when unpacking values
......
...@@ -244,7 +244,8 @@ TEST_F(PermissionsAPIUnitTest, ContainsAndGetAllWithRuntimeHostPermissions) { ...@@ -244,7 +244,8 @@ TEST_F(PermissionsAPIUnitTest, ContainsAndGetAllWithRuntimeHostPermissions) {
// contentscript.com (since permissions are not withheld). // contentscript.com (since permissions are not withheld).
EXPECT_TRUE(contains_origin(kExampleCom)); EXPECT_TRUE(contains_origin(kExampleCom));
EXPECT_TRUE(contains_origin(kContentScriptCom)); EXPECT_TRUE(contains_origin(kContentScriptCom));
EXPECT_THAT(get_all(), testing::ElementsAre(kExampleCom)); EXPECT_THAT(get_all(),
testing::UnorderedElementsAre(kExampleCom, kContentScriptCom));
ScriptingPermissionsModifier modifier(profile(), extension); ScriptingPermissionsModifier modifier(profile(), extension);
modifier.SetWithholdHostPermissions(true); modifier.SetWithholdHostPermissions(true);
......
...@@ -120,17 +120,6 @@ class PermissionsUpdaterListener : public content::NotificationObserver { ...@@ -120,17 +120,6 @@ class PermissionsUpdaterListener : public content::NotificationObserver {
class PermissionsUpdaterTest : public ExtensionServiceTestBase { class PermissionsUpdaterTest : public ExtensionServiceTestBase {
}; };
scoped_refptr<Extension> LoadOurManifest() {
base::FilePath path;
path = path.AppendASCII("api_test")
.AppendASCII("permissions")
.AppendASCII("optional");
return LoadManifest(path.AsUTF8Unsafe(),
"manifest.json",
Manifest::INTERNAL,
Extension::NO_FLAGS);
}
void AddPattern(URLPatternSet* extent, const std::string& pattern) { void AddPattern(URLPatternSet* extent, const std::string& pattern) {
int schemes = URLPattern::SCHEME_ALL; int schemes = URLPattern::SCHEME_ALL;
extent->AddPattern(URLPattern(schemes, pattern)); extent->AddPattern(URLPattern(schemes, pattern));
...@@ -166,8 +155,12 @@ TEST_F(PermissionsUpdaterTest, GrantAndRevokeOptionalPermissions) { ...@@ -166,8 +155,12 @@ TEST_F(PermissionsUpdaterTest, GrantAndRevokeOptionalPermissions) {
InitializeEmptyExtensionService(); InitializeEmptyExtensionService();
// Load the test extension. // Load the test extension.
scoped_refptr<Extension> extension = LoadOurManifest(); scoped_refptr<const Extension> extension =
ASSERT_TRUE(extension.get()); ExtensionBuilder("permissions")
.AddPermissions({"management", "http://a.com/*"})
.SetManifestKey("optional_permissions",
ListBuilder().Append("http://*.c.com/*").Build())
.Build();
APIPermissionSet default_apis; APIPermissionSet default_apis;
default_apis.insert(APIPermission::kManagement); default_apis.insert(APIPermission::kManagement);
......
...@@ -26,17 +26,17 @@ var emptyPermissions = {permissions: [], origins: []}; ...@@ -26,17 +26,17 @@ var emptyPermissions = {permissions: [], origins: []};
var initialPermissions = { var initialPermissions = {
permissions: ['management'], permissions: ['management'],
origins: ['http://a.com/*'] origins: ['http://a.com/*', "http://contentscript.com/*"]
}; };
var permissionsWithBookmarks = { var permissionsWithBookmarks = {
permissions: ['management', 'bookmarks'], permissions: ['management', 'bookmarks'],
origins: ['http://a.com/*'] origins: ['http://a.com/*', "http://contentscript.com/*"]
} }
var permissionsWithOrigin = { var permissionsWithOrigin = {
permissions: ['management'], permissions: ['management'],
origins: ['http://a.com/*', 'http://*.c.com/*'] origins: ['http://a.com/*', 'http://*.c.com/*', "http://contentscript.com/*"]
} }
function checkEqualSets(set1, set2) { function checkEqualSets(set1, set2) {
......
// Copyright 2018 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.
// This space intentionally left blank.
...@@ -7,6 +7,10 @@ ...@@ -7,6 +7,10 @@
"background": { "background": {
"scripts": ["background.js"] "scripts": ["background.js"]
}, },
"content_scripts": [{
"matches": ["http://contentscript.com/*"],
"js": ["content_script.js"]
}],
"permissions": [ "permissions": [
"management", "management",
"http://a.com/*" "http://a.com/*"
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment