blob: f0502cac727896ce674f3b93a9dd4cfcbf54b41b [file] [log] [blame]
<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<script>
function resourceUrl(path) {
return "https://{{host}}:{{ports[https][0]}}" + base_path() + path;
}
function crossOriginUrl(path) {
return "https://{{hosts[alt][]}}:{{ports[https][0]}}" + base_path() + path;
}
function verify(options) {
const url = options.mode === 'cross-origin' ? crossOriginUrl(options.resource)
: resourceUrl(options.resource);
const entryList = options.performance.getEntriesByName(url, 'resource');
if (options.should_no_performance_entry) {
// The performance timeline may not have an entry for a resource
// which failed to load.
assert_equals(entryList.length, 0, options.description);
return;
}
assert_equals(entryList.length, 1, options.description);
const entry = entryList[0];
assert_equals(entry.entryType, 'resource', options.description);
assert_greater_than(entry.workerStart, 0, options.description);
assert_greater_than_equal(entry.workerStart, entry.startTime, options.description);
assert_less_than_equal(entry.workerStart, entry.fetchStart, options.description);
if (options.mode === 'cross-origin') {
assert_equals(entry.responseStart, 0, options.description);
assert_greater_than_equal(entry.responseEnd, entry.fetchStart, options.description);
} else {
assert_greater_than_equal(entry.responseStart, entry.fetchStart, options.description);
assert_greater_than_equal(entry.responseEnd, entry.responseStart, options.description);
}
assert_greater_than(entry.responseEnd, entry.fetchStart, options.description);
assert_greater_than(entry.duration, 0, options.description);
if (options.resource.indexOf('redirect.py') != -1) {
assert_less_than_equal(entry.workerStart, entry.redirectStart,
options.description);
} else {
assert_equals(entry.redirectStart, 0, options.description);
}
}
promise_test(function(t) {
const worker_url = 'resources/resource-timing-worker.js';
const scope = 'resources/resource-timing-iframe.sub.html';
let registration;
return service_worker_unregister_and_register(t, worker_url, scope)
.then(function(r) {
registration = r;
return wait_for_state(t, r.installing, 'activated');
})
.then(function() {
return with_iframe(scope);
})
.then(function(frame) {
const performance = frame.contentWindow.performance;
verify({
performance: performance,
resource: 'resources/dummy.js',
mode: 'same-origin',
description: 'Generated response',
});
verify({
performance: performance,
resource: 'resources/empty.js',
mode: 'same-origin',
description: 'Network fallback',
});
verify({
performance: performance,
resource: 'resources/redirect.py?Redirect=empty.js',
mode: 'same-origin',
description: 'Redirect',
});
verify({
performance: performance,
resource: 'resources/square.png',
mode: 'same-origin',
description: 'Network fallback image',
});
// Test that worker start is available on cross-origin no-cors
// subresources.
verify({
performance: performance,
resource: 'resources/square.png',
mode: 'cross-origin',
description: 'Network fallback cross-origin image',
});
// Tests for resouces which failed to load.
verify({
performance: performance,
resource: 'resources/missing.jpg',
mode: 'same-origin',
description: 'Network fallback load failure',
should_no_performance_entry: true,
});
verify({
performance: performance,
resource: 'resources/missing.jpg',
mode: 'cross-origin',
description: 'Network fallback cross-origin load failure',
should_no_performance_entry: true,
});
// Tests for respondWith(fetch()).
verify({
performance: performance,
resource: 'resources/missing.jpg?SWRespondsWithFetch',
mode: 'same-origin',
description: 'Resource in iframe, nonexistent but responded with fetch to another.',
});
verify({
performance: performance,
resource: 'resources/dummy.txt?SWFetched',
mode: 'same-origin',
description: 'Resource fetched as response from missing.jpg?SWRespondsWithFetch.',
should_no_performance_entry: true,
});
// Test for a normal resource that is unaffected by the Service Worker.
verify({
performance: performance,
resource: 'resources/empty-worker.js',
mode: 'same-origin',
description: 'Resource untouched by the Service Worker.',
});
frame.remove();
return registration.unregister();
});
}, 'Controlled resource loads');
test(() => {
const url = resourceUrl('resources/test-helpers.sub.js');
const entry = window.performance.getEntriesByName(url, 'resource')[0];
assert_equals(entry.workerStart, 0, 'Non-controlled');
}, 'Non-controlled resource loads');
</script>