Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Warnings

<!doctype html>
<html>
<head>
<title>Final history position for history.go should be calculated when executing the task</title>
<script type="text/javascript" src="/resources/testharness.js"></script>
<script type="text/javascript" src="/resources/testharnessreport.js"></script>
<script type="text/javascript">
setup({explicit_done:true});
window.onload = function () {
var hashcount = 0;
if( location.hash && location.hash != '#' ) {
location.href = location.href.replace(/#.*$/,'');
return;
}
setTimeout(add1,100);
function add1() {
location.hash = '#foo';
setTimeout(add2,100);
}
function add2() {
location.hash = '#bar';
setTimeout(add3,100);
}
function add3() {
location.hash = '#baz';
setTimeout(dojumps,100);
}
function dojumps() {
window.onhashchange = function () {
hashcount++;
};
history.go(-2);
test(function () {
//many browsers special-case jumps that only imply hash changes and will do them synchronously - the spec does allow this
assert_equals( hashcount, 0, 'hashchange fired even though the location should not have changed' );
assert_equals( location.hash.replace(/^#/,''), 'baz', 'the browser navigated synchronously' );
}, '.go commands should be queued until the thread has ended');
history.go(-1);
setTimeout(checkjumps,100);
}
function checkjumps() {
test(function () {
assert_true( !!hashcount, 'this testcase requires haschange support; the test cannot be used in this browser' );
}, 'browser needs to support hashchange events for this testcase');
test(function () {
assert_equals( hashcount, 2, 'the wrong number of queued commands were executed' );
}, 'queued .go commands should all be executed when the queue is processed');
test(function () {
assert_equals( location.hash.replace(/^#/,''), '' );
}, 'history position should be calculated when executing, not when calling the .go command');
done();
}
};
</script>
</head>
<body>
<noscript><p>Enable JavaScript and reload</p></noscript>
<div id="log"></div>
</body>
</html>