|
1 <html> |
|
2 <!-- |
|
3 https://bugzilla.mozilla.org/show_bug.cgi?id=475006 |
|
4 https://bugzilla.mozilla.org/show_bug.cgi?id=391829 |
|
5 https://bugzilla.mozilla.org/show_bug.cgi?id=581952 |
|
6 https://bugzilla.mozilla.org/show_bug.cgi?id=558036 |
|
7 --> |
|
8 <head> |
|
9 <title>Group attributes tests</title> |
|
10 <link rel="stylesheet" type="text/css" |
|
11 href="chrome://mochikit/content/tests/SimpleTest/test.css" /> |
|
12 |
|
13 <script type="application/javascript" |
|
14 src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> |
|
15 |
|
16 <script type="application/javascript" |
|
17 src="../common.js"></script> |
|
18 <script type="application/javascript" |
|
19 src="../attributes.js"></script> |
|
20 |
|
21 <script type="application/javascript"> |
|
22 function doTest() |
|
23 { |
|
24 // aria |
|
25 testAttrs("atomic", {"atomic" : "true", "container-atomic" : "true"}, true); |
|
26 testAttrs(getNode("atomic").firstChild, {"container-atomic" : "true"}, true); |
|
27 testAbsentAttrs("atomic_false", {"atomic" : "false", "container-atomic" : "false"}); |
|
28 testAbsentAttrs(getNode("atomic_false").firstChild, {"container-atomic" : "false"}); |
|
29 |
|
30 testAttrs("autocomplete", {"autocomplete" : "true"}, true); |
|
31 testAttrs("checkbox", {"checkable" : "true"}, true); |
|
32 testAttrs("checkedCheckbox", {"checkable" : "true"}, true); |
|
33 testAttrs("checkedMenuitem", {"checkable" : "true"}, true); |
|
34 testAttrs("checkedOption", {"checkable" : "true"}, true); |
|
35 testAttrs("checkedRadio", {"checkable" : "true"}, true); |
|
36 testAttrs("checkedTreeitem", {"checkable" : "true"}, true); |
|
37 testAttrs("dropeffect", {"dropeffect" : "copy"}, true); |
|
38 testAttrs("grabbed", {"grabbed" : "true"}, true); |
|
39 testAttrs("hidden", {"hidden" : "true"}, true); |
|
40 testAbsentAttrs("hidden_false", { "hidden": "false" }); |
|
41 testAttrs("sortAscending", {"sort" : "ascending"}, true); |
|
42 testAttrs("sortDescending", {"sort" : "descending"}, true); |
|
43 testAttrs("sortNone", {"sort" : "none"}, true); |
|
44 testAttrs("sortOther", {"sort" : "other"}, true); |
|
45 |
|
46 // inherited attributes by subdocuments |
|
47 var subdoc = getAccessible("iframe").firstChild; |
|
48 testAttrs(subdoc, {"busy" : "true"}, true); |
|
49 |
|
50 // live object attribute |
|
51 |
|
52 // HTML |
|
53 testAttrs("output", {"live" : "polite"}, true); |
|
54 |
|
55 // ARIA |
|
56 testAttrs("live", {"live" : "polite"}, true); |
|
57 testAttrs("live2", {"live" : "polite"}, true); |
|
58 testAbsentAttrs("live3", {"live" : ""}); |
|
59 testAttrs("log", {"live" : "polite"}, true); |
|
60 testAttrs("logAssertive", {"live" : "assertive"}, true); |
|
61 testAttrs("marquee", {"live" : "off"}, true); |
|
62 testAttrs("status", {"live" : "polite"}, true); |
|
63 testAttrs("timer", {"live" : "off"}, true); |
|
64 testAbsentAttrs("tablist", {"live" : "polite"}); |
|
65 |
|
66 // container-live object attribute |
|
67 testAttrs("liveChild", {"container-live" : "polite"}, true); |
|
68 testAttrs("live2Child", {"container-live" : "polite"}, true); |
|
69 testAttrs("logChild", {"container-live" : "polite"}, true); |
|
70 testAttrs("logAssertiveChild", {"container-live" : "assertive"}, true); |
|
71 testAttrs("marqueeChild", {"container-live" : "off"}, true); |
|
72 testAttrs("statusChild", {"container-live" : "polite"}, true); |
|
73 testAttrs("timerChild", {"container-live" : "off"}, true); |
|
74 testAbsentAttrs("tablistChild", {"container-live" : "polite"}); |
|
75 |
|
76 // container-live-role object attribute |
|
77 testAttrs("log", {"container-live-role" : "log"}, true); |
|
78 testAttrs("logAssertive", {"container-live-role" : "log"}, true); |
|
79 testAttrs("marquee", {"container-live-role" : "marquee"}, true); |
|
80 testAttrs("status", {"container-live-role" : "status"}, true); |
|
81 testAttrs("timer", {"container-live-role" : "timer"}, true); |
|
82 testAttrs("logChild", {"container-live-role" : "log"}, true); |
|
83 testAttrs("logAssertive", {"container-live-role" : "log"}, true); |
|
84 testAttrs("logAssertiveChild", {"container-live-role" : "log"}, true); |
|
85 testAttrs("marqueeChild", {"container-live-role" : "marquee"}, true); |
|
86 testAttrs("statusChild", {"container-live-role" : "status"}, true); |
|
87 testAttrs("timerChild", {"container-live-role" : "timer"}, true); |
|
88 testAbsentAttrs("tablistChild", {"container-live-role" : "tablist"}); |
|
89 |
|
90 // absent aria-label and aria-labelledby object attribute |
|
91 testAbsentAttrs("label", {"label" : "foo"}); |
|
92 testAbsentAttrs("labelledby", {"labelledby" : "label"}); |
|
93 |
|
94 // container that has no default live attribute |
|
95 testAttrs("liveGroup", {"live" : "polite"}, true); |
|
96 testAttrs("liveGroupChild", {"container-live" : "polite"}, true); |
|
97 testAttrs("liveGroup", {"container-live-role" : "group"}, true); |
|
98 testAttrs("liveGroupChild", {"container-live-role" : "group"}, true); |
|
99 |
|
100 // text input type |
|
101 testAbsentAttrs("button", { "text-input-type": "button"}); |
|
102 testAbsentAttrs("checkbox", { "text-input-type": "checkbox"}); |
|
103 testAbsentAttrs("radio", { "text-input-type": "radio"}); |
|
104 testAttrs("email", {"text-input-type" : "email"}, true); |
|
105 testAttrs("search", {"text-input-type" : "search"}, true); |
|
106 testAttrs("tel", {"text-input-type" : "tel"}, true); |
|
107 testAttrs("url", {"text-input-type" : "url"}, true); |
|
108 |
|
109 // html |
|
110 testAttrs("radio", {"checkable" : "true"}, true); |
|
111 testAttrs("checkbox", {"checkable" : "true"}, true); |
|
112 testAttrs("draggable", {"draggable" : "true"}, true); |
|
113 testAttrs("th1", { "abbr": "SS#" }, true); |
|
114 testAttrs("th2", { "abbr": "SS#" }, true); |
|
115 testAttrs("th2", { "axis": "social" }, true); |
|
116 |
|
117 // don't barf on an empty abbr element. |
|
118 testAbsentAttrs("th3", { "abbr": "" }, true); |
|
119 |
|
120 // application accessible |
|
121 if (WIN) { |
|
122 var gfxInfo = Components.classes["@mozilla.org/gfx/info;1"]. |
|
123 getService(Components.interfaces.nsIGfxInfo); |
|
124 var attrs = { |
|
125 "D2D": (gfxInfo.D2DEnabled ? "true" : "false") |
|
126 } |
|
127 testAttrs(getApplicationAccessible(), attrs, false); |
|
128 } |
|
129 |
|
130 // no object attributes |
|
131 testAbsentAttrs(getAccessible("listitem").firstChild, { "tag": "" }); |
|
132 |
|
133 // experimental aria |
|
134 testAttrs("experimental", {"blah" : "true"}, true); |
|
135 |
|
136 SimpleTest.finish(); |
|
137 } |
|
138 |
|
139 SimpleTest.waitForExplicitFinish(); |
|
140 addA11yLoadEvent(doTest); |
|
141 </script> |
|
142 </head> |
|
143 <body> |
|
144 <a target="_blank" |
|
145 href="https://bugzilla.mozilla.org/show_bug.cgi?id=475006" |
|
146 title="Extend nsARIAMap to capture ARIA attribute characteristics"> |
|
147 Mozilla Bug 475006 |
|
148 </a> |
|
149 <a target="_blank" |
|
150 href="https://bugzilla.mozilla.org/show_bug.cgi?id=391829" |
|
151 title="Add support for container-live-role to object attributes"> |
|
152 Mozilla Bug 391829 |
|
153 </a> |
|
154 <a target="_blank" |
|
155 href="https://bugzilla.mozilla.org/show_bug.cgi?id=581952" |
|
156 title="Make explicit that aria-label is not an object attribute"> |
|
157 Mozilla Bug 475006 |
|
158 </a> |
|
159 <a target="_blank" |
|
160 href="https://bugzilla.mozilla.org/show_bug.cgi?id=558036" |
|
161 title="make HTML <output> accessible"> |
|
162 Mozilla Bug 558036 |
|
163 </a> |
|
164 <a target="_blank" |
|
165 href="https://bugzilla.mozilla.org/show_bug.cgi?id=896400" |
|
166 title="Tablist should no longer be an implicit live region"> |
|
167 Mozilla Bug 896400 |
|
168 </a> |
|
169 <a target="_blank" |
|
170 href="https://bugzilla.mozilla.org/show_bug.cgi?id=563862" |
|
171 title="Expand support for nsIAccessibleEvent::OBJECT_ATTRIBUTE_CHANGE"> |
|
172 Mozilla Bug 563862 |
|
173 </a> |
|
174 <a target="_blank" |
|
175 href="https://bugzilla.mozilla.org/show_bug.cgi?id=819303" |
|
176 title="crash in nsTextEquivUtils::AppendTextEquivFromTextContent"> |
|
177 Mozilla Bug 819303 |
|
178 </a> |
|
179 <a target="_blank" |
|
180 href="https://bugzilla.mozilla.org/show_bug.cgi?id=838407" |
|
181 title="aria-hidden false value shouldn't be exposed via object attributes"> |
|
182 Mozilla Bug 838407 |
|
183 </a> |
|
184 <p id="display"></p> |
|
185 <div id="content" style="display: none"></div> |
|
186 <pre id="test"> |
|
187 </pre> |
|
188 |
|
189 <!-- aria --> |
|
190 <div id="atomic" aria-atomic="true">live region</div> |
|
191 <div id="atomic_false" aria-atomic="false">live region</div> |
|
192 <div id="autocomplete" role="textbox" aria-autocomplete="true"></div> |
|
193 <div id="checkbox" role="checkbox"></div> |
|
194 <div id="checkedCheckbox" role="checkbox" aria-checked="true"></div> |
|
195 <div id="checkedMenuitem" role="menuitem" aria-checked="true"></div> |
|
196 <div id="checkedOption" role="option" aria-checked="true"></div> |
|
197 <div id="checkedRadio" role="radio" aria-checked="true"></div> |
|
198 <div id="checkedTreeitem" role="treeitem" aria-checked="true"></div> |
|
199 <div id="dropeffect" aria-dropeffect="copy"></div> |
|
200 <div id="grabbed" aria-grabbed="true"></div> |
|
201 <div id="hidden" aria-hidden="true"></div> |
|
202 <div id="hidden_false" aria-hidden="false"></div> |
|
203 <div id="sortAscending" role="columnheader" aria-sort="ascending"></div> |
|
204 <div id="sortDescending" role="columnheader" aria-sort="descending"></div> |
|
205 <div id="sortNone" role="columnheader" aria-sort="none"></div> |
|
206 <div id="sortOther" role="columnheader" aria-sort="other"></div> |
|
207 |
|
208 <!-- inherited from iframe --> |
|
209 <iframe id="iframe" src="data:text/html,<html><body></body></html>" |
|
210 aria-busy="true"></iframe> |
|
211 |
|
212 <!-- html --> |
|
213 <output id="output"></output> |
|
214 |
|
215 <!-- back to aria --> |
|
216 <div id="live" aria-live="polite">excuse <div id="liveChild">me</div></div> |
|
217 <div id="live2" role="marquee" aria-live="polite">excuse <div id="live2Child">me</div></div> |
|
218 <div id="live3" role="region">excuse</div> |
|
219 <div id="log" role="log">excuse <div id="logChild">me</div></div> |
|
220 <div id="logAssertive" role="log" aria-live="assertive">excuse <div id="logAssertiveChild">me</div></div> |
|
221 <div id="marquee" role="marquee">excuse <div id="marqueeChild">me</div></div> |
|
222 <div id="status" role="status">excuse <div id="statusChild">me</div></div> |
|
223 <div id="tablist" role="tablist">tablist <div id="tablistChild">tab</div></div> |
|
224 <div id="timer" role="timer">excuse <div id="timerChild">me</div></div> |
|
225 |
|
226 <!-- aria-label[ledby] should not be an object attribute --> |
|
227 <div id="label" role="checkbox" aria-label="foo"></div> |
|
228 <div id="labelledby" role="checkbox" aria-labelledby="label"></div> |
|
229 |
|
230 <!-- unusual live case --> |
|
231 <div id="liveGroup" role="group" aria-live="polite"> |
|
232 excuse <div id="liveGroupChild">me</div> |
|
233 </div> |
|
234 |
|
235 <!-- text input type --> |
|
236 <input id="button" type="button"/> |
|
237 <input id="email" type="email"/> |
|
238 <input id="search" type="search"/> |
|
239 <input id="tel" type="tel"/> |
|
240 <input id="url" type="url"/> |
|
241 |
|
242 <!-- html --> |
|
243 <input id="radio" type="radio"/> |
|
244 <input id="checkbox" type="checkbox"/> |
|
245 <div id="draggable" draggable="true">Draggable div</div> |
|
246 <table> |
|
247 <tr> |
|
248 <th id="th1"><abbr title="Social Security Number">SS#</abbr></th> |
|
249 <th id="th2" abbr="SS#" axis="social">Social Security Number</th> |
|
250 <th id="th3"><abbr></abbr></th> |
|
251 </tr> |
|
252 </table> |
|
253 |
|
254 <ul> |
|
255 <li id="listitem">item |
|
256 </ul> |
|
257 |
|
258 <!-- experimental aria --> |
|
259 <div id="experimental" aria-blah="true">Fake beer</div> |
|
260 </body> |
|
261 </html> |