/** * Offline-posture sanitizer tests — raw-HTML fetch vectors beyond * (which the image inliner owns). No Playwright, no PDF generation. * * Regression for: `; const out = sanitizeUntrustedHtml(input); expect(out).not.toContain("@import"); expect(out).not.toContain("evil.example"); expect(out).toContain("color: red"); }); test("strips string-form @import (no url())", () => { const out = sanitizeUntrustedHtml(``); expect(out).not.toContain("@import"); expect(out).not.toContain("evil.example"); }); test("neutralizes remote url() inside `; const out = sanitizeUntrustedHtml(input); expect(out).not.toContain("evil.example"); expect(out).toContain("url(#)"); expect(out).toContain("color: blue"); }); test("neutralizes remote url() in inline style attributes", () => { const input = `
x
`; const out = sanitizeUntrustedHtml(input); expect(out).not.toContain("evil.example"); expect(out).toContain("url(#)"); expect(out).toContain("padding:4px"); }); test("neutralizes protocol-relative url(//…) in style attributes", () => { const out = sanitizeUntrustedHtml(`
x
`); expect(out).not.toContain("evil.example"); }); test("strips srcset with a remote candidate, leaves src for the inliner", () => { const input = ``; const out = sanitizeUntrustedHtml(input); expect(out).not.toContain("srcset"); expect(out).not.toContain("evil.example"); expect(out).toContain(`src="local.png"`); }); test("strips unquoted remote srcset", () => { const out = sanitizeUntrustedHtml(``); expect(out).not.toContain("evil.example"); }); test("keeps local-only srcset (no network vector)", () => { const input = ``; expect(sanitizeUntrustedHtml(input)).toContain(`srcset="a.png 1x, a@2x.png 2x"`); }); test("neutralizes remote