chromium/third_party/blink/web_tests/fast/loader/hashchange-event.html

<html>
<head>
<script>

if (!window.sessionStorage) {
    alert("This test needs sessionstorage to run properly");
    location.href = "http://webkit.org/";
}

var targetNumberOfEventsForFirstTest = 8;
var targetNumberOfEventsForSecondTest = 10;

var testNumber = 1;
if (sessionStorage.totalEventsFired == targetNumberOfEventsForFirstTest)
    testNumber = 2;

sessionStorage.clear();
sessionStorage.totalEventsFired = 0;

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

function startTest()
{
    if (testNumber == 1) {
        location.hash='#';
        location.hash='#';
        location.hash='#someHash';
        location.hash='#';
        location.hash='#';
        location.hash='#someHash';
        location.hash='#someHash';
        location.hash='#';
    } else if (testNumber == 2) {
        location.hash='#someHash';
        location.hash='#someHash';
        location.hash='#';
        location.hash='#someHash';
        location.hash='#someHash';
        location.hash='#';
        location.hash='#';
        location.hash='#someHash';
    } else
        alert("This shouldn't happen.");
}

var totalEventsFired = 0;
function hashChanged(eventHandlerName)
{
    alert("Test number " + testNumber + ".\nhashchange event received by " + eventHandlerName + ".\nA total of " + ++sessionStorage.totalEventsFired + " events have been received.");
    if (testNumber == 1 && sessionStorage.totalEventsFired == targetNumberOfEventsForFirstTest) {
        location.hash="";
        location.href=location.href.substr(0, location.href.length - 1);
    }
    if (testNumber == 2 && sessionStorage.totalEventsFired == targetNumberOfEventsForSecondTest && window.testRunner) {
        testRunner.notifyDone();
        sessionStorage.clear();
    }
}

window.addEventListener("hashchange", function() { hashChanged('window-event-listener'); }, false);

</script>
</head>
<body onload="setTimeout('startTest();', 0);" onhashchange="hashChanged('body-onhashchange-attribute');">
This test checks to make sure the hashchange event is fired when the value of location.hash changes.<br>
This includes testing the transition from no fragment identifier to an empty fragment identifier *not* generating an event, as these cases are equivalent as far as location.hash is concerned.<br>
Clicking the links below manually should also result in the event being fired when the hash actually changes.<br>
<a href="#">Go to empty hash</a><br>
<a href="#someHash">Go to non-empty hash</a><br>
<a name="#">Empty hash anchor</a><br>
<a name="#someHash">Non-empty hash anchor</a>
</body>
</html>