import { JSDOM } from "jsdom"; import { fetchHtmlWithPlaywright } from "./playwright.ts"; import { createStreamResponse } from "./helpers.ts"; /** * Mutates the given JSDOM instance: rewrites all relevant URL-bearing attributes * to absolute URLs, resolving against the provided domain (e.g., "https://example.com"). */ export function absolutizeDomUrls(dom: JSDOM, domain: string): void { const { document } = dom.window; const base = toBase(domain); const rewrite = (selector: string, attr: string) => { document.querySelectorAll(selector).forEach((el) => { const v = el.getAttribute(attr); if (!v) return; const abs = toAbsolute(v, base); if (abs !== v) el.setAttribute(attr, abs); }); }; // Common URL attributes rewrite("a[href]", "href"); rewrite("area[href]", "href"); rewrite("link[href]", "href"); rewrite("use[href]", "href"); // SVG 2 rewrite("use[xlink\\:href]", "xlink:href"); // legacy SVG rewrite("image[href]", "href"); // SVG rewrite("image[xlink\\:href]", "xlink:href"); // legacy SVG rewrite("script[src]", "src"); rewrite("img[src]", "src"); rewrite("source[src]", "src"); rewrite("track[src]", "src"); rewrite("iframe[src]", "src"); rewrite("embed[src]", "src"); rewrite("audio[src]", "src"); rewrite("video[src]", "src"); rewrite("object[data]", "data"); rewrite("input[src]", "src"); rewrite("form[action]", "action"); rewrite("video[poster]", "poster"); // srcset (img, source) document .querySelectorAll("img[srcset], source[srcset]") .forEach((el) => { const v = el.getAttribute("srcset"); if (!v) return; const abs = absolutizeSrcset(v, base); if (abs !== v) el.setAttribute("srcset", abs); }); // Inline CSS in style attributes: url(...) document.querySelectorAll("[style]").forEach((el) => { const v = el.getAttribute("style"); if (!v) return; const abs = absolutizeCssUrls(v, base); if (abs !== v) el.setAttribute("style", abs); }); //