diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index d81bfe4ab7c4..130cec9ecf17 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -22,6 +22,7 @@ use dom::bindings::js::{Root, RootedReference}; use dom::bindings::refcounted::Trusted; use dom::bindings::reflector::{Reflectable, reflect_dom_object}; use dom::bindings::str::{ByteString, USVString}; +use dom::blob::Blob; use dom::document::DocumentSource; use dom::document::{Document, IsHTMLDocument}; use dom::event::{Event, EventBubbles, EventCancelable}; @@ -54,6 +55,7 @@ use std::ascii::AsciiExt; use std::borrow::ToOwned; use std::cell::{Cell, RefCell}; use std::default::Default; +use std::string::ToString; use std::sync::mpsc::channel; use std::sync::{Arc, Mutex}; use string_cache::Atom; @@ -122,6 +124,7 @@ pub struct XMLHttpRequest { response: DOMRefCell, response_type: Cell, response_xml: MutNullableHeap>, + response_blob: MutNullableHeap>, #[ignore_heap_size_of = "Defined in hyper"] response_headers: DOMRefCell, #[ignore_heap_size_of = "Defined in hyper"] @@ -161,6 +164,7 @@ impl XMLHttpRequest { response: DOMRefCell::new(ByteString::new(vec!())), response_type: Cell::new(XMLHttpRequestResponseType::_empty), response_xml: Default::default(), + response_blob: Default::default(), response_headers: DOMRefCell::new(Headers::new()), override_mime_type: DOMRefCell::new(None), override_charset: DOMRefCell::new(None), @@ -725,7 +729,10 @@ impl XMLHttpRequestMethods for XMLHttpRequest { JS_ClearPendingException(cx); return NullValue(); } - } + }, + XMLHttpRequestResponseType::Blob => { + self.blob_response().to_jsval(cx, rval.handle_mut()); + }, _ => { // XXXManishearth handle other response types self.response.borrow().to_jsval(cx, rval.handle_mut()); @@ -1038,6 +1045,21 @@ impl XMLHttpRequest { encoding.decode(&self.response.borrow(), DecoderTrap::Replace).unwrap().to_owned() } + // https://xhr.spec.whatwg.org/#blob-response + fn blob_response(&self) -> Root { + // Step 1 + if let Some(response) = self.response_blob.get() { + return response; + } + // Step 2 + let mime = self.final_mime_type().as_ref().map(ToString::to_string).unwrap_or("".to_owned()); + + // Steps 3 && 4 + let blob = Blob::new(self.global().r(), self.response.borrow().to_vec(), &mime); + self.response_blob.set(Some(blob.r())); + blob + } + fn document_response(&self) -> Option> { let mime_type = self.final_mime_type(); //TODO: prescan the response to determine encoding if final charset is null diff --git a/tests/wpt/metadata/XMLHttpRequest/response-data-blob.htm.ini b/tests/wpt/metadata/XMLHttpRequest/response-data-blob.htm.ini deleted file mode 100644 index 5220ff2e3ada..000000000000 --- a/tests/wpt/metadata/XMLHttpRequest/response-data-blob.htm.ini +++ /dev/null @@ -1,5 +0,0 @@ -[response-data-blob.htm] - type: testharness - [XMLHttpRequest: The response attribute: Blob data] - expected: FAIL - diff --git a/tests/wpt/metadata/XMLHttpRequest/send-data-blob.htm.ini b/tests/wpt/metadata/XMLHttpRequest/send-data-blob.htm.ini deleted file mode 100644 index d09722d5fe14..000000000000 --- a/tests/wpt/metadata/XMLHttpRequest/send-data-blob.htm.ini +++ /dev/null @@ -1,5 +0,0 @@ -[send-data-blob.htm] - type: testharness - [XMLHttpRequest: The send() method: Blob data] - expected: FAIL -