diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index a20d8c90fb7..81133ea6bc9 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -1164,8 +1164,8 @@ impl XMLHttpRequest { return NullValue(); } // Step 4 - fn decode_to_utf16(bytes: &[u8], encoding: &'static Encoding) -> Vec { - let mut decoder = encoding.new_decoder(); + fn decode_to_utf16_with_bom_removal(bytes: &[u8], encoding: &'static Encoding) -> Vec { + let mut decoder = encoding.new_decoder_with_bom_removal(); let capacity = decoder.max_utf16_buffer_length(bytes.len()).expect("Overflow"); let mut utf16 = Vec::with_capacity(capacity); let extra = unsafe { @@ -1179,7 +1179,12 @@ impl XMLHttpRequest { } utf16 } - let json_text = decode_to_utf16(&bytes, UTF_8); + // https://xhr.spec.whatwg.org/#json-response refers to + // https://infra.spec.whatwg.org/#parse-json-from-bytes which refers to + // https://encoding.spec.whatwg.org/#utf-8-decode which means + // that the encoding is always UTF-8 and the UTF-8 BOM is removed, + // if present, but UTF-16BE/LE BOM must not be honored. + let json_text = decode_to_utf16_with_bom_removal(&bytes, UTF_8); // Step 5 rooted!(in(cx) let mut rval = UndefinedValue()); unsafe { diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index 2e66e800142..743e1fea8bf 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -180079,6 +180079,11 @@ {} ] ], + "XMLHttpRequest/resources/utf16-bom.json": [ + [ + {} + ] + ], "XMLHttpRequest/resources/utf16.txt": [ [ {} @@ -293760,6 +293765,12 @@ {} ] ], + "XMLHttpRequest/no-utf16-json.htm": [ + [ + "/XMLHttpRequest/no-utf16-json.htm", + {} + ] + ], "XMLHttpRequest/open-after-abort.htm": [ [ "/XMLHttpRequest/open-after-abort.htm", @@ -377781,6 +377792,10 @@ "6804845b3ba0e52ee407fc7e8036ce905283751c", "testharness" ], + "XMLHttpRequest/no-utf16-json.htm": [ + "4546215ad6f138676d3c473782e6e34b4c922589", + "testharness" + ], "XMLHttpRequest/open-after-abort.htm": [ "082fa646606cf8f278d61960f02fafa264e57e9f", "testharness" @@ -378273,6 +378288,10 @@ "e1addc2a9f014c2546b5770dd328b1562dc4fdc3", "support" ], + "XMLHttpRequest/resources/utf16-bom.json": [ + "3d344828308b32594a8ed51a3cf186ccfa83cfb1", + "support" + ], "XMLHttpRequest/resources/utf16.txt": [ "47e95b463051a904934ec51df445a39301c5f671", "support" diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/no-utf16-json.htm b/tests/wpt/web-platform-tests/XMLHttpRequest/no-utf16-json.htm new file mode 100644 index 00000000000..03bbc108047 --- /dev/null +++ b/tests/wpt/web-platform-tests/XMLHttpRequest/no-utf16-json.htm @@ -0,0 +1,19 @@ + + +XMLHttpRequest: responseType "json" should be decoded as UTF-8 even when there's a UTF-16 BOM + + + +
+ + diff --git a/tests/wpt/web-platform-tests/XMLHttpRequest/resources/utf16-bom.json b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/utf16-bom.json new file mode 100644 index 00000000000..5fd0a585a30 Binary files /dev/null and b/tests/wpt/web-platform-tests/XMLHttpRequest/resources/utf16-bom.json differ