diff options
Diffstat (limited to 'dom/tests/mochitest/fetch/fetch_test_framework.js')
-rw-r--r-- | dom/tests/mochitest/fetch/fetch_test_framework.js | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/dom/tests/mochitest/fetch/fetch_test_framework.js b/dom/tests/mochitest/fetch/fetch_test_framework.js new file mode 100644 index 0000000000..91f1a7bf5d --- /dev/null +++ b/dom/tests/mochitest/fetch/fetch_test_framework.js @@ -0,0 +1,168 @@ +function testScript(script) { + function makeWrapperUrl(wrapper) { + return wrapper + "?script=" + script; + } + let workerWrapperUrl = makeWrapperUrl("worker_wrapper.js"); + + // The framework runs the entire test in many different configurations. + // On slow platforms and builds this can make the tests likely to + // timeout while they are still running. Lengthen the timeout to + // accomodate this. + SimpleTest.requestLongerTimeout(4); + + // reroute.html should have set this variable if a service worker is present! + if (!("isSWPresent" in window)) { + window.isSWPresent = false; + } + + function setupPrefs() { + return new Promise(function(resolve, reject) { + SpecialPowers.pushPrefEnv( + { + set: [ + ["dom.serviceWorkers.enabled", true], + ["dom.serviceWorkers.testing.enabled", true], + ["dom.serviceWorkers.idle_timeout", 60000], + ["dom.serviceWorkers.exemptFromPerDomainMax", true], + ], + }, + resolve + ); + }); + } + + function workerTest() { + return new Promise(function(resolve, reject) { + var worker = new Worker(workerWrapperUrl); + worker.onmessage = function(event) { + if (event.data.context != "Worker") { + return; + } + if (event.data.type == "finish") { + resolve(); + } else if (event.data.type == "status") { + ok(event.data.status, event.data.context + ": " + event.data.msg); + } + }; + worker.onerror = function(event) { + reject("Worker error: " + event.message); + }; + + worker.postMessage({ script }); + }); + } + + function nestedWorkerTest() { + return new Promise(function(resolve, reject) { + var worker = new Worker(makeWrapperUrl("nested_worker_wrapper.js")); + worker.onmessage = function(event) { + if (event.data.context != "NestedWorker") { + return; + } + if (event.data.type == "finish") { + resolve(); + } else if (event.data.type == "status") { + ok(event.data.status, event.data.context + ": " + event.data.msg); + } + }; + worker.onerror = function(event) { + reject("Nested Worker error: " + event.message); + }; + + worker.postMessage({ script }); + }); + } + + function serviceWorkerTest() { + var isB2G = + !navigator.userAgent.includes("Android") && + /Mobile|Tablet/.test(navigator.userAgent); + if (isB2G) { + // TODO B2G doesn't support running service workers for now due to bug 1137683. + dump("Skipping running the test in SW until bug 1137683 gets fixed.\n"); + return Promise.resolve(); + } + return new Promise(function(resolve, reject) { + function setupSW(registration) { + var worker = + registration.installing || + registration.waiting || + registration.active; + var iframe; + + window.addEventListener("message", function onMessage(event) { + if (event.data.context != "ServiceWorker") { + return; + } + if (event.data.type == "finish") { + window.removeEventListener("message", onMessage); + iframe.remove(); + registration + .unregister() + .then(resolve) + .catch(reject); + } else if (event.data.type == "status") { + ok(event.data.status, event.data.context + ": " + event.data.msg); + } + }); + + worker.onerror = reject; + + iframe = document.createElement("iframe"); + iframe.src = "message_receiver.html"; + iframe.onload = function() { + worker.postMessage({ script }); + }; + document.body.appendChild(iframe); + } + + navigator.serviceWorker + .register(workerWrapperUrl, { scope: "." }) + .then(setupSW); + }); + } + + function windowTest() { + return new Promise(function(resolve, reject) { + var scriptEl = document.createElement("script"); + scriptEl.setAttribute("src", script); + scriptEl.onload = function() { + runTest().then(resolve, reject); + }; + document.body.appendChild(scriptEl); + }); + } + + SimpleTest.waitForExplicitFinish(); + // We have to run the window, worker and service worker tests sequentially + // since some tests set and compare cookies and running in parallel can lead + // to conflicting values. + setupPrefs() + .then(function() { + return windowTest(); + }) + .then(function() { + return workerTest(); + }) + .then(function() { + return nestedWorkerTest(); + }) + .then(function() { + return serviceWorkerTest(); + }) + .catch(function(e) { + ok(false, "Some test failed in " + script); + info(e); + info(e.message); + return Promise.resolve(); + }) + .then(function() { + try { + if (parent && parent.finishTest) { + parent.finishTest(); + return; + } + } catch {} + SimpleTest.finish(); + }); +} |