<script>

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

function log(msg) {
    document.getElementById("logger").innerHTML += msg + "<br>";
}

function loaded()
{
    // Make a 512k character string, which computes as 1mb of payload.
    var object = "12345678";
    for (var i = 0; i < 16; ++i)
        object += object;
    
    log("Pushing 63+mb of state objects (but less than 64mb)");

    try {
        // Push 63+mb of state objects (while the string is exactly 1mb, it counts for a little more than 1mb)
        for (var i = 1; i < 64; ++i)
            history.pushState(0, 0, object);
    } catch (e) {
        log("Unexpected exception pushing > 63mb but < 64mb of state objects: " + e);  
    }
    
    log ("Replacing the last state object with one that should fit");

    try {
        // replaceState with a 1mb state object.
        // If replaceState counts against the global limit, this will cause an exception.
        // But it should work.
        history.replaceState(0, 0, object);
        
        log("It fit");
    } catch (e) {
        log("Unexpected exception replacing the last state object: " + e); 
    }
    
    // Make the string be 1024k characters, which computes as 2mb of payload.
    object += object;
    
    log ("Replacing the last state object with one that should not fit");

    try {
        // Replacing the 63rd 1mb string with a 2mb string *should* still trigger the limit.
        history.replaceState(0, 0, object);
        log("It fit, but should not have");
    } catch (e) {
        log("Expected exception replacing the last state object: " + e);  
    }

    if (window.testRunner)
        testRunner.notifyDone();    
}

window.onload = loaded;

</script>
<body>
Test should not crash.<br>
replaceState() should not always count against the global quota. Instead it should literally replace the most recent state object added.<br>
<div id="logger"></div>
</body>
