fetch_test_framework.js (5026B)
1 function testScript(script) { 2 var mode = location.href.includes("http2") ? "?mode=http2&" : "?"; 3 function makeWrapperUrl(wrapper) { 4 return wrapper + mode + "script=" + script; 5 } 6 let workerWrapperUrl = makeWrapperUrl("worker_wrapper.js"); 7 8 // The framework runs the entire test in many different configurations. 9 // On slow platforms and builds this can make the tests likely to 10 // timeout while they are still running. Lengthen the timeout to 11 // accomodate this. 12 SimpleTest.requestLongerTimeout(4); 13 14 // reroute.html should have set this variable if a service worker is present! 15 if (!("isSWPresent" in window)) { 16 window.isSWPresent = false; 17 } 18 19 function setupPrefs() { 20 return new Promise(function (resolve, reject) { 21 SpecialPowers.pushPrefEnv( 22 { 23 set: [ 24 ["dom.serviceWorkers.enabled", true], 25 ["dom.serviceWorkers.testing.enabled", true], 26 ["dom.serviceWorkers.idle_timeout", 60000], 27 ["dom.serviceWorkers.exemptFromPerDomainMax", true], 28 ], 29 }, 30 resolve 31 ); 32 }); 33 } 34 35 function workerTest() { 36 return new Promise(function (resolve, reject) { 37 var worker = new Worker(workerWrapperUrl); 38 worker.onmessage = function (event) { 39 if (event.data.context != "Worker") { 40 return; 41 } 42 if (event.data.type == "finish") { 43 resolve(); 44 } else if (event.data.type == "status") { 45 ok(event.data.status, event.data.context + ": " + event.data.msg); 46 } 47 }; 48 worker.onerror = function (event) { 49 reject("Worker error: " + event.message); 50 }; 51 52 worker.postMessage({ script }); 53 }); 54 } 55 56 function nestedWorkerTest() { 57 return new Promise(function (resolve, reject) { 58 var worker = new Worker(makeWrapperUrl("nested_worker_wrapper.js")); 59 worker.onmessage = function (event) { 60 if (event.data.context != "NestedWorker") { 61 return; 62 } 63 if (event.data.type == "finish") { 64 resolve(); 65 } else if (event.data.type == "status") { 66 ok(event.data.status, event.data.context + ": " + event.data.msg); 67 } 68 }; 69 worker.onerror = function (event) { 70 reject("Nested Worker error: " + event.message); 71 }; 72 73 worker.postMessage({ script }); 74 }); 75 } 76 77 function serviceWorkerTest() { 78 var isB2G = 79 !navigator.userAgent.includes("Android") && 80 /Mobile|Tablet/.test(navigator.userAgent); 81 if (isB2G) { 82 // TODO B2G doesn't support running service workers for now due to bug 1137683. 83 dump("Skipping running the test in SW until bug 1137683 gets fixed.\n"); 84 return Promise.resolve(); 85 } 86 return new Promise(function (resolve, reject) { 87 function setupSW(registration) { 88 var worker = 89 registration.installing || 90 registration.waiting || 91 registration.active; 92 var iframe; 93 94 window.addEventListener("message", function onMessage(event) { 95 if (event.data.context != "ServiceWorker") { 96 return; 97 } 98 if (event.data.type == "finish") { 99 window.removeEventListener("message", onMessage); 100 iframe.remove(); 101 registration.unregister().then(resolve).catch(reject); 102 } else if (event.data.type == "status") { 103 ok(event.data.status, event.data.context + ": " + event.data.msg); 104 } 105 }); 106 107 worker.onerror = reject; 108 109 iframe = document.createElement("iframe"); 110 iframe.src = "message_receiver.html"; 111 iframe.onload = function () { 112 worker.postMessage({ script }); 113 }; 114 document.body.appendChild(iframe); 115 } 116 117 navigator.serviceWorker 118 .register(workerWrapperUrl, { scope: "." }) 119 .then(setupSW); 120 }); 121 } 122 123 function windowTest() { 124 return new Promise(function (resolve, reject) { 125 var scriptEl = document.createElement("script"); 126 scriptEl.setAttribute("src", script); 127 scriptEl.onload = function () { 128 runTest().then(resolve, reject); 129 }; 130 document.body.appendChild(scriptEl); 131 }); 132 } 133 134 SimpleTest.waitForExplicitFinish(); 135 // We have to run the window, worker and service worker tests sequentially 136 // since some tests set and compare cookies and running in parallel can lead 137 // to conflicting values. 138 setupPrefs() 139 .then(function () { 140 return windowTest(); 141 }) 142 .then(function () { 143 return workerTest(); 144 }) 145 .then(function () { 146 return nestedWorkerTest(); 147 }) 148 .then(function () { 149 return serviceWorkerTest(); 150 }) 151 .catch(function (e) { 152 ok(false, "Some test failed in " + script); 153 info(e); 154 info(e.message); 155 return Promise.resolve(); 156 }) 157 .then(function () { 158 try { 159 if (parent && parent.finishTest) { 160 parent.finishTest(); 161 return; 162 } 163 } catch {} 164 SimpleTest.finish(); 165 }); 166 }