| <!doctype html> | |
| <html> | |
| <head> | |
| <title>Resource Timing: PerformanceResourceTiming attributes shouldn't change | |
| if the HTTP status code changes</title> | |
| <link rel="help" href="https://www.w3.org/TR/resource-timing-2/#sec-performanceresourcetiming"/> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src=/common/get-host-info.sub.js></script> | |
| </head> | |
| <body> | |
| <img id="img_200"> | |
| <img id="img_307"> | |
| <img id="img_404"> | |
| <img id="img_502"> | |
| <script id="script_200"></script> | |
| <script id="script_307"></script> | |
| <script id="script_404"></script> | |
| <script id="script_502"></script> | |
| <script> | |
| const listenForPerformanceEntries = num_expected => { | |
| return new Promise(resolve => { | |
| let results = []; | |
| new PerformanceObserver(entryList => { | |
| entryList.getEntries().forEach(entry => { | |
| if (!entry.name.includes("status-code")) | |
| return; | |
| results.push(entry); | |
| if (results.length == num_expected) { | |
| resolve(results); | |
| } | |
| }); | |
| }).observe({entryTypes: ['resource']}); | |
| }); | |
| } | |
| promise_test(async t => { | |
| const destUrl = get_host_info().HTTP_REMOTE_ORIGIN + '/resource-timing/resources/'; | |
| const statusCodes = ['200', '307', '404', '502']; | |
| let expected_entry_count = 0; | |
| statusCodes.forEach(status => { | |
| document.getElementById(`img_${status}`).src = `${destUrl}status-code.py?status=${status}`; | |
| document.getElementById(`script_${status}`).src = `${destUrl}status-code.py?status=${status}&script=1`; | |
| expected_entry_count += 2; | |
| }); | |
| const entries = await listenForPerformanceEntries(expected_entry_count); | |
| // We will check that the non-timestamp values of the entry match for all | |
| // entries. | |
| const keys = [ | |
| 'entryType', | |
| 'nextHopProtocol', | |
| 'transferSize', | |
| 'encodedBodySize', | |
| 'decodedBodySize', | |
| ]; | |
| const first = entries[0]; | |
| entries.slice(1).forEach(entry => { | |
| keys.forEach(attribute => { | |
| assert_equals(entry[attribute], first[attribute], | |
| `There must be no discernible difference for the ${attribute} ` + | |
| `attribute but found a difference for the ${entry.name} resource.`); | |
| })}); | |
| }, "Make sure cross origin resource fetch failures with different status codes are indistinguishable"); | |
| </script> |