diff options
11 files changed, 32 insertions, 26 deletions
diff --git a/components/script/dom/bindings/trace.rs b/components/script/dom/bindings/trace.rs index 6c2f9367350..df5c84d3778 100644 --- a/components/script/dom/bindings/trace.rs +++ b/components/script/dom/bindings/trace.rs @@ -45,6 +45,7 @@ use euclid::size::Size2D; use html5ever::tree_builder::QuirksMode; use hyper::header::Headers; use hyper::method::Method; +use hyper::mime::Mime; use ipc_channel::ipc::{IpcReceiver, IpcSender}; use js::jsapi::JS_CallUnbarrieredObjectTracer; use js::jsapi::{GCTraceKindToAscii, Heap, JSGCTraceKind, JSObject, JSTracer, JS_CallObjectTracer, JS_CallValueTracer}; @@ -286,6 +287,7 @@ no_jsmanaged_fields!(PseudoElement); no_jsmanaged_fields!(Length); no_jsmanaged_fields!(ElementState); no_jsmanaged_fields!(DOMString); +no_jsmanaged_fields!(Mime); impl JSTraceable for Box<ScriptChan + Send> { #[inline] diff --git a/components/script/dom/webidls/XMLHttpRequest.webidl b/components/script/dom/webidls/XMLHttpRequest.webidl index 3285e859691..aba1569957b 100644 --- a/components/script/dom/webidls/XMLHttpRequest.webidl +++ b/components/script/dom/webidls/XMLHttpRequest.webidl @@ -65,7 +65,8 @@ interface XMLHttpRequest : XMLHttpRequestEventTarget { readonly attribute ByteString statusText; ByteString? getResponseHeader(ByteString name); ByteString getAllResponseHeaders(); - // void overrideMimeType(DOMString mime); + [Throws] + void overrideMimeType(DOMString mime); [SetterThrows] attribute XMLHttpRequestResponseType responseType; readonly attribute any response; diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index 10bc4cd8d57..e8025880f2e 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -121,6 +121,9 @@ pub struct XMLHttpRequest { response_xml: MutNullableHeap<JS<Document>>, #[ignore_heap_size_of = "Defined in hyper"] response_headers: DOMRefCell<Headers>, + override_mime_type: DOMRefCell<Option<Mime>>, + #[ignore_heap_size_of = "Defined in rust-encoding"] + override_charset: DOMRefCell<Option<EncodingRef>>, // Associated concepts request_method: DOMRefCell<Method>, @@ -158,6 +161,8 @@ impl XMLHttpRequest { response_type: Cell::new(_empty), response_xml: Default::default(), response_headers: DOMRefCell::new(Headers::new()), + override_mime_type: DOMRefCell::new(None), + override_charset: DOMRefCell::new(None), request_method: DOMRefCell::new(Method::Get), request_url: DOMRefCell::new(None), @@ -644,6 +649,21 @@ impl XMLHttpRequestMethods for XMLHttpRequest { ByteString::new(self.filter_response_headers().to_string().into_bytes()) } + // https://xhr.spec.whatwg.org/#the-overridemimetype()-method + fn OverrideMimeType(&self, mime: DOMString) -> ErrorResult { + match self.ready_state.get() { + XMLHttpRequestState::Loading | XMLHttpRequestState::Done => return Err(Error::InvalidState), + _ => {}, + } + let override_mime = try!(mime.parse::<Mime>().map_err(|_| Error::Syntax)); + *self.override_mime_type.borrow_mut() = Some(override_mime.clone()); + let value = override_mime.get_param(mime::Attr::Charset); + *self.override_charset.borrow_mut() = value.and_then(|value| { + encoding_from_whatwg_label(value) + }); + Ok(()) + } + // https://xhr.spec.whatwg.org/#the-responsetype-attribute fn ResponseType(&self) -> XMLHttpRequestResponseType { self.response_type.get() @@ -987,6 +1007,7 @@ impl XMLHttpRequest { } } + //FIXME: add support for override_mime_type and override_charset fn text_response(&self) -> String { let mut encoding = UTF_8 as EncodingRef; match self.response_headers.borrow().get() { diff --git a/tests/wpt/metadata/XMLHttpRequest/interfaces.html.ini b/tests/wpt/metadata/XMLHttpRequest/interfaces.html.ini index af28495ed67..fcfceffb01d 100644 --- a/tests/wpt/metadata/XMLHttpRequest/interfaces.html.ini +++ b/tests/wpt/metadata/XMLHttpRequest/interfaces.html.ini @@ -1,20 +1,11 @@ [interfaces.html] type: testharness - [XMLHttpRequest interface: operation overrideMimeType(DOMString)] - expected: FAIL - - [XMLHttpRequest interface: calling overrideMimeType(DOMString) on new XMLHttpRequest() with too few arguments must throw TypeError] - expected: FAIL - [FormData interface: new FormData() must inherit property "getAll" with the proper type (4)] expected: FAIL [FormData interface: new FormData(form) must inherit property "getAll" with the proper type (4)] expected: FAIL - [XMLHttpRequest interface: new XMLHttpRequest() must inherit property "overrideMimeType" with the proper type (20)] - expected: FAIL - [FormData interface: operation getAll(USVString)] expected: FAIL diff --git a/tests/wpt/metadata/XMLHttpRequest/overridemimetype-done-state.htm.ini b/tests/wpt/metadata/XMLHttpRequest/overridemimetype-done-state.htm.ini deleted file mode 100644 index 30899db29ab..00000000000 --- a/tests/wpt/metadata/XMLHttpRequest/overridemimetype-done-state.htm.ini +++ /dev/null @@ -1,5 +0,0 @@ -[overridemimetype-done-state.htm] - type: testharness - [XMLHttpRequest: overrideMimeType() in DONE state] - expected: FAIL - diff --git a/tests/wpt/metadata/XMLHttpRequest/overridemimetype-invalid-mime-type.htm.ini b/tests/wpt/metadata/XMLHttpRequest/overridemimetype-invalid-mime-type.htm.ini deleted file mode 100644 index 8dc44ad2646..00000000000 --- a/tests/wpt/metadata/XMLHttpRequest/overridemimetype-invalid-mime-type.htm.ini +++ /dev/null @@ -1,5 +0,0 @@ -[overridemimetype-invalid-mime-type.htm] - type: testharness - [XMLHttpRequest: overrideMimeType() in unsent state, invalid MIME types] - expected: FAIL - diff --git a/tests/wpt/metadata/XMLHttpRequest/overridemimetype-loading-state.htm.ini b/tests/wpt/metadata/XMLHttpRequest/overridemimetype-loading-state.htm.ini deleted file mode 100644 index 393a4127f9d..00000000000 --- a/tests/wpt/metadata/XMLHttpRequest/overridemimetype-loading-state.htm.ini +++ /dev/null @@ -1,5 +0,0 @@ -[overridemimetype-loading-state.htm] - type: testharness - [XMLHttpRequest: overrideMimeType() in LOADING state] - expected: FAIL - diff --git a/tests/wpt/metadata/XMLHttpRequest/overridemimetype-open-state-force-utf-8.htm.ini b/tests/wpt/metadata/XMLHttpRequest/overridemimetype-open-state-force-utf-8.htm.ini index 3a367188e48..68d82dd90ec 100644 --- a/tests/wpt/metadata/XMLHttpRequest/overridemimetype-open-state-force-utf-8.htm.ini +++ b/tests/wpt/metadata/XMLHttpRequest/overridemimetype-open-state-force-utf-8.htm.ini @@ -1,5 +1,6 @@ [overridemimetype-open-state-force-utf-8.htm] type: testharness + expected: CRASH [XMLHttpRequest: overrideMimeType() in open state, enforcing UTF-8 encoding] expected: FAIL diff --git a/tests/wpt/metadata/XMLHttpRequest/overridemimetype-open-state-force-xml.htm.ini b/tests/wpt/metadata/XMLHttpRequest/overridemimetype-open-state-force-xml.htm.ini index ac428599347..adbc58f3fd3 100644 --- a/tests/wpt/metadata/XMLHttpRequest/overridemimetype-open-state-force-xml.htm.ini +++ b/tests/wpt/metadata/XMLHttpRequest/overridemimetype-open-state-force-xml.htm.ini @@ -1,5 +1,6 @@ [overridemimetype-open-state-force-xml.htm] type: testharness + expected: TIMEOUT [XMLHttpRequest: overrideMimeType() in open state, XML MIME type with UTF-8 charset] - expected: FAIL + expected: TIMEOUT diff --git a/tests/wpt/metadata/XMLHttpRequest/overridemimetype-unsent-state-force-shiftjis.htm.ini b/tests/wpt/metadata/XMLHttpRequest/overridemimetype-unsent-state-force-shiftjis.htm.ini index c2b822106e0..be43cd7a16e 100644 --- a/tests/wpt/metadata/XMLHttpRequest/overridemimetype-unsent-state-force-shiftjis.htm.ini +++ b/tests/wpt/metadata/XMLHttpRequest/overridemimetype-unsent-state-force-shiftjis.htm.ini @@ -1,5 +1,6 @@ [overridemimetype-unsent-state-force-shiftjis.htm] type: testharness + expected: CRASH [XMLHttpRequest: overrideMimeType() in unsent state, enforcing Shift-JIS encoding] expected: FAIL diff --git a/tests/wpt/metadata/XMLHttpRequest/send-entity-body-document.htm.ini b/tests/wpt/metadata/XMLHttpRequest/send-entity-body-document.htm.ini index 3d2bb0da7ba..3922bf69def 100644 --- a/tests/wpt/metadata/XMLHttpRequest/send-entity-body-document.htm.ini +++ b/tests/wpt/metadata/XMLHttpRequest/send-entity-body-document.htm.ini @@ -8,3 +8,6 @@ [XML document, windows-1252] expected: FAIL + [HTML document, invalid UTF-8] + expected: FAIL + |