responsexml-document-properties.htm (4532B)
1 <!doctype html> 2 <html> 3 <head> 4 <title>XMLHttpRequest: responseXML document properties</title> 5 <script src="/resources/testharness.js"></script> 6 <script src="/resources/testharnessreport.js"></script> 7 <script src="../html/dom/documents/resource-metadata-management/support/document-lastModified-utils.js"></script> 8 </head> 9 <body> 10 <div id="log"></div> 11 <script> 12 var client = new XMLHttpRequest() 13 client.open("GET", "resources/well-formed.xml", false) 14 client.send(null) 15 var responseURLObject = new URL('resources/well-formed.xml', location.href); 16 var responseURL = responseURLObject.href 17 var responseDomain = responseURLObject.hostname 18 var expected = { 19 domain:responseDomain, 20 URL:responseURL, 21 documentURI:responseURL, 22 baseURI:responseURL, 23 referrer:'', 24 title:'', 25 contentType:'application/xml', 26 readyState:'complete', 27 location:null, 28 defaultView:null, 29 body:null, 30 doctype:null, 31 all:HTMLAllCollection, 32 cookie:'' 33 } 34 35 for (var name in expected) { 36 runTest(name, expected[name]) 37 } 38 39 function runTest(name, value){ 40 test(function(){ 41 if (name == "all") { 42 assert_equals(Object.getPrototypeOf(client.responseXML[name]), value.prototype) 43 } else { 44 assert_equals(client.responseXML[name], value) 45 } 46 }, name) 47 } 48 49 // Parse a "lastModified" value and convert it to a Date. 50 // See https://html.spec.whatwg.org/multipage/dom.html#dom-document-lastmodified 51 function parseLastModified(value) { 52 const [undefined, month, day, year, hours, minutes, seconds] = 53 /^(\d\d)\/(\d\d)\/(\d+) (\d\d):(\d\d):(\d\d)$/.exec(value); 54 return new Date(year, month - 1, day, hours, minutes, seconds); 55 } 56 57 async_test(t => { 58 const client = new XMLHttpRequest(); 59 client.open("GET", "resources/redirect.py?location=well-formed.xml"); 60 client.send(); 61 client.onload = t.step_func_done(() => { 62 assert_equals(client.responseXML.URL, responseURL); 63 assert_equals(client.responseXML.baseURI, responseURL); 64 }); 65 }, "Test document URL properties after redirect"); 66 67 async_test(t => { 68 const client = new XMLHttpRequest(); 69 client.open("GET", "resources/redirect.py?location=base.xml"); 70 client.send(); 71 client.onload = t.step_func_done(() => { 72 const localResponseURL = new URL('resources/base.xml', location.href).href; 73 assert_equals(client.responseXML.URL, localResponseURL); 74 assert_equals(client.responseXML.baseURI, 'https://example.com/'); 75 client.responseXML.documentElement.remove(); 76 assert_equals(client.responseXML.baseURI, localResponseURL); 77 const newBase = document.createElement("base"), 78 newBaseURL = "https://elsewhere.example/"; 79 newBase.href = "https://elsewhere.example/"; 80 client.responseXML.appendChild(newBase); 81 assert_equals(client.responseXML.baseURI, newBaseURL); 82 newBase.remove(); 83 document.head.appendChild(newBase); 84 assert_equals(client.responseXML.baseURI, localResponseURL); 85 newBase.remove(); 86 }); 87 }, "Test document URL properties of document with <base> after redirect"); 88 89 test(function() { 90 assert_document_lastmodified_string_approximately_now(client.responseXML.lastModified); 91 }, 'lastModified set to time of response if no HTTP header provided') 92 93 test(function() { 94 var client2 = new XMLHttpRequest() 95 client2.open("GET", "resources/last-modified.py", false) 96 client2.send(null) 97 assert_equals((new Date(client2.getResponseHeader('Last-Modified'))).getTime(), (parseLastModified(client2.responseXML.lastModified)).getTime()) 98 }, 'lastModified set to related HTTP header if provided') 99 100 test(function() { 101 client.responseXML.cookie = "thisshouldbeignored" 102 assert_equals(client.responseXML.cookie, "") 103 }, 'cookie (after setting it)') 104 105 var objectProps = [ 106 "styleSheets", 107 "implementation", 108 "images", 109 "forms", 110 "links", 111 ]; 112 113 for (let prop of objectProps) { 114 test(function() { 115 assert_equals(typeof(client.responseXML[prop]), "object") 116 }, prop + " should be an object") 117 } 118 </script> 119 </body> 120 </html>