summaryrefslogtreecommitdiffstats
path: root/devtools/shared/network-observer/test/browser/head.js
diff options
context:
space:
mode:
Diffstat (limited to 'devtools/shared/network-observer/test/browser/head.js')
-rw-r--r--devtools/shared/network-observer/test/browser/head.js123
1 files changed, 123 insertions, 0 deletions
diff --git a/devtools/shared/network-observer/test/browser/head.js b/devtools/shared/network-observer/test/browser/head.js
new file mode 100644
index 0000000000..deb7becff6
--- /dev/null
+++ b/devtools/shared/network-observer/test/browser/head.js
@@ -0,0 +1,123 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+ChromeUtils.defineESModuleGetters(this, {
+ NetworkObserver:
+ "resource://devtools/shared/network-observer/NetworkObserver.sys.mjs",
+});
+
+const TEST_DIR = gTestPath.substr(0, gTestPath.lastIndexOf("/"));
+const CHROME_URL_ROOT = TEST_DIR + "/";
+const URL_ROOT = CHROME_URL_ROOT.replace(
+ "chrome://mochitests/content/",
+ "https://example.com/"
+);
+
+/**
+ * Load the provided url in an existing browser.
+ * Returns a promise which will resolve when the page is loaded.
+ *
+ * @param {Browser} browser
+ * The browser element where the URL should be loaded.
+ * @param {String} url
+ * The URL to load in the new tab
+ */
+async function loadURL(browser, url) {
+ const loaded = BrowserTestUtils.browserLoaded(browser);
+ BrowserTestUtils.startLoadingURIString(browser, url);
+ return loaded;
+}
+
+/**
+ * Create a new foreground tab loading the provided url.
+ * Returns a promise which will resolve when the page is loaded.
+ *
+ * @param {String} url
+ * The URL to load in the new tab
+ */
+async function addTab(url) {
+ const tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, url);
+ registerCleanupFunction(() => {
+ gBrowser.removeTab(tab);
+ });
+ return tab;
+}
+
+/**
+ * Base network event owner class implementing all mandatory callbacks and
+ * keeping track of which callbacks have been called.
+ */
+class NetworkEventOwner {
+ hasEventTimings = false;
+ hasResponseCache = false;
+ hasResponseContent = false;
+ hasResponseStart = false;
+ hasSecurityInfo = false;
+ hasServerTimings = false;
+
+ addEventTimings() {
+ this.hasEventTimings = true;
+ }
+ addResponseCache() {
+ this.hasResponseCache = true;
+ }
+ addResponseContent() {
+ this.hasResponseContent = true;
+ }
+ addResponseStart() {
+ this.hasResponseStart = true;
+ }
+ addSecurityInfo() {
+ this.hasSecurityInfo = true;
+ }
+ addServerTimings() {
+ this.hasServerTimings = true;
+ }
+ addServiceWorkerTimings() {
+ this.hasServiceWorkerTimings = true;
+ }
+}
+
+/**
+ * Create a simple network event owner, with mock implementations of all
+ * the expected APIs for a NetworkEventOwner.
+ */
+function createNetworkEventOwner(event) {
+ return new NetworkEventOwner();
+}
+
+/**
+ * Wait for network events matching the provided URL, until the count reaches
+ * the provided expected count.
+ *
+ * @param {string|null} expectedUrl
+ * The URL which should be monitored by the NetworkObserver.If set to null watch for
+ * all requests
+ * @param {number} expectedRequestsCount
+ * How many different events (requests) are expected.
+ * @returns {Promise}
+ * A promise which will resolve with an array of network event owners, when
+ * the expected event count is reached.
+ */
+async function waitForNetworkEvents(expectedUrl = null, expectedRequestsCount) {
+ const events = [];
+ const networkObserver = new NetworkObserver({
+ ignoreChannelFunction: channel =>
+ expectedUrl ? channel.URI.spec !== expectedUrl : false,
+ onNetworkEvent: () => {
+ info("waitForNetworkEvents received a new event");
+ const owner = createNetworkEventOwner();
+ events.push(owner);
+ return owner;
+ },
+ });
+ registerCleanupFunction(() => networkObserver.destroy());
+
+ info("Wait until the events count reaches " + expectedRequestsCount);
+ await BrowserTestUtils.waitForCondition(
+ () => events.length >= expectedRequestsCount
+ );
+ return events;
+}