summaryrefslogtreecommitdiffstats
path: root/devtools/server/tests/xpcshell/test_webextension_descriptor.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/server/tests/xpcshell/test_webextension_descriptor.js')
-rw-r--r--devtools/server/tests/xpcshell/test_webextension_descriptor.js141
1 files changed, 141 insertions, 0 deletions
diff --git a/devtools/server/tests/xpcshell/test_webextension_descriptor.js b/devtools/server/tests/xpcshell/test_webextension_descriptor.js
new file mode 100644
index 0000000000..00cdeea605
--- /dev/null
+++ b/devtools/server/tests/xpcshell/test_webextension_descriptor.js
@@ -0,0 +1,141 @@
+/* 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();
+});