diff options
Diffstat (limited to 'devtools/client/netmonitor/test/browser_net_pause.js')
-rw-r--r-- | devtools/client/netmonitor/test/browser_net_pause.js | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/devtools/client/netmonitor/test/browser_net_pause.js b/devtools/client/netmonitor/test/browser_net_pause.js new file mode 100644 index 0000000000..6ed01efe27 --- /dev/null +++ b/devtools/client/netmonitor/test/browser_net_pause.js @@ -0,0 +1,151 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +/** + * Tests if the pause/resume button works. + */ +add_task(async function () { + const { tab, monitor, toolbox } = await initNetMonitor(PAUSE_URL, { + requestCount: 1, + }); + info("Starting test... "); + + const { document, store, windowRequire } = monitor.panelWin; + const Actions = windowRequire("devtools/client/netmonitor/src/actions/index"); + const pauseButton = document.querySelector(".requests-list-pause-button"); + + store.dispatch(Actions.batchEnable(false)); + + // Make sure we start in a sane state. + assertRequestCount(store, 0); + + // Load one request and assert it shows up in the list. + await performRequestAndWait(tab, monitor, SIMPLE_URL + "?id=1"); + assertRequestCount(store, 1); + + let noRequest = true; + monitor.panelWin.api.once(TEST_EVENTS.NETWORK_EVENT, () => { + noRequest = false; + }); + + monitor.panelWin.api.once(TEST_EVENTS.NETWORK_EVENT_UPDATED, () => { + noRequest = false; + }); + + // Click pause, load second request and make sure they don't show up. + EventUtils.sendMouseEvent({ type: "click" }, pauseButton); + await waitForPauseButtonToChange(document, true); + + await performPausedRequest(tab, monitor, toolbox); + + ok(noRequest, "There should be no activity when paused."); + assertRequestCount(store, 1); + + // Click pause again to resume monitoring. Load a third request + // and make sure they will show up. + EventUtils.sendMouseEvent({ type: "click" }, pauseButton); + await waitForPauseButtonToChange(document, false); + + await performRequestAndWait(tab, monitor, SIMPLE_URL + "?id=2"); + + ok(!noRequest, "There should be activity when resumed."); + assertRequestCount(store, 2); + + // Click pause, reload the page and check that there are + // some requests. + EventUtils.sendMouseEvent({ type: "click" }, pauseButton); + await waitForPauseButtonToChange(document, true); + + await waitForAllNetworkUpdateEvents(); + // Page reload should auto-resume + await reloadBrowser(); + await waitForPauseButtonToChange(document, false); + await performRequestAndWait(tab, monitor, SIMPLE_URL + "?id=3"); + + ok(!noRequest, "There should be activity when resumed."); + + return teardown(monitor); +}); + +/** + * Wait until a request is visible in the request list + */ +function waitForRequest(doc, url) { + return waitUntil(() => + [...doc.querySelectorAll(".request-list-item .requests-list-file")].some( + columns => columns.title.includes(url) + ) + ); +} + +/** + * Waits for the state of the paused/resume button to change. + */ +async function waitForPauseButtonToChange(doc, isPaused) { + await waitUntil( + () => + !!doc.querySelector( + `.requests-list-pause-button.devtools-${ + isPaused ? "play" : "pause" + }-icon` + ) + ); + ok( + true, + `The pause button is correctly in the ${ + isPaused ? "paused" : "resumed" + } state` + ); +} + +/** + * Asserts the number of requests in the network monitor. + */ +function assertRequestCount(store, count) { + is( + store.getState().requests.requests.length, + count, + "There should be correct number of requests" + ); +} + +/** + * Execute simple GET request and wait till it's done. + */ +async function performRequestAndWait(tab, monitor, requestURL) { + const wait = waitForRequest(monitor.panelWin.document, requestURL); + await SpecialPowers.spawn( + tab.linkedBrowser, + [requestURL], + async function (url) { + await content.wrappedJSObject.performRequests(url); + } + ); + await wait; +} + +/** + * Execute simple GET request, and uses a one time listener to + * know when the resource is available. + */ +async function performPausedRequest(tab, monitor, toolbox) { + const { onResource: waitForEventWhenPaused } = + await toolbox.resourceCommand.waitForNextResource( + toolbox.resourceCommand.TYPES.NETWORK_EVENT, + { + ignoreExistingResources: true, + } + ); + await SpecialPowers.spawn( + tab.linkedBrowser, + [SIMPLE_URL], + async function (url) { + await content.wrappedJSObject.performRequests(url); + } + ); + // Wait for NETWORK_EVENT resources to be fetched, in order to ensure + // that there is no pending request related to their processing. + await waitForEventWhenPaused; +} |