forked from mirrors/gecko-dev
This patch does change the extension-related special case in SVGContextPaint::IsAllowedForImageFromURI to check the "internal:svgContextPropertiesAllowed" extension permission, and move the existing criteria in the Extension class (which takes care of adding the internal permission when those criteria as met). This patch does not contain yet a new explicit test case for the new internal permission (which is part of the patch build on top of this one and attached to the same bugzilla issue), but it does pass the existing mochitest-chrome (test_chrome_ext_svg_context_fill.html). Differential Revision: https://phabricator.services.mozilla.com/D115835
162 lines
4.6 KiB
JavaScript
162 lines
4.6 KiB
JavaScript
"use strict";
|
|
|
|
const { ExtensionPermissions } = ChromeUtils.import(
|
|
"resource://gre/modules/ExtensionPermissions.jsm"
|
|
);
|
|
|
|
AddonTestUtils.init(this);
|
|
AddonTestUtils.overrideCertDB();
|
|
AddonTestUtils.createAppInfo(
|
|
"xpcshell@tests.mozilla.org",
|
|
"XPCShell",
|
|
"1",
|
|
"42"
|
|
);
|
|
|
|
// This test doesn't need the test extensions to be detected as privileged,
|
|
// disabling it to avoid having to keep the list of expected "internal:*"
|
|
// permissions that are added automatically to privileged extensions
|
|
// and already covered by other tests.
|
|
AddonTestUtils.usePrivilegedSignatures = false;
|
|
|
|
Services.prefs.setBoolPref(
|
|
"extensions.webextensions.background-delayed-startup",
|
|
false
|
|
);
|
|
|
|
// Look up the cached permissions, if any.
|
|
async function getCachedPermissions(extensionId) {
|
|
const NotFound = Symbol("extension ID not found in permissions cache");
|
|
try {
|
|
return await ExtensionParent.StartupCache.permissions.get(
|
|
extensionId,
|
|
() => {
|
|
// Throw error to prevent the key from being created.
|
|
throw NotFound;
|
|
}
|
|
);
|
|
} catch (e) {
|
|
if (e === NotFound) {
|
|
return null;
|
|
}
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
// Look up the permissions from the file. Internal methods are used to avoid
|
|
// inadvertently changing the permissions in the cache or the database.
|
|
async function getStoredPermissions(extensionId) {
|
|
if (await ExtensionPermissions._has(extensionId)) {
|
|
return ExtensionPermissions._get(extensionId);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
add_task(async function setup() {
|
|
// Bug 1646182: Force ExtensionPermissions to run in rkv mode, the legacy
|
|
// storage mode will run in xpcshell-legacy-ep.ini
|
|
await ExtensionPermissions._uninit();
|
|
|
|
optionalPermissionsPromptHandler.init();
|
|
optionalPermissionsPromptHandler.acceptPrompt = true;
|
|
|
|
await AddonTestUtils.promiseStartupManager();
|
|
registerCleanupFunction(async () => {
|
|
await AddonTestUtils.promiseShutdownManager();
|
|
});
|
|
});
|
|
|
|
// This test must run before any restart of the addonmanager so the
|
|
// ExtensionAddonObserver works.
|
|
add_task(async function test_permissions_removed() {
|
|
let extension = ExtensionTestUtils.loadExtension({
|
|
manifest: {
|
|
optional_permissions: ["idle"],
|
|
},
|
|
background() {
|
|
browser.test.onMessage.addListener(async (msg, arg) => {
|
|
if (msg == "request") {
|
|
try {
|
|
let result = await browser.permissions.request(arg);
|
|
browser.test.sendMessage("request.result", result);
|
|
} catch (err) {
|
|
browser.test.sendMessage("request.result", err.message);
|
|
}
|
|
}
|
|
});
|
|
},
|
|
useAddonManager: "temporary",
|
|
});
|
|
|
|
await extension.startup();
|
|
|
|
await withHandlingUserInput(extension, async () => {
|
|
extension.sendMessage("request", { permissions: ["idle"], origins: [] });
|
|
let result = await extension.awaitMessage("request.result");
|
|
equal(result, true, "request() for optional permissions succeeded");
|
|
});
|
|
|
|
let id = extension.id;
|
|
let perms = await ExtensionPermissions.get(id);
|
|
equal(
|
|
perms.permissions.length,
|
|
1,
|
|
`optional permission added (${JSON.stringify(perms.permissions)})`
|
|
);
|
|
|
|
Assert.deepEqual(
|
|
await getCachedPermissions(id),
|
|
{
|
|
permissions: ["idle"],
|
|
origins: [],
|
|
},
|
|
"Optional permission added to cache"
|
|
);
|
|
Assert.deepEqual(
|
|
await getStoredPermissions(id),
|
|
{
|
|
permissions: ["idle"],
|
|
origins: [],
|
|
},
|
|
"Optional permission added to persistent file"
|
|
);
|
|
|
|
await extension.unload();
|
|
|
|
// Directly read from the internals instead of using ExtensionPermissions.get,
|
|
// because the latter will lazily cache the extension ID.
|
|
Assert.deepEqual(
|
|
await getCachedPermissions(id),
|
|
null,
|
|
"Cached permissions removed"
|
|
);
|
|
Assert.deepEqual(
|
|
await getStoredPermissions(id),
|
|
null,
|
|
"Stored permissions removed"
|
|
);
|
|
|
|
perms = await ExtensionPermissions.get(id);
|
|
equal(
|
|
perms.permissions.length,
|
|
0,
|
|
`no permissions after uninstall (${JSON.stringify(perms.permissions)})`
|
|
);
|
|
equal(
|
|
perms.origins.length,
|
|
0,
|
|
`no origin permissions after uninstall (${JSON.stringify(perms.origins)})`
|
|
);
|
|
|
|
// The public ExtensionPermissions.get method should not store (empty)
|
|
// permissions in the persistent database. Polluting the cache is not ideal,
|
|
// but acceptable since the cache will eventually be cleared, and non-test
|
|
// code is not likely to call ExtensionPermissions.get() for non-installed
|
|
// extensions anyway.
|
|
Assert.deepEqual(await getCachedPermissions(id), perms, "Permissions cached");
|
|
Assert.deepEqual(
|
|
await getStoredPermissions(id),
|
|
null,
|
|
"Permissions not saved"
|
|
);
|
|
});
|