worker_wrapper.js (3222B)
1 /* eslint-env worker */ 2 3 // Any copyright is dedicated to the Public Domain. 4 // http://creativecommons.org/publicdomain/zero/1.0/ 5 // 6 // ServiceWorker equivalent of worker_wrapper.js. 7 8 var client; 9 var context; 10 11 function ok(a, msg) { 12 client.postMessage({ 13 type: "status", 14 status: !!a, 15 msg: a + ": " + msg, 16 context, 17 }); 18 } 19 20 function is(a, b, msg) { 21 client.postMessage({ 22 type: "status", 23 status: a === b, 24 msg: a + " === " + b + ": " + msg, 25 context, 26 }); 27 } 28 29 function workerTestArrayEquals(a, b) { 30 if (!Array.isArray(a) || !Array.isArray(b) || a.length != b.length) { 31 return false; 32 } 33 for (var i = 0, n = a.length; i < n; ++i) { 34 if (a[i] !== b[i]) { 35 return false; 36 } 37 } 38 return true; 39 } 40 41 function testDone() { 42 client.postMessage({ type: "finish", context }); 43 } 44 45 function workerTestGetPrefs(prefs, cb) { 46 addEventListener("message", function workerTestGetPrefsCB(e) { 47 if ( 48 e.data.type != "returnPrefs" || 49 !workerTestArrayEquals(prefs, e.data.prefs) 50 ) { 51 return; 52 } 53 removeEventListener("message", workerTestGetPrefsCB); 54 cb(e.data.result); 55 }); 56 client.postMessage({ 57 type: "getPrefs", 58 context, 59 prefs, 60 }); 61 } 62 63 function workerTestGetPermissions(permissions, cb) { 64 addEventListener("message", function workerTestGetPermissionsCB(e) { 65 if ( 66 e.data.type != "returnPermissions" || 67 !workerTestArrayEquals(permissions, e.data.permissions) 68 ) { 69 return; 70 } 71 removeEventListener("message", workerTestGetPermissionsCB); 72 cb(e.data.result); 73 }); 74 client.postMessage({ 75 type: "getPermissions", 76 context, 77 permissions, 78 }); 79 } 80 81 function workerTestGetUserAgent(cb) { 82 addEventListener("message", function workerTestGetUserAgentCB(e) { 83 if (e.data.type !== "returnUserAgent") { 84 return; 85 } 86 removeEventListener("message", workerTestGetUserAgentCB); 87 cb(e.data.result); 88 }); 89 client.postMessage({ 90 context, 91 type: "getUserAgent", 92 }); 93 } 94 95 var completeInstall = null; 96 97 addEventListener("message", function workerWrapperOnMessage(e) { 98 removeEventListener("message", workerWrapperOnMessage); 99 var data = e.data; 100 function runScript() { 101 try { 102 importScripts(data.script); 103 } catch (err) { 104 client.postMessage({ 105 type: "status", 106 status: false, 107 context, 108 msg: 109 "worker failed to import " + data.script + "; error: " + err.message, 110 }); 111 } 112 } 113 if ("ServiceWorkerGlobalScope" in self) { 114 self.clients 115 .matchAll({ includeUncontrolled: true }) 116 .then(function (clients) { 117 for (var i = 0; i < clients.length; ++i) { 118 if (clients[i].url.indexOf("message_receiver.html") > -1) { 119 client = clients[i]; 120 break; 121 } 122 } 123 if (!client) { 124 dump( 125 "We couldn't find the message_receiver window, the test will fail\n" 126 ); 127 } 128 context = "ServiceWorker"; 129 runScript(); 130 completeInstall(); 131 }); 132 } else { 133 client = self; 134 context = "Worker"; 135 runScript(); 136 } 137 }); 138 139 addEventListener("install", e => { 140 e.waitUntil(new Promise(resolve => (completeInstall = resolve))); 141 });