|
1 <?xml version="1.0"?> |
|
2 <?xml-stylesheet href="chrome://global/skin" type="text/css"?> |
|
3 <window title="Mozilla Bug 478536" |
|
4 width="600" height="600" |
|
5 onload="onload();" |
|
6 onunload="onunload();" |
|
7 xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> |
|
8 |
|
9 <script type="application/javascript" |
|
10 src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js" /> |
|
11 |
|
12 <body xmlns="http://www.w3.org/1999/xhtml" id="body"> |
|
13 <style type="text/css"> |
|
14 #view { |
|
15 overflow: auto; |
|
16 width: 100px; |
|
17 height: 100px; |
|
18 border: 1px solid; |
|
19 margin: 0; |
|
20 } |
|
21 </style> |
|
22 <pre id="view" onscroll="onScrollView(event);"> |
|
23 Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. |
|
24 Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. |
|
25 Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. |
|
26 Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. |
|
27 Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. |
|
28 Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. |
|
29 Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. |
|
30 Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. |
|
31 Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. |
|
32 Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. Text. |
|
33 </pre> |
|
34 </body> |
|
35 |
|
36 <script class="testbody" type="application/javascript"> |
|
37 <![CDATA[ |
|
38 |
|
39 function ok(aCondition, aMessage) |
|
40 { |
|
41 window.opener.wrappedJSObject.SimpleTest.ok(aCondition, aMessage); |
|
42 } |
|
43 |
|
44 function is(aLeft, aRight, aMessage) |
|
45 { |
|
46 window.opener.wrappedJSObject.SimpleTest.is(aLeft, aRight, aMessage); |
|
47 } |
|
48 |
|
49 function isnot(aLeft, aRight, aMessage) |
|
50 { |
|
51 window.opener.wrappedJSObject.SimpleTest.isnot(aLeft, aRight, aMessage); |
|
52 } |
|
53 |
|
54 var gBody = document.getElementById("body"); |
|
55 var gView = document.getElementById("view"); |
|
56 |
|
57 /** |
|
58 * Description: |
|
59 * |
|
60 * First, lock the wheel scrolling target to "view" at first step. |
|
61 * Next, scroll back to top most of the "view" at second step. |
|
62 * Finally, scroll back again at third step. This fails to scroll the "view", |
|
63 * then, |onMouseScrollFailed| event should be fired. And at that time, we |
|
64 * can remove the "view". So, in post processing of the event firere, the |
|
65 * "view" should not be referred. |
|
66 * |
|
67 * For suppressing random test failure, all tests will be retried if we handle |
|
68 * unexpected timeout event. |
|
69 */ |
|
70 |
|
71 var gTests = [ |
|
72 { scrollToForward: true, shouldScroll: true }, |
|
73 { scrollToForward: false, shouldScroll: true }, |
|
74 { scrollToForward: false, shouldScroll: false } |
|
75 ]; |
|
76 var gCurrentTestIndex = -1; |
|
77 var gIgnoreScrollEvent = true; |
|
78 |
|
79 var gPrefSvc = Components.classes["@mozilla.org/preferences-service;1"]. |
|
80 getService(Components.interfaces.nsIPrefBranch); |
|
81 const kPrefSmoothScroll = "general.smoothScroll"; |
|
82 const kPrefNameTimeout = "mousewheel.transaction.timeout"; |
|
83 const kDefaultTimeout = gPrefSvc.getIntPref(kPrefNameTimeout); |
|
84 |
|
85 gPrefSvc.setBoolPref(kPrefSmoothScroll, false); |
|
86 |
|
87 var gTimeout = kDefaultTimeout; |
|
88 |
|
89 gBody.addEventListener("MozMouseScrollFailed", onMouseScrollFailed, false); |
|
90 gBody.addEventListener("MozMouseScrollTransactionTimeout", |
|
91 onTransactionTimeout, false); |
|
92 |
|
93 function setTimeoutPrefs(aTimeout) |
|
94 { |
|
95 gPrefSvc.setIntPref(kPrefNameTimeout, aTimeout); |
|
96 gTimeout = aTimeout; |
|
97 } |
|
98 |
|
99 function resetTimeoutPrefs() |
|
100 { |
|
101 if (gTimeout == kDefaultTimeout) |
|
102 return; |
|
103 setTimeoutPrefs(kDefaultTimeout); |
|
104 } |
|
105 |
|
106 function growUpTimeoutPrefs() |
|
107 { |
|
108 if (gTimeout != kDefaultTimeout) |
|
109 return; |
|
110 setTimeoutPrefs(5000); |
|
111 } |
|
112 |
|
113 function onload() |
|
114 { |
|
115 disableNonTestMouseEvents(true); |
|
116 setTimeout(runNextTest, 0); |
|
117 } |
|
118 |
|
119 function onunload() |
|
120 { |
|
121 resetTimeoutPrefs(); |
|
122 disableNonTestMouseEvents(false); |
|
123 gPrefSvc.clearUserPref(kPrefSmoothScroll); |
|
124 window.opener.wrappedJSObject.SimpleTest.finish(); |
|
125 } |
|
126 |
|
127 function finish() |
|
128 { |
|
129 window.close(); |
|
130 } |
|
131 |
|
132 // testing code |
|
133 |
|
134 var gTimer; |
|
135 function clearTimer() |
|
136 { |
|
137 clearTimeout(gTimer); |
|
138 gTimer = 0; |
|
139 } |
|
140 |
|
141 function runNextTest() |
|
142 { |
|
143 clearTimer(); |
|
144 if (++gCurrentTestIndex >= gTests.length) { |
|
145 ok(true, "didn't crash, succeeded"); |
|
146 finish(); |
|
147 return; |
|
148 } |
|
149 fireWheelScrollEvent(gTests[gCurrentTestIndex].scrollToForward); |
|
150 } |
|
151 |
|
152 var gRetryCount = 5; |
|
153 function retryAllTests() |
|
154 { |
|
155 clearTimer(); |
|
156 if (--gRetryCount >= 0) { |
|
157 gView.scrollTop = 0; |
|
158 gView.scrollLeft = 0; |
|
159 gCurrentTestIndex = -1; |
|
160 growUpTimeoutPrefs(); |
|
161 ok(true, "WARNING: retry current test-list..."); |
|
162 gTimer = setTimeout(runNextTest, 0); |
|
163 } else { |
|
164 ok(false, "Failed by unexpected timeout"); |
|
165 finish(); |
|
166 } |
|
167 } |
|
168 |
|
169 function fireWheelScrollEvent(aForward) |
|
170 { |
|
171 gIgnoreScrollEvent = false; |
|
172 var event = { deltaY: aForward ? 4.0 : -4.0, |
|
173 deltaMode: WheelEvent.DOM_DELTA_LINE }; |
|
174 synthesizeWheel(gView, 5, 5, event, window); |
|
175 } |
|
176 |
|
177 function onScrollView(aEvent) |
|
178 { |
|
179 if (gIgnoreScrollEvent) |
|
180 return; |
|
181 gIgnoreScrollEvent = true; |
|
182 clearTimer(); |
|
183 ok(gTests[gCurrentTestIndex].shouldScroll, "The view is scrolled"); |
|
184 gTimer = setTimeout(runNextTest, 0); |
|
185 } |
|
186 |
|
187 function onMouseScrollFailed(aEvent) |
|
188 { |
|
189 clearTimer(); |
|
190 gIgnoreScrollEvent = true; |
|
191 ok(!gTests[gCurrentTestIndex].shouldScroll, "The view is not scrolled"); |
|
192 if (!gTests[gCurrentTestIndex].shouldScroll) |
|
193 gBody.removeChild(gView); |
|
194 runNextTest(); |
|
195 } |
|
196 |
|
197 function onTransactionTimeout(aEvent) |
|
198 { |
|
199 if (!gTimer) |
|
200 return; |
|
201 gIgnoreScrollEvent = true; |
|
202 retryAllTests(); |
|
203 } |
|
204 |
|
205 ]]> |
|
206 </script> |
|
207 |
|
208 </window> |