mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-10-20 15:09:42 +00:00
The example shows how to write a test that depends on custom HTTP headers in the response. This will be useful for testing browser JS that depends on how Ladybird processes response headers, eg CORS headers like Access-Control-Allow-Origin and others.
128 lines
3.2 KiB
JavaScript
128 lines
3.2 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}/create`, {
|
|
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}`;
|
|
}
|
|
}
|
|
|
|
// FIXME: Get the port from internals
|
|
const __httpTestServer = new HTTPTestServer("http://localhost:8123");
|
|
function httpTestServer() {
|
|
return __httpTestServer;
|
|
}
|