diff --git a/src/bundle/rewriters/url.ts b/src/bundle/rewriters/url.ts index 0e2d9ea..9e0444f 100644 --- a/src/bundle/rewriters/url.ts +++ b/src/bundle/rewriters/url.ts @@ -16,8 +16,6 @@ export function encodeUrl(url: string, origin?: string | URL) { origin = new URL(self.__scramjet$config.codec.decode(location.href.slice((location.origin + self.__scramjet$config.prefix).length))); } - console.log(url); - if (url.startsWith("javascript:")) { return "javascript:" + rewriteJs(url.slice("javascript:".length)); } else if (/^(#|mailto|about|data)/.test(url) || url.startsWith(location.origin + self.__scramjet$config.prefix)) { diff --git a/src/client/element.ts b/src/client/element.ts index b99f688..b696fab 100644 --- a/src/client/element.ts +++ b/src/client/element.ts @@ -44,6 +44,10 @@ Object.keys(attribs).forEach((attrib: string) => { }, set(value) { + if (this.dataset["scramjet"]) { + return; + } + console.log(value); this.dataset[`${attrib}`] = value; if (/nonce|integrity|csp/.test(attrib)) { this.removeAttribute(attrib); @@ -84,6 +88,10 @@ Element.prototype.getAttribute = new Proxy(Element.prototype.getAttribute, { Element.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, { apply(target, thisArg, argArray) { + if (thisArg.dataset["scramjet"]) { + return; + } + console.log(argArray[1]) if (Object.keys(attribs).includes(argArray[0])) { thisArg.dataset[`${argArray[0]}`] = argArray[1]; if (/nonce|integrity|csp/.test(argArray[0])) { diff --git a/src/html/cloner.ts b/src/html/cloner.ts new file mode 100644 index 0000000..dd18432 --- /dev/null +++ b/src/html/cloner.ts @@ -0,0 +1,25 @@ +export default class Clone { + el: HTMLElement; + copy: HTMLElement + + constructor(element: HTMLElement) { + this.el = element; + this.copy = document.createElement(element.tagName); + + for (const attr of element.getAttributeNames()) { + this.copy.setAttribute(attr, element.getAttribute(attr)); + } + + if (element.innerHTML) { + this.copy.innerHTML = element.innerHTML; + } + } + + insertCopy() { + this.el.insertAdjacentElement("afterend", this.copy); + } + + removeElement() { + this.el.remove(); + } +} \ No newline at end of file diff --git a/src/html/index.ts b/src/html/index.ts index e40d0d8..d97ecdb 100644 --- a/src/html/index.ts +++ b/src/html/index.ts @@ -1,6 +1,7 @@ // this code needs to be bundled as a separate file due to when it is ran import { encodeUrl, rewriteCss, rewriteJs, rewriteSrcset } from "../bundle"; +import Clone from "./cloner.ts"; const parser = new DOMParser(); @@ -79,4 +80,12 @@ navigator.serviceWorker.ready.then(({ active }) => { navigator.serviceWorker.addEventListener("message", (message) => { document.documentElement.replaceWith(rewriteHtml(message.data).documentElement); + + const scripts = document.querySelectorAll("script:not([data-scramjet])"); + + for (const script of scripts) { + const clone = new Clone(script); + clone.insertCopy(); + clone.removeElement(); + } }); \ No newline at end of file