| <!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> |