diff --git a/src/client/dom/element.ts b/src/client/dom/element.ts index 8db00be..12a58dd 100644 --- a/src/client/dom/element.ts +++ b/src/client/dom/element.ts @@ -7,7 +7,7 @@ import { rewriteCss, rewriteHtml, rewriteJs } from "../../shared"; export default function (client: ScramjetClient, self: typeof window) { const _nativeGetAttribute = self.Element.prototype.getAttribute; const nativeSetAttribute = self.Element.prototype.setAttribute; - const _nativeHasAttribute = self.Element.prototype.hasAttribute; + const nativeHasAttribute = self.Element.prototype.hasAttribute; const attrObject = { nonce: [self.HTMLElement], @@ -158,8 +158,11 @@ export default function (client: ScramjetClient, self: typeof window) { return ctx.return(null); } - if (ctx.fn.call(ctx.this, `scramjet-data-${name}`)) { - ctx.return(ctx.fn.call(ctx.this, `scramjet-data-${name}`)); + if (nativeHasAttribute.call(ctx.this, `scramjet-data-${name}`)) { + const attrib = ctx.fn.call(ctx.this, `scramjet-data-${name}`); + if (attrib === null) return ctx.return(""); + + return ctx.return(attrib); } }, }); @@ -209,6 +212,7 @@ export default function (client: ScramjetClient, self: typeof window) { return unrewriteHtml(ctx.get()); }, }); + client.Proxy("Element.prototype.insertAdjacentHTML", { apply(ctx) { if (ctx.args[1]) @@ -292,6 +296,9 @@ export default function (client: ScramjetClient, self: typeof window) { "Node.prototype.parentElement", "Node.prototype.previousSibling", "Node.prototype.nextSibling", + "Range.prototype.commonAncestorContainer", + "AbstractRange.prototype.endContainer", + "AbstractRange.prototype.startContainer", ], { get(ctx) { @@ -306,6 +313,22 @@ export default function (client: ScramjetClient, self: typeof window) { } ); + client.Proxy( + [ + "HTMLIFrameElement.prototype.getSVGDocument", + "HTMLObjectElement.prototype.getSVGDocument", + "HTMLEmbedElement.prototype.getSVGDocument", + ], + { + apply(ctx) { + const document = ctx.call(); + if (document) { + ctx.return(ctx.this.contentDocument); + } + }, + } + ); + client.Proxy("Node.prototype.getRootNode", { apply(ctx) { const n = ctx.call() as Node; diff --git a/src/client/shared/unproxy.ts b/src/client/shared/unproxy.ts index 20a37ec..4c2ee51 100644 --- a/src/client/shared/unproxy.ts +++ b/src/client/shared/unproxy.ts @@ -30,6 +30,7 @@ export default function (client: ScramjetClient, self: typeof window) { self.MutationObserver.prototype, self.document, self.MouseEvent.prototype, + self.Range.prototype, ]) { for (const prop in target) { try { diff --git a/src/shared/rewriters/html.ts b/src/shared/rewriters/html.ts index 97642fa..f2e2f0c 100644 --- a/src/shared/rewriters/html.ts +++ b/src/shared/rewriters/html.ts @@ -294,6 +294,7 @@ export function rewriteSrcset(srcset: string, meta: URLMeta) { // Rewrite the URLs and keep the descriptors (if any) const rewrittenUrl = rewriteUrl(url.trim(), meta); + return descriptors.length > 0 ? `${rewrittenUrl} ${descriptors.join(" ")}` : rewrittenUrl; diff --git a/src/shared/rewriters/url.ts b/src/shared/rewriters/url.ts index 7b54e8b..b0b31cf 100644 --- a/src/shared/rewriters/url.ts +++ b/src/shared/rewriters/url.ts @@ -46,15 +46,13 @@ export function rewriteUrl(url: string | URL, meta: URLMeta) { if (base.startsWith("about:")) base = unrewriteUrl(self.location.href); // jank!!!!! weird jank!!! const realUrl = tryCanParseURL(url, base); - if (realUrl) { - return ( - location.origin + - $scramjet.config.prefix + - $scramjet.codec.encode(realUrl.href) - ); - } else { - return url; - } + if (!realUrl) return url; + + return ( + location.origin + + $scramjet.config.prefix + + $scramjet.codec.encode(realUrl.href) + ); } } diff --git a/src/shared/rewriters/worker.ts b/src/shared/rewriters/worker.ts index a0463e2..d4b486b 100644 --- a/src/shared/rewriters/worker.ts +++ b/src/shared/rewriters/worker.ts @@ -22,7 +22,6 @@ export function rewriteWorkers( script("shared"); str += `self.$scramjet.config = ${JSON.stringify($scramjet.config)};`; script("client"); - console.log(str); let rewritten = rewriteJs(js, url, meta); if (rewritten instanceof Uint8Array) { @@ -31,7 +30,7 @@ export function rewriteWorkers( str += rewritten; - dbg.log("Rewrite", type, str); + // dbg.log("Rewrite", type, str); return str; } diff --git a/src/worker/fetch.ts b/src/worker/fetch.ts index 0b1ceff..e5954fe 100644 --- a/src/worker/fetch.ts +++ b/src/worker/fetch.ts @@ -58,13 +58,14 @@ export async function handleFetch( dataurl = unrewriteBlob(dataurl); } - const response: Response = await fetch(dataurl, {}); - + const response: Partial = await fetch(dataurl, {}); + const url = dataurl.startsWith("blob:") ? dataurl : "(data url)"; + response.finalURL = url; let body: BodyType; if (response.body) { body = await rewriteBody( - response, + response as BareResponseFetch, client ? { base: new URL(new URL(client.url).origin),