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"]
#[no_trace]
override_mime_type: DomRefCell<Option<Mime>>,
#[no_trace]
override_charset: DomRefCell<Option<&'static Encoding>>,
// 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
/// <https://xhr.spec.whatwg.org/#the-overridemimetype()-method>
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() {
XMLHttpRequestState::Loading | XMLHttpRequestState::Done => {
return Err(Error::InvalidState);
},
_ => {},
}
// Step 2
let override_mime = mime.parse::<Mime>().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 thiss override MIME type to the result of parsing mime.
// 3. If thiss override MIME type is failure, then set thiss override MIME type
// to application/octet-stream.
let override_mime = match mime.parse::<Mime>() {
Ok(mime) => mime,
Err(_) => "application/octet-stream"
.parse::<Mime>()
.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(())
}
/// <https://xhr.spec.whatwg.org/#final-charset>
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::<ContentType>() {
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 responseMIMEs 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 xhrs override MIME types 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()))
}
/// <https://xhr.spec.whatwg.org/#response-mime-type>

View file

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

View file

@ -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=<3D>;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

View file

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

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]
[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]

View file

@ -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=<3D>;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

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