mirror of
https://github.com/MercuryWorkshop/scramjet.git
synced 2025-05-13 22:40:01 -04:00
feat: start proxying css getpropertydeclaration
This commit is contained in:
parent
c4070bbd6d
commit
9f04dacd01
6 changed files with 56 additions and 9 deletions
|
@ -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());
|
||||||
|
},
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ export const {
|
||||||
url: { encodeUrl, decodeUrl },
|
url: { encodeUrl, decodeUrl },
|
||||||
rewrite: {
|
rewrite: {
|
||||||
rewriteCss,
|
rewriteCss,
|
||||||
|
unrewriteCss,
|
||||||
rewriteHtml,
|
rewriteHtml,
|
||||||
unrewriteHtml,
|
unrewriteHtml,
|
||||||
rewriteSrcset,
|
rewriteSrcset,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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})`;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
|
@ -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
3
src/types.d.ts
vendored
|
@ -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;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue