<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8" />
<title>This test validates the values in resource timing for a cross-origin redirect.</title>
<link rel="author" title="Intel" href="http://www.intel.com/" />
<link rel="help" href="http://www.w3.org/TR/resource-timing/#performanceresourcetiming"/>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/webperftestharness.js"></script>
<script src="resources/webperftestharnessextension.js"></script>

<script>
    setup({explicit_done: true});
    function onload_test() {
        const context = new PerformanceContext(performance);
        const entry = context.getEntriesByName(document.getElementById('frameContext').src, 'resource')[0];

        test_equals(entry.redirectStart, 0, 'redirectStart should be 0 in cross-origin redirect.');
        test_equals(entry.redirectEnd, 0, 'redirectEnd should be 0 in cross-origin redirect.');
        test_equals(entry.domainLookupStart, 0, 'domainLookupStart should be 0 in cross-origin redirect.');
        test_equals(entry.domainLookupEnd, 0, 'domainLookupEnd should be 0 in cross-origin redirect.');
        test_equals(entry.connectStart, 0, 'connectStart should be 0 in cross-origin redirect.');
        test_equals(entry.connectEnd, 0, 'connectEnd should be 0 in cross-origin redirect.');
        test_equals(entry.requestStart, 0, 'requestStart should be 0 in cross-origin redirect.');
        test_equals(entry.responseStart, 0, 'responseStart should be 0 in cross-origin redirect.');
        test_equals(entry.secureConnectionStart, 0, 'secureConnectionStart should be 0 in cross-origin redirect.');
        test_greater_than(entry.fetchStart, 0, 'fetchStart should be greater than 0 in cross-origin redirect.');
        test_greater_than(entry.responseEnd, 0, 'responseEnd should be greater than 0 in cross-origin redirect.');
        done();
    }
</script>
</head>
<body>
<iframe id="frameContext" src="" style="width: 250px; height: 250px;"></iframe>
<script>
    let destUrl = '/common/redirect.py?location=';
    // Add www to get a cross origin frame.
    destUrl += 'http://www.' + document.location.host + '/resource-timing/resources/blank_page_green.htm';

    const frameContext = document.getElementById('frameContext');
    frameContext.onload = onload_test;
    frameContext.src = destUrl;
</script>
</body>
</html>
