<!DOCTYPE html>
<html>
<head>
    <script src="../../resources/js-test.js"></script>
</head>
<body>
    <p id="description"></p>
    <pre id="console"></pre>

    <script>
    var jsTestIsAsync = true;

    description('Tests that appending iframe with with no URL and setting its URL later (including hash part) does not overwrite current history entry.');

    if (window.testRunner)
        testRunner.clearBackForwardList();

    onload = beginTest;

    function beginTest() {
        // The frame must be appened both on initial load and after navigating
        // back. On first load we must set the same SRC as after navigating away.
        var iframe = document.createElement('iframe');
        document.body.appendChild(iframe);

        if (location.hash.indexOf('wentBack') == -1) {
            // Run else code path after going back.
            location.hash = 'wentBack';

            setFrameSrc();

            // Navigate forward and back to create forward navigation entry.
            // Must be done outside the load handler to generate history entry.
            window.setTimeout(function() {
                location.href = 'resources/back-on-load.html';
            }, 0);
        } else {
            window.setTimeout(setFrameSrcAndfinishTest, 100);
        }
    }

    function setFrameSrc() {
        document.querySelector('iframe').src = 'about:blank/#identifier';
    }

    function setFrameSrcAndfinishTest() {
        document.querySelector('iframe').src = 'about:blank/#identifier';
        testRunner.dumpBackForwardList();
        finishJSTest();
    }
    </script>
</body>
</html>
