<script>

if (!sessionStorage.in_document_with_fragment_url_4)
    sessionStorage.in_document_with_fragment_url_4 = true;
else
    delete sessionStorage.in_document_with_fragment_url_4;

if (window.testRunner) {
    testRunner.dumpAsText();
    testRunner.waitUntilDone();
}

function documentURLHash()
{
    var index = document.URL.lastIndexOf("#");
    if (index == -1)
        return "";
    return document.URL.substring(index);
}

function hashChanged()
{
    alert("Hash changed to " + documentURLHash() + " which is interesting because we shouldn't get a hashchange event in this test.");
}

function loaded()
{
    if (sessionStorage.in_document_with_fragment_url_4) {
        alert("First load complete.  URL's current hash is " + documentURLHash());
        history.replaceState(null, null, "#foo");
        alert("After replaceState, the URL's current hash is " + documentURLHash());
        var rect = document.getElementById("clickanchor").getBoundingClientRect();
        eventSender.mouseMoveTo(rect.left + rect.width / 2, rect.top + rect.height / 2);
        eventSender.mouseDown();
        eventSender.mouseUp();
    } else {
        alert("Second load complete.  URL's current hash is " + documentURLHash());
        if (window.testRunner)
            testRunner.notifyDone();
    }
}

</script>
<body onhashchange="hashChanged();" onload="loaded();">
This page uses history.replaceState() to add #foo to its URL.  Then click the second link, which has an empty href and should take you back to the original URL without the #foo.<br>
<a id="clickanchor" href="">Click here to return to the original page with the original url</a>
</body>
