From 36d22d82aa202bb199967e9512281e9a53db42c9 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 21:33:14 +0200 Subject: Adding upstream version 115.7.0esr. Signed-off-by: Daniel Baumann --- dom/push/test/lifetime_worker.js | 90 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 dom/push/test/lifetime_worker.js (limited to 'dom/push/test/lifetime_worker.js') diff --git a/dom/push/test/lifetime_worker.js b/dom/push/test/lifetime_worker.js new file mode 100644 index 0000000000..02c09d966e --- /dev/null +++ b/dom/push/test/lifetime_worker.js @@ -0,0 +1,90 @@ +var state = "from_scope"; +var resolvePromiseCallback; + +self.onfetch = function (event) { + if (event.request.url.includes("lifetime_frame.html")) { + event.respondWith(new Response("iframe_lifetime")); + return; + } + + var currentState = state; + event.waitUntil( + self.clients.matchAll().then(clients => { + clients.forEach(client => { + client.postMessage({ type: "fetch", state: currentState }); + }); + }) + ); + + if (event.request.url.includes("update")) { + state = "update"; + } else if (event.request.url.includes("wait")) { + event.respondWith( + new Promise(function (res, rej) { + if (resolvePromiseCallback) { + dump("ERROR: service worker was already waiting on a promise.\n"); + } + resolvePromiseCallback = function () { + res(new Response("resolve_respondWithPromise")); + }; + }) + ); + state = "wait"; + } else if (event.request.url.includes("release")) { + state = "release"; + resolvePromise(); + } +}; + +function resolvePromise() { + if (resolvePromiseCallback === undefined || resolvePromiseCallback == null) { + dump("ERROR: wait promise was not set.\n"); + return; + } + resolvePromiseCallback(); + resolvePromiseCallback = null; +} + +self.onmessage = function (event) { + var lastState = state; + state = event.data; + if (state === "wait") { + event.waitUntil( + new Promise(function (res, rej) { + if (resolvePromiseCallback) { + dump("ERROR: service worker was already waiting on a promise.\n"); + } + resolvePromiseCallback = res; + }) + ); + } else if (state === "release") { + resolvePromise(); + } + event.source.postMessage({ type: "message", state: lastState }); +}; + +self.onpush = function (event) { + var pushResolve; + event.waitUntil( + new Promise(function (resolve) { + pushResolve = resolve; + }) + ); + + // FIXME(catalinb): push message carry no data. So we assume the only + // push message we get is "wait" + self.clients.matchAll().then(function (client) { + if (!client.length) { + dump("ERROR: no clients to send the response to.\n"); + } + + client[0].postMessage({ type: "push", state }); + + state = "wait"; + if (resolvePromiseCallback) { + dump("ERROR: service worker was already waiting on a promise.\n"); + } else { + resolvePromiseCallback = pushResolve; + } + }); +}; -- cgit v1.2.3