diff --git a/devtools/client/aboutdebugging-new/src/components/debugtarget/TemporaryExtensionAction.js b/devtools/client/aboutdebugging-new/src/components/debugtarget/TemporaryExtensionAction.js index d45b40133bcc..cd6a9e4d68dc 100644 --- a/devtools/client/aboutdebugging-new/src/components/debugtarget/TemporaryExtensionAction.js +++ b/devtools/client/aboutdebugging-new/src/components/debugtarget/TemporaryExtensionAction.js @@ -51,7 +51,7 @@ class TemporaryExtensionAction extends PureComponent { }, dom.button( { - className: "default-button", + className: "default-button js-temporary-extension-reload-button", onClick: e => this.reload(), }, "Reload", diff --git a/devtools/client/aboutdebugging-new/test/browser/browser.ini b/devtools/client/aboutdebugging-new/test/browser/browser.ini index 38b8d00d4e19..b4dde1b0ce7f 100644 --- a/devtools/client/aboutdebugging-new/test/browser/browser.ini +++ b/devtools/client/aboutdebugging-new/test/browser/browser.ini @@ -14,6 +14,7 @@ support-files = helper-serviceworker.js mocks/* resources/bad-extension/* + resources/packaged-extension/* resources/service-workers/* resources/test-adb-extension/* resources/test-temporary-extension/* @@ -25,6 +26,7 @@ support-files = [browser_aboutdebugging_addons_manifest_url.js] skip-if = (os == 'linux' && bits == 32) # ADB start() fails on linux 32, see Bug 1499638 [browser_aboutdebugging_addons_remote_runtime.js] +[browser_aboutdebugging_addons_temporary_addon_buttons.js] [browser_aboutdebugging_connect_networklocations.js] [browser_aboutdebugging_connect_toggle_usb_devices.js] skip-if = (os == 'linux' && bits == 32) # ADB start() fails on linux 32, see Bug 1499638 diff --git a/devtools/client/aboutdebugging-new/test/browser/browser_aboutdebugging_addons_temporary_addon_buttons.js b/devtools/client/aboutdebugging-new/test/browser/browser_aboutdebugging_addons_temporary_addon_buttons.js new file mode 100644 index 000000000000..8d5536c6aa75 --- /dev/null +++ b/devtools/client/aboutdebugging-new/test/browser/browser_aboutdebugging_addons_temporary_addon_buttons.js @@ -0,0 +1,96 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ +"use strict"; + +/* import-globals-from helper-addons.js */ +Services.scriptloader.loadSubScript(CHROME_URL_ROOT + "helper-addons.js", this); + +// Test that the reload button updates the addon list with the correct metadata. +add_task(async function() { + const { document, tab } = await openAboutDebugging(); + + const ORIGINAL_EXTENSION_NAME = "Temporary web extension (original)"; + const UPDATED_EXTENSION_NAME = "Temporary web extension (updated)"; + const EXTENSION_ID = "test-devtools@mozilla.org"; + + const manifestBase = { + "manifest_version": 2, + "name": ORIGINAL_EXTENSION_NAME, + "version": "1.0", + "applications": { + "gecko": { + "id": EXTENSION_ID, + }, + }, + }; + + const tempExt = new TemporaryExtension(EXTENSION_ID); + tempExt.writeManifest(manifestBase); + + info("Install a temporary extension (original)"); + await AddonManager.installTemporaryAddon(tempExt.sourceDir); + + info("Wait until a debug target item appears"); + await waitUntil(() => findDebugTargetByText(ORIGINAL_EXTENSION_NAME, document)); + + const originalTarget = findDebugTargetByText(ORIGINAL_EXTENSION_NAME, document); + ok(!!originalTarget, "The temporary extension isinstalled with the expected name"); + + info("Update the name of the temporary extension in the manifest"); + tempExt.writeManifest(Object.assign({}, manifestBase, {name: UPDATED_EXTENSION_NAME})); + + info("Click on the reload button for the temporary extension"); + const reloadButton = + originalTarget.querySelector(".js-temporary-extension-reload-button"); + reloadButton.click(); + + info("Wait until the debug target with the original extension name disappears"); + await waitUntil(() => !findDebugTargetByText(ORIGINAL_EXTENSION_NAME, document)); + + info("Wait until the debug target with the updated extension name appears"); + await waitUntil(() => findDebugTargetByText(UPDATED_EXTENSION_NAME, document)); + + const updatedTarget = findDebugTargetByText(UPDATED_EXTENSION_NAME, document); + ok(!!updatedTarget, "The temporary extension name has been updated"); + + info("Click on the remove button for the temporary extension"); + const removeButton = + updatedTarget.querySelector(".js-temporary-extension-remove-button"); + removeButton.click(); + + info("Wait until the debug target with the updated extension name disappears"); + await waitUntil(() => !findDebugTargetByText(UPDATED_EXTENSION_NAME, document)); + + info("Remove the temporary web extension"); + tempExt.remove(); + + await removeTab(tab); +}); + +add_task(async function() { + const PACKAGED_EXTENSION_ID = "packaged-extension@tests"; + const PACKAGED_EXTENSION_NAME = "Packaged extension"; + + const { document, tab } = await openAboutDebugging(); + + await installRegularAddon("resources/packaged-extension/packaged-extension.xpi"); + + info("Wait until extension appears in about:debugging"); + await waitUntil(() => findDebugTargetByText(PACKAGED_EXTENSION_NAME, document)); + const target = findDebugTargetByText(PACKAGED_EXTENSION_NAME, document); + + const reloadButton = target.querySelector(".js-temporary-extension-reload-button"); + ok(!reloadButton, "No reload button displayed for a regularly installed extension"); + + const removeButton = target.querySelector(".js-temporary-extension-remove-button"); + ok(!removeButton, "No remove button displayed for a regularly installed extension"); + + info("Retrieve the extension instance from the addon manager, and uninstall it"); + const extension = await AddonManager.getAddonByID(PACKAGED_EXTENSION_ID); + extension.uninstall(); + + info("Wait until the addon disappears from about:debugging"); + await waitUntil(() => !findDebugTargetByText(PACKAGED_EXTENSION_NAME, document)); + + await removeTab(tab); +}); diff --git a/devtools/client/aboutdebugging-new/test/browser/helper-addons.js b/devtools/client/aboutdebugging-new/test/browser/helper-addons.js index 93d26880ac4c..6cc2dcc38b6e 100644 --- a/devtools/client/aboutdebugging-new/test/browser/helper-addons.js +++ b/devtools/client/aboutdebugging-new/test/browser/helper-addons.js @@ -59,3 +59,68 @@ function prepareMockFilePicker(path) { MockFilePicker.setFiles([_getSupportsFile(path).file]); } /* exported prepareMockFilePicker */ + +/** + * Creates a web extension from scratch in a temporary location. + * The object must be removed when you're finished working with it. + */ +class TemporaryExtension { + constructor(addonId) { + this.addonId = addonId; + this.tmpDir = FileUtils.getDir("TmpD", ["browser_addons_reload"]); + if (!this.tmpDir.exists()) { + this.tmpDir.create(Ci.nsIFile.DIRECTORY_TYPE, FileUtils.PERMS_DIRECTORY); + } + this.sourceDir = this.tmpDir.clone(); + this.sourceDir.append(this.addonId); + if (!this.sourceDir.exists()) { + this.sourceDir.create(Ci.nsIFile.DIRECTORY_TYPE, + FileUtils.PERMS_DIRECTORY); + } + } + + writeManifest(manifestData) { + const manifest = this.sourceDir.clone(); + manifest.append("manifest.json"); + if (manifest.exists()) { + manifest.remove(true); + } + const fos = Cc["@mozilla.org/network/file-output-stream;1"] + .createInstance(Ci.nsIFileOutputStream); + fos.init(manifest, + FileUtils.MODE_WRONLY | FileUtils.MODE_CREATE | + FileUtils.MODE_TRUNCATE, + FileUtils.PERMS_FILE, 0); + + const manifestString = JSON.stringify(manifestData); + fos.write(manifestString, manifestString.length); + fos.close(); + } + + remove() { + return this.tmpDir.remove(true); + } +} +/* exported TemporaryExtension */ + +/** + * Install an add-on using the AddonManager so it does not show up as temporary. + */ +function installRegularAddon(filePath) { + const file = _getSupportsFile(filePath).file; + return new Promise(async (resolve, reject) => { + const install = await AddonManager.getInstallForFile(file); + if (!install) { + throw new Error(`An install was not created for ${filePath}`); + } + install.addListener({ + onDownloadFailed: reject, + onDownloadCancelled: reject, + onInstallFailed: reject, + onInstallCancelled: reject, + onInstallEnded: resolve, + }); + install.install(); + }); +} +/* exported installRegularAddon */ diff --git a/devtools/client/aboutdebugging-new/test/browser/resources/packaged-extension/packaged-extension.xpi b/devtools/client/aboutdebugging-new/test/browser/resources/packaged-extension/packaged-extension.xpi new file mode 100644 index 000000000000..c1c7af9600a6 Binary files /dev/null and b/devtools/client/aboutdebugging-new/test/browser/resources/packaged-extension/packaged-extension.xpi differ