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 <mrobinson@igalia.com>
This commit is contained in:
cybai (Haku) 2024-02-29 05:26:43 +09:00 committed by GitHub
parent 5ba29c20ac
commit a89bacb7c5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 35 additions and 274 deletions

View file

@ -145,8 +145,6 @@ pub struct XMLHttpRequest {
#[ignore_malloc_size_of = "Defined in hyper"] #[ignore_malloc_size_of = "Defined in hyper"]
#[no_trace] #[no_trace]
override_mime_type: DomRefCell<Option<Mime>>, override_mime_type: DomRefCell<Option<Mime>>,
#[no_trace]
override_charset: DomRefCell<Option<&'static Encoding>>,
// Associated concepts // Associated concepts
#[ignore_malloc_size_of = "Defined in hyper"] #[ignore_malloc_size_of = "Defined in hyper"]
@ -201,7 +199,6 @@ impl XMLHttpRequest {
response_json: Heap::default(), response_json: Heap::default(),
response_headers: DomRefCell::new(HeaderMap::new()), response_headers: DomRefCell::new(HeaderMap::new()),
override_mime_type: DomRefCell::new(None), override_mime_type: DomRefCell::new(None),
override_charset: DomRefCell::new(None),
request_method: DomRefCell::new(Method::GET), request_method: DomRefCell::new(Method::GET),
request_url: DomRefCell::new(None), request_url: DomRefCell::new(None),
@ -892,31 +889,28 @@ impl XMLHttpRequestMethods for XMLHttpRequest {
ByteString::new(v) ByteString::new(v)
} }
// https://xhr.spec.whatwg.org/#the-overridemimetype()-method /// <https://xhr.spec.whatwg.org/#the-overridemimetype()-method>
fn OverrideMimeType(&self, mime: DOMString) -> ErrorResult { fn OverrideMimeType(&self, mime: DOMString) -> ErrorResult {
// Step 1 // 1. If thiss state is loading or done, then throw an "InvalidStateError"
// DOMException.
match self.ready_state.get() { match self.ready_state.get() {
XMLHttpRequestState::Loading | XMLHttpRequestState::Done => { XMLHttpRequestState::Loading | XMLHttpRequestState::Done => {
return Err(Error::InvalidState); return Err(Error::InvalidState);
}, },
_ => {}, _ => {},
} }
// Step 2
let override_mime = mime.parse::<Mime>().map_err(|_| Error::Syntax)?; // 2. Set thiss override MIME type to the result of parsing mime.
// Step 3 // 3. If thiss override MIME type is failure, then set thiss override MIME type
let mime_str = override_mime.as_ref(); // to application/octet-stream.
let mime_parts: Vec<&str> = mime_str.split(";").collect(); let override_mime = match mime.parse::<Mime>() {
let mime_no_params = if mime_parts.len() > 1 { Ok(mime) => mime,
mime_parts[0].parse().unwrap() Err(_) => "application/octet-stream"
} else { .parse::<Mime>()
override_mime.clone() .map_err(|_| Error::Syntax)?,
}; };
*self.override_mime_type.borrow_mut() = Some(mime_no_params); *self.override_mime_type.borrow_mut() = Some(override_mime);
// 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()));
Ok(()) Ok(())
} }
@ -1604,19 +1598,29 @@ impl XMLHttpRequest {
Ok(()) Ok(())
} }
/// <https://xhr.spec.whatwg.org/#final-charset>
fn final_charset(&self) -> Option<&'static Encoding> { fn final_charset(&self) -> Option<&'static Encoding> {
if self.override_charset.borrow().is_some() { // 1. Let label be null.
self.override_charset.borrow().clone() // 2. Let responseMIME be the result of get a response MIME type for xhr.
} else { // 3. If responseMIMEs parameters["charset"] exists, then set label to it.
match self.response_headers.borrow().typed_get::<ContentType>() { let response_charset = self
Some(ct) => { .response_mime_type()
let mime: Mime = ct.into(); .and_then(|mime| mime.get_param(mime::CHARSET).map(|c| c.to_string()));
let value = mime.get_param(mime::CHARSET);
value.and_then(|value| Encoding::for_label(value.as_ref().as_bytes())) // 4. If xhrs override MIME types parameters["charset"] exists, then set label to it.
}, let override_charset = self
None => None, .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()))
} }
/// <https://xhr.spec.whatwg.org/#response-mime-type> /// <https://xhr.spec.whatwg.org/#response-mime-type>

View file

@ -1,31 +1,4 @@
[single-byte-decoder.window.html?XMLHttpRequest] [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] [single-byte-decoder.window.html?TextDecoder]

View file

