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) {
// to apps/extensions via the permissions API.
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());
// TODO(devlin): Add scriptable hosts.
return permissions;
}
......
......@@ -29,28 +29,23 @@ using extensions::permissions_test_util::GetPatternsAsStrings;
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.
TEST(ExtensionPermissionsAPIHelpers, Pack) {
APIPermissionSet apis;
apis.insert(APIPermission::kTab);
apis.insert(APIPermission::kFileBrowserHandler);
// Note: kFileBrowserHandler implies kFileBrowserHandlerInternal.
URLPatternSet hosts;
AddPattern(&hosts, "http://a.com/*");
AddPattern(&hosts, "http://b.com/*");
URLPatternSet explicit_hosts(
{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.
std::unique_ptr<Permissions> pack_result(PackPermissionSet(
PermissionSet(apis, ManifestPermissionSet(), hosts, URLPatternSet())));
std::unique_ptr<Permissions> pack_result(PackPermissionSet(PermissionSet(
apis, ManifestPermissionSet(), explicit_hosts, scriptable_hosts)));
ASSERT_TRUE(pack_result);
ASSERT_TRUE(pack_result->permissions);
EXPECT_THAT(*pack_result->permissions,
......@@ -59,7 +54,8 @@ TEST(ExtensionPermissionsAPIHelpers, Pack) {
ASSERT_TRUE(pack_result->origins);
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
......
......@@ -244,7 +244,8 @@ TEST_F(PermissionsAPIUnitTest, ContainsAndGetAllWithRuntimeHostPermissions) {
// contentscript.com (since permissions are not withheld).
EXPECT_TRUE(contains_origin(kExampleCom));
EXPECT_TRUE(contains_origin(kContentScriptCom));
EXPECT_THAT(get_all(), testing::ElementsAre(kExampleCom));
EXPECT_THAT(get_all(),
testing::UnorderedElementsAre(kExampleCom, kContentScriptCom));
ScriptingPermissionsModifier modifier(profile(), extension);
modifier.SetWithholdHostPermissions(true);
......
......@@ -120,17 +120,6 @@ class PermissionsUpdaterListener : public content::NotificationObserver {
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) {
int schemes = URLPattern::SCHEME_ALL;
extent->AddPattern(URLPattern(schemes, pattern));
......@@ -166,8 +155,12 @@ TEST_F(PermissionsUpdaterTest, GrantAndRevokeOptionalPermissions) {
InitializeEmptyExtensionService();
// Load the test extension.
scoped_refptr<Extension> extension = LoadOurManifest();
ASSERT_TRUE(extension.get());
scoped_refptr<const Extension> extension =
ExtensionBuilder("permissions")
.AddPermissions({"management", "http://a.com/*"})
.SetManifestKey("optional_permissions",
ListBuilder().Append("http://*.c.com/*").Build())
.Build();
APIPermissionSet default_apis;
default_apis.insert(APIPermission::kManagement);
......
......@@ -26,17 +26,17 @@ var emptyPermissions = {permissions: [], origins: []};
var initialPermissions = {
permissions: ['management'],
origins: ['http://a.com/*']
origins: ['http://a.com/*', "http://contentscript.com/*"]
};
var permissionsWithBookmarks = {
permissions: ['management', 'bookmarks'],
origins: ['http://a.com/*']
origins: ['http://a.com/*', "http://contentscript.com/*"]
}
var permissionsWithOrigin = {
permissions: ['management'],
origins: ['http://a.com/*', 'http://*.c.com/*']
origins: ['http://a.com/*', 'http://*.c.com/*', "http://contentscript.com/*"]
}
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 @@
"background": {
"scripts": ["background.js"]
},
"content_scripts": [{
"matches": ["http://contentscript.com/*"],
"js": ["content_script.js"]
}],
"permissions": [
"management",
"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