Bug 460926 A11y hierachy is broken on Ubuntu 8.10 (GNOME 2.24), r=Evan.Yan sr=roc
[wine-gecko.git] / accessible / src / base / nsARIAMap.cpp
blob8e9e672732a53bd418140cd071a8b0d21a253f86
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* vim:expandtab:shiftwidth=2:tabstop=2:
3 */
4 /* ***** BEGIN LICENSE BLOCK *****
5 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
7 * The contents of this file are subject to the Mozilla Public License Version
8 * 1.1 (the "License"); you may not use this file except in compliance with
9 * the License. You may obtain a copy of the License at
10 * http://www.mozilla.org/MPL/
12 * Software distributed under the License is distributed on an "AS IS" basis,
13 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
14 * for the specific language governing rights and limitations under the
15 * License.
17 * The Original Code is mozilla.org code.
19 * The Initial Developer of the Original Code is IBM Corporation
20 * Portions created by the Initial Developer are Copyright (C) 2007
21 * the Initial Developer. All Rights Reserved.
23 * Contributor(s):
24 * Aaron Leventhal <aleventh@us.ibm.com>
26 * Alternatively, the contents of this file may be used under the terms of
27 * either the GNU General Public License Version 2 or later (the "GPL"), or
28 * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
29 * in which case the provisions of the GPL or the LGPL are applicable instead
30 * of those above. If you wish to allow use of your version of this file only
31 * under the terms of either the GPL or the LGPL, and not to allow others to
32 * use your version of this file under the terms of the MPL, indicate your
33 * decision by deleting the provisions above and replace them with the notice
34 * and other provisions required by the GPL or the LGPL. If you do not delete
35 * the provisions above, a recipient may use your version of this file under
36 * the terms of any one of the MPL, the GPL or the LGPL.
38 * ***** END LICENSE BLOCK ***** */
40 #include "nsARIAMap.h"
41 #include "nsIAccessibleRole.h"
42 #include "nsIAccessibleStates.h"
44 /**
45 * This list of WAI-defined roles are currently hardcoded.
46 * Eventually we will most likely be loading an RDF resource that contains this information
47 * Using RDF will also allow for role extensibility. See bug 280138.
49 * Definition of nsRoleMapEntry and nsStateMapEntry contains comments explaining this table.
51 * When no nsIAccessibleRole enum mapping exists for an ARIA role, the
52 * role will be exposed via the object attribute "xml-roles".
53 * In addition, in MSAA, the unmapped role will also be exposed as a BSTR string role.
55 * There are no nsIAccessibleRole enums for the following landmark roles:
56 * banner, contentinfo, main, navigation, note, search, secondary, seealso, breadcrumbs
57 */
59 static const nsStateMapEntry kEndEntry = {nsnull, 0, 0}; // To fill in array of state mappings
61 nsRoleMapEntry nsARIAMap::gWAIRoleMap[] =
64 "alert",
65 nsIAccessibleRole::ROLE_ALERT,
66 eNoValue,
67 eNoAction,
68 kNoReqStates,
69 kEndEntry
72 "alertdialog",
73 nsIAccessibleRole::ROLE_ALERT,
74 eNoValue,
75 eNoAction,
76 kNoReqStates,
77 kEndEntry
80 "application",
81 nsIAccessibleRole::ROLE_APPLICATION,
82 eNoValue,
83 eNoAction,
84 kNoReqStates,
85 kEndEntry
88 "article",
89 nsIAccessibleRole::ROLE_DOCUMENT,
90 eNoValue,
91 eNoAction,
92 kNoReqStates,
93 kEndEntry
96 "button",
97 nsIAccessibleRole::ROLE_PUSHBUTTON,
98 eNoValue,
99 eClickAction,
100 kNoReqStates,
101 {&nsAccessibilityAtoms::aria_pressed, kBoolState, nsIAccessibleStates::STATE_PRESSED},
102 {&nsAccessibilityAtoms::aria_pressed, "mixed", nsIAccessibleStates::STATE_MIXED},
103 kEndEntry
106 "checkbox",
107 nsIAccessibleRole::ROLE_CHECKBUTTON,
108 eNoValue,
109 eCheckUncheckAction,
110 nsIAccessibleStates::STATE_CHECKABLE,
111 {&nsAccessibilityAtoms::aria_checked, kBoolState, nsIAccessibleStates::STATE_CHECKED},
112 {&nsAccessibilityAtoms::aria_checked, "mixed", nsIAccessibleStates::STATE_MIXED},
113 {&nsAccessibilityAtoms::aria_readonly, kBoolState, nsIAccessibleStates::STATE_READONLY},
114 kEndEntry
117 "columnheader",
118 nsIAccessibleRole::ROLE_COLUMNHEADER,
119 eNoValue,
120 eNoAction,
121 kNoReqStates,
122 {&nsAccessibilityAtoms::aria_selected, kBoolState, nsIAccessibleStates::STATE_SELECTED | nsIAccessibleStates::STATE_SELECTABLE},
123 {&nsAccessibilityAtoms::aria_selected, "false", nsIAccessibleStates::STATE_SELECTABLE},
124 {&nsAccessibilityAtoms::aria_readonly, kBoolState, nsIAccessibleStates::STATE_READONLY},
125 kEndEntry
128 "combobox",
129 nsIAccessibleRole::ROLE_COMBOBOX,
130 eHasValueMinMax,
131 eOpenCloseAction,
132 nsIAccessibleStates::STATE_COLLAPSED | nsIAccessibleStates::STATE_HASPOPUP,
133 // Manually map EXT_STATE_SUPPORTS_AUTOCOMPLETION aria-autocomplete
134 {&nsAccessibilityAtoms::aria_readonly, kBoolState, nsIAccessibleStates::STATE_READONLY},
135 {&nsAccessibilityAtoms::aria_expanded, kBoolState, nsIAccessibleStates::STATE_EXPANDED},
136 kEndEntry
139 "description",
140 nsIAccessibleRole::ROLE_TEXT_CONTAINER,
141 eNoValue,
142 eNoAction,
143 kNoReqStates,
144 kEndEntry
147 "dialog",
148 nsIAccessibleRole::ROLE_DIALOG,
149 eNoValue,
150 eNoAction,
151 kNoReqStates,
152 kEndEntry
155 "document",
156 nsIAccessibleRole::ROLE_DOCUMENT,
157 eNoValue,
158 eNoAction,
159 kNoReqStates,
160 kEndEntry
163 "grid",
164 nsIAccessibleRole::ROLE_TABLE,
165 eNoValue,
166 eNoAction,
167 nsIAccessibleStates::STATE_FOCUSABLE,
168 {&nsAccessibilityAtoms::aria_multiselectable, kBoolState, nsIAccessibleStates::STATE_MULTISELECTABLE | nsIAccessibleStates::STATE_EXTSELECTABLE},
169 {&nsAccessibilityAtoms::aria_readonly, kBoolState, nsIAccessibleStates::STATE_READONLY},
170 kEndEntry
173 "gridcell",
174 nsIAccessibleRole::ROLE_CELL,
175 eNoValue,
176 eNoAction,
177 kNoReqStates,
178 {&nsAccessibilityAtoms::aria_expanded, kBoolState, nsIAccessibleStates::STATE_EXPANDED},
179 {&nsAccessibilityAtoms::aria_expanded, "false", nsIAccessibleStates::STATE_COLLAPSED},
180 {&nsAccessibilityAtoms::aria_selected, kBoolState, nsIAccessibleStates::STATE_SELECTED | nsIAccessibleStates::STATE_SELECTABLE},
181 {&nsAccessibilityAtoms::aria_selected, "false", nsIAccessibleStates::STATE_SELECTABLE},
182 {&nsAccessibilityAtoms::aria_readonly, kBoolState, nsIAccessibleStates::STATE_READONLY},
183 kEndEntry
186 "group",
187 nsIAccessibleRole::ROLE_GROUPING,
188 eNoValue,
189 eNoAction,
190 kNoReqStates,
191 kEndEntry
194 "heading",
195 nsIAccessibleRole::ROLE_HEADING,
196 eNoValue,
197 eNoAction,
198 kNoReqStates,
199 kEndEntry
202 "img",
203 nsIAccessibleRole::ROLE_GRAPHIC,
204 eNoValue,
205 eNoAction,
206 kNoReqStates,
207 kEndEntry
210 "label",
211 nsIAccessibleRole::ROLE_LABEL,
212 eNoValue,
213 eNoAction,
214 kNoReqStates,
215 kEndEntry
218 "link",
219 nsIAccessibleRole::ROLE_LINK,
220 eNoValue,
221 eJumpAction,
222 nsIAccessibleStates::STATE_LINKED,
223 kEndEntry
226 "list",
227 nsIAccessibleRole::ROLE_LIST,
228 eNoValue,
229 eNoAction,
230 nsIAccessibleStates::STATE_READONLY,
231 {&nsAccessibilityAtoms::aria_multiselectable, kBoolState, nsIAccessibleStates::STATE_MULTISELECTABLE | nsIAccessibleStates::STATE_EXTSELECTABLE},
232 kEndEntry
235 "listbox",
236 nsIAccessibleRole::ROLE_LISTBOX,
237 eNoValue,
238 eNoAction,
239 kNoReqStates,
240 {&nsAccessibilityAtoms::aria_readonly, kBoolState, nsIAccessibleStates::STATE_READONLY},
241 {&nsAccessibilityAtoms::aria_multiselectable, kBoolState, nsIAccessibleStates::STATE_MULTISELECTABLE | nsIAccessibleStates::STATE_EXTSELECTABLE},
242 kEndEntry
245 "listitem",
246 nsIAccessibleRole::ROLE_LISTITEM,
247 eNoValue,
248 eNoAction, // XXX: should depend on state, parent accessible
249 nsIAccessibleStates::STATE_READONLY,
250 {&nsAccessibilityAtoms::aria_selected, kBoolState, nsIAccessibleStates::STATE_SELECTED | nsIAccessibleStates::STATE_SELECTABLE},
251 {&nsAccessibilityAtoms::aria_selected, "false", nsIAccessibleStates::STATE_SELECTABLE},
252 {&nsAccessibilityAtoms::aria_checked, kBoolState, nsIAccessibleStates::STATE_CHECKED | nsIAccessibleStates::STATE_CHECKABLE},
253 {&nsAccessibilityAtoms::aria_checked, "mixed", nsIAccessibleStates::STATE_MIXED | nsIAccessibleStates::STATE_CHECKABLE},
254 {&nsAccessibilityAtoms::aria_checked, "false", nsIAccessibleStates::STATE_CHECKABLE},
255 kEndEntry
258 "math",
259 nsIAccessibleRole::ROLE_FLAT_EQUATION,
260 eNoValue,
261 eNoAction,
262 kNoReqStates,
263 kEndEntry
266 "menu",
267 nsIAccessibleRole::ROLE_MENUPOPUP,
268 eNoValue,
269 eNoAction, // XXX: technically accessibles of menupopup role haven't
270 // any action, but menu can be open or close.
271 kNoReqStates,
272 kEndEntry
275 "menubar",
276 nsIAccessibleRole::ROLE_MENUBAR,
277 eNoValue,
278 eNoAction,
279 kNoReqStates,
280 kEndEntry
283 "menuitem",
284 nsIAccessibleRole::ROLE_MENUITEM,
285 eNoValue,
286 eClickAction,
287 kNoReqStates,
288 {&nsAccessibilityAtoms::aria_checked, kBoolState, nsIAccessibleStates::STATE_CHECKED | nsIAccessibleStates::STATE_CHECKABLE},
289 {&nsAccessibilityAtoms::aria_checked, "mixed", nsIAccessibleStates::STATE_MIXED | nsIAccessibleStates::STATE_CHECKABLE},
290 {&nsAccessibilityAtoms::aria_checked, "false", nsIAccessibleStates::STATE_CHECKABLE},
291 kEndEntry
294 "menuitemcheckbox",
295 nsIAccessibleRole::ROLE_CHECK_MENU_ITEM,
296 eNoValue,
297 eClickAction,
298 nsIAccessibleStates::STATE_CHECKABLE,
299 {&nsAccessibilityAtoms::aria_checked, kBoolState, nsIAccessibleStates::STATE_CHECKED },
300 {&nsAccessibilityAtoms::aria_checked, "mixed", nsIAccessibleStates::STATE_MIXED},
301 kEndEntry
304 "menuitemradio",
305 nsIAccessibleRole::ROLE_RADIO_MENU_ITEM,
306 eNoValue,
307 eClickAction,
308 nsIAccessibleStates::STATE_CHECKABLE,
309 {&nsAccessibilityAtoms::aria_checked, kBoolState, nsIAccessibleStates::STATE_CHECKED },
310 kEndEntry
313 "option",
314 nsIAccessibleRole::ROLE_OPTION,
315 eNoValue,
316 eSelectAction,
317 kNoReqStates,
318 {&nsAccessibilityAtoms::aria_selected, kBoolState, nsIAccessibleStates::STATE_SELECTED | nsIAccessibleStates::STATE_SELECTABLE},
319 {&nsAccessibilityAtoms::aria_selected, "false", nsIAccessibleStates::STATE_SELECTABLE},
320 {&nsAccessibilityAtoms::aria_checked, kBoolState, nsIAccessibleStates::STATE_CHECKED | nsIAccessibleStates::STATE_CHECKABLE},
321 {&nsAccessibilityAtoms::aria_checked, "mixed", nsIAccessibleStates::STATE_MIXED | nsIAccessibleStates::STATE_CHECKABLE},
322 {&nsAccessibilityAtoms::aria_checked, "false", nsIAccessibleStates::STATE_CHECKABLE},
323 kEndEntry
326 "presentation",
327 nsIAccessibleRole::ROLE_NOTHING,
328 eNoValue,
329 eNoAction,
330 kNoReqStates,
331 kEndEntry
334 "progressbar",
335 nsIAccessibleRole::ROLE_PROGRESSBAR,
336 eHasValueMinMax,
337 eNoAction,
338 nsIAccessibleStates::STATE_READONLY,
339 kEndEntry
342 "radio",
343 nsIAccessibleRole::ROLE_RADIOBUTTON,
344 eNoValue,
345 eSelectAction,
346 kNoReqStates,
347 {&nsAccessibilityAtoms::aria_checked, kBoolState, nsIAccessibleStates::STATE_CHECKED},
348 kEndEntry
351 "radiogroup",
352 nsIAccessibleRole::ROLE_GROUPING,
353 eNoValue,
354 eNoAction,
355 kNoReqStates,
356 kEndEntry
359 "region",
360 nsIAccessibleRole::ROLE_PANE,
361 eNoValue,
362 eNoAction,
363 kNoReqStates,
364 kEndEntry
367 "row",
368 nsIAccessibleRole::ROLE_ROW,
369 eNoValue,
370 eNoAction,
371 kNoReqStates,
372 {&nsAccessibilityAtoms::aria_selected, kBoolState, nsIAccessibleStates::STATE_SELECTED | nsIAccessibleStates::STATE_SELECTABLE},
373 {&nsAccessibilityAtoms::aria_selected, "false", nsIAccessibleStates::STATE_SELECTABLE},
374 {&nsAccessibilityAtoms::aria_expanded, kBoolState, nsIAccessibleStates::STATE_EXPANDED},
375 {&nsAccessibilityAtoms::aria_expanded, "false", nsIAccessibleStates::STATE_COLLAPSED},
376 kEndEntry
379 "rowheader",
380 nsIAccessibleRole::ROLE_ROWHEADER,
381 eNoValue,
382 eNoAction,
383 kNoReqStates,
384 {&nsAccessibilityAtoms::aria_selected, kBoolState, nsIAccessibleStates::STATE_SELECTED | nsIAccessibleStates::STATE_SELECTABLE},
385 {&nsAccessibilityAtoms::aria_selected, "false", nsIAccessibleStates::STATE_SELECTABLE},
386 {&nsAccessibilityAtoms::aria_readonly, kBoolState, nsIAccessibleStates::STATE_READONLY},
387 kEndEntry
390 "section",
391 nsIAccessibleRole::ROLE_SECTION,
392 eNoValue,
393 eNoAction,
394 kNoReqStates,
395 kEndEntry
398 "separator",
399 nsIAccessibleRole::ROLE_SEPARATOR,
400 eNoValue,
401 eNoAction,
402 kNoReqStates,
403 kEndEntry
406 "slider",
407 nsIAccessibleRole::ROLE_SLIDER,
408 eHasValueMinMax,
409 eNoAction,
410 kNoReqStates,
411 {&nsAccessibilityAtoms::aria_readonly, kBoolState, nsIAccessibleStates::STATE_READONLY},
412 kEndEntry
415 "spinbutton",
416 nsIAccessibleRole::ROLE_SPINBUTTON,
417 eHasValueMinMax,
418 eNoAction,
419 kNoReqStates,
420 {&nsAccessibilityAtoms::aria_readonly, kBoolState, nsIAccessibleStates::STATE_READONLY},
421 kEndEntry
424 "status",
425 nsIAccessibleRole::ROLE_STATUSBAR,
426 eNoValue,
427 eNoAction,
428 kNoReqStates,
429 kEndEntry
432 "tab",
433 nsIAccessibleRole::ROLE_PAGETAB,
434 eNoValue,
435 eSwitchAction,
436 kNoReqStates,
437 kEndEntry
440 "tablist",
441 nsIAccessibleRole::ROLE_PAGETABLIST,
442 eNoValue,
443 eNoAction,
444 kNoReqStates,
445 kEndEntry
448 "tabpanel",
449 nsIAccessibleRole::ROLE_PROPERTYPAGE,
450 eNoValue,
451 eNoAction,
452 kNoReqStates,
453 kEndEntry
456 "textbox",
457 nsIAccessibleRole::ROLE_ENTRY,
458 eNoValue,
459 eActivateAction,
460 kNoReqStates,
461 // Manually map EXT_STATE_SINGLE_LINE and EXT_STATE_MULTI_LINE FROM aria-multiline
462 // Manually map EXT_STATE_SUPPORTS_AUTOCOMPLETION aria-autocomplete
463 {&nsAccessibilityAtoms::aria_autocomplete, "list", nsIAccessibleStates::STATE_HASPOPUP},
464 {&nsAccessibilityAtoms::aria_autocomplete, "both", nsIAccessibleStates::STATE_HASPOPUP},
465 {&nsAccessibilityAtoms::aria_readonly, kBoolState, nsIAccessibleStates::STATE_READONLY},
466 kEndEntry
469 "toolbar",
470 nsIAccessibleRole::ROLE_TOOLBAR,
471 eNoValue,
472 eNoAction,
473 kNoReqStates,
474 kEndEntry
477 "tooltip",
478 nsIAccessibleRole::ROLE_TOOLTIP,
479 eNoValue,
480 eNoAction,
481 kNoReqStates,
482 kEndEntry
485 "tree",
486 nsIAccessibleRole::ROLE_OUTLINE,
487 eNoValue,
488 eNoAction,
489 kNoReqStates,
490 {&nsAccessibilityAtoms::aria_readonly, kBoolState, nsIAccessibleStates::STATE_READONLY},
491 {&nsAccessibilityAtoms::aria_multiselectable, kBoolState, nsIAccessibleStates::STATE_MULTISELECTABLE | nsIAccessibleStates::STATE_EXTSELECTABLE},
492 kEndEntry
495 "treegrid",
496 nsIAccessibleRole::ROLE_TREE_TABLE,
497 eNoValue,
498 eNoAction,
499 kNoReqStates,
500 {&nsAccessibilityAtoms::aria_readonly, kBoolState, nsIAccessibleStates::STATE_READONLY},
501 {&nsAccessibilityAtoms::aria_multiselectable, kBoolState, nsIAccessibleStates::STATE_MULTISELECTABLE | nsIAccessibleStates::STATE_EXTSELECTABLE},
502 kEndEntry
505 "treeitem",
506 nsIAccessibleRole::ROLE_OUTLINEITEM,
507 eNoValue,
508 eActivateAction, // XXX: should expose second 'expand/collapse' action based
509 // on states
510 kNoReqStates,
511 {&nsAccessibilityAtoms::aria_selected, kBoolState, nsIAccessibleStates::STATE_SELECTED | nsIAccessibleStates::STATE_SELECTABLE},
512 {&nsAccessibilityAtoms::aria_selected, "false", nsIAccessibleStates::STATE_SELECTABLE},
513 {&nsAccessibilityAtoms::aria_expanded, kBoolState, nsIAccessibleStates::STATE_EXPANDED},
514 {&nsAccessibilityAtoms::aria_expanded, "false", nsIAccessibleStates::STATE_COLLAPSED},
515 {&nsAccessibilityAtoms::aria_checked, kBoolState, nsIAccessibleStates::STATE_CHECKED | nsIAccessibleStates::STATE_CHECKABLE},
516 {&nsAccessibilityAtoms::aria_checked, "mixed", nsIAccessibleStates::STATE_MIXED | nsIAccessibleStates::STATE_CHECKABLE},
517 {&nsAccessibilityAtoms::aria_checked, "false", nsIAccessibleStates::STATE_CHECKABLE},
521 PRUint32 nsARIAMap::gWAIRoleMapLength = NS_ARRAY_LENGTH(nsARIAMap::gWAIRoleMap);
523 nsRoleMapEntry nsARIAMap::gLandmarkRoleMap = {
525 nsIAccessibleRole::ROLE_NOTHING,
526 eNoValue,
527 eNoAction,
528 kNoReqStates,
529 kEndEntry
532 nsRoleMapEntry nsARIAMap::gEmptyRoleMap = {
534 nsIAccessibleRole::ROLE_NOTHING,
535 eNoValue,
536 eNoAction,
537 kNoReqStates,
538 kEndEntry
542 * Universal states:
543 * The following state rules are applied to any accessible element,
544 * whether there is an ARIA role or not:
546 nsStateMapEntry nsARIAMap::gWAIUnivStateMap[] = {
547 {&nsAccessibilityAtoms::aria_required, kBoolState, nsIAccessibleStates::STATE_REQUIRED},
548 {&nsAccessibilityAtoms::aria_invalid, kBoolState, nsIAccessibleStates::STATE_INVALID},
549 {&nsAccessibilityAtoms::aria_haspopup, kBoolState, nsIAccessibleStates::STATE_HASPOPUP},
550 {&nsAccessibilityAtoms::aria_busy, "true", nsIAccessibleStates::STATE_BUSY},
551 {&nsAccessibilityAtoms::aria_busy, "error", nsIAccessibleStates::STATE_INVALID},
552 {&nsAccessibilityAtoms::aria_disabled, kBoolState, nsIAccessibleStates::STATE_UNAVAILABLE},
553 kEndEntry