@ -6,9 +6,6 @@
[Bogus MIME type should end up as application/octet-stream, 2] [Bogus MIME type should end up as application/octet-stream, 2]
expected: FAIL 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] [2) MIME types need to be parsed and serialized: TEXT/HTML;CHARSET=GBK]
expected: FAIL expected: FAIL
@ -204,9 +201,6 @@
[39) MIME types need to be parsed and serialized: x/x;test] [39) MIME types need to be parsed and serialized: x/x;test]
expected: FAIL 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: </>] [63) MIME types need to be parsed and serialized: </>]
expected: FAIL expected: FAIL
@ -264,9 +258,6 @@
[26) MIME types need to be parsed and serialized: text/html;charset= ";charset=GBK] [26) MIME types need to be parsed and serialized: text/html;charset= ";charset=GBK]
expected: FAIL 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] [25) MIME types need to be parsed and serialized: text/html;;;;charset=gbk]
expected: FAIL 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 ] [48) MIME types need to be parsed and serialized: \n\r\t x/x;x=x\n\r\t ]
expected: FAIL 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] [49) MIME types need to be parsed and serialized: x/x;\n\r\t x=x\n\r\t ;x=y]
expected: FAIL expected: FAIL
@ -354,9 +342,6 @@
[12) MIME types need to be parsed and serialized: text/html;charset=\x0bgbk] [12) MIME types need to be parsed and serialized: text/html;charset=\x0bgbk]
expected: FAIL 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] [53) MIME types need to be parsed and serialized: \x0cx/x]
expected: FAIL expected: FAIL
@ -366,12 +351,6 @@
[24) MIME types need to be parsed and serialized: text/html ; ; charset=gbk] [24) MIME types need to be parsed and serialized: text/html ; ; charset=gbk]
expected: FAIL 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: ÿ/ÿ] [65) MIME types need to be parsed and serialized: ÿ/ÿ]
expected: FAIL expected: FAIL
@ -399,9 +378,6 @@
[41) MIME types need to be parsed and serialized: text/html;a\]=bar;b[=bar;c=bar] [41) MIME types need to be parsed and serialized: text/html;a\]=bar;b[=bar;c=bar]
expected: FAIL 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] [43) MIME types need to be parsed and serialized: text/html;in\]valid=";asd=foo";foo=bar]
expected: FAIL expected: FAIL
@ -438,62 +414,5 @@
[54) MIME types need to be parsed and serialized: x/x;test=<3D>;x=x] [54) MIME types need to be parsed and serialized: x/x;test=<3D>;x=x]
expected: FAIL 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/] [63) MIME types need to be parsed and serialized: bogus/]
expected: FAIL 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

View file

@ -1,7 +1,3 @@
[overridemimetype-edge-cases.window.html] [overridemimetype-edge-cases.window.html]
[overrideMimeType() state needs to be reset across requests] [overrideMimeType() state needs to be reset across requests]
expected: FAIL expected: FAIL
[Charset can be overridden by overrideMimeType() with a bogus charset]
expected: FAIL

View file

@ -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

View file

@ -1,31 +1,4 @@
[single-byte-decoder.window.html?XMLHttpRequest] [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] [single-byte-decoder.window.html?TextDecoder]

View file

@ -1,7 +1,4 @@
[overridemimetype-blob.html] [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] [2) MIME types need to be parsed and serialized: TEXT/HTML;CHARSET=GBK]
expected: FAIL expected: FAIL
@ -44,15 +41,6 @@
[15) MIME types need to be parsed and serialized: text/html;\x0ccharset=gbk] [15) MIME types need to be parsed and serialized: text/html;\x0ccharset=gbk]
expected: FAIL 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] [19) MIME types need to be parsed and serialized: text/html;charset=';charset=GBK]
expected: FAIL expected: FAIL
@ -89,12 +77,6 @@
[30) MIME types need to be parsed and serialized: text/html;charset=gbk"] [30) MIME types need to be parsed and serialized: text/html;charset=gbk"]
expected: FAIL 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"] [33) MIME types need to be parsed and serialized: text/html;charset="\\ gbk"]
expected: FAIL expected: FAIL
@ -113,15 +95,9 @@
[38) MIME types need to be parsed and serialized: text/html;charset={gbk}] [38) MIME types need to be parsed and serialized: text/html;charset={gbk}]
expected: FAIL 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] [41) MIME types need to be parsed and serialized: text/html;a\]=bar;b[=bar;c=bar]
expected: FAIL 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] [43) MIME types need to be parsed and serialized: text/html;in\]valid=";asd=foo";foo=bar]
expected: FAIL expected: FAIL
@ -158,62 +134,5 @@
[54) MIME types need to be parsed and serialized: x/x;test=<3D>;x=x] [54) MIME types need to be parsed and serialized: x/x;test=<3D>;x=x]
expected: FAIL 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/] [63) MIME types need to be parsed and serialized: bogus/]
expected: FAIL 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

View file

@ -1,3 +0,0 @@
[overridemimetype-edge-cases.window.html]
[Charset can be overridden by overrideMimeType() with a bogus charset]
expected: FAIL

View file

@ -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