141 lines
4.9 KiB
JavaScript
141 lines
4.9 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
const { ExtensionTestUtils } = ChromeUtils.importESModule(
|
|
"resource://testing-common/ExtensionXPCShellUtils.sys.mjs"
|
|
);
|
|
|
|
const DistinctDevToolsServer = getDistinctDevToolsServer();
|
|
ExtensionTestUtils.init(this);
|
|
|
|
add_setup(async () => {
|
|
Services.prefs.setBoolPref("extensions.blocklist.enabled", false);
|
|
await startupAddonsManager();
|
|
|
|
// We intentionally generate install-time manifest warnings, so don't trigger
|
|
// the special test-only mode of converting them to errors.
|
|
Services.prefs.setBoolPref(
|
|
"extensions.webextensions.warnings-as-errors",
|
|
false
|
|
);
|
|
|
|
DistinctDevToolsServer.init();
|
|
DistinctDevToolsServer.registerAllActors();
|
|
});
|
|
|
|
// Verifies:
|
|
// - listAddons
|
|
// - WebExtensionDescriptorActor output
|
|
// Also a regression test for bug 1837185, that AddonManager.sys.mjs and
|
|
// ExtensionParent.sys.mjs are imported from the correct loader.
|
|
add_task(async function test_listAddons_and_WebExtensionDescriptor() {
|
|
const transport = DistinctDevToolsServer.connectPipe();
|
|
const client = new DevToolsClient(transport);
|
|
await client.connect();
|
|
|
|
const getRootResponse = await client.mainRoot.getRoot();
|
|
|
|
ok(getRootResponse, "received a response after calling RootActor::getRoot");
|
|
ok(getRootResponse.addonsActor, "getRoot returned an addonsActor id");
|
|
|
|
const ADDON_ID = "with@warning";
|
|
const extension = ExtensionTestUtils.loadExtension({
|
|
useAddonManager: "permanent",
|
|
manifest: {
|
|
name: "DummyExtensionWithUnknownManifestKey",
|
|
unknown_manifest_key: "this is an unknown manifest key",
|
|
browser_specific_settings: { gecko: { id: ADDON_ID } },
|
|
},
|
|
background: `browser.test.sendMessage("background_started");`,
|
|
});
|
|
await extension.startup();
|
|
await extension.awaitMessage("background_started");
|
|
|
|
// listAddons: addon after new install.
|
|
{
|
|
const listAddonsResponse = await client.mainRoot.listAddons();
|
|
const addon = listAddonsResponse.find(a => a.id === ADDON_ID);
|
|
ok(addon, "listAddons() returns a list of add-ons including with@warning");
|
|
|
|
// Inspect all raw properties of the message, to make sure that we always
|
|
// have full coverage for all current and future properties.
|
|
const { actor, url, warnings, ...addonMinusSomeKeys } = addon._form;
|
|
const actorPattern = /^server\d+\.conn\d+\.webExtensionDescriptor\d+$/;
|
|
ok(actorPattern.test(actor), `actor is webExtensionDescriptor: ${actor}`);
|
|
// We don't care about the exact path, just a dummy check:
|
|
ok(url.endsWith(".xpi"), `url is path to the xpi file`);
|
|
|
|
deepEqual(
|
|
warnings,
|
|
[
|
|
"Reading manifest: Warning processing unknown_manifest_key: An unexpected property was found in the WebExtension manifest.",
|
|
],
|
|
"Can retrieve warnings."
|
|
);
|
|
|
|
// Verify that the other remaining keys have a meaningful value.
|
|
// This is mainly to have some form of verification on the value of the
|
|
// properties. If this check ever fails, double-check whether the proposed
|
|
// change makes sense and if it does just update the test expectation here.
|
|
deepEqual(
|
|
addonMinusSomeKeys,
|
|
{
|
|
backgroundScriptStatus: undefined,
|
|
debuggable: true,
|
|
hidden: false,
|
|
iconDataURL: undefined,
|
|
iconURL: null,
|
|
id: ADDON_ID,
|
|
isSystem: false,
|
|
isWebExtension: true,
|
|
manifestURL: `moz-extension://${extension.uuid}/manifest.json`,
|
|
name: "DummyExtensionWithUnknownManifestKey",
|
|
persistentBackgroundScript: true,
|
|
temporarilyInstalled: false,
|
|
traits: {
|
|
supportsReloadDescriptor: true,
|
|
watcher: true,
|
|
},
|
|
},
|
|
"WebExtensionDescriptorActor content matches the add-on"
|
|
);
|
|
}
|
|
|
|
await extension.upgrade({
|
|
manifest: {
|
|
name: "Updated_extension",
|
|
new_unknown_manifest_key: "different warning than before",
|
|
browser_specific_settings: { gecko: { id: ADDON_ID } },
|
|
},
|
|
background: `browser.test.sendMessage("updated_done");`,
|
|
});
|
|
await extension.awaitMessage("updated_done");
|
|
|
|
// listAddons: addon after update.
|
|
{
|
|
const listAddonsResponse = await client.mainRoot.listAddons();
|
|
const addon = listAddonsResponse.find(a => a.id === ADDON_ID);
|
|
ok(addon, "listAddons() should still list the add-on after update");
|
|
equal(addon.name, "Updated_extension", "Got updated name");
|
|
deepEqual(
|
|
addon.warnings,
|
|
[
|
|
"Reading manifest: Warning processing new_unknown_manifest_key: An unexpected property was found in the WebExtension manifest.",
|
|
],
|
|
"Can retrieve new warnings for updated add-on."
|
|
);
|
|
}
|
|
|
|
await extension.unload();
|
|
|
|
// listAddons: addon after removal - gone.
|
|
{
|
|
const listAddonsResponse = await client.mainRoot.listAddons();
|
|
const addon = listAddonsResponse.find(a => a.id === ADDON_ID);
|
|
deepEqual(addon, null, "Add-on should be gone after removal");
|
|
}
|
|
|
|
await client.close();
|
|
});
|