Implement the overrideMimeType method for XMLHttpRequest

This commit is contained in:
Jitendra Jain 2015-10-17 22:25:32 -04:00
parent 4067960ba5
commit ed809a60bf
11 changed files with 32 additions and 26 deletions

View file

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

View file

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

View file

@ -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() {