feat: start proxying more css things

This commit is contained in:
Percs 2025-05-11 03:00:36 -05:00
parent 02ae723a41
commit 375c54d5ed
7 changed files with 761 additions and 312 deletions

View file

@ -32,7 +32,7 @@
"license": "MIT", "license": "MIT",
"devDependencies": { "devDependencies": {
"@eslint/eslintrc": "^3.3.1", "@eslint/eslintrc": "^3.3.1",
"@eslint/js": "^9.25.1", "@eslint/js": "^9.26.0",
"@estruyf/github-actions-reporter": "^1.10.0", "@estruyf/github-actions-reporter": "^1.10.0",
"@fastify/static": "^8.1.1", "@fastify/static": "^8.1.1",
"@mercuryworkshop/bare-as-module3": "^2.2.5", "@mercuryworkshop/bare-as-module3": "^2.2.5",
@ -41,17 +41,17 @@
"@mercuryworkshop/wisp-js": "^0.3.3", "@mercuryworkshop/wisp-js": "^0.3.3",
"@nebula-services/bare-server-node": "^2.0.4", "@nebula-services/bare-server-node": "^2.0.4",
"@playwright/test": "^1.52.0", "@playwright/test": "^1.52.0",
"@rsdoctor/rspack-plugin": "^1.0.2", "@rsdoctor/rspack-plugin": "^1.1.2",
"@rspack/cli": "^1.3.8", "@rspack/cli": "^1.3.9",
"@rspack/core": "^1.3.8", "@rspack/core": "^1.3.9",
"@types/eslint": "^9.6.1", "@types/eslint": "^9.6.1",
"@types/estree": "^1.0.7", "@types/estree": "^1.0.7",
"@types/node": "^22.15.3", "@types/node": "^22.15.17",
"@types/serviceworker": "^0.0.132", "@types/serviceworker": "^0.0.134",
"@typescript-eslint/eslint-plugin": "^8.31.1", "@typescript-eslint/eslint-plugin": "^8.32.0",
"@typescript-eslint/parser": "^8.31.1", "@typescript-eslint/parser": "^8.32.0",
"dotenv": "^16.5.0", "dotenv": "^16.5.0",
"eslint": "^9.25.1", "eslint": "^9.26.0",
"fastify": "^5.3.2", "fastify": "^5.3.2",
"playwright": "^1.52.0", "playwright": "^1.52.0",
"prettier": "^3.5.3", "prettier": "^3.5.3",

945
pnpm-lock.yaml generated

File diff suppressed because it is too large Load diff

View file

@ -25,6 +25,26 @@ export default function (client: ScramjetClient) {
return unrewriteCss(ctx.get()); return unrewriteCss(ctx.get());
}, },
}); });
client.Proxy("CSSStyleSheet.prototype.insertRule", {
apply(ctx) {
ctx.args[0] = rewriteCss(ctx.args[0], client.meta);
},
});
client.Trap("CSSRule.prototype.cssText", {
set(ctx, value: string) {
ctx.set(rewriteCss(value, client.meta));
},
get(ctx) {
return unrewriteCss(ctx.get());
},
});
client.Proxy(["CSSStyleValue.parse", "CSSStyleValue.parseAll"], {
apply(ctx) {
if (!ctx.args[1]) return;
ctx.args[1] = rewriteCss(ctx.args[1], client.meta);
},
});
client.Trap("HTMLElement.prototype.style", { client.Trap("HTMLElement.prototype.style", {
get(ctx) { get(ctx) {

View file

@ -2,6 +2,18 @@ import { rewriteHtml } from "../../shared";
import { ScramjetClient } from "../client"; import { ScramjetClient } from "../client";
export default function (client: ScramjetClient, _self: Self) { export default function (client: ScramjetClient, _self: Self) {
client.Proxy(
["Document.prototype.querySelector", "Document.prototype.querySelectorAll"],
{
apply(ctx) {
ctx.args[0] = (ctx.args[0] as string).replace(
/((?:^|\s)\b\w+\[(?:src|href|data-href))[\^]?(=['"]?(?:https?[:])?\/\/)/,
"$1*$2"
);
},
}
);
client.Proxy("Document.prototype.write", { client.Proxy("Document.prototype.write", {
apply(ctx) { apply(ctx) {
if (ctx.args[0]) if (ctx.args[0])

View file

@ -1,8 +1,13 @@
import { SCRAMJETCLIENT } from "../../symbols"; import { SCRAMJETCLIENT } from "../../symbols";
import { ScramjetClient } from "../client"; import { ScramjetClient } from "../client";
import { nativeGetOwnPropertyDescriptor } from "../natives"; import { nativeGetOwnPropertyDescriptor } from "../natives";
import { unrewriteUrl, htmlRules, unrewriteHtml } from "../../shared"; import {
import { rewriteCss, rewriteHtml, rewriteJs } from "../../shared"; unrewriteUrl,
rewriteUrl,
htmlRules,
unrewriteHtml,
} from "../../shared";
import { unrewriteCss, rewriteCss, rewriteHtml, rewriteJs } from "../../shared";
const encoder = new TextEncoder(); const encoder = new TextEncoder();
function bytesToBase64(bytes: Uint8Array) { function bytesToBase64(bytes: Uint8Array) {
@ -328,6 +333,48 @@ export default function (client: ScramjetClient, self: typeof window) {
}, },
}); });
client.Proxy("Audio", {
construct(ctx) {
ctx.args[0] = rewriteUrl(ctx.args[0], client.meta);
},
});
client.Proxy("Text.prototype.appendData", {
apply(ctx) {
if (ctx.this?.parentElement.tagName === "STYLE") {
ctx.args[0] = rewriteCss(ctx.args[0], client.meta);
}
},
});
client.Proxy("Text.prototype.insertData", {
apply(ctx) {
if (ctx.this?.parentElement.tagName === "STYLE") {
ctx.args[1] = rewriteCss(ctx.args[1], client.meta);
}
},
});
client.Proxy("Text.prototype.insertData", {
apply(ctx) {
if (ctx.this?.parentElement.tagName === "STYLE") {
ctx.args[2] = rewriteCss(ctx.args[2], client.meta);
}
},
});
client.Trap(["Text.prototype.data", "Text.prototype.wholeText"], {
get(ctx) {
if (ctx.this?.parentElement.tagName === "STYLE") {
return unrewriteCss(ctx.get() as string);
}
},
set(ctx, v) {
if (ctx.this?.parentElement.tagName === "STYLE") {
ctx.set(rewriteCss(v as string, client.meta));
}
},
});
client.Trap( client.Trap(
[ [
"HTMLIFrameElement.prototype.contentWindow", "HTMLIFrameElement.prototype.contentWindow",
@ -454,7 +501,6 @@ export default function (client: ScramjetClient, self: typeof window) {
}, },
} }
); );
client.Proxy("Node.prototype.getRootNode", { client.Proxy("Node.prototype.getRootNode", {
apply(ctx) { apply(ctx) {
const n = ctx.call() as Node; const n = ctx.call() as Node;

View file

@ -0,0 +1,15 @@
import { rewriteUrl } from "../../shared";
import { ScramjetClient } from "../client";
export default function (client: ScramjetClient, self: Self) {
client.Proxy("Navigator.prototype.registerProtocolHandler", {
apply(ctx) {
ctx.args[1] = rewriteUrl(ctx.args[1], client.meta);
},
});
client.Proxy("Navigator.prototype.unregisterProtocolHandler", {
apply(ctx) {
ctx.args[1] = rewriteUrl(ctx.args[1], client.meta);
},
});
}

View file

@ -53,6 +53,17 @@ export default function (client: ScramjetClient, self: Self) {
return unrewriteUrl(this.newURL); return unrewriteUrl(this.newURL);
}, },
}, },
storage: {
_init() {
return this.key.startsWith(client.url.host + "@");
},
key() {
return this.key.substring(this.key.indexOf("@") + 1);
},
url() {
return unrewriteUrl(this.url);
},
},
}; };
function wraplistener(listener: (...args: any) => any) { function wraplistener(listener: (...args: any) => any) {