From 55d4f24cb50e995b0dfee73979305e8237384a53 Mon Sep 17 00:00:00 2001 From: ycw Date: Tue, 25 Jan 2022 01:31:42 +0800 Subject: [PATCH] FileLoader: `text` honors mimetype's charset as encoding (#23292) * honor encoding * npm run lint-fix * cmp idx * lint * textual encoding * record state * new api `.setResponseType` * rollback mmdloader * sniff encoding for 'text' kind --- src/loaders/FileLoader.js | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/loaders/FileLoader.js b/src/loaders/FileLoader.js index b42e55bc752ebf..d9ea9bc3e66665 100644 --- a/src/loaders/FileLoader.js +++ b/src/loaders/FileLoader.js @@ -69,6 +69,10 @@ class FileLoader extends Loader { // An abort controller could be added within a future PR } ); + // record states ( avoid data race ) + const mimeType = this.mimeType; + const responseType = this.responseType; + // start the fetch fetch( req ) .then( response => { @@ -147,7 +151,7 @@ class FileLoader extends Loader { } ) .then( response => { - switch ( this.responseType ) { + switch ( responseType ) { case 'arraybuffer': @@ -163,7 +167,7 @@ class FileLoader extends Loader { .then( text => { const parser = new DOMParser(); - return parser.parseFromString( text, this.mimeType ); + return parser.parseFromString( text, mimeType ); } ); @@ -173,7 +177,20 @@ class FileLoader extends Loader { default: - return response.text(); + if ( mimeType === undefined ) { + + return response.text(); + + } else { + + // sniff encoding + const re = /charset="?([^;"\s]*)"?/i; + const exec = re.exec( mimeType ); + const label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined; + const decoder = new TextDecoder( label ); + return response.arrayBuffer().then( ab => decoder.decode( ab ) ); + + } }