|
1 <html> |
|
2 <head> |
|
3 <title>visibility state testing</title> |
|
4 |
|
5 <link rel="stylesheet" type="text/css" |
|
6 href="chrome://mochikit/content/tests/SimpleTest/test.css" /> |
|
7 |
|
8 <script type="application/javascript" |
|
9 src="chrome://mochikit/content/MochiKit/packed.js"></script> |
|
10 <script type="application/javascript" |
|
11 src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> |
|
12 |
|
13 <script type="application/javascript" |
|
14 src="../common.js"></script> |
|
15 <script type="application/javascript" |
|
16 src="../role.js"></script> |
|
17 <script type="application/javascript" |
|
18 src="../states.js"></script> |
|
19 <script type="application/javascript" |
|
20 src="../events.js"></script> |
|
21 <script type="application/javascript" |
|
22 src="../browser.js"></script> |
|
23 |
|
24 <script type="application/javascript"> |
|
25 //////////////////////////////////////////////////////////////////////////// |
|
26 // Invokers |
|
27 |
|
28 function loadURIInvoker(aURI, aFunc) |
|
29 { |
|
30 this.invoke = function loadURIInvoker_invoke() |
|
31 { |
|
32 tabBrowser().loadURI(aURI); |
|
33 } |
|
34 |
|
35 this.eventSeq = [ |
|
36 new invokerChecker(EVENT_DOCUMENT_LOAD_COMPLETE, currentTabDocument) |
|
37 ]; |
|
38 |
|
39 this.finalCheck = function loadURIInvoker_finalCheck() |
|
40 { |
|
41 aFunc.call(); |
|
42 } |
|
43 |
|
44 this.getID = function loadURIInvoker_getID() |
|
45 { |
|
46 return "load uri " + aURI; |
|
47 } |
|
48 } |
|
49 |
|
50 function addTabInvoker(aURL, aFunc) |
|
51 { |
|
52 this.eventSeq = [ |
|
53 new invokerChecker(EVENT_DOCUMENT_LOAD_COMPLETE, tabDocumentAt, 1) |
|
54 ]; |
|
55 |
|
56 this.invoke = function addTabInvoker_invoke() |
|
57 { |
|
58 tabBrowser().loadOneTab(aURL, null, "", null, false); |
|
59 } |
|
60 |
|
61 this.finalCheck = function addTabInvoker_finalCheck() |
|
62 { |
|
63 aFunc.call(); |
|
64 } |
|
65 |
|
66 this.getID = function addTabInvoker_getID() |
|
67 { |
|
68 return "add tab: " + aURL; |
|
69 } |
|
70 } |
|
71 |
|
72 //////////////////////////////////////////////////////////////////////////// |
|
73 // Tests |
|
74 |
|
75 function testBackgroundTab() |
|
76 { |
|
77 // Accessibles in background tab should have offscreen state and no |
|
78 // invisible state. |
|
79 var tabDoc = tabDocumentAt(0); |
|
80 var input = getAccessible(tabDoc.getElementById("input")); |
|
81 testStates(input, STATE_OFFSCREEN, 0, STATE_INVISIBLE); |
|
82 } |
|
83 |
|
84 function testScrolledOff() |
|
85 { |
|
86 var tabDoc = tabDocumentAt(1); |
|
87 |
|
88 // scrolled off |
|
89 input = getAccessible(tabDoc.getElementById("input_scrolledoff")); |
|
90 testStates(input, STATE_OFFSCREEN, 0, STATE_INVISIBLE); |
|
91 |
|
92 // scrolled off item (twice) |
|
93 var lastLiNode = tabDoc.getElementById("li_last"); |
|
94 var lastLi = getAccessible(lastLiNode); |
|
95 testStates(lastLi, STATE_OFFSCREEN, 0, STATE_INVISIBLE); |
|
96 |
|
97 // scroll into view the item |
|
98 lastLiNode.scrollIntoView(true); |
|
99 testStates(lastLi, 0, 0, STATE_OFFSCREEN | STATE_INVISIBLE); |
|
100 |
|
101 // first item is scrolled off now (testcase for bug 768786) |
|
102 var firstLi = getAccessible(tabDoc.getElementById("li_first")); |
|
103 testStates(firstLi, STATE_OFFSCREEN, 0, STATE_INVISIBLE); |
|
104 } |
|
105 |
|
106 var gInputDocURI = "data:text/html,<html><body>"; |
|
107 gInputDocURI += "<input id='input'></body></html>"; |
|
108 |
|
109 var gDocURI = "data:text/html,<html><body>"; |
|
110 gDocURI += "<div style='border:2px solid blue; width: 500px; height: 600px;'></div>"; |
|
111 gDocURI += "<input id='input_scrolledoff'>"; |
|
112 gDocURI += "<ul style='border:2px solid red; width: 100px; height: 50px; overflow: auto;'>"; |
|
113 gDocURI += " <li id='li_first'>item1</li><li>item2</li><li>item3</li>"; |
|
114 gDocURI += " <li>item4</li><li>item5</li><li id='li_last'>item6</li>"; |
|
115 gDocURI += "</ul>"; |
|
116 gDocURI += "</body></html>"; |
|
117 |
|
118 function doTests() |
|
119 { |
|
120 testStates("div", 0, 0, STATE_INVISIBLE | STATE_OFFSCREEN); |
|
121 testStates("div_off", STATE_OFFSCREEN, 0, STATE_INVISIBLE); |
|
122 testStates("div_transformed", STATE_OFFSCREEN, 0, STATE_INVISIBLE); |
|
123 testStates("div_abschild", 0, 0, STATE_INVISIBLE | STATE_OFFSCREEN); |
|
124 |
|
125 gQueue = new eventQueue(); |
|
126 |
|
127 gQueue.push(new addTabInvoker("about:blank", testBackgroundTab)); |
|
128 gQueue.push(new loadURIInvoker(gDocURI, testScrolledOff)); |
|
129 |
|
130 gQueue.onFinish = function() { closeBrowserWindow(); } |
|
131 gQueue.invoke(); // Will call SimpleTest.finish(); |
|
132 } |
|
133 |
|
134 SimpleTest.waitForExplicitFinish(); |
|
135 openBrowserWindow(doTests, gInputDocURI, { width: 600, height: 600 }); |
|
136 </script> |
|
137 |
|
138 </head> |
|
139 |
|
140 <body> |
|
141 |
|
142 <a target="_blank" |
|
143 href="https://bugzilla.mozilla.org/show_bug.cgi?id=591363" |
|
144 title="(in)visible state is not always correct?"> |
|
145 Mozilla Bug 591363 |
|
146 </a> |
|
147 <a target="_blank" |
|
148 href="https://bugzilla.mozilla.org/show_bug.cgi?id=768786" |
|
149 title="Offscreen state is not exposed under certain circumstances"> |
|
150 Mozilla Bug 768786 |
|
151 </a> |
|
152 <p id="display"></p> |
|
153 <div id="content" style="display: none"></div> |
|
154 <pre id="test"> |
|
155 </pre> |
|
156 |
|
157 <div id="outer_div"> |
|
158 |
|
159 <!-- trivial cases --> |
|
160 <div id="div">div</div> |
|
161 <div id="div_off" style="position: absolute; left:-999px; top:-999px"> |
|
162 offscreen! |
|
163 </div> |
|
164 <div id="div_transformed" style="transform: translate(-999px, -999px);"> |
|
165 transformed! |
|
166 </div> |
|
167 |
|
168 <!-- edge case: no rect but has out of flow child --> |
|
169 <div id="div_abschild"> |
|
170 <p style="position: absolute; left: 120px; top:120px;">absolute</p> |
|
171 </div> |
|
172 |
|
173 </div> |
|
174 </body> |
|
175 </html> |