Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

/* Any copyright is dedicated to the Public Domain.
"use strict";
const { ExtensionTestUtils } = ChromeUtils.importESModule(
);
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();
});