diff options
Diffstat (limited to 'devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_addons_remote_runtime.js')
-rw-r--r-- | devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_addons_remote_runtime.js | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_addons_remote_runtime.js b/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_addons_remote_runtime.js new file mode 100644 index 0000000000..607b8e15b4 --- /dev/null +++ b/devtools/client/aboutdebugging/test/browser/browser_aboutdebugging_addons_remote_runtime.js @@ -0,0 +1,145 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +const NETWORK_RUNTIME_HOST = "localhost:6080"; +const NETWORK_RUNTIME_APP_NAME = "TestNetworkApp"; +const USB_RUNTIME_ID = "test-runtime-id"; +const USB_RUNTIME_DEVICE_NAME = "test device name"; +const USB_RUNTIME_APP_NAME = "TestUsbApp"; + +// Test that addons are displayed and updated for USB runtimes when expected. +add_task(async function () { + const mocks = new Mocks(); + + const { document, tab, window } = await openAboutDebugging(); + await selectThisFirefoxPage(document, window.AboutDebugging.store); + + info("Prepare USB client mock"); + const usbClient = mocks.createUSBRuntime(USB_RUNTIME_ID, { + deviceName: USB_RUNTIME_DEVICE_NAME, + name: USB_RUNTIME_APP_NAME, + }); + mocks.emitUSBUpdate(); + + info("Test addons in runtime page for USB client"); + await connectToRuntime(USB_RUNTIME_DEVICE_NAME, document); + await selectRuntime(USB_RUNTIME_DEVICE_NAME, USB_RUNTIME_APP_NAME, document); + await testAddonsOnMockedRemoteClient( + usbClient, + mocks.thisFirefoxClient, + document + ); + + info("Prepare Network client mock"); + const networkClient = mocks.createNetworkRuntime(NETWORK_RUNTIME_HOST, { + name: NETWORK_RUNTIME_APP_NAME, + }); + + info("Test addons in runtime page for Network client"); + await connectToRuntime(NETWORK_RUNTIME_HOST, document); + await selectRuntime(NETWORK_RUNTIME_HOST, NETWORK_RUNTIME_APP_NAME, document); + await testAddonsOnMockedRemoteClient( + networkClient, + mocks.thisFirefoxClient, + document + ); + + await removeTab(tab); +}); + +/** + * Check that addons are visible in the runtime page for a remote client (USB or network). + */ +async function testAddonsOnMockedRemoteClient( + remoteClient, + firefoxClient, + document +) { + const extensionPane = getDebugTargetPane("Extensions", document); + info("Check an empty target pane message is displayed"); + ok( + extensionPane.querySelector(".qa-debug-target-list-empty"), + "Extensions list is empty" + ); + + info("Add an extension to the remote client"); + const addon = { name: "Test extension name", debuggable: true }; + const temporaryAddon = { + name: "Test temporary extension", + debuggable: true, + temporarilyInstalled: true, + }; + remoteClient.listAddons = () => [addon, temporaryAddon]; + remoteClient._eventEmitter.emit("addonListChanged"); + + info("Wait until the extension appears"); + await waitUntil( + () => !extensionPane.querySelector(".qa-debug-target-list-empty") + ); + + const extensionTarget = findDebugTargetByText( + "Test extension name", + document + ); + ok(extensionTarget, "Extension target appeared for the remote runtime"); + + const temporaryExtensionTarget = findDebugTargetByText( + "Test temporary extension", + document + ); + ok( + temporaryExtensionTarget, + "Temporary Extension target appeared for the remote runtime" + ); + + const removeButton = temporaryExtensionTarget.querySelector( + ".qa-temporary-extension-remove-button" + ); + ok(removeButton, "Remove button expected for the temporary extension"); + + const reloadButton = temporaryExtensionTarget.querySelector( + ".qa-temporary-extension-reload-button" + ); + ok(reloadButton, "Reload button expected for the temporary extension"); + + // The goal here is to check that runtimes addons are only updated when the remote + // runtime is sending addonListChanged events. The reason for this test is because the + // previous implementation was updating the remote runtime extensions list when the + // _local_ AddonManager was updated. + info("Remove the extension from the remote client WITHOUT sending an event"); + remoteClient.listAddons = () => []; + + info("Simulate an addon update on the ThisFirefox client"); + firefoxClient._eventEmitter.emit("addonListChanged"); + + // To avoid wait for a set period of time we trigger another async update, adding a new + // tab. We assume that if the addon update mechanism had started, it would also be done + // when the new tab was processed. + info("Wait until the tab target for 'http://some.random/url.com' appears"); + const testTab = { + retrieveFavicon: () => {}, + outerWindowID: 0, + traits: {}, + url: "http://some.random/url.com", + }; + remoteClient.listTabs = () => [testTab]; + remoteClient._eventEmitter.emit("tabListChanged"); + await waitUntil(() => + findDebugTargetByText("http://some.random/url.com", document) + ); + + ok( + findDebugTargetByText("Test extension name", document), + "The test extension is still visible" + ); + + info( + "Emit `addonListChanged` on remoteClient and wait for the target list to update" + ); + remoteClient._eventEmitter.emit("addonListChanged"); + await waitUntil( + () => !findDebugTargetByText("Test extension name", document) + ); +} |