blob: 49bd93427c1d39ac5aed928caa3d0253557dd416 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>Resource Timing - test that unsuccessful iframes create entries</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/get-host-info.sub.js"></script>
<body>
<script>
test(() => {
const entries = performance.getEntriesByType("resource");
assert_equals(entries.length, 3, "Precondition - Entries for blocking scripts fired");
}, "Precondition");
const run_test = async (t, url, csp) => {
const setPerformanceObserver = new Promise(resolve => {
const po = new PerformanceObserver(resolve);
po.observe({type: "resource"});
});
const timeout = new Promise(resolve => t.step_timeout(resolve, 1000));
const frame = document.createElement("iframe");
frame.src = url;
if (csp) {
frame.csp = csp;
}
document.body.appendChild(frame);
const list = await Promise.race([setPerformanceObserver, timeout]);
assert_equals(typeof(list), "object", "No iframe entry was fired");
const entries = list.getEntriesByName(url);
assert_equals(entries.length, 1);
assert_greater_than(entries[0].duration, 0, "Duration greater than 0");
}
const {REMOTE_ORIGIN, ORIGINAL_HOST, HTTPS_PORT} = get_host_info();
const nonexistent_url = "https://nonexistent." + ORIGINAL_HOST + ":" + HTTPS_PORT + "/";
promise_test(t => {
return run_test(t, nonexistent_url);
}, "Test iframe from non-existent host");
promise_test(t => {
const url = new URL("resources/fake_responses.py?redirect=" + nonexistent_url, location.href);
return run_test(t, url.toString());
}, "Test iframe redirecting to non-existent host");
const csp_directive = "default-src 'none'";
promise_test(t => {
const url = new URL("/resource-timing/resources/csp-default-none.html", location.href);
return run_test(t, url, csp_directive);
}, "Same-origin iframe that complies with CSP attribute gets reported");
promise_test(t => {
const url = new URL("/resource-timing/resources/green-frame.html", location.href);
return run_test(t, url.toString(), csp_directive);
}, "Same-origin iframe that doesn't comply with CSP attribute gets reported");
promise_test(t => {
const url = new URL("/resource-timing/resources/csp-default-none.html", REMOTE_ORIGIN);
return run_test(t, url.toString(), csp_directive);
}, "Cross-origin iframe that complies with CSP attribute gets reported");
promise_test(t => {
const url = new URL("/resource-timing/resources/green-frame.html", REMOTE_ORIGIN);
return run_test(t, url.toString(), csp_directive);
}, "Cross-origin iframe that doesn't comply with CSP attribute gets reported");
promise_test(t => {
const url = new URL("/resource-timing/resources/200_empty.asis", location.href);
return run_test(t, url.toString(), csp_directive);
}, "Same-origin empty iframe with a 200 status gets reported");
promise_test(t => {
const url = new URL("/resource-timing/resources/200_empty.asis", REMOTE_ORIGIN);
return run_test(t, url.toString(), csp_directive);
}, "Cross-origin empty iframe with a 200 status gets reported");
</script>
</body>
</html>