diff options
author | Keith Yeung <kungfukeith11@gmail.com> | 2016-02-12 15:28:11 -0500 |
---|---|---|
committer | Keith Yeung <kungfukeith11@gmail.com> | 2016-02-14 23:55:43 -0500 |
commit | 6be5218d3c49d146108665276296647dd84a1709 (patch) | |
tree | 99305192a4e0e4ae2d2bac83a9e6fa4fbdda05d3 /components/script/dom/xmlhttprequest.rs | |
parent | e8ae7e47731eb20ea36dbc55deda84b664c3aab4 (diff) | |
download | servo-6be5218d3c49d146108665276296647dd84a1709.tar.gz servo-6be5218d3c49d146108665276296647dd84a1709.zip |
Cache XHR JSON responses
Diffstat (limited to 'components/script/dom/xmlhttprequest.rs')
-rw-r--r-- | components/script/dom/xmlhttprequest.rs | 48 |
1 files changed, 38 insertions, 10 deletions
diff --git a/components/script/dom/xmlhttprequest.rs b/components/script/dom/xmlhttprequest.rs index 130cec9ecf1..42d1dc18ef1 100644 --- a/components/script/dom/xmlhttprequest.rs +++ b/components/script/dom/xmlhttprequest.rs @@ -17,7 +17,7 @@ use dom::bindings::conversions::{ToJSValConvertible}; use dom::bindings::error::{Error, ErrorResult, Fallible}; use dom::bindings::global::{GlobalRef, GlobalRoot}; use dom::bindings::inheritance::Castable; -use dom::bindings::js::{JS, MutNullableHeap}; +use dom::bindings::js::{JS, MutHeapJSVal, MutNullableHeap}; use dom::bindings::js::{Root, RootedReference}; use dom::bindings::refcounted::Trusted; use dom::bindings::reflector::{Reflectable, reflect_dom_object}; @@ -125,6 +125,8 @@ pub struct XMLHttpRequest { response_type: Cell<XMLHttpRequestResponseType>, response_xml: MutNullableHeap<JS<Document>>, response_blob: MutNullableHeap<JS<Blob>>, + #[ignore_heap_size_of = "Defined in rust-mozjs"] + response_json: MutHeapJSVal, #[ignore_heap_size_of = "Defined in hyper"] response_headers: DOMRefCell<Headers>, #[ignore_heap_size_of = "Defined in hyper"] @@ -165,6 +167,7 @@ impl XMLHttpRequest { response_type: Cell::new(XMLHttpRequestResponseType::_empty), response_xml: Default::default(), response_blob: Default::default(), + response_json: MutHeapJSVal::new(), response_headers: DOMRefCell::new(Headers::new()), override_mime_type: DOMRefCell::new(None), override_charset: DOMRefCell::new(None), @@ -720,15 +723,7 @@ impl XMLHttpRequestMethods for XMLHttpRequest { } }, XMLHttpRequestResponseType::Json => { - let decoded = UTF_8.decode(&self.response.borrow(), DecoderTrap::Replace).unwrap().to_owned(); - let decoded: Vec<u16> = decoded.utf16_units().collect(); - if !JS_ParseJSON(cx, - decoded.as_ptr(), - decoded.len() as u32, - rval.handle_mut()) { - JS_ClearPendingException(cx); - return NullValue(); - } + self.json_response(cx).to_jsval(cx, rval.handle_mut()); }, XMLHttpRequestResponseType::Blob => { self.blob_response().to_jsval(cx, rval.handle_mut()); @@ -1093,6 +1088,39 @@ impl XMLHttpRequest { Some(temp_doc) } + #[allow(unsafe_code)] + // https://xhr.spec.whatwg.org/#json-response + fn json_response(&self, cx: *mut JSContext) -> JSVal { + // Step 1 + let response_json = self.response_json.get(); + if !response_json.is_null_or_undefined() { + return response_json; + } + // Step 2 + let bytes = self.response.borrow(); + // Step 3 + if bytes.len() == 0 { + return NullValue(); + } + // Step 4 + let json_text = UTF_8.decode(&bytes, DecoderTrap::Replace).unwrap().to_owned(); + let json_text: Vec<u16> = json_text.utf16_units().collect(); + // Step 5 + let mut rval = RootedValue::new(cx, UndefinedValue()); + unsafe { + if !JS_ParseJSON(cx, + json_text.as_ptr(), + json_text.len() as u32, + rval.handle_mut()) { + JS_ClearPendingException(cx); + return NullValue(); + } + } + // Step 6 + self.response_json.set(rval.ptr); + self.response_json.get() + } + fn document_text_html(&self) -> Root<Document>{ let charset = self.final_charset().unwrap_or(UTF_8); let wr = self.global(); |