<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<body>
<script>
function numberOfDownloads(url) {
    let absoluteURL = new URL(url, location.href).href;
    return performance.getEntriesByName(absoluteURL).length;
}

function waitForSubFrameLoad() {
    return new Promise((resolve) => {
        window.subFrameLoaded = () => {
            window.subFrameLoaded = null;
            resolve();
        };
    });
}

function runTest(type) {
    performance.clearResourceTimings();
    let elem = document.createElement(type);
    if (type === 'object')
        elem.data = 'resources/self_navigation.html?' + type;
    else
        elem.src = 'resources/self_navigation.html?' + type;
    document.body.appendChild(elem);
    return waitForSubFrameLoad().then(() => {
        let resources = performance.getEntriesByType('resource');
        assert_equals(numberOfDownloads('resources/self_navigation.html?' + type), 1);
        assert_equals(numberOfDownloads('resources/notify_parent.html?redirected'), 0);
        document.body.removeChild(elem);
    });
}

promise_test(
    () => runTest('iframe'),
    "Subsequent <iframe> navigations don't appear in the resource-timing buffer.");

promise_test(
    () => runTest('frame'),
    "Subsequent <frame> navigations don't appear in the resource-timing buffer.");

promise_test(
    () => runTest('embed'),
    "Subsequent <embed> navigations don't appear in the resource-timing buffer.");

promise_test(
    () => runTest('object'),
    "Subsequent <object> navigations don't appear in the resource-timing buffer.");

</script>
</body>
