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

<iframe src="data:text/plain,iframe1" id="iframe1" name="iframe1"></iframe> 
<iframe src="data:text/plain,iframe2" id="iframe2" name="iframe2"></iframe> 

<script>
var wentBack = false;

description('Tests that we trigger same-document navigation when history entries are generated via fragment changes, even if the frames present in the document change between history entries.');

if (window.testRunner) {
    testRunner.dumpChildFrames();
    testRunner.clearBackForwardList();
    testRunner.dumpBackForwardList();
}

onload = function()
{
    // Run afer onload, to make sure that we can generate history entries.
    setTimeout(beginTest, 0);
}

onpopstate = function(event) {
    var loc = location.href;
    var filenameAndQuery = loc.substring(loc.lastIndexOf('/') + 1);
    debug('popstate to state: ' + event.state + ' filename: ' + filenameAndQuery);
    
    if (!location.hash) {
        if (wentBack) {
            debug('going forward');
            history.forward();
        }
    } else if (location.hash == '#newState') {
        if (!wentBack) {
            wentBack = true;
            debug('going back');
            history.back();
        } else {
            finishJSTest();
        }
    } else {
        testFailed('Unexpected state');
    }
};


function beginTest() 
{
    debug('removing iframe2');
    document.body.removeChild(document.getElementById('iframe2'));

    debug('navigating to #newState');
    window.location.href = '#newState';
}
var jsTestIsAsync = true;
</script>  
</body>
</html>
