|
1 <?xml version="1.0"?> |
|
2 <?xml-stylesheet href="chrome://global/skin" type="text/css"?> |
|
3 <?xml-stylesheet href="/tests/SimpleTest/test.css" type="text/css"?> |
|
4 |
|
5 <window title="Arrow Panels" |
|
6 style="padding: 10px;" |
|
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/SimpleTest.js"/> |
|
11 <script type="application/javascript" |
|
12 src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/> |
|
13 |
|
14 <stack flex="1"> |
|
15 <label id="topleft" value="Top Left Corner" left="15" top="15"/> |
|
16 <label id="topright" value="Top Right" right="15" top="15"/> |
|
17 <label id="bottomleft" value="Bottom Left Corner" left="15" bottom="15"/> |
|
18 <label id="bottomright" value="Bottom Right" right="15" bottom="15"/> |
|
19 <!-- Our SimpleTest/TestRunner.js runs tests inside an iframe which sizes are W=500 H=300. |
|
20 'left' and 'top' values need to be set so that the panel (popup) has enough room to display on its 4 sides. --> |
|
21 <label id="middle" value="+/- Centered" left="225" top="135"/> |
|
22 <iframe id="frame" type="content" |
|
23 src="data:text/html,<input id='input'>" width="100" height="100" left="225" top="120"/> |
|
24 </stack> |
|
25 |
|
26 <panel id="panel" type="arrow" |
|
27 onpopupshown="checkPanelPosition(this)" onpopuphidden="runNextTest.next()"> |
|
28 <label id="panellabel" value="This is some text..." height="65"/> |
|
29 </panel> |
|
30 |
|
31 <panel id="bigpanel" type="arrow" |
|
32 onpopupshown="checkBigPanel(this)" onpopuphidden="runNextTest.next()"> |
|
33 <button label="This is some text..." height="3000"/> |
|
34 </panel> |
|
35 |
|
36 <script type="application/javascript"> |
|
37 <![CDATA[ |
|
38 |
|
39 SimpleTest.waitForExplicitFinish(); |
|
40 |
|
41 var expectedAnchor = null; |
|
42 var expectedSide = "", expectedAnchorEdge = "", expectedPack = "", expectedAlignment = ""; |
|
43 var zoomFactor = 1; |
|
44 var runNextTest; |
|
45 |
|
46 function startTest() |
|
47 { |
|
48 runNextTest = nextTest(); |
|
49 runNextTest.next(); |
|
50 } |
|
51 |
|
52 function nextTest() |
|
53 { |
|
54 var panel = $("panel"); |
|
55 |
|
56 function openPopup(position, anchor, expected, anchorEdge, pack, alignment) |
|
57 { |
|
58 expectedAnchor = anchor instanceof Node ? anchor : $(anchor); |
|
59 expectedSide = expected; |
|
60 expectedAnchorEdge = anchorEdge; |
|
61 expectedPack = pack; |
|
62 expectedAlignment = alignment == undefined ? position : alignment; |
|
63 |
|
64 panel.removeAttribute("side"); |
|
65 panel.openPopup(expectedAnchor, position, 0, 0, false, false, null); |
|
66 } |
|
67 |
|
68 for (var iter = 0; iter < 2; iter++) { |
|
69 openPopup("after_start", "topleft", "top", "left", "start"); |
|
70 yield; |
|
71 openPopup("after_start", "bottomleft", "bottom", "left", "start", "before_start"); |
|
72 yield; |
|
73 openPopup("before_start", "topleft", "top", "left", "start", "after_start"); |
|
74 yield; |
|
75 openPopup("before_start", "bottomleft", "bottom", "left", "start"); |
|
76 yield; |
|
77 openPopup("after_start", "middle", "top", "left", "start"); |
|
78 yield; |
|
79 openPopup("before_start", "middle", "bottom", "left", "start"); |
|
80 yield; |
|
81 |
|
82 openPopup("after_start", "topright", "top", "right", "end", "after_end"); |
|
83 yield; |
|
84 openPopup("after_start", "bottomright", "bottom", "right", "end", "before_end"); |
|
85 yield; |
|
86 openPopup("before_start", "topright", "top", "right", "end", "after_end"); |
|
87 yield; |
|
88 openPopup("before_start", "bottomright", "bottom", "right", "end", "before_end"); |
|
89 yield; |
|
90 |
|
91 openPopup("after_end", "middle", "top", "right", "end"); |
|
92 yield; |
|
93 openPopup("before_end", "middle", "bottom", "right", "end"); |
|
94 yield; |
|
95 |
|
96 openPopup("start_before", "topleft", "left", "top", "start", "end_before"); |
|
97 yield; |
|
98 openPopup("start_before", "topright", "right", "top", "start"); |
|
99 yield; |
|
100 openPopup("end_before", "topleft", "left", "top", "start"); |
|
101 yield; |
|
102 openPopup("end_before", "topright", "right", "top", "start", "start_before"); |
|
103 yield; |
|
104 openPopup("start_before", "middle", "right", "top", "start"); |
|
105 yield; |
|
106 openPopup("end_before", "middle", "left", "top", "start"); |
|
107 yield; |
|
108 |
|
109 openPopup("start_before", "bottomleft", "left", "bottom", "end", "end_after"); |
|
110 yield; |
|
111 openPopup("start_before", "bottomright", "right", "bottom", "end", "start_after"); |
|
112 yield; |
|
113 openPopup("end_before", "bottomleft", "left", "bottom", "end", "end_after"); |
|
114 yield; |
|
115 openPopup("end_before", "bottomright", "right", "bottom", "end", "start_after"); |
|
116 yield; |
|
117 |
|
118 openPopup("start_after", "middle", "right", "bottom", "end"); |
|
119 yield; |
|
120 openPopup("end_after", "middle", "left", "bottom", "end"); |
|
121 yield; |
|
122 |
|
123 openPopup("topcenter bottomleft", "bottomleft", "bottom", "center left", "start", "before_start"); |
|
124 yield; |
|
125 openPopup("bottomcenter topleft", "topleft", "top", "center left", "start", "after_start"); |
|
126 yield; |
|
127 openPopup("topcenter bottomright", "bottomright", "bottom", "center right", "end", "before_end"); |
|
128 yield; |
|
129 openPopup("bottomcenter topright", "topright", "top", "center right", "end", "after_end"); |
|
130 yield; |
|
131 openPopup("topcenter bottomleft", "middle", "bottom", "center left", "start", "before_start"); |
|
132 yield; |
|
133 openPopup("bottomcenter topleft", "middle", "top", "center left", "start", "after_start"); |
|
134 yield; |
|
135 |
|
136 openPopup("leftcenter topright", "middle", "right", "center top", "start", "start_before"); |
|
137 yield; |
|
138 openPopup("rightcenter bottomleft", "middle", "left", "center bottom", "end", "end_after"); |
|
139 yield; |
|
140 |
|
141 /* |
|
142 XXXndeakin disable these parts of the test which often cause problems, see bug 626563 |
|
143 |
|
144 openPopup("after_start", frames[0].document.getElementById("input"), "top", "left", "start"); |
|
145 yield; |
|
146 |
|
147 setScale(frames[0], 1.5); |
|
148 openPopup("after_start", frames[0].document.getElementById("input"), "top", "left", "start"); |
|
149 yield; |
|
150 |
|
151 setScale(frames[0], 2.5); |
|
152 openPopup("before_start", frames[0].document.getElementById("input"), "bottom", "left", "start"); |
|
153 yield; |
|
154 |
|
155 setScale(frames[0], 1); |
|
156 */ |
|
157 |
|
158 $("bigpanel").openPopup($("topleft"), "after_start", 0, 0, false, false, null, "start"); |
|
159 yield; |
|
160 |
|
161 // switch to rtl mode |
|
162 document.documentElement.style.direction = "rtl"; |
|
163 $("topleft").setAttribute("right", "15"); |
|
164 $("topright").setAttribute("left", "15"); |
|
165 $("bottomleft").setAttribute("right", "15"); |
|
166 $("bottomright").setAttribute("left", "15"); |
|
167 $("topleft").removeAttribute("left"); |
|
168 $("topright").removeAttribute("right"); |
|
169 $("bottomleft").removeAttribute("left"); |
|
170 $("bottomright").removeAttribute("right"); |
|
171 } |
|
172 |
|
173 SimpleTest.finish() |
|
174 yield; |
|
175 } |
|
176 |
|
177 function setScale(win, scale) |
|
178 { |
|
179 var wn = win.QueryInterface(Components.interfaces.nsIInterfaceRequestor) |
|
180 .getInterface(Components.interfaces.nsIWebNavigation); |
|
181 var shell = wn.QueryInterface(Components.interfaces.nsIDocShell); |
|
182 var docViewer = shell.contentViewer.QueryInterface(Components.interfaces.nsIMarkupDocumentViewer); |
|
183 docViewer.fullZoom = scale; |
|
184 zoomFactor = scale; |
|
185 } |
|
186 |
|
187 function checkPanelPosition(panel) |
|
188 { |
|
189 let anchor = panel.anchorNode; |
|
190 let adj = 0, hwinpos = 0, vwinpos = 0; |
|
191 if (anchor.ownerDocument != document) { |
|
192 var framerect = anchor.ownerDocument.defaultView.frameElement.getBoundingClientRect(); |
|
193 hwinpos = framerect.left; |
|
194 vwinpos = framerect.top; |
|
195 } |
|
196 |
|
197 // Positions are reversed in rtl yet the coordinates used in the computations |
|
198 // are not, so flip the expected label side and anchor edge. |
|
199 var isRTL = (window.getComputedStyle(panel).direction == "rtl"); |
|
200 if (isRTL) { |
|
201 var flipLeftRight = function (val) val == "left" ? "right" : "left"; |
|
202 expectedAnchorEdge = expectedAnchorEdge.replace(/(left|right)/, flipLeftRight); |
|
203 expectedSide = expectedSide.replace(/(left|right)/, flipLeftRight); |
|
204 } |
|
205 |
|
206 var panelRect = panel.getBoundingClientRect(); |
|
207 var anchorRect = anchor.getBoundingClientRect(); |
|
208 var labelBO = $("panellabel").boxObject; |
|
209 var labelRect = { top: labelBO.y, |
|
210 left: labelBO.x, |
|
211 bottom: labelBO.y + labelBO.height, |
|
212 right: labelBO.x + labelBO.width }; |
|
213 switch (expectedSide) { |
|
214 case "top": |
|
215 ok(labelRect.top > vwinpos + anchorRect.bottom * zoomFactor + 5, "panel label is below"); |
|
216 break; |
|
217 case "bottom": |
|
218 ok(labelRect.bottom < vwinpos + anchorRect.top * zoomFactor - 5, "panel label is above"); |
|
219 break; |
|
220 case "left": |
|
221 ok(labelRect.left > hwinpos + anchorRect.right * zoomFactor + 5, "panel label is right"); |
|
222 break; |
|
223 case "right": |
|
224 ok(labelRect.right < hwinpos + anchorRect.left * zoomFactor - 5, "panel label is left"); |
|
225 break; |
|
226 } |
|
227 |
|
228 let iscentered = false; |
|
229 if (expectedAnchorEdge.indexOf("center ") == 0) { |
|
230 expectedAnchorEdge = expectedAnchorEdge.substring(7); |
|
231 iscentered = true; |
|
232 } |
|
233 |
|
234 switch (expectedAnchorEdge) { |
|
235 case "top": |
|
236 adj = vwinpos + parseInt(getComputedStyle(panel, "").marginTop); |
|
237 if (iscentered) |
|
238 adj += Math.round(anchorRect.height) / 2; |
|
239 isWithinHalfPixel(panelRect.top, anchorRect.top * zoomFactor + adj, "anchored on top"); |
|
240 break; |
|
241 case "bottom": |
|
242 adj = vwinpos + parseInt(getComputedStyle(panel, "").marginBottom); |
|
243 if (iscentered) |
|
244 adj += Math.round(anchorRect.height) / 2; |
|
245 isWithinHalfPixel(panelRect.bottom, anchorRect.bottom * zoomFactor - adj, "anchored on bottom"); |
|
246 break; |
|
247 case "left": |
|
248 adj = hwinpos + parseInt(getComputedStyle(panel, "").marginLeft); |
|
249 if (iscentered) |
|
250 adj += Math.round(anchorRect.width) / 2; |
|
251 isWithinHalfPixel(panelRect.left, anchorRect.left * zoomFactor + adj, "anchored on left "); |
|
252 break; |
|
253 case "right": |
|
254 adj = hwinpos + parseInt(getComputedStyle(panel, "").marginRight); |
|
255 if (iscentered) |
|
256 adj += Math.round(anchorRect.width) / 2; |
|
257 isWithinHalfPixel(panelRect.right, anchorRect.right * zoomFactor - adj, "anchored on right"); |
|
258 break; |
|
259 } |
|
260 |
|
261 is(anchor, expectedAnchor, "anchor"); |
|
262 |
|
263 var arrow = document.getAnonymousElementByAttribute(panel, "anonid", "arrow"); |
|
264 is(arrow.getAttribute("side"), expectedSide, "panel arrow side"); |
|
265 is(arrow.hidden, false, "panel hidden"); |
|
266 is(arrow.parentNode.pack, expectedPack, "panel arrow pack"); |
|
267 is(panel.alignmentPosition, expectedAlignment, "panel alignmentPosition"); |
|
268 |
|
269 panel.hidePopup(); |
|
270 } |
|
271 |
|
272 function isWithinHalfPixel(a, b, desc) |
|
273 { |
|
274 ok(Math.abs(a - b) <= 0.5, desc); |
|
275 } |
|
276 |
|
277 function checkBigPanel(panel) |
|
278 { |
|
279 ok(panel.firstChild.getBoundingClientRect().height < 2800, "big panel height"); |
|
280 panel.hidePopup(); |
|
281 } |
|
282 |
|
283 SimpleTest.waitForFocus(startTest); |
|
284 |
|
285 ]]> |
|
286 </script> |
|
287 |
|
288 <body xmlns="http://www.w3.org/1999/xhtml"/> |
|
289 |
|
290 </window> |