feat: start proxying css getpropertydeclaration

This commit is contained in:
Percs 2024-10-07 00:52:39 -05:00
parent c4070bbd6d
commit 9f04dacd01
6 changed files with 56 additions and 9 deletions

View file

@ -1,5 +1,5 @@
import { ScramjetClient } from "../client"; import { ScramjetClient } from "../client";
import { rewriteCss } from "../../shared"; import { rewriteCss, unrewriteCss } from "../../shared";
const cssProperties = [ const cssProperties = [
"background", "background",
@ -21,4 +21,23 @@ export default function (client: ScramjetClient) {
ctx.args[1] = rewriteCss(ctx.args[1], client.meta); ctx.args[1] = rewriteCss(ctx.args[1], client.meta);
}, },
}); });
client.Proxy("CSSStyleDeclaration.prototype.getPropertyValue", {
apply(ctx) {
if (cssProperties.includes(ctx.args[0])) {
const realProperty = ctx.call();
return ctx.return(unrewriteCss(realProperty));
}
},
});
client.Trap("CSSStyleDeclaration.prototype.cssText", {
set(ctx, value: string) {
ctx.set(rewriteCss(value, client.meta));
},
get(ctx) {
return unrewriteCss(ctx.get());
},
});
} }

View file

@ -3,6 +3,7 @@ export const {
url: { encodeUrl, decodeUrl }, url: { encodeUrl, decodeUrl },
rewrite: { rewrite: {
rewriteCss, rewriteCss,
unrewriteCss,
rewriteHtml, rewriteHtml,
unrewriteHtml, unrewriteHtml,
rewriteSrcset, rewriteSrcset,

View file

@ -1,5 +1,5 @@
import { encodeUrl, decodeUrl } from "./rewriters/url"; import { encodeUrl, decodeUrl } from "./rewriters/url";
import { rewriteCss } from "./rewriters/css"; import { rewriteCss, unrewriteCss } from "./rewriters/css";
import { rewriteHtml, rewriteSrcset } from "./rewriters/html"; import { rewriteHtml, rewriteSrcset } from "./rewriters/html";
import { rewriteJs } from "./rewriters/js"; import { rewriteJs } from "./rewriters/js";
import { rewriteHeaders } from "./rewriters/headers"; import { rewriteHeaders } from "./rewriters/headers";
@ -23,6 +23,7 @@ self.$scramjet.shared = {
}, },
rewrite: { rewrite: {
rewriteCss, rewriteCss,
unrewriteCss,
rewriteHtml, rewriteHtml,
unrewriteHtml, unrewriteHtml,
rewriteSrcset, rewriteSrcset,

View file

@ -1,7 +1,7 @@
// This CSS rewriter uses code from Meteor // This CSS rewriter uses code from Meteor
// You can find the original source code at https://github.com/MeteorProxy/Meteor // You can find the original source code at https://github.com/MeteorProxy/Meteor
import { URLMeta, encodeUrl } from "./url"; import { URLMeta, encodeUrl, decodeUrl } from "./url";
export function rewriteCss(css: string, meta: URLMeta) { export function rewriteCss(css: string, meta: URLMeta) {
const regex = const regex =
@ -32,3 +32,33 @@ export function rewriteCss(css: string, meta: URLMeta) {
} }
); );
} }
export function unrewriteCss(css: string) {
const regex =
/(@import\s+(?!url\())?\s*url\(\s*(['"]?)([^'")]+)\2\s*\)|@import\s+(['"])([^'"]+)\4/g;
return css.replace(
regex,
(
match,
importStatement,
urlQuote,
urlContent,
importQuote,
importContent
) => {
const url = urlContent || importContent;
const encodedUrl = decodeUrl(url.trim());
if (importStatement) {
return `@import url(${urlQuote}${encodedUrl}${urlQuote})`;
}
if (importQuote) {
return `@import ${importQuote}${encodedUrl}${importQuote}`;
}
return `url(${urlQuote}${encodedUrl}${urlQuote})`;
}
);
}

View file

@ -57,11 +57,6 @@ export function rewriteHtml(
script("data:application/javascript;base64," + btoa(injected)), script("data:application/javascript;base64," + btoa(injected)),
script(self.$scramjet.config["shared"]), script(self.$scramjet.config["shared"]),
script(self.$scramjet.config["client"]) script(self.$scramjet.config["client"])
// script("/vc/browser.js"),
// new Element("link", {
// rel: "stylesheet",
// href: "/vc/browser.css",
// })
); );
} }

3
src/types.d.ts vendored
View file

@ -1,6 +1,6 @@
import { ScramjetController } from "./controller/index"; import { ScramjetController } from "./controller/index";
import { encodeUrl, decodeUrl } from "./shared/rewriters/url"; import { encodeUrl, decodeUrl } from "./shared/rewriters/url";
import { rewriteCss } from "./shared/rewriters/css"; import { rewriteCss, unrewriteCss } from "./shared/rewriters/css";
import { import {
htmlRules, htmlRules,
rewriteHtml, rewriteHtml,
@ -59,6 +59,7 @@ declare global {
}; };
rewrite: { rewrite: {
rewriteCss: typeof rewriteCss; rewriteCss: typeof rewriteCss;
unrewriteCss: typeof unrewriteCss;
rewriteHtml: typeof rewriteHtml; rewriteHtml: typeof rewriteHtml;
unrewriteHtml: typeof unrewriteHtml; unrewriteHtml: typeof unrewriteHtml;
rewriteSrcset: typeof rewriteSrcset; rewriteSrcset: typeof rewriteSrcset;