summaryrefslogtreecommitdiffstats
path: root/devtools/server/tests/chrome/webextension-helpers.js
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--devtools/server/tests/chrome/webextension-helpers.js138
1 files changed, 138 insertions, 0 deletions
diff --git a/devtools/server/tests/chrome/webextension-helpers.js b/devtools/server/tests/chrome/webextension-helpers.js
new file mode 100644
index 0000000000..98f8efd900
--- /dev/null
+++ b/devtools/server/tests/chrome/webextension-helpers.js
@@ -0,0 +1,138 @@
+/* exported attachAddon, waitForFramesUpdated, reloadAddon,
+ collectFrameUpdates, generateWebExtensionXPI, promiseInstallFile,
+ promiseWebExtensionStartup, promiseWebExtensionShutdown
+ */
+
+"use strict";
+
+const { require, loader } = ChromeUtils.import(
+ "resource://devtools/shared/Loader.jsm"
+);
+const { DevToolsClient } = require("devtools/client/devtools-client");
+const { DevToolsServer } = require("devtools/server/devtools-server");
+
+const {
+ AddonTestUtils,
+} = require("resource://testing-common/AddonTestUtils.jsm");
+const {
+ ExtensionTestCommon,
+} = require("resource://testing-common/ExtensionTestCommon.jsm");
+
+loader.lazyImporter(
+ this,
+ "ExtensionParent",
+ "resource://gre/modules/ExtensionParent.jsm"
+);
+
+// Initialize a minimal DevToolsServer and connect to the webextension addon actor.
+if (!DevToolsServer.initialized) {
+ DevToolsServer.init();
+ DevToolsServer.registerAllActors();
+ SimpleTest.registerCleanupFunction(function() {
+ DevToolsServer.destroy();
+ });
+}
+
+SimpleTest.registerCleanupFunction(function() {
+ const { hiddenXULWindow } = ExtensionParent.DebugUtils;
+ const debugBrowserMapSize =
+ ExtensionParent.DebugUtils.debugBrowserPromises.size;
+
+ if (debugBrowserMapSize > 0) {
+ is(
+ debugBrowserMapSize,
+ 0,
+ "ExtensionParent DebugUtils debug browsers have not been released"
+ );
+ }
+
+ if (hiddenXULWindow) {
+ ok(
+ false,
+ "ExtensionParent DebugUtils hiddenXULWindow has not been destroyed"
+ );
+ }
+});
+
+// Test helpers related to the webextensions debugging RDP actors.
+
+function waitForFramesUpdated(target, matchFn) {
+ return new Promise(resolve => {
+ const listener = data => {
+ if (typeof matchFn === "function" && !matchFn(data)) {
+ return;
+ } else if (!data.frames) {
+ return;
+ }
+
+ target.off("frameUpdate", listener);
+ resolve(data.frames);
+ };
+ target.on("frameUpdate", listener);
+ });
+}
+
+function collectFrameUpdates({ client }, matchFn) {
+ const collected = [];
+
+ const listener = data => {
+ if (matchFn(data)) {
+ collected.push(data);
+ }
+ };
+
+ client.on("frameUpdate", listener);
+ let unsubscribe = () => {
+ unsubscribe = null;
+ client.off("frameUpdate", listener);
+ return collected;
+ };
+
+ SimpleTest.registerCleanupFunction(function() {
+ if (unsubscribe) {
+ unsubscribe();
+ }
+ });
+
+ return unsubscribe;
+}
+
+async function attachAddon(addonId) {
+ const transport = DevToolsServer.connectPipe();
+ const client = new DevToolsClient(transport);
+
+ await client.connect();
+
+ const addonDescriptor = await client.mainRoot.getAddon({ id: addonId });
+ const addonTarget = await addonDescriptor.getTarget();
+
+ if (!addonTarget) {
+ client.close();
+ throw new Error(`No WebExtension Actor found for ${addonId}`);
+ }
+
+ return addonTarget;
+}
+
+async function reloadAddon({ client }, addonId) {
+ const addonTargetFront = await client.mainRoot.getAddon({ id: addonId });
+
+ if (!addonTargetFront) {
+ client.close();
+ throw new Error(`No WebExtension Actor found for ${addonId}`);
+ }
+
+ await addonTargetFront.reload();
+}
+
+// Test helpers related to the AddonManager.
+
+function generateWebExtensionXPI(extDetails) {
+ return ExtensionTestCommon.generateXPI(extDetails);
+}
+
+let {
+ promiseInstallFile,
+ promiseWebExtensionStartup,
+ promiseWebExtensionShutdown,
+} = AddonTestUtils;