From a89bacb7c591129caebb820fc8199886ced8081b Mon Sep 17 00:00:00 2001 From: "cybai (Haku)" Date: Thu, 29 Feb 2024 05:26:43 +0900 Subject: [PATCH] Update overrideMimeType and final-charset to match xhr spec (#29812) * Update overrideMimeType to match xhr spec * Update final-encoding to match xhr spec * Fix an issue and add more comments --------- Co-authored-by: Martin Robinson --- components/script/dom/xmlhttprequest.rs | 66 ++++++++------- .../single-byte-decoder.window.js.ini | 27 ------- .../xhr/overridemimetype-blob.html.ini | 81 ------------------- .../overridemimetype-edge-cases.window.js.ini | 4 - ...overridemimetype-invalid-mime-type.htm.ini | 11 --- .../single-byte-decoder.window.js.ini | 27 ------- .../meta/xhr/overridemimetype-blob.html.ini | 81 ------------------- .../overridemimetype-edge-cases.window.js.ini | 3 - ...overridemimetype-invalid-mime-type.htm.ini | 9 --- 9 files changed, 35 insertions(+), 274 deletions(-) delete mode 100644 tests/wpt/meta-legacy-layout/xhr/overridemimetype-invalid-mime-type.htm.ini delete mode 100644 tests/wpt/meta/xhr/overridemimetype-edge-cases.window.js.ini delete mode 100644 tests/wpt/meta/xhr/overridemimetype-invalid-mime-type.htm.ini diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index 48c55d44717..e748d23d6b1 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -145,8 +145,6 @@ pub struct XMLHttpRequest { #[ignore_malloc_size_of = "Defined in hyper"] #[no_trace] override_mime_type: DomRefCell>, - #[no_trace] - override_charset: DomRefCell>, // Associated concepts #[ignore_malloc_size_of = "Defined in hyper"] @@ -201,7 +199,6 @@ impl XMLHttpRequest { response_json: Heap::default(), response_headers: DomRefCell::new(HeaderMap::new()), override_mime_type: DomRefCell::new(None), - override_charset: DomRefCell::new(None), request_method: DomRefCell::new(Method::GET), request_url: DomRefCell::new(None), @@ -892,31 +889,28 @@ impl XMLHttpRequestMethods for XMLHttpRequest { ByteString::new(v) } - // https://xhr.spec.whatwg.org/#the-overridemimetype()-method + /// fn OverrideMimeType(&self, mime: DOMString) -> ErrorResult { - // Step 1 + // 1. If this’s state is loading or done, then throw an "InvalidStateError" + // DOMException. match self.ready_state.get() { XMLHttpRequestState::Loading | XMLHttpRequestState::Done => { return Err(Error::InvalidState); }, _ => {}, } - // Step 2 - let override_mime = mime.parse::().map_err(|_| Error::Syntax)?; - // Step 3 - let mime_str = override_mime.as_ref(); - let mime_parts: Vec<&str> = mime_str.split(";").collect(); - let mime_no_params = if mime_parts.len() > 1 { - mime_parts[0].parse().unwrap() - } else { - override_mime.clone() + + // 2. Set this’s override MIME type to the result of parsing mime. + // 3. If this’s override MIME type is failure, then set this’s override MIME type + // to application/octet-stream. + let override_mime = match mime.parse::() { + Ok(mime) => mime, + Err(_) => "application/octet-stream" + .parse::() + .map_err(|_| Error::Syntax)?, }; - *self.override_mime_type.borrow_mut() = Some(mime_no_params); - // Step 4 - let value = override_mime.get_param(mime::CHARSET); - *self.override_charset.borrow_mut() = - value.and_then(|value| Encoding::for_label(value.as_ref().as_bytes())); + *self.override_mime_type.borrow_mut() = Some(override_mime); Ok(()) } @@ -1604,19 +1598,29 @@ impl XMLHttpRequest { Ok(()) } + /// fn final_charset(&self) -> Option<&'static Encoding> { - if self.override_charset.borrow().is_some() { - self.override_charset.borrow().clone() - } else { - match self.response_headers.borrow().typed_get::() { - Some(ct) => { - let mime: Mime = ct.into(); - let value = mime.get_param(mime::CHARSET); - value.and_then(|value| Encoding::for_label(value.as_ref().as_bytes())) - }, - None => None, - } - } + // 1. Let label be null. + // 2. Let responseMIME be the result of get a response MIME type for xhr. + // 3. If responseMIME’s parameters["charset"] exists, then set label to it. + let response_charset = self + .response_mime_type() + .and_then(|mime| mime.get_param(mime::CHARSET).map(|c| c.to_string())); + + // 4. If xhr’s override MIME type’s parameters["charset"] exists, then set label to it. + let override_charset = self + .override_mime_type + .borrow() + .as_ref() + .and_then(|mime| mime.get_param(mime::CHARSET).map(|c| c.to_string())); + + // 5. If label is null, then return null. + // 6. Let encoding be the result of getting an encoding from label. + // 7. If encoding is failure, then return null. + // 8. Return encoding. + override_charset + .or(response_charset) + .and_then(|charset| Encoding::for_label(&charset.as_bytes())) } /// diff --git a/tests/wpt/meta-legacy-layout/encoding/single-byte-decoder.window.js.ini b/tests/wpt/meta-legacy-layout/encoding/single-byte-decoder.window.js.ini index 93f558266e0..d71939b82b5 100644 --- a/tests/wpt/meta-legacy-layout/encoding/single-byte-decoder.window.js.ini +++ b/tests/wpt/meta-legacy-layout/encoding/single-byte-decoder.window.js.ini @@ -1,31 +1,4 @@ [single-byte-decoder.window.html?XMLHttpRequest] - [ISO-8859-2: iso_8859-2:1987 (XMLHttpRequest)] - expected: FAIL - - [ISO-8859-3: iso_8859-3:1988 (XMLHttpRequest)] - expected: FAIL - - [ISO-8859-4: iso_8859-4:1988 (XMLHttpRequest)] - expected: FAIL - - [ISO-8859-5: iso_8859-5:1988 (XMLHttpRequest)] - expected: FAIL - - [ISO-8859-6: iso_8859-6:1987 (XMLHttpRequest)] - expected: FAIL - - [ISO-8859-7: iso_8859-7:1987 (XMLHttpRequest)] - expected: FAIL - - [ISO-8859-8: iso_8859-8:1988 (XMLHttpRequest)] - expected: FAIL - - [windows-1252: iso_8859-1:1987 (XMLHttpRequest)] - expected: FAIL - - [windows-1254: iso_8859-9:1989 (XMLHttpRequest)] - expected: FAIL - [single-byte-decoder.window.html?TextDecoder] diff --git a/tests/wpt/meta-legacy-layout/xhr/overridemimetype-blob.html.ini b/tests/wpt/meta-legacy-layout/xhr/overridemimetype-blob.html.ini index 68effab01a4..87cc3e33c33 100644 --- a/tests/wpt/meta-legacy-layout/xhr/overridemimetype-blob.html.ini +++ b/tests/wpt/meta-legacy-layout/xhr/overridemimetype-blob.html.ini @@ -6,9 +6,6 @@ [Bogus MIME type should end up as application/octet-stream, 2] expected: FAIL - [1) MIME types need to be parsed and serialized: text/html;charset=gbk] - expected: FAIL - [2) MIME types need to be parsed and serialized: TEXT/HTML;CHARSET=GBK] expected: FAIL @@ -204,9 +201,6 @@ [39) MIME types need to be parsed and serialized: x/x;test] expected: FAIL - [16) MIME types need to be parsed and serialized: text/html;charset='gbk'] - expected: FAIL - [63) MIME types need to be parsed and serialized: ] expected: FAIL @@ -264,9 +258,6 @@ [26) MIME types need to be parsed and serialized: text/html;charset= ";charset=GBK] expected: FAIL - [17) MIME types need to be parsed and serialized: text/html;charset='gbk] - expected: FAIL - [25) MIME types need to be parsed and serialized: text/html;;;;charset=gbk] expected: FAIL @@ -339,9 +330,6 @@ [48) MIME types need to be parsed and serialized: \n\r\t x/x;x=x\n\r\t ] expected: FAIL - [31) MIME types need to be parsed and serialized: text/html;charset=" gbk"] - expected: FAIL - [49) MIME types need to be parsed and serialized: x/x;\n\r\t x=x\n\r\t ;x=y] expected: FAIL @@ -354,9 +342,6 @@ [12) MIME types need to be parsed and serialized: text/html;charset=\x0bgbk] expected: FAIL - [32) MIME types need to be parsed and serialized: text/html;charset="gbk "] - expected: FAIL - [53) MIME types need to be parsed and serialized: \x0cx/x] expected: FAIL @@ -366,12 +351,6 @@ [24) MIME types need to be parsed and serialized: text/html ; ; charset=gbk] expected: FAIL - [18) MIME types need to be parsed and serialized: text/html;charset=gbk'] - expected: FAIL - - [39) MIME types need to be parsed and serialized: text/html;0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789=x;charset=gbk] - expected: FAIL - [65) MIME types need to be parsed and serialized: ÿ/ÿ] expected: FAIL @@ -399,9 +378,6 @@ [41) MIME types need to be parsed and serialized: text/html;a\]=bar;b[=bar;c=bar] expected: FAIL - [42) MIME types need to be parsed and serialized: text/html;valid=";";foo=bar] - expected: FAIL - [43) MIME types need to be parsed and serialized: text/html;in\]valid=";asd=foo";foo=bar] expected: FAIL @@ -438,62 +414,5 @@ [54) MIME types need to be parsed and serialized: x/x;test=�;x=x] expected: FAIL - [55) MIME types need to be parsed and serialized: \x0bx/x] - expected: FAIL - - [56) MIME types need to be parsed and serialized: \x0cx/x] - expected: FAIL - - [57) MIME types need to be parsed and serialized: x/x\x0b] - expected: FAIL - - [58) MIME types need to be parsed and serialized: x/x\x0c] - expected: FAIL - - [59) MIME types need to be parsed and serialized: ] - expected: FAIL - - [60) MIME types need to be parsed and serialized: \t] - expected: FAIL - - [61) MIME types need to be parsed and serialized: /] - expected: FAIL - - [62) MIME types need to be parsed and serialized: bogus] - expected: FAIL - [63) MIME types need to be parsed and serialized: bogus/] expected: FAIL - - [64) MIME types need to be parsed and serialized: bogus/ ] - expected: FAIL - - [65) MIME types need to be parsed and serialized: bogus/bogus/;] - expected: FAIL - - [66) MIME types need to be parsed and serialized: ] - expected: FAIL - - [67) MIME types need to be parsed and serialized: (/)] - expected: FAIL - - [68) MIME types need to be parsed and serialized: ÿ/ÿ] - expected: FAIL - - [69) MIME types need to be parsed and serialized: text/html(;doesnot=matter] - expected: FAIL - - [70) MIME types need to be parsed and serialized: {/}] - expected: FAIL - - [71) MIME types need to be parsed and serialized: Ā/Ā] - expected: FAIL - - [72) MIME types need to be parsed and serialized: text /html] - expected: FAIL - - [73) MIME types need to be parsed and serialized: text/ html] - expected: FAIL - - [74) MIME types need to be parsed and serialized: "text/html"] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/xhr/overridemimetype-edge-cases.window.js.ini b/tests/wpt/meta-legacy-layout/xhr/overridemimetype-edge-cases.window.js.ini index a99bbb61fd9..e1b384326c7 100644 --- a/tests/wpt/meta-legacy-layout/xhr/overridemimetype-edge-cases.window.js.ini +++ b/tests/wpt/meta-legacy-layout/xhr/overridemimetype-edge-cases.window.js.ini @@ -1,7 +1,3 @@ [overridemimetype-edge-cases.window.html] [overrideMimeType() state needs to be reset across requests] expected: FAIL - - [Charset can be overridden by overrideMimeType() with a bogus charset] - expected: FAIL - diff --git a/tests/wpt/meta-legacy-layout/xhr/overridemimetype-invalid-mime-type.htm.ini b/tests/wpt/meta-legacy-layout/xhr/overridemimetype-invalid-mime-type.htm.ini deleted file mode 100644 index d8e806a7520..00000000000 --- a/tests/wpt/meta-legacy-layout/xhr/overridemimetype-invalid-mime-type.htm.ini +++ /dev/null @@ -1,11 +0,0 @@ -[overridemimetype-invalid-mime-type.htm] - type: testharness - [Bogus MIME type does not override encoding] - expected: FAIL - - [Bogus MIME type does not override encoding, 2] - expected: FAIL - - [Bogus MIME type does override MIME type] - expected: FAIL - diff --git a/tests/wpt/meta/encoding/single-byte-decoder.window.js.ini b/tests/wpt/meta/encoding/single-byte-decoder.window.js.ini index 93f558266e0..d71939b82b5 100644 --- a/tests/wpt/meta/encoding/single-byte-decoder.window.js.ini +++ b/tests/wpt/meta/encoding/single-byte-decoder.window.js.ini @@ -1,31 +1,4 @@ [single-byte-decoder.window.html?XMLHttpRequest] - [ISO-8859-2: iso_8859-2:1987 (XMLHttpRequest)] - expected: FAIL - - [ISO-8859-3: iso_8859-3:1988 (XMLHttpRequest)] - expected: FAIL - - [ISO-8859-4: iso_8859-4:1988 (XMLHttpRequest)] - expected: FAIL - - [ISO-8859-5: iso_8859-5:1988 (XMLHttpRequest)] - expected: FAIL - - [ISO-8859-6: iso_8859-6:1987 (XMLHttpRequest)] - expected: FAIL - - [ISO-8859-7: iso_8859-7:1987 (XMLHttpRequest)] - expected: FAIL - - [ISO-8859-8: iso_8859-8:1988 (XMLHttpRequest)] - expected: FAIL - - [windows-1252: iso_8859-1:1987 (XMLHttpRequest)] - expected: FAIL - - [windows-1254: iso_8859-9:1989 (XMLHttpRequest)] - expected: FAIL - [single-byte-decoder.window.html?TextDecoder] diff --git a/tests/wpt/meta/xhr/overridemimetype-blob.html.ini b/tests/wpt/meta/xhr/overridemimetype-blob.html.ini index b3868f239e7..3424d718dbb 100644 --- a/tests/wpt/meta/xhr/overridemimetype-blob.html.ini +++ b/tests/wpt/meta/xhr/overridemimetype-blob.html.ini @@ -1,7 +1,4 @@ [overridemimetype-blob.html] - [1) MIME types need to be parsed and serialized: text/html;charset=gbk] - expected: FAIL - [2) MIME types need to be parsed and serialized: TEXT/HTML;CHARSET=GBK] expected: FAIL @@ -44,15 +41,6 @@ [15) MIME types need to be parsed and serialized: text/html;\x0ccharset=gbk] expected: FAIL - [16) MIME types need to be parsed and serialized: text/html;charset='gbk'] - expected: FAIL - - [17) MIME types need to be parsed and serialized: text/html;charset='gbk] - expected: FAIL - - [18) MIME types need to be parsed and serialized: text/html;charset=gbk'] - expected: FAIL - [19) MIME types need to be parsed and serialized: text/html;charset=';charset=GBK] expected: FAIL @@ -89,12 +77,6 @@ [30) MIME types need to be parsed and serialized: text/html;charset=gbk"] expected: FAIL - [31) MIME types need to be parsed and serialized: text/html;charset=" gbk"] - expected: FAIL - - [32) MIME types need to be parsed and serialized: text/html;charset="gbk "] - expected: FAIL - [33) MIME types need to be parsed and serialized: text/html;charset="\\ gbk"] expected: FAIL @@ -113,15 +95,9 @@ [38) MIME types need to be parsed and serialized: text/html;charset={gbk}] expected: FAIL - [39) MIME types need to be parsed and serialized: text/html;0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789=x;charset=gbk] - expected: FAIL - [41) MIME types need to be parsed and serialized: text/html;a\]=bar;b[=bar;c=bar] expected: FAIL - [42) MIME types need to be parsed and serialized: text/html;valid=";";foo=bar] - expected: FAIL - [43) MIME types need to be parsed and serialized: text/html;in\]valid=";asd=foo";foo=bar] expected: FAIL @@ -158,62 +134,5 @@ [54) MIME types need to be parsed and serialized: x/x;test=�;x=x] expected: FAIL - [55) MIME types need to be parsed and serialized: \x0bx/x] - expected: FAIL - - [56) MIME types need to be parsed and serialized: \x0cx/x] - expected: FAIL - - [57) MIME types need to be parsed and serialized: x/x\x0b] - expected: FAIL - - [58) MIME types need to be parsed and serialized: x/x\x0c] - expected: FAIL - - [59) MIME types need to be parsed and serialized: ] - expected: FAIL - - [60) MIME types need to be parsed and serialized: \t] - expected: FAIL - - [61) MIME types need to be parsed and serialized: /] - expected: FAIL - - [62) MIME types need to be parsed and serialized: bogus] - expected: FAIL - [63) MIME types need to be parsed and serialized: bogus/] expected: FAIL - - [64) MIME types need to be parsed and serialized: bogus/ ] - expected: FAIL - - [65) MIME types need to be parsed and serialized: bogus/bogus/;] - expected: FAIL - - [66) MIME types need to be parsed and serialized: ] - expected: FAIL - - [67) MIME types need to be parsed and serialized: (/)] - expected: FAIL - - [68) MIME types need to be parsed and serialized: ÿ/ÿ] - expected: FAIL - - [69) MIME types need to be parsed and serialized: text/html(;doesnot=matter] - expected: FAIL - - [70) MIME types need to be parsed and serialized: {/}] - expected: FAIL - - [71) MIME types need to be parsed and serialized: Ā/Ā] - expected: FAIL - - [72) MIME types need to be parsed and serialized: text /html] - expected: FAIL - - [73) MIME types need to be parsed and serialized: text/ html] - expected: FAIL - - [74) MIME types need to be parsed and serialized: "text/html"] - expected: FAIL diff --git a/tests/wpt/meta/xhr/overridemimetype-edge-cases.window.js.ini b/tests/wpt/meta/xhr/overridemimetype-edge-cases.window.js.ini deleted file mode 100644 index ce27ecb9738..00000000000 --- a/tests/wpt/meta/xhr/overridemimetype-edge-cases.window.js.ini +++ /dev/null @@ -1,3 +0,0 @@ -[overridemimetype-edge-cases.window.html] - [Charset can be overridden by overrideMimeType() with a bogus charset] - expected: FAIL diff --git a/tests/wpt/meta/xhr/overridemimetype-invalid-mime-type.htm.ini b/tests/wpt/meta/xhr/overridemimetype-invalid-mime-type.htm.ini deleted file mode 100644 index 34e8613d3cf..00000000000 --- a/tests/wpt/meta/xhr/overridemimetype-invalid-mime-type.htm.ini +++ /dev/null @@ -1,9 +0,0 @@ -[overridemimetype-invalid-mime-type.htm] - [Bogus MIME type does not override encoding] - expected: FAIL - - [Bogus MIME type does not override encoding, 2] - expected: FAIL - - [Bogus MIME type does override MIME type] - expected: FAIL