fix(sanitizer): normalize non-breaking spaces for WebView compatibility (#2893)

Convert   to   before sanitization and restore after XMLSerializer
serialization. This handles the platform difference where XMLSerializer
produces different representations of non-breaking spaces ( ,  ,
or \u00A0) across different WebView implementations.
This commit is contained in:
Huang Xin
2026-01-09 09:30:04 +01:00
committed by GitHub
parent 20ae09c52d
commit cfe51d01ee
@@ -8,7 +8,7 @@ export const sanitizerTransformer: Transformer = {
const allowScript = ctx.viewSettings.allowScript; const allowScript = ctx.viewSettings.allowScript;
if (allowScript) return ctx.content; if (allowScript) return ctx.content;
const result = ctx.content; const result = ctx.content.replaceAll(' ', ' ');
const sanitized = DOMPurify.sanitize(result, { const sanitized = DOMPurify.sanitize(result, {
WHOLE_DOCUMENT: true, WHOLE_DOCUMENT: true,
@@ -40,6 +40,7 @@ export const sanitizerTransformer: Transformer = {
const serializer = new XMLSerializer(); const serializer = new XMLSerializer();
let serialized = serializer.serializeToString(sanitized); let serialized = serializer.serializeToString(sanitized);
serialized = serialized.replaceAll(' ', ' ').replaceAll('\u00A0', ' ');
serialized = '<?xml version="1.0" encoding="utf-8"?>' + serialized; serialized = '<?xml version="1.0" encoding="utf-8"?>' + serialized;
serialized = serialized.replace(/(<head[^>]*>)/i, '\n$1'); serialized = serialized.replace(/(<head[^>]*>)/i, '\n$1');
serialized = serialized.replace(/(<\/body>)(<\/html>)/i, '$1\n$2'); serialized = serialized.replace(/(<\/body>)(<\/html>)/i, '$1\n$2');