mirror of
https://github.com/MercuryWorkshop/scramjet.git
synced 2025-05-13 22:40:01 -04:00
outerHtml and a get impl
This commit is contained in:
parent
8e191b45ab
commit
e8b9e04d46
5 changed files with 65 additions and 36 deletions
|
@ -1,5 +1,5 @@
|
||||||
import { ScramjetClient } from "../client";
|
import { ScramjetClient } from "../client";
|
||||||
import { config, decodeUrl, htmlRules } from "../shared";
|
import { config, decodeUrl, htmlRules, unrewriteHtml } from "../shared";
|
||||||
import {
|
import {
|
||||||
encodeUrl,
|
encodeUrl,
|
||||||
rewriteCss,
|
rewriteCss,
|
||||||
|
@ -8,11 +8,6 @@ import {
|
||||||
rewriteSrcset,
|
rewriteSrcset,
|
||||||
} from "../shared";
|
} from "../shared";
|
||||||
|
|
||||||
declare global {
|
|
||||||
interface Element {
|
|
||||||
$origattrs: Record<string, string>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
export default function (client: ScramjetClient, self: typeof window) {
|
export default function (client: ScramjetClient, self: typeof window) {
|
||||||
const attrObject = {
|
const attrObject = {
|
||||||
nonce: [self.HTMLElement],
|
nonce: [self.HTMLElement],
|
||||||
|
@ -100,22 +95,27 @@ export default function (client: ScramjetClient, self: typeof window) {
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const innerHTML = Object.getOwnPropertyDescriptor(
|
client.Trap("Element.prototype.innerHTML", {
|
||||||
self.Element.prototype,
|
set(ctx, value: string) {
|
||||||
"innerHTML"
|
if (ctx.this instanceof self.HTMLScriptElement) {
|
||||||
);
|
return rewriteJs(value, client.url);
|
||||||
|
} else if (ctx.this instanceof self.HTMLStyleElement) {
|
||||||
Object.defineProperty(self.Element.prototype, "innerHTML", {
|
return rewriteCss(value, client.url);
|
||||||
set(value) {
|
|
||||||
if (this instanceof self.HTMLScriptElement) {
|
|
||||||
value = rewriteJs(value);
|
|
||||||
} else if (this instanceof self.HTMLStyleElement) {
|
|
||||||
value = rewriteCss(value);
|
|
||||||
} else {
|
} else {
|
||||||
value = rewriteHtml(value, client.cookieStore);
|
return rewriteHtml(value, client.cookieStore, client.url);
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
get(ctx) {
|
||||||
|
return unrewriteHtml(ctx.get());
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
return innerHTML.set.call(this, value);
|
client.Trap("Element.prototype.outerHTML", {
|
||||||
|
set(ctx, value: string) {
|
||||||
|
return rewriteHtml(value, client.cookieStore, client.url);
|
||||||
|
},
|
||||||
|
get(ctx) {
|
||||||
|
return unrewriteHtml(ctx.get());
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ export const {
|
||||||
rewrite: {
|
rewrite: {
|
||||||
rewriteCss,
|
rewriteCss,
|
||||||
rewriteHtml,
|
rewriteHtml,
|
||||||
|
unrewriteHtml,
|
||||||
rewriteSrcset,
|
rewriteSrcset,
|
||||||
rewriteJs,
|
rewriteJs,
|
||||||
rewriteHeaders,
|
rewriteHeaders,
|
||||||
|
|
|
@ -8,7 +8,7 @@ import { BareClient } from "@mercuryworkshop/bare-mux";
|
||||||
import { parseDomain } from "parse-domain";
|
import { parseDomain } from "parse-domain";
|
||||||
import { ScramjetHeaders } from "./headers";
|
import { ScramjetHeaders } from "./headers";
|
||||||
import { CookieStore } from "./cookie";
|
import { CookieStore } from "./cookie";
|
||||||
import { htmlRules } from "./rewriters/html";
|
import { htmlRules, unrewriteHtml } from "./rewriters/html";
|
||||||
|
|
||||||
self.$scramjet.shared = {
|
self.$scramjet.shared = {
|
||||||
util: {
|
util: {
|
||||||
|
@ -23,6 +23,7 @@ self.$scramjet.shared = {
|
||||||
rewrite: {
|
rewrite: {
|
||||||
rewriteCss,
|
rewriteCss,
|
||||||
rewriteHtml,
|
rewriteHtml,
|
||||||
|
unrewriteHtml,
|
||||||
rewriteSrcset,
|
rewriteSrcset,
|
||||||
rewriteJs,
|
rewriteJs,
|
||||||
rewriteHeaders,
|
rewriteHeaders,
|
||||||
|
|
|
@ -48,28 +48,49 @@ export function rewriteHtml(
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
const script = (src) => new Element("script", { src });
|
||||||
|
|
||||||
head.children.unshift(
|
head.children.unshift(
|
||||||
new Element("script", {
|
script(self.$scramjet.config["wasm"]),
|
||||||
src: self.$scramjet.config["wasm"],
|
script(self.$scramjet.config["codecs"]),
|
||||||
}),
|
script("data:application/javascript;base64," + btoa(injected)),
|
||||||
new Element("script", {
|
script(self.$scramjet.config["shared"]),
|
||||||
src: self.$scramjet.config["codecs"],
|
script(self.$scramjet.config["client"])
|
||||||
}),
|
|
||||||
new Element("script", {
|
|
||||||
src: "data:application/javascript;base64," + btoa(injected),
|
|
||||||
}),
|
|
||||||
new Element("script", {
|
|
||||||
src: self.$scramjet.config["shared"],
|
|
||||||
}),
|
|
||||||
new Element("script", {
|
|
||||||
src: self.$scramjet.config["client"],
|
|
||||||
})
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return render(handler.root);
|
return render(handler.root);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function unrewriteHtml(html: string) {
|
||||||
|
const handler = new DomHandler((err, dom) => dom);
|
||||||
|
const parser = new Parser(handler);
|
||||||
|
|
||||||
|
parser.write(html);
|
||||||
|
parser.end();
|
||||||
|
|
||||||
|
function traverse(node: ChildNode) {
|
||||||
|
if ("attribs" in node) {
|
||||||
|
for (const key in node.attribs) {
|
||||||
|
if (key.startsWith("data-scramjet-")) {
|
||||||
|
node.attribs[key.slice(13)] = node.attribs[key];
|
||||||
|
delete node.attribs[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ("childNodes" in node) {
|
||||||
|
for (const child of node.childNodes) {
|
||||||
|
traverse(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
traverse(handler.root);
|
||||||
|
|
||||||
|
return render(handler.root);
|
||||||
|
}
|
||||||
|
|
||||||
export const htmlRules: {
|
export const htmlRules: {
|
||||||
[key: string]: "*" | string[] | Function;
|
[key: string]: "*" | string[] | Function;
|
||||||
fn: (
|
fn: (
|
||||||
|
|
8
src/types.d.ts
vendored
8
src/types.d.ts
vendored
|
@ -1,7 +1,12 @@
|
||||||
import { ScramjetController } from "./bootsrapper/index";
|
import { ScramjetController } from "./bootsrapper/index";
|
||||||
import { encodeUrl, decodeUrl } from "./shared/rewriters/url";
|
import { encodeUrl, decodeUrl } from "./shared/rewriters/url";
|
||||||
import { rewriteCss } from "./shared/rewriters/css";
|
import { rewriteCss } from "./shared/rewriters/css";
|
||||||
import { htmlRules, rewriteHtml, rewriteSrcset } from "./shared/rewriters/html";
|
import {
|
||||||
|
htmlRules,
|
||||||
|
rewriteHtml,
|
||||||
|
rewriteSrcset,
|
||||||
|
unrewriteHtml,
|
||||||
|
} from "./shared/rewriters/html";
|
||||||
import { rewriteJs } from "./shared/rewriters/js";
|
import { rewriteJs } from "./shared/rewriters/js";
|
||||||
import { rewriteHeaders } from "./shared/rewriters/headers";
|
import { rewriteHeaders } from "./shared/rewriters/headers";
|
||||||
import { rewriteWorkers } from "./shared/rewriters/worker";
|
import { rewriteWorkers } from "./shared/rewriters/worker";
|
||||||
|
@ -43,6 +48,7 @@ declare global {
|
||||||
rewrite: {
|
rewrite: {
|
||||||
rewriteCss: typeof rewriteCss;
|
rewriteCss: typeof rewriteCss;
|
||||||
rewriteHtml: typeof rewriteHtml;
|
rewriteHtml: typeof rewriteHtml;
|
||||||
|
unrewriteHtml: typeof unrewriteHtml;
|
||||||
rewriteSrcset: typeof rewriteSrcset;
|
rewriteSrcset: typeof rewriteSrcset;
|
||||||
rewriteJs: typeof rewriteJs;
|
rewriteJs: typeof rewriteJs;
|
||||||
rewriteHeaders: typeof rewriteHeaders;
|
rewriteHeaders: typeof rewriteHeaders;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue