File size: 2,426 Bytes
bee6636 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
import { CookieStore } from "./cookie";
import { rewriteCss } from "./rewriters/css";
import { rewriteHtml, rewriteSrcset } from "./rewriters/html";
import { rewriteUrl, unrewriteBlob, URLMeta } from "./rewriters/url";
export const htmlRules: {
[key: string]: "*" | string[] | ((...any: any[]) => string | null);
fn: (value: string, meta: URLMeta, cookieStore: CookieStore) => string | null;
}[] = [
{
fn: (value: string, meta: URLMeta) => {
return rewriteUrl(value, meta);
},
// url rewrites
src: ["embed", "script", "img", "frame", "source", "input", "track"],
href: ["a", "link", "area", "use", "image"],
data: ["object"],
action: ["form"],
formaction: ["button", "input", "textarea", "submit"],
poster: ["video"],
"xlink:href": ["image"],
},
{
fn: (value: string, meta: URLMeta) => {
let url = rewriteUrl(value, meta);
if (meta.topFrameName)
url += `?topFrame=${meta.topFrameName}&parentFrame=${meta.parentFrameName}`;
return url;
},
src: ["iframe"],
},
{
fn: (value: string, meta: URLMeta) => {
if (value.startsWith("blob:")) {
// for media elements specifically they must take the original blob
// because they can't be fetch'd
return unrewriteBlob(value);
}
return rewriteUrl(value, meta);
},
src: ["video", "audio"],
},
{
fn: () => "",
integrity: ["script", "link"],
},
{
fn: () => null,
// csp stuff that must be deleted
nonce: "*",
csp: ["iframe"],
credentialless: ["iframe"],
},
{
fn: (value: string, meta: URLMeta) => rewriteSrcset(value, meta),
// srcset
srcset: ["img", "source"],
imagesrcset: ["link"],
},
{
fn: (value: string, meta: URLMeta, cookieStore: CookieStore) =>
rewriteHtml(
value,
cookieStore,
{
// for srcdoc origin is the origin of the page that the iframe is on. base and path get dropped
origin: new URL(meta.origin.origin),
base: new URL(meta.origin.origin),
},
true
),
// srcdoc
srcdoc: ["iframe"],
},
{
fn: (value: string, meta: URLMeta) => rewriteCss(value, meta),
style: "*",
},
{
fn: (value: string, meta: URLMeta) => {
if (value === "_top" || value === "_unfencedTop")
return meta.topFrameName;
else if (value === "_parent") return meta.parentFrameName;
else return value;
},
target: ["a", "base"],
},
];
|