Fri, 16 Jan 2015 18:13:44 +0100
Integrate suggestion from review to improve consistency with existing code.
1 <html>
3 <head>
4 <title>ARIA based nsIAccessible states testing</title>
6 <link rel="stylesheet" type="text/css"
7 href="chrome://mochikit/content/tests/SimpleTest/test.css" />
9 <style type="text/css">
10 .offscreen {
11 position: absolute;
12 left: -5000px;
13 top: -5000px;
14 height: 100px;
15 width: 100px;
16 }
17 </style>
19 <script type="application/javascript"
20 src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
22 <script type="application/javascript"
23 src="../common.js"></script>
24 <script type="application/javascript"
25 src="../role.js"></script>
26 <script type="application/javascript"
27 src="../states.js"></script>
29 <script type="application/javascript">
30 function testAriaDisabledTree(aAccOrElmOrID)
31 {
32 // test accessible and its subtree for propagated state.
33 var acc = getAccessible(aAccOrElmOrID);
34 if (!acc)
35 return;
37 var [state, extraState] = getStates(aAccOrElmOrID);
38 if (state & STATE_UNAVAILABLE) {
39 var role = getRole(acc);
40 if (role != ROLE_GROUPING) {
41 testStates(acc, STATE_FOCUSABLE);
42 }
43 }
45 // Iterate over its children to see if the state got propagated.
46 var children = null;
47 try {
48 children = acc.children;
49 } catch(e) {}
50 ok(children, "Could not get children for " + aAccOrElmOrID +"!");
52 if (children) {
53 for (var i = 0; i < children.length; i++) {
54 var childAcc = children.queryElementAt(i, nsIAccessible);
55 testAriaDisabledTree(childAcc);
56 }
57 }
58 }
60 function doTest()
61 {
62 // aria_autocomplete
63 testStates("textbox_autocomplete_inline", 0, EXT_STATE_SUPPORTS_AUTOCOMPLETION);
64 testStates("textbox_autocomplete_list", STATE_HASPOPUP, EXT_STATE_SUPPORTS_AUTOCOMPLETION);
65 testStates("textbox_autocomplete_both", STATE_HASPOPUP, EXT_STATE_SUPPORTS_AUTOCOMPLETION);
66 testStates("combobox_autocomplete_inline", STATE_HASPOPUP, EXT_STATE_SUPPORTS_AUTOCOMPLETION);
67 testStates("combobox_autocomplete_list", STATE_HASPOPUP, EXT_STATE_SUPPORTS_AUTOCOMPLETION);
68 testStates("combobox_autocomplete_both", STATE_HASPOPUP, EXT_STATE_SUPPORTS_AUTOCOMPLETION);
70 testStates("htmltext_autocomplete_list", STATE_HASPOPUP, EXT_STATE_SUPPORTS_AUTOCOMPLETION);
71 testStates("htmltextarea_autocomplete_list", STATE_HASPOPUP, EXT_STATE_SUPPORTS_AUTOCOMPLETION);
73 // aria-busy
74 testStates("textbox_busy_false", 0, 0, STATE_BUSY);
75 testStates("textbox_busy_true", STATE_BUSY);
76 testStates("textbox_busy_error", STATE_INVALID);
78 // aria-expanded
79 testStates("combobox", STATE_COLLAPSED);
80 testStates("combobox_expanded", STATE_EXPANDED);
82 // tri-state checkbox
83 var checkboxElem = getNode("check1");
84 if (checkboxElem) {
85 testStates(checkboxElem, STATE_CHECKED);
86 checkboxElem.checked = false;
87 testStates(checkboxElem, 0, 0, STATE_CHECKED);
88 checkboxElem.indeterminate = true;
89 testStates(checkboxElem, STATE_MIXED, 0);
90 }
92 // aria-checked
93 testStates("aria_checked_checkbox", STATE_CHECKED);
94 testStates("aria_mixed_checkbox", STATE_MIXED);
96 // test disabled group and all its descendants to see if they are
97 // disabled, too. See bug 429285.
98 testAriaDisabledTree("group");
100 // aria-multiline
101 testStates("aria_multiline_textbox", 0, EXT_STATE_MULTI_LINE);
103 // aria-multiselectable
104 testStates("aria_multiselectable_listbox",
105 STATE_MULTISELECTABLE | STATE_EXTSELECTABLE);
107 // aria-pressed
108 testStates("aria_pressed_button", STATE_PRESSED, 0, STATE_CHECKABLE);
109 testStates("aria_pressed_native_button", STATE_PRESSED, 0, STATE_CHECKABLE);
111 // aria-readonly
112 testStates("aria_readonly_textbox", STATE_READONLY);
114 // readonly/editable on grid and gridcell
115 testStates("aria_grid_default", 0, EXT_STATE_EDITABLE,
116 STATE_READONLY, 0);
117 testStates("aria_grid_default_colheader_readonly", STATE_READONLY, 0,
118 0, EXT_STATE_EDITABLE);
119 testStates("aria_grid_default_colheader_inherited", 0, EXT_STATE_EDITABLE,
120 STATE_READONLY, 0);
121 testStates("aria_grid_default_rowheader_readonly", STATE_READONLY, 0,
122 0, EXT_STATE_EDITABLE);
123 testStates("aria_grid_default_rowheader_inherited", 0, EXT_STATE_EDITABLE,
124 STATE_READONLY, 0);
125 testStates("aria_grid_default_cell_readonly", STATE_READONLY, 0,
126 0, EXT_STATE_EDITABLE);
127 testStates("aria_grid_default_cell_inherited", 0, EXT_STATE_EDITABLE,
128 STATE_READONLY, 0);
130 testStates("aria_grid_readonly", STATE_READONLY, 0,
131 0, EXT_STATE_EDITABLE);
132 testStates("aria_grid_readonly_colheader_editable", 0, EXT_STATE_EDITABLE,
133 STATE_READONLY, 0);
134 testStates("aria_grid_readonly_colheader_inherited", STATE_READONLY, 0,
135 0, EXT_STATE_EDITABLE);
136 testStates("aria_grid_readonly_rowheader_editable", 0, EXT_STATE_EDITABLE,
137 STATE_READONLY, 0);
138 testStates("aria_grid_readonly_rowheader_inherited", STATE_READONLY, 0,
139 0, EXT_STATE_EDITABLE);
140 testStates("aria_grid_readonly_cell_editable", 0, EXT_STATE_EDITABLE,
141 STATE_READONLY, 0);
142 testStates("aria_grid_readonly_cell_inherited", STATE_READONLY, 0,
143 0, EXT_STATE_EDITABLE);
145 // readonly/editable on treegrid and gridcell
146 testStates("aria_treegrid_default", 0, EXT_STATE_EDITABLE,
147 STATE_READONLY, 0);
148 testStates("aria_treegrid_default_colheader_readonly", STATE_READONLY, 0,
149 0, EXT_STATE_EDITABLE);
150 testStates("aria_treegrid_default_colheader_inherited", 0, EXT_STATE_EDITABLE,
151 STATE_READONLY, 0);
152 testStates("aria_treegrid_default_rowheader_readonly", STATE_READONLY, 0,
153 0, EXT_STATE_EDITABLE);
154 testStates("aria_treegrid_default_rowheader_inherited", 0, EXT_STATE_EDITABLE,
155 STATE_READONLY, 0);
156 testStates("aria_treegrid_default_cell_readonly", STATE_READONLY, 0,
157 0, EXT_STATE_EDITABLE);
158 testStates("aria_treegrid_default_cell_inherited", 0, EXT_STATE_EDITABLE,
159 STATE_READONLY, 0);
161 testStates("aria_treegrid_readonly", STATE_READONLY, 0,
162 0, EXT_STATE_EDITABLE);
163 testStates("aria_treegrid_readonly_colheader_editable", 0, EXT_STATE_EDITABLE,
164 STATE_READONLY, 0);
165 testStates("aria_treegrid_readonly_colheader_inherited", STATE_READONLY, 0,
166 0, EXT_STATE_EDITABLE);
167 testStates("aria_treegrid_readonly_rowheader_editable", 0, EXT_STATE_EDITABLE,
168 STATE_READONLY, 0);
169 testStates("aria_treegrid_readonly_rowheader_inherited", STATE_READONLY, 0,
170 0, EXT_STATE_EDITABLE);
171 testStates("aria_treegrid_readonly_cell_editable", 0, EXT_STATE_EDITABLE,
172 STATE_READONLY, 0);
173 testStates("aria_treegrid_readonly_cell_inherited", STATE_READONLY, 0,
174 0, EXT_STATE_EDITABLE);
176 // aria-selectable
177 testStates("aria_selectable_listitem", STATE_SELECTABLE | STATE_SELECTED);
179 // active state caused by aria-activedescendant
180 testStates("as_item1", 0, EXT_STATE_ACTIVE);
181 testStates("as_item2", 0, 0, 0, EXT_STATE_ACTIVE);
183 // universal ARIA properties inherited from file input control
184 var fileBrowseButton = getAccessible("fileinput").firstChild;
185 testStates(fileBrowseButton,
186 STATE_BUSY | STATE_UNAVAILABLE | STATE_REQUIRED | STATE_HASPOPUP | STATE_INVALID);
187 // No states on the label.
189 // offscreen test
190 testStates("aria_offscreen_textbox", STATE_OFFSCREEN);
192 //
193 // This section tests aria roles on links/anchors for underlying
194 // HTMLLinkAccessible creation. (see closed bug 494807)
195 //
197 // strong roles
198 testStates("aria_menuitem_link", 0, 0, STATE_LINKED);
199 testStates("aria_button_link", 0, 0, STATE_LINKED);
200 testStates("aria_checkbox_link", 0, 0, STATE_LINKED);
202 // strong landmark
203 testStates("aria_application_link", 0, 0, STATE_LINKED);
204 testStates("aria_application_anchor", 0, 0, STATE_SELECTABLE);
206 // strange cases
207 testStates("aria_link_link", STATE_LINKED);
208 testStates("aria_link_anchor", STATE_SELECTABLE);
210 // some weak landmarks
211 testStates("aria_main_link", STATE_LINKED);
212 testStates("aria_navigation_link", STATE_LINKED);
213 testStates("aria_main_anchor", STATE_SELECTABLE);
214 testStates("aria_navigation_anchor", STATE_SELECTABLE);
216 // aria-orientation (applied to scrollbar, separator, slider)
217 testStates("aria_scrollbar", 0, EXT_STATE_VERTICAL, 0, EXT_STATE_HORIZONTAL);
218 testStates("aria_hscrollbar", 0, EXT_STATE_HORIZONTAL, 0, EXT_STATE_VERTICAL);
219 testStates("aria_vscrollbar", 0, EXT_STATE_VERTICAL, 0, EXT_STATE_HORIZONTAL);
220 testStates("aria_separator", 0, EXT_STATE_HORIZONTAL, 0, EXT_STATE_VERTICAL);
221 testStates("aria_hseparator", 0, EXT_STATE_HORIZONTAL, 0, EXT_STATE_VERTICAL);
222 testStates("aria_vseparator", 0, EXT_STATE_VERTICAL, 0, EXT_STATE_HORIZONTAL);
223 testStates("aria_slider", 0, EXT_STATE_HORIZONTAL, 0, EXT_STATE_VERTICAL);
224 testStates("aria_hslider", 0, EXT_STATE_HORIZONTAL, 0, EXT_STATE_VERTICAL);
225 testStates("aria_vslider", 0, EXT_STATE_VERTICAL, 0, EXT_STATE_HORIZONTAL);
227 // indeterminate ARIA progressbars (no aria-valuenow or aria-valuetext attribute)
228 // should expose mixed state
229 testStates("aria_progressbar", STATE_MIXED);
230 testStates("aria_progressbar_valuenow", 0, 0, STATE_MIXED);
231 testStates("aria_progressbar_valuetext", 0, 0, STATE_MIXED);
233 testStates("aria_listbox", STATE_FOCUSABLE);
234 testStates("aria_grid", STATE_FOCUSABLE);
235 testStates("aria_tree", STATE_FOCUSABLE);
236 testStates("aria_treegrid", STATE_FOCUSABLE);
237 testStates("aria_listbox_disabled", 0, 0, STATE_FOCUSABLE);
238 testStates("aria_grid_disabled", 0, 0, STATE_FOCUSABLE);
239 testStates("aria_tree_disabled", 0, 0, STATE_FOCUSABLE);
240 testStates("aria_treegrid_disabled", 0, 0, STATE_FOCUSABLE);
241 SimpleTest.finish();
242 }
244 SimpleTest.waitForExplicitFinish();
245 addA11yLoadEvent(doTest);
246 </script>
248 </head>
250 <body>
252 <a target="_blank"
253 href="https://bugzilla.mozilla.org/show_bug.cgi?id=457219"
254 title="nsIAccessible states testing">
255 Mozilla Bug 457219
256 </a><br />
257 <a target="_blank"
258 href="https://bugzilla.mozilla.org/show_bug.cgi?id=429285"
259 title="Propagate aria-disabled to descendants">
260 Mozilla Bug 429285
261 </a>
262 <a target="_blank"
263 href="https://bugzilla.mozilla.org/show_bug.cgi?id=457226"
264 title="Mochitests for ARIA states">
265 Mozilla Bug 457226
266 </a>
267 <a target="_blank"
268 href="https://bugzilla.mozilla.org/show_bug.cgi?id=499653"
269 title="Unify ARIA state attributes mapping rules">
270 Mozilla Bug 499653
271 </a>
272 <a target="_blank"
273 href="https://bugzilla.mozilla.org/show_bug.cgi?id=681674"
274 title="aria-autocomplete not supported on standard form text input controls">
275 Mozilla Bug 681674
276 </a>
277 <a target="_blank"
278 href="https://bugzilla.mozilla.org/show_bug.cgi?id=681674"
279 title="aria-orientation should be applied to separator and slider roles">
280 Mozilla Bug 681674
281 </a>
282 <a target="_blank"
283 href="https://bugzilla.mozilla.org/show_bug.cgi?id=689847"
284 title="Expose active state on current item of selectable widgets">
285 Mozilla Bug 689847
286 </a>
287 <a target="_blank"
288 href="https://bugzilla.mozilla.org/show_bug.cgi?id=699017"
289 title="File input control should be propogate states to descendants">
290 Mozilla Bug 699017
291 </a>
292 <a target="_blank"
293 href="https://bugzilla.mozilla.org/show_bug.cgi?id=690199"
294 title="ARIA select widget should expose focusable state regardless the way they manage its children">
295 Mozilla Bug 690199
296 </a>
297 <a target="_blank"
298 href="https://bugzilla.mozilla.org/show_bug.cgi?id=740851"
299 title="ARIA undetermined progressmeters should expose mixed state">
300 Mozilla Bug 740851
301 </a>
302 <a target="_blank"
303 href="https://bugzilla.mozilla.org/show_bug.cgi?id=762876"
304 title="fix default horizontal / vertical state of role=scrollbar and ensure only one of horizontal / vertical states is exposed">
305 Mozilla Bug 762876
306 </a>
307 <a target="_blank"
308 href="https://bugzilla.mozilla.org/show_bug.cgi?id=892091"
309 title="ARIA treegrid should be editable by default">
310 Bug 892091
311 </a>
312 <a target="_blank"
313 href="https://bugzilla.mozilla.org/show_bug.cgi?id=835121"
314 title="ARIA grid should be editable by default">
315 Mozilla Bug 835121
316 </a>
317 <a target="_blank"
318 href="https://bugzilla.mozilla.org/show_bug.cgi?id=989958"
319 title="Pressed state is not exposed on a button element with aria-pressed attribute"
320 Mozilla Bug 989958
321 </a>
323 <p id="display"></p>
324 <div id="content" style="display: none"></div>
325 <pre id="test">
326 </pre>
328 <div id="textbox_autocomplete_inline" role="textbox" aria-autocomplete="inline"></div>
329 <div id="textbox_autocomplete_list" role="textbox" aria-autocomplete="list"></div>
330 <div id="textbox_autocomplete_both" role="textbox" aria-autocomplete="both"></div>
331 <div id="combobox_autocomplete_inline" role="combobox" aria-autocomplete="inline"></div>
332 <div id="combobox_autocomplete_list" role="combobox" aria-autocomplete="list"></div>
333 <div id="combobox_autocomplete_both" role="combobox" aria-autocomplete="both"></div>
335 <input id="htmltext_autocomplete_list" type="text" aria-autocomplete="list" />
336 <textarea id="htmltextarea_autocomplete_list" aria-autocomplete="list"></textarea>
338 <div id="textbox_busy_false" role="textbox" aria-busy="false"></div>
339 <div id="textbox_busy_true" role="textbox" aria-busy="true"></div>
340 <div id="textbox_busy_error" role="textbox" aria-busy="error"></div>
342 <div id="combobox" role="combobox">combobox</div>
343 <div id="combobox_expanded" role="combobox"
344 aria-expanded="true">combobox</div>
346 <input type="checkbox" id="check1" value="I agree" checked="true"/>
348 <div id="aria_checked_checkbox" role="checkbox" aria-checked="true">
349 I agree
350 </div>
352 <div id="aria_mixed_checkbox" role="checkbox" aria-checked="mixed">
353 I might agree
354 </div>
355 <div id="aria_multiline_textbox" role="textbox" aria-multiline="true"></div>
356 <div id="aria_multiselectable_listbox" role="listbox" aria-multiselectable="true"></div>
357 <div id="aria_pressed_button" role="button" aria-pressed="true">Button</div>
358 <button id="aria_pressed_native_button" aria-pressed="true">Button</button>
360 <div id="aria_readonly_textbox"
361 role="textbox" aria-readonly="true">This text should be readonly</div>
363 <div id="aria_grid_default" role="grid">
364 <div role="row">
365 <div id="aria_grid_default_colheader_readonly"
366 role="columnheader" aria-readonly="true">colheader1</div>
367 <div id="aria_grid_default_colheader_inherited"
368 role="columnheader">colheader2</div>
369 </div>
370 <div role="row">
371 <div id="aria_grid_default_rowheader_readonly"
372 role="rowheader" aria-readonly="true">rowheader1</div>
373 <div id="aria_grid_default_rowheader_inherited"
374 role="rowheader">rowheader2</div>
375 </div>
376 <div role="row">
377 <div id="aria_grid_default_cell_readonly"
378 role="gridcell" aria-readonly="true">gridcell1</div>
379 <div id="aria_grid_default_cell_inherited"
380 role="gridcell">gridcell2</div>
381 </div>
382 </div>
384 <div id="aria_grid_readonly" role="grid" aria-readonly="true">
385 <div role="row">
386 <div id="aria_grid_readonly_colheader_editable"
387 role="columnheader" aria-readonly="false">colheader1</div>
388 <div id="aria_grid_readonly_colheader_inherited"
389 role="columnheader">colheader2</div>
390 </div>
391 <div role="row">
392 <div id="aria_grid_readonly_rowheader_editable"
393 role="rowheader" aria-readonly="false">rowheader1</div>
394 <div id="aria_grid_readonly_rowheader_inherited"
395 role="rowheader">rowheader2</div>
396 </div>
397 <div role="row">
398 <div id="aria_grid_readonly_cell_editable"
399 role="gridcell" aria-readonly="false">gridcell1</div>
400 <div id="aria_grid_readonly_cell_inherited"
401 role="gridcell">gridcell2</div>
402 </div>
403 </div>
405 <div id="aria_treegrid_default" role="grid">
406 <div role="row">
407 <div id="aria_treegrid_default_colheader_readonly"
408 role="columnheader" aria-readonly="true">colheader1</div>
409 <div id="aria_treegrid_default_colheader_inherited"
410 role="columnheader">colheader2</div>
411 </div>
412 <div role="row">
413 <div id="aria_treegrid_default_rowheader_readonly"
414 role="rowheader" aria-readonly="true">rowheader1</div>
415 <div id="aria_treegrid_default_rowheader_inherited"
416 role="rowheader">rowheader2</div>
417 </div>
418 <div role="row">
419 <div id="aria_treegrid_default_cell_readonly"
420 role="gridcell" aria-readonly="true">gridcell1</div>
421 <div id="aria_treegrid_default_cell_inherited"
422 role="gridcell">gridcell2</div>
423 </div>
424 </div>
426 <div id="aria_treegrid_readonly" role="grid" aria-readonly="true">
427 <div role="row">
428 <div id="aria_treegrid_readonly_colheader_editable"
429 role="columnheader" aria-readonly="false">colheader1</div>
430 <div id="aria_treegrid_readonly_colheader_inherited"
431 role="columnheader">colheader2</div>
432 </div>
433 <div role="row">
434 <div id="aria_treegrid_readonly_rowheader_editable"
435 role="rowheader" aria-readonly="false">rowheader1</div>
436 <div id="aria_treegrid_readonly_rowheader_inherited"
437 role="rowheader">rowheader2</div>
438 </div>
439 <div role="row">
440 <div id="aria_treegrid_readonly_cell_editable"
441 role="gridcell" aria-readonly="false">gridcell1</div>
442 <div id="aria_treegrid_readonly_cell_inherited"
443 role="gridcell">gridcell2</div>
444 </div>
445 </div>
447 <div role="listbox">
448 <div id="aria_selectable_listitem" role="option" aria-selected="true">Item1</div>
449 </div>
451 <!-- Test that aria-disabled state gets propagated to all descendants -->
452 <div id="group" role="group" aria-disabled="true">
453 <button>hi</button>
454 <div tabindex="0" role="listbox" aria-activedescendant="item1">
455 <div role="option" id="item1">Item 1</div>
456 <div role="option" id="item2">Item 2</div>
457 <div role="option" id="item3">Item 3</div>
458 <div role="option" id="item4">Item 4</div>
459 </div>
460 <div role="slider" tabindex="0">A slider</div>
461 </div>
463 <!-- Test active state -->
464 <div id="as_listbox" tabindex="0" role="listbox"
465 aria-activedescendant="as_item1">
466 <div role="option" id="as_item1">Item 1</div>
467 <div role="option" id="as_item2">Item 2</div>
468 </div>
470 <!-- universal ARIA properties should be inherited by text field of file input -->
471 <input type="file" id="fileinput"
472 aria-busy="true"
473 aria-disabled="true"
474 aria-required="true"
475 aria-haspopup="true"
476 aria-invalid="true">
478 <div id="offscreen_log" role="log" class="offscreen">
479 <div id="aria_offscreen_textbox" role="textbox" aria-readonly="true">This text should be offscreen</div>
480 </div>
482 <a id="aria_menuitem_link" role="menuitem" href="foo">menuitem</a>
483 <a id="aria_button_link" role="button" href="foo">button</a>
484 <a id="aria_checkbox_link" role="checkbox" href="foo">checkbox</a>
486 <!-- strange edge case: please don't do this in the wild -->
487 <a id="aria_link_link" role="link" href="foo">link</a>
488 <a id="aria_link_anchor" role="link" name="link_anchor">link</a>
490 <!-- landmarks: links -->
491 <a id="aria_application_link" role="application" href="foo">app</a>
492 <a id="aria_main_link" role="main" href="foo">main</a>
493 <a id="aria_navigation_link" role="navigation" href="foo">nav</a>
495 <!-- landmarks: anchors -->
496 <a id="aria_application_anchor" role="application" name="app_anchor">app</a>
497 <a id="aria_main_anchor" role="main" name="main_anchor">main</a>
498 <a id="aria_navigation_anchor" role="navigation" name="nav_anchor">nav</a>
500 <!-- aria-orientation -->
501 <div id="aria_scrollbar" role="scrollbar">scrollbar</div>
502 <div id="aria_hscrollbar" role="scrollbar" aria-orientation="horizontal">horizontal scrollbar</div>
503 <div id="aria_vscrollbar" role="scrollbar" aria-orientation="vertical">vertical scrollbar</div>
504 <div id="aria_separator" role="separator">separator</div>
505 <div id="aria_hseparator" role="separator" aria-orientation="horizontal">horizontal separator</div>
506 <div id="aria_vseparator" role="separator" aria-orientation="vertical">vertical separator</div>
507 <div id="aria_slider" role="slider">slider</div>
508 <div id="aria_hslider" role="slider" aria-orientation="horizontal">horizontal slider</div>
509 <div id="aria_vslider" role="slider" aria-orientation="vertical">vertical slider</div>
511 <!-- indeterminate ARIA progressbars should expose mixed state -->
512 <div id="aria_progressbar" role="progressbar"></div>
513 <div id="aria_progressbar_valuenow" role="progressbar" aria-valuenow="1"></div>
514 <div id="aria_progressbar_valuetext" role="progressbar" aria-valuetext="value"></div>
516 <!-- ARIA select widget should expose focusable state regardless the way they manage its children -->
517 <div id="aria_listbox" role="listbox">
518 <div role="option" tabindex="0">A</div>
519 <div role="option" tabindex="0">a</div>
520 </div>
521 <div id="aria_grid" role="grid">
522 <div role="row"><div role="gridcell" tabindex="0">B</div></div></div>
523 <div role="row"><div role="gridcell" tabindex="0">b</div></div></div>
524 <div id="aria_tree" role="tree">
525 <div role="treeitem" tabindex="0">C</div>
526 <div role="treeitem" tabindex="0">c</div>
527 </div>
528 <div id="aria_treegrid" role="treegrid">
529 <div role="row"><div role="gridcell" tabindex="0">D</div></div>
530 <div role="row"><div role="gridcell" tabindex="0">d</div></div>
531 </div>
532 <div id="aria_listbox_disabled" role="listbox" aria-disabled="true">
533 <div role="option">E</div>
534 <div role="option">e</div>
535 </div>
536 <div id="aria_grid_disabled" role="grid" aria-disabled="true">
537 <div role="row"><div role="gridcell">F</div></div>
538 <div role="row"><div role="gridcell">f</div></div>
539 </div>
540 <div id="aria_tree_disabled" role="tree" aria-disabled="true">
541 <div role="treeitem">G</div>
542 <div role="treeitem">g</div>
543 </div>
544 <div id="aria_treegrid_disabled" role="treegrid" aria-disabled="true">
545 <div role="row"><div role="gridcell">H</div></div>
546 <div role="row"><div role="gridcell">h</div></div>
547 </div>
549 </body>
550 </html>