1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=669671
-->
<head>
<title>Test for Bug 669671</title>
<script 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">
/**
* 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();
popup.history.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();
popup.history.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();
popup.history.back();
yield undefined;
is(popup.document.body.innerHTML, initialCount + "",
"Load count (should be cached)");
popup.close();
SimpleTest.finish();
}
var gGen = test();
var popup;
// Disable RCWN to make cache behavior deterministic.
SpecialPowers.pushPrefEnv({set: [["network.http.rcwn.enabled", false]]}, () => {
// This will call into onChildLoad once it loads.
popup = window.open("file_bug669671.sjs?pushed");
});
</script>
</pre>
</body>
</html>
|