summaryrefslogtreecommitdiffstats
path: root/browser/components/extensions/test/browser/browser_ext_addon_debugging_netmonitor.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/extensions/test/browser/browser_ext_addon_debugging_netmonitor.js')
-rw-r--r--browser/components/extensions/test/browser/browser_ext_addon_debugging_netmonitor.js116
1 files changed, 116 insertions, 0 deletions
diff --git a/browser/components/extensions/test/browser/browser_ext_addon_debugging_netmonitor.js b/browser/components/extensions/test/browser/browser_ext_addon_debugging_netmonitor.js
new file mode 100644
index 0000000000..f436a19657
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_ext_addon_debugging_netmonitor.js
@@ -0,0 +1,116 @@
+/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* vim: set sts=2 sw=2 et tw=80: */
+"use strict";
+
+const { require } = ChromeUtils.importESModule(
+ "resource://devtools/shared/loader/Loader.sys.mjs"
+);
+
+const { gDevTools } = require("devtools/client/framework/devtools");
+
+async function setupToolboxTest(extensionId) {
+ const toolbox = await gDevTools.showToolboxForWebExtension(extensionId);
+
+ async function waitFor(condition) {
+ while (!condition()) {
+ // eslint-disable-next-line mozilla/no-arbitrary-setTimeout
+ await new Promise(done => window.setTimeout(done, 1000));
+ }
+ }
+
+ const netmonitor = await toolbox.selectTool("netmonitor");
+
+ const expectedURL = "http://mochi.test:8888/?test_netmonitor=1";
+
+ // Call a function defined in the target extension to make it
+ // fetch from an expected http url.
+ await toolbox.commands.scriptCommand.execute(
+ `doFetchHTTPRequest("${expectedURL}");`
+ );
+
+ await waitFor(() => {
+ return !netmonitor.panelWin.document.querySelector(
+ ".request-list-empty-notice"
+ );
+ });
+
+ let { store } = netmonitor.panelWin;
+
+ // NOTE: we need to filter the requests to the ones that we expect until
+ // the network monitor is not yet filtering out the requests that are not
+ // coming from an extension window or a descendent of an extension window,
+ // in both oop and non-oop extension mode (filed as Bug 1442621).
+ function filterRequest(request) {
+ return request.url === expectedURL;
+ }
+
+ let requests;
+
+ await waitFor(() => {
+ requests = Array.from(store.getState().requests.requests.values()).filter(
+ filterRequest
+ );
+
+ return !!requests.length;
+ });
+
+ // Call a function defined in the target extension to make assertions
+ // on the network requests collected by the netmonitor panel.
+ await toolbox.commands.scriptCommand.execute(
+ `testNetworkRequestReceived(${JSON.stringify(requests)});`
+ );
+
+ await toolbox.destroy();
+}
+
+add_task(async function test_addon_debugging_netmonitor_panel() {
+ const EXTENSION_ID = "test-monitor-panel@mozilla";
+
+ function background() {
+ let expectedURL;
+ window.doFetchHTTPRequest = async function (urlToFetch) {
+ expectedURL = urlToFetch;
+ await fetch(urlToFetch);
+ };
+ window.testNetworkRequestReceived = async function (requests) {
+ browser.test.log(
+ "Addon Debugging Netmonitor panel collected requests: " +
+ JSON.stringify(requests)
+ );
+ browser.test.assertEq(1, requests.length, "Got one request logged");
+ browser.test.assertEq("GET", requests[0].method, "Got a GET request");
+ browser.test.assertEq(
+ expectedURL,
+ requests[0].url,
+ "Got the expected request url"
+ );
+
+ browser.test.notifyPass("netmonitor_request_logged");
+ };
+ browser.test.sendMessage("ready");
+ }
+
+ let extension = ExtensionTestUtils.loadExtension({
+ background,
+ useAddonManager: "temporary",
+ manifest: {
+ permissions: ["http://mochi.test/"],
+ browser_specific_settings: {
+ gecko: { id: EXTENSION_ID },
+ },
+ },
+ });
+
+ await extension.startup();
+ await extension.awaitMessage("ready");
+
+ const onToolboxClose = setupToolboxTest(EXTENSION_ID);
+ await Promise.all([
+ extension.awaitFinish("netmonitor_request_logged"),
+ onToolboxClose,
+ ]);
+
+ info("Addon Toolbox closed");
+
+ await extension.unload();
+});