diff options
Diffstat (limited to '')
-rw-r--r-- | devtools/server/tests/chrome/webextension-helpers.js | 138 |
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; |