123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 |
- <!DOCTYPE HTML>
- <html>
- <!--
- https://bugzilla.mozilla.org/show_bug.cgi?id=669671
- -->
- <head>
- <title>Test for Bug 669671</title>
- <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
- <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
- </head>
- <body>
- <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=669671">Mozilla Bug 669671</a>
- <p id="display"></p>
- <div id="content" style="display: none">
- </div>
- <pre id="test">
- <script type="application/javascript;version=1.7">
- /**
- * Test for Bug 669671.
- *
- * This is a bit complicated. We have a script, file_bug669671.sjs, which counts
- * how many times it's loaded and returns that count in the body of an HTML
- * document. For brevity, call this page X.
- *
- * X is sent with Cache-Control: max-age=0 and can't be bfcached (it has an
- * onunload handler). Our test does the following in a popup:
- *
- * 1) Load X?pushed, to prime the cache.
- * 2) Navigate to X.
- * 3) Call pushState and navigate from X to X?pushed.
- * 4) Navigate to X?navigated.
- * 5) Go back (to X?pushed).
- *
- * We do all this work so we can check that in step 5, we fetch X?pushed from
- * the network -- we shouldn't use our cached copy, because of the
- * cache-control header X sends.
- *
- * Then we go back and repeat the whole process but call history.replaceState
- * instead of pushState. And for good measure, we test once more, this time
- * modifying only the hash of the URI using replaceState. In this case, we
- * *should* load from the cache.
- *
- **/
- SimpleTest.requestLongerTimeout(2);
- SimpleTest.waitForExplicitFinish();
- function onChildLoad()
- {
- SimpleTest.executeSoon(function() { gGen.next() });
- }
- var _loadCount = 0;
- function checkPopupLoadCount()
- {
- is(popup.document.body.innerHTML, _loadCount + '', 'Load count');
- // We normally want to increment _loadCount here. But if the test fails
- // because we didn't do a load we should have, let's not cause a cascade of
- // failures by incrementing _loadCount.
- var origCount = _loadCount;
- if (popup.document.body.innerHTML >= _loadCount + '')
- _loadCount++;
- return origCount;
- }
- function test()
- {
- // Step 0 - Make sure the count is reset to 0 in case of reload
- popup.location = 'file_bug669671.sjs?countreset';
- yield;
- is(popup.document.body.innerHTML, '0',
- 'Load count should be reset to 0');
- // Step 1 - The popup's body counts how many times we've requested the
- // resource. This is the first time we've requested it, so it should be '0'.
- checkPopupLoadCount();
- // Step 2 - We'll get another onChildLoad when this finishes.
- popup.location = 'file_bug669671.sjs';
- yield undefined;
- // Step 3 - Call pushState and change the URI back to ?pushed.
- checkPopupLoadCount();
- popup.history.pushState('', '', '?pushed');
- // Step 4 - Navigate away. This should trigger another onChildLoad.
- popup.location = 'file_bug669671.sjs?navigated-1';
- yield undefined;
- // Step 5 - Go back. This should result in another onload (because the file is
- // not in bfcache) and should be the fourth time we've requested the sjs file.
- checkPopupLoadCount();
- SpecialPowers.wrap(popup).back();
- yield undefined;
- // This is the check which was failing before we fixed the bug.
- checkPopupLoadCount();
- popup.close();
- // Do the whole thing again, but with replaceState.
- popup = window.open('file_bug669671.sjs?replaced');
- yield undefined;
- checkPopupLoadCount();
- popup.location = 'file_bug669671.sjs';
- yield undefined;
- checkPopupLoadCount();
- popup.history.replaceState('', '', '?replaced');
- popup.location = 'file_bug669671.sjs?navigated-2';
- yield undefined;
- checkPopupLoadCount();
- SpecialPowers.wrap(popup).back();
- yield undefined;
- checkPopupLoadCount();
- popup.close();
- // Once more, with feeling. Notice that we don't have to prime the cache
- // with an extra load here, because X and X#hash share the same cache entry.
- popup = window.open('file_bug669671.sjs?hash-test');
- yield undefined;
- var initialCount = checkPopupLoadCount();
- popup.history.replaceState('', '', '#hash');
- popup.location = 'file_bug669671.sjs?navigated-3';
- yield undefined;
- checkPopupLoadCount();
- SpecialPowers.wrap(popup).back();
- yield undefined;
- is(popup.document.body.innerHTML, initialCount + '',
- 'Load count (should be cached)');
- popup.close();
- SimpleTest.finish();
- yield undefined;
- }
- // This will call into onChildLoad once it loads.
- var popup = window.open('file_bug669671.sjs?pushed');
- var gGen = test();
- </script>
- </pre>
- </body>
- </html>
|