diff options
Diffstat (limited to 'devtools/client/netmonitor/test/browser_net_service-worker-status.js')
-rw-r--r-- | devtools/client/netmonitor/test/browser_net_service-worker-status.js | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/devtools/client/netmonitor/test/browser_net_service-worker-status.js b/devtools/client/netmonitor/test/browser_net_service-worker-status.js new file mode 100644 index 0000000000..7686ed6d52 --- /dev/null +++ b/devtools/client/netmonitor/test/browser_net_service-worker-status.js @@ -0,0 +1,112 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +/** + * Tests if requests intercepted by service workers have the correct status code + */ + +// Service workers only work on https +const URL = EXAMPLE_URL.replace("http:", "https:"); + +const TEST_URL = URL + "service-workers/status-codes.html"; + +add_task(async function () { + const { tab, monitor } = await initNetMonitor(TEST_URL, { + enableCache: true, + requestCount: 1, + }); + info("Starting test... "); + + const { document, store, windowRequire, connector } = monitor.panelWin; + const Actions = windowRequire("devtools/client/netmonitor/src/actions/index"); + const { getDisplayedRequests, getSortedRequests } = windowRequire( + "devtools/client/netmonitor/src/selectors/index" + ); + + store.dispatch(Actions.batchEnable(false)); + + const REQUEST_DATA = [ + { + method: "GET", + uri: URL + "service-workers/test/200", + details: { + status: 200, + statusText: "OK (service worker)", + displayedStatus: "service worker", + type: "plain", + fullMimeType: "text/plain; charset=UTF-8", + }, + stackFunctions: ["doXHR", "performRequests"], + }, + ]; + + info("Registering the service worker..."); + await SpecialPowers.spawn(tab.linkedBrowser, [], async function () { + await content.wrappedJSObject.registerServiceWorker(); + }); + + info("Performing requests..."); + // Execute requests. + await performRequests(monitor, tab, REQUEST_DATA.length); + + // Fetch stack-trace data from the backend and wait till + // all packets are received. + const requests = getSortedRequests(store.getState()); + await Promise.all( + requests.map(requestItem => + connector.requestData(requestItem.id, "stackTrace") + ) + ); + + const requestItems = document.querySelectorAll(".request-list-item"); + for (const requestItem of requestItems) { + requestItem.scrollIntoView(); + const requestsListStatus = requestItem.querySelector(".status-code"); + EventUtils.sendMouseEvent({ type: "mouseover" }, requestsListStatus); + await waitUntil(() => requestsListStatus.title); + await waitForDOMIfNeeded(requestItem, ".requests-list-timings-total"); + } + + let index = 0; + for (const request of REQUEST_DATA) { + const item = getSortedRequests(store.getState())[index]; + + info(`Verifying request #${index}`); + await verifyRequestItemTarget( + document, + getDisplayedRequests(store.getState()), + item, + request.method, + request.uri, + request.details + ); + + const { stacktrace } = item; + const stackLen = stacktrace ? stacktrace.length : 0; + + ok(stacktrace, `Request #${index} has a stacktrace`); + ok( + stackLen >= request.stackFunctions.length, + `Request #${index} has a stacktrace with enough (${stackLen}) items` + ); + + request.stackFunctions.forEach((functionName, j) => { + is( + stacktrace[j].functionName, + functionName, + `Request #${index} has the correct function at position #${j} on the stack` + ); + }); + + index++; + } + + info("Unregistering the service worker..."); + await SpecialPowers.spawn(tab.linkedBrowser, [], async function () { + await content.wrappedJSObject.unregisterServiceWorker(); + }); + + await teardown(monitor); +}); |