Bug 1934608 [wpt PR 49465] - Better communication for shadowrealm-in-serviceworker tests, a=testonly

Automatic update from web-platform-tests
Use the port from the connect event for ShadowRealms in ServiceWorkers

This seems to be more reliable.

--
Stringify exceptions in createSetupErrorResult

Otherwise the result formatting code gets confused.

--

wpt-commits: e9bc3888fb2f2af7fb0e316570ed3bfc5b44127e, 8aae170d58b1f461b4c21837d4b5f8841603e340
wpt-pr: 49465
This commit is contained in:
Ms2ger
2024-12-03 16:47:09 +00:00
committed by moz-wptsync-bot
parent 19a49cc0c3
commit 07bde16a73

View File

@@ -35,7 +35,7 @@ globalThis.fetchAdaptor = (resource) => (resolve, reject) => {
.then(resolve, (e) => reject(e.toString()));
};
let sharedWorkerMessagePortPromise;
let workerMessagePortPromise;
/**
* Used when the hosting realm is a worker. This value is a Promise that
* resolves to a function that posts a message to the worker's message port,
@@ -47,17 +47,8 @@ globalThis.getPostMessageFunc = async function () {
return postMessage; // postMessage available directly in dedicated worker
}
if (typeof clients === "object") {
// Messages from the ShadowRealm are not in response to any message received
// from the ServiceWorker's client, so broadcast them to all clients
const allClients = await clients.matchAll({ includeUncontrolled: true });
return function broadcast(msg) {
allClients.map(client => client.postMessage(msg));
}
}
if (sharedWorkerMessagePortPromise) {
return await sharedWorkerMessagePortPromise;
if (workerMessagePortPromise) {
return await workerMessagePortPromise;
}
throw new Error("getPostMessageFunc is intended for Worker scopes");
@@ -66,13 +57,23 @@ globalThis.getPostMessageFunc = async function () {
// Port available asynchronously in shared worker, but not via an async func
let savedResolver;
if (globalThis.constructor.name === "SharedWorkerGlobalScope") {
sharedWorkerMessagePortPromise = new Promise((resolve) => {
workerMessagePortPromise = new Promise((resolve) => {
savedResolver = resolve;
});
addEventListener("connect", function (event) {
const port = event.ports[0];
savedResolver(port.postMessage.bind(port));
});
} else if (globalThis.constructor.name === "ServiceWorkerGlobalScope") {
workerMessagePortPromise = new Promise((resolve) => {
savedResolver = resolve;
});
addEventListener("message", (e) => {
if (typeof e.data === "object" && e.data !== null && e.data.type === "connect") {
const client = e.source;
savedResolver(client.postMessage.bind(client));
}
});
}
/**
@@ -134,7 +135,7 @@ globalThis.setupFakeFetchOverMessagePort = function (port) {
* the test harness that the tests are finished and there was an error in the
* setup code.
*
* @param {message} string - error message
* @param {message} any - error
*/
globalThis.createSetupErrorResult = function (message) {
return {
@@ -143,7 +144,8 @@ globalThis.createSetupErrorResult = function (message) {
asserts: [],
status: {
status: 1, // TestsStatus.ERROR,
message,
message: String(message),
stack: typeof message === "object" && message !== null && "stack" in message ? message.stack : undefined,
},
};
};