Add caching to document_response

This commit is contained in:
liviuba 2016-02-19 11:30:09 +02:00
parent 96d185359d
commit 347f3c15b2
3 changed files with 89 additions and 4 deletions

View file

@ -778,8 +778,8 @@ impl XMLHttpRequestMethods for XMLHttpRequest {
}, },
// Step 2 // Step 2
XMLHttpRequestResponseType::Document => { XMLHttpRequestResponseType::Document => {
let op_doc = self.GetResponseXML(); let op_doc = self.document_response();
if let Ok(Some(doc)) = op_doc { if let Some(doc) = op_doc {
doc.to_jsval(cx, rval.handle_mut()); doc.to_jsval(cx, rval.handle_mut());
} else { } else {
// Substep 1 // Substep 1
@ -1126,19 +1126,28 @@ impl XMLHttpRequest {
// https://xhr.spec.whatwg.org/#document-response // https://xhr.spec.whatwg.org/#document-response
fn document_response(&self) -> Option<Root<Document>> { fn document_response(&self) -> Option<Root<Document>> {
// Step 1
let response = self.response_xml.get();
if response.is_some() {
return self.response_xml.get();
}
let mime_type = self.final_mime_type(); let mime_type = self.final_mime_type();
//TODO: prescan the response to determine encoding if final charset is null // TODO: prescan the response to determine encoding if final charset is null
let charset = self.final_charset().unwrap_or(UTF_8); let charset = self.final_charset().unwrap_or(UTF_8);
let temp_doc: Root<Document>; let temp_doc: Root<Document>;
match mime_type { match mime_type {
Some(Mime(mime::TopLevel::Text, mime::SubLevel::Html, _)) => { Some(Mime(mime::TopLevel::Text, mime::SubLevel::Html, _)) => {
// Step 5
if self.response_type.get() == XMLHttpRequestResponseType::_empty { if self.response_type.get() == XMLHttpRequestResponseType::_empty {
return None; return None;
} }
// Step 6
else { else {
temp_doc = self.document_text_html(); temp_doc = self.document_text_html();
} }
}, },
// Step 7
Some(Mime(mime::TopLevel::Text, mime::SubLevel::Xml, _)) | Some(Mime(mime::TopLevel::Text, mime::SubLevel::Xml, _)) |
Some(Mime(mime::TopLevel::Application, mime::SubLevel::Xml, _)) | Some(Mime(mime::TopLevel::Application, mime::SubLevel::Xml, _)) |
None => { None => {
@ -1152,10 +1161,14 @@ impl XMLHttpRequest {
return None; return None;
} }
}, },
// Step 4
_ => { return None; } _ => { return None; }
} }
// Step 9
temp_doc.set_encoding_name(DOMString::from(charset.name())); temp_doc.set_encoding_name(DOMString::from(charset.name()));
Some(temp_doc) // Step 13
self.response_xml.set(Some(temp_doc.r()));
return self.response_xml.get();
} }
#[allow(unsafe_code)] #[allow(unsafe_code)]

View file

@ -33814,6 +33814,12 @@
"url": "/WebIDL/ecmascript-binding/has-instance.html" "url": "/WebIDL/ecmascript-binding/has-instance.html"
} }
], ],
"XMLHttpRequest/responsexml-get-twice.htm": [
{
"path": "XMLHttpRequest/responsexml-get-twice.htm",
"url": "/XMLHttpRequest/responsexml-get-twice.htm"
}
],
"html/browsers/browsing-the-web/scroll-to-fragid/scroll-frag-percent-encoded.html": [ "html/browsers/browsing-the-web/scroll-to-fragid/scroll-frag-percent-encoded.html": [
{ {
"path": "html/browsers/browsing-the-web/scroll-to-fragid/scroll-frag-percent-encoded.html", "path": "html/browsers/browsing-the-web/scroll-to-fragid/scroll-frag-percent-encoded.html",

View file

@ -0,0 +1,66 @@
<!doctype html>
<meta charset="utf-8">
<title></title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
async_test(function() {
var client = new XMLHttpRequest()
client.open("GET", "resources/well-formed.xml")
client.responseType = "document"
assert_equals(client.responseType, "document")
client.send()
client.onload = this.step_func_done(function() {
var first = client.response
var second = client.response
assert_not_equals(first, null)
assert_not_equals(second, null)
assert_equals(first, second)
})
}, "Getting response, then response")
async_test(function() {
var client = new XMLHttpRequest()
client.open("GET", "resources/well-formed.xml")
client.responseType = "document"
assert_equals(client.responseType, "document")
client.send()
client.onload = this.step_func_done(function() {
var first = client.responseXML
var second = client.responseXML
assert_not_equals(first, null)
assert_not_equals(second, null)
assert_equals(first, second)
})
}, "Getting responseXML, then responseXML")
async_test(function() {
var client = new XMLHttpRequest()
client.open("GET", "resources/well-formed.xml")
client.responseType = "document"
assert_equals(client.responseType, "document")
client.send()
client.onload = this.step_func_done(function() {
var first = client.responseXML
var second = client.response
assert_not_equals(first, null)
assert_not_equals(second, null)
assert_equals(first, second)
})
}, "Getting responseXML, then response")
async_test(function() {
var client = new XMLHttpRequest()
client.open("GET", "resources/well-formed.xml")
client.responseType = "document"
assert_equals(client.responseType, "document")
client.send()
client.onload = this.step_func_done(function() {
var first = client.response
var second = client.responseXML
assert_not_equals(first, null)
assert_not_equals(second, null)
assert_equals(first, second)
})
}, "Getting response, then responseXML")
</script>