mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-05-13 22:52:52 +00:00
135 lines
3.4 KiB
JavaScript
135 lines
3.4 KiB
JavaScript
var __outputElement = null;
|
|
let __alreadyCalledTest = false;
|
|
let __originalURL = null;
|
|
function __preventMultipleTestFunctions() {
|
|
if (__alreadyCalledTest) {
|
|
throw new Error("You must only call test() or asyncTest() once per page");
|
|
}
|
|
__alreadyCalledTest = true;
|
|
}
|
|
|
|
if (globalThis.internals === undefined) {
|
|
internals = {
|
|
signalTextTestIsDone: function () {},
|
|
spoofCurrentURL: function (url) {},
|
|
};
|
|
}
|
|
|
|
function __finishTest() {
|
|
if (__originalURL) {
|
|
internals.spoofCurrentURL(__originalURL);
|
|
}
|
|
internals.signalTextTestIsDone(__outputElement.innerText);
|
|
}
|
|
|
|
function spoofCurrentURL(url) {
|
|
if (__originalURL === null) {
|
|
__originalURL = document.location.href;
|
|
}
|
|
internals.spoofCurrentURL(url);
|
|
}
|
|
|
|
function println(s) {
|
|
__outputElement.appendChild(document.createTextNode(s + "\n"));
|
|
}
|
|
|
|
function printElement(e) {
|
|
let element_string = `<${e.nodeName} `;
|
|
if (e.id) element_string += `id="${e.id}" `;
|
|
element_string += ">";
|
|
println(element_string);
|
|
}
|
|
|
|
function animationFrame() {
|
|
const { promise, resolve } = Promise.withResolvers();
|
|
requestAnimationFrame(resolve);
|
|
return promise;
|
|
}
|
|
|
|
function timeout(ms) {
|
|
const { promise, resolve } = Promise.withResolvers();
|
|
setTimeout(resolve, ms);
|
|
return promise;
|
|
}
|
|
|
|
const __testErrorHandlerController = new AbortController();
|
|
window.addEventListener(
|
|
"error",
|
|
event => {
|
|
println(`Uncaught Error In Test: ${event.message}`);
|
|
__finishTest();
|
|
},
|
|
{ signal: __testErrorHandlerController.signal }
|
|
);
|
|
|
|
function removeTestErrorHandler() {
|
|
__testErrorHandlerController.abort();
|
|
}
|
|
|
|
document.addEventListener("DOMContentLoaded", function () {
|
|
__outputElement = document.createElement("pre");
|
|
__outputElement.setAttribute("id", "out");
|
|
document.body.appendChild(__outputElement);
|
|
});
|
|
|
|
function test(f) {
|
|
__preventMultipleTestFunctions();
|
|
document.addEventListener("DOMContentLoaded", f);
|
|
window.addEventListener("load", () => {
|
|
__finishTest();
|
|
});
|
|
}
|
|
|
|
function asyncTest(f) {
|
|
const done = () => {
|
|
__preventMultipleTestFunctions();
|
|
__finishTest();
|
|
};
|
|
document.addEventListener("DOMContentLoaded", () => {
|
|
f(done);
|
|
});
|
|
}
|
|
|
|
function promiseTest(f) {
|
|
document.addEventListener("DOMContentLoaded", () => {
|
|
f().then(() => {
|
|
__preventMultipleTestFunctions();
|
|
__finishTest();
|
|
});
|
|
});
|
|
}
|
|
|
|
class HTTPTestServer {
|
|
constructor(baseURL) {
|
|
this.baseURL = baseURL;
|
|
}
|
|
async createEcho(method, path, options) {
|
|
const result = await fetch(`${this.baseURL}/echo`, {
|
|
method: "POST",
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
},
|
|
body: JSON.stringify({ ...options, method, path }),
|
|
});
|
|
if (!result.ok) {
|
|
throw new Error("Error creating echo: " + result.statusText);
|
|
}
|
|
return `${this.baseURL}${path}`;
|
|
}
|
|
getStaticURL(path) {
|
|
return `${this.baseURL}/static/${path}`;
|
|
}
|
|
}
|
|
|
|
const __httpTestServer = (function () {
|
|
if (globalThis.internals && globalThis.internals.getEchoServerPort)
|
|
return new HTTPTestServer(`http://localhost:${internals.getEchoServerPort()}`);
|
|
|
|
return null;
|
|
})();
|
|
|
|
function httpTestServer() {
|
|
if (!__httpTestServer)
|
|
throw new Error("window.internals must be exposed to use HTTPTestServer");
|
|
return __httpTestServer;
|
|
}
|