<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<title>This test validates Resource Timing for cross origin content fetched by Service Worker from an originally same-origin URL.</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/get-host-info.sub.js"></script>
<script src="resources/test-helpers.sub.js"></script>
</head>

<body>
<script>
async_test(function(t) {
    const worker_url = 'resources/worker-fetching-cross-origin.js';
    const scope = 'resources/iframe-with-image.html';
    let registration;
    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 frame_performance = frame.contentWindow.performance;
        // Check that there is one entry for which the timing allow check algorithm failed.
        const entries = frame_performance.getEntriesByType('resource');
        assert_equals(entries.length, 1);
        const entry = entries[0];
        assert_equals(entry.redirectStart, 0, 'redirectStart should be 0 in cross-origin request.');
        assert_equals(entry.redirectEnd, 0, 'redirectEnd should be 0 in cross-origin request.');
        assert_equals(entry.domainLookupStart, 0, 'domainLookupStart should be 0 in cross-origin request.');
        assert_equals(entry.domainLookupEnd, 0, 'domainLookupEnd should be 0 in cross-origin request.');
        assert_equals(entry.connectStart, 0, 'connectStart should be 0 in cross-origin request.');
        assert_equals(entry.connectEnd, 0, 'connectEnd should be 0 in cross-origin request.');
        assert_equals(entry.requestStart, 0, 'requestStart should be 0 in cross-origin request.');
        assert_equals(entry.responseStart, 0, 'responseStart should be 0 in cross-origin request.');
        assert_equals(entry.secureConnectionStart, 0, 'secureConnectionStart should be 0 in cross-origin request.');
        assert_equals(entry.decodedBodySize, 0, 'decodedBodySize should be 0 in cross-origin request.');
        frame.remove();
        return registration.unregister();
      })
    .then(function() {
        t.done();
      })
    .catch(unreached_rejection(t));
}, 'Test that timing allow check fails when service worker changes origin from same to cross origin.');
</script>
</body>
</html>
