Fix for bug 373364 - implement IA2:role. r=aaronlev

git-svn-id: svn://10.0.0.236/trunk@221681 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
surkov.alexander%gmail.com
2007-03-10 03:00:08 +00:00
parent 17248ec479
commit aae1d4ef4a
2 changed files with 388 additions and 132 deletions

View File

@@ -465,8 +465,9 @@ STDMETHODIMP nsAccessibleWrap::get_accRole(
PRUint32 xpRole = 0, msaaRole = 0;
if (NS_FAILED(xpAccessible->GetFinalRole(&xpRole)))
return E_FAIL;
msaaRole = msaaRoleMap[xpRole];
NS_ASSERTION(msaaRoleMap[nsIAccessible::ROLE_LAST_ENTRY] == ROLE_MSAA_LAST_ENTRY,
msaaRole = gWindowsRoleMap[xpRole].msaaRole;
NS_ASSERTION(gWindowsRoleMap[nsIAccessible::ROLE_LAST_ENTRY].msaaRole == ROLE_WINDOWS_LAST_ENTRY,
"MSAA role map skewed");
// Special case, not a great place for this, but it's better than adding extra role buttonmenu role to ARIA
@@ -487,11 +488,15 @@ STDMETHODIMP nsAccessibleWrap::get_accRole(
// Use BSTR role to expose role attribute or tag name + namespace
nsCOMPtr<nsIDOMNode> domNode;
nsCOMPtr<nsIAccessNode> accessNode(do_QueryInterface(xpAccessible));
NS_ASSERTION(accessNode, "No accessnode for accessible");
if (!accessNode)
return E_FAIL;
accessNode->GetDOMNode(getter_AddRefs(domNode));
nsIContent *content = GetRoleContent(domNode);
NS_ASSERTION(content, "No content for accessible");
if (content && content->IsNodeOfType(nsINode::eELEMENT)) {
if (!content)
return E_FAIL;
if (content->IsNodeOfType(nsINode::eELEMENT)) {
nsAutoString roleString;
if (msaaRole != ROLE_SYSTEM_CLIENT && !GetRoleAttribute(content, roleString)) {
nsINodeInfo *nodeInfo = content->NodeInfo();
@@ -1114,7 +1119,16 @@ nsAccessibleWrap::get_relations(long maxRelations,
STDMETHODIMP
nsAccessibleWrap::role(long *role)
{
return E_NOTIMPL;
PRUint32 xpRole = 0;
if (NS_FAILED(GetFinalRole(&xpRole)))
return E_FAIL;
NS_ASSERTION(gWindowsRoleMap[nsIAccessible::ROLE_LAST_ENTRY].ia2Role == ROLE_WINDOWS_LAST_ENTRY,
"MSAA role map skewed");
*role = gWindowsRoleMap[xpRole].ia2Role;
return S_OK;
}
STDMETHODIMP

View File

@@ -1,5 +1,5 @@
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* vim:expandtab:shiftwidth=4:tabstop=4:
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:expandtab:shiftwidth=2:tabstop=2:
*/
/* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
@@ -21,8 +21,9 @@
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
* Gao, Ming (gaoming@cn.ibm.com)
* Aaron Leventhal (aleventh@us.ibm.com)
* Gao, Ming <gaoming@cn.ibm.com>
* Aaron Leventhal <aleventh@us.ibm.com>
* Alexander Surkov <surkov.alexander@gmail.com>
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
@@ -39,9 +40,10 @@
* ***** END LICENSE BLOCK ***** */
#include "OLEACC.H"
#include "AccessibleRole.h"
const PRUint32 USE_ROLE_STRING = 0;
const PRUint32 ROLE_MSAA_LAST_ENTRY = 0xffffffff;
const PRUint32 ROLE_WINDOWS_LAST_ENTRY = 0xffffffff;
#ifndef ROLE_SYSTEM_SPLITBUTTON
const PRUint32 ROLE_SYSTEM_SPLITBUTTON = 0x3e; // Not defined in all oleacc.h versions
@@ -55,126 +57,366 @@ const PRUint32 ROLE_SYSTEM_IPADDRESS = 0x3f; // Not defined in all oleacc.h vers
const PRUint32 ROLE_SYSTEM_OUTLINEBUTTON = 0x40; // Not defined in all oleacc.h versions
#endif
// Map array from cross platform roles to MSAA roles
PRUint32 msaaRoleMap[] = {
USE_ROLE_STRING, // nsIAccessible::ROLE_NOTHING
ROLE_SYSTEM_TITLEBAR, // nsIAccessible::ROLE_TITLEBAR
ROLE_SYSTEM_MENUBAR, // nsIAccessible::ROLE_MENUBAR
ROLE_SYSTEM_SCROLLBAR, // nsIAccessible::ROLE_SCROLLBAR
ROLE_SYSTEM_GRIP, // nsIAccessible::ROLE_GRIP
ROLE_SYSTEM_SOUND, // nsIAccessible::ROLE_SOUND
ROLE_SYSTEM_CURSOR, // nsIAccessible::ROLE_CURSOR
ROLE_SYSTEM_CARET, // nsIAccessible::ROLE_CARET
ROLE_SYSTEM_ALERT, // nsIAccessible::ROLE_ALERT
ROLE_SYSTEM_WINDOW, // nsIAccessible::ROLE_WINDOW
USE_ROLE_STRING, // nsIAccessible::ROLE_CLIENT
ROLE_SYSTEM_MENUPOPUP, // nsIAccessible::ROLE_MENUPOPUP
ROLE_SYSTEM_MENUITEM, // nsIAccessible::ROLE_MENUITEM
ROLE_SYSTEM_TOOLTIP, // nsIAccessible::ROLE_TOOLTIP
ROLE_SYSTEM_APPLICATION, // nsIAccessible::ROLE_APPLICATION
ROLE_SYSTEM_DOCUMENT, // nsIAccessible::ROLE_DOCUMENT
ROLE_SYSTEM_PANE, // nsIAccessible::ROLE_PANE
ROLE_SYSTEM_CHART, // nsIAccessible::ROLE_CHART
ROLE_SYSTEM_DIALOG, // nsIAccessible::ROLE_DIALOG
ROLE_SYSTEM_BORDER, // nsIAccessible::ROLE_BORDER
ROLE_SYSTEM_GROUPING, // nsIAccessible::ROLE_GROUPING
ROLE_SYSTEM_SEPARATOR, // nsIAccessible::ROLE_SEPARATOR
ROLE_SYSTEM_TOOLBAR, // nsIAccessible::ROLE_TOOLBAR
ROLE_SYSTEM_STATUSBAR, // nsIAccessible::ROLE_STATUSBAR
ROLE_SYSTEM_TABLE, // nsIAccessible::ROLE_TABLE
ROLE_SYSTEM_COLUMNHEADER, // nsIAccessible::ROLE_COLUMNHEADER,
ROLE_SYSTEM_ROWHEADER, // nsIAccessible::ROLE_ROWHEADER
ROLE_SYSTEM_COLUMN, // nsIAccessible::ROLE_COLUMN
ROLE_SYSTEM_ROW, // nsIAccessible::ROLE_ROW
ROLE_SYSTEM_CELL, // nsIAccessible::ROLE_CELL
ROLE_SYSTEM_LINK, // nsIAccessible::ROLE_LINK
ROLE_SYSTEM_HELPBALLOON, // nsIAccessible::ROLE_HELPBALLOON
ROLE_SYSTEM_CHARACTER, // nsIAccessible::ROLE_CHARACTER
ROLE_SYSTEM_LIST, // nsIAccessible::ROLE_LIST
ROLE_SYSTEM_LISTITEM, // nsIAccessible::ROLE_LISTITEM
ROLE_SYSTEM_OUTLINE, // nsIAccessible::ROLE_OUTLINE
ROLE_SYSTEM_OUTLINEITEM, // nsIAccessible::ROLE_OUTLINEITEM
ROLE_SYSTEM_PAGETAB, // nsIAccessible::ROLE_PAGETAB
ROLE_SYSTEM_PROPERTYPAGE, // nsIAccessible::ROLE_PROPERTYPAGE
ROLE_SYSTEM_INDICATOR, // nsIAccessible::ROLE_INDICATOR
ROLE_SYSTEM_GRAPHIC, // nsIAccessible::ROLE_GRAPHIC
ROLE_SYSTEM_STATICTEXT, // nsIAccessible::ROLE_STATICTEXT
ROLE_SYSTEM_TEXT, // nsIAccessible::ROLE_TEXT_LEAF
ROLE_SYSTEM_PUSHBUTTON, // nsIAccessible::ROLE_PUSHBUTTON
ROLE_SYSTEM_CHECKBUTTON, // nsIAccessible::ROLE_CHECKBUTTON
ROLE_SYSTEM_RADIOBUTTON, // nsIAccessible::ROLE_RADIOBUTTON
ROLE_SYSTEM_COMBOBOX, // nsIAccessible::ROLE_COMBOBOX
ROLE_SYSTEM_DROPLIST, // nsIAccessible::ROLE_DROPLIST
ROLE_SYSTEM_PROGRESSBAR, // nsIAccessible::ROLE_PROGRESSBAR
ROLE_SYSTEM_DIAL, // nsIAccessible::ROLE_DIAL
ROLE_SYSTEM_HOTKEYFIELD, // nsIAccessible::ROLE_HOTKEYFIELD
ROLE_SYSTEM_SLIDER, // nsIAccessible::ROLE_SLIDER
ROLE_SYSTEM_SPINBUTTON, // nsIAccessible::ROLE_SPINBUTTON
ROLE_SYSTEM_DIAGRAM, // nsIAccessible::ROLE_DIAGRAM
ROLE_SYSTEM_ANIMATION, // nsIAccessible::ROLE_ANIMATION
ROLE_SYSTEM_EQUATION, // nsIAccessible::ROLE_EQUATION
ROLE_SYSTEM_BUTTONDROPDOWN, // nsIAccessible::ROLE_BUTTONDROPDOWN
ROLE_SYSTEM_BUTTONMENU, // nsIAccessible::ROLE_BUTTONMENU
ROLE_SYSTEM_BUTTONDROPDOWNGRID, // nsIAccessible::ROLE_BUTTONDROPDOWNGRID
ROLE_SYSTEM_WHITESPACE, // nsIAccessible::ROLE_WHITESPACE
ROLE_SYSTEM_PAGETABLIST, // nsIAccessible::ROLE_PAGETABLIST
ROLE_SYSTEM_CLOCK, // nsIAccessible::ROLE_CLOCK
ROLE_SYSTEM_SPLITBUTTON, // nsIAccessible::ROLE_SPLITBUTTON
ROLE_SYSTEM_IPADDRESS, // nsIAccessible::ROLE_IPADDRESS
// Make up for ATK roles that we don't have in MSAA. When in doubt
// map them to USE_ROLE_STRING so that the role string is exposed
ROLE_SYSTEM_STATICTEXT, // nsIAccessible::ROLE_ACCEL_LABEL
ROLE_SYSTEM_INDICATOR, // nsIAccessible::ROLE_ARROW
USE_ROLE_STRING, // nsIAccessible::ROLE_CANVAS
ROLE_SYSTEM_MENUITEM, // nsIAccessible::ROLE_CHECK_MENU_ITEM
ROLE_SYSTEM_DIALOG, // nsIAccessible::ROLE_COLOR_CHOOSER
USE_ROLE_STRING, // nsIAccessible::ROLE_DATE_EDITOR
USE_ROLE_STRING, // nsIAccessible::ROLE_DESKTOP_ICON
USE_ROLE_STRING, // nsIAccessible::ROLE_DESKTOP_FRAME
USE_ROLE_STRING, // nsIAccessible::ROLE_DIRECTORY_PANE
USE_ROLE_STRING, // nsIAccessible::ROLE_FILE_CHOOSER
USE_ROLE_STRING, // nsIAccessible::ROLE_FONT_CHOOSER
ROLE_SYSTEM_APPLICATION, // nsIAccessible::ROLE_CHROME_WINDOW
USE_ROLE_STRING, // nsIAccessible::ROLE_GLASS_PANE
USE_ROLE_STRING, // nsIAccessible::ROLE_HTML_CONTAINER
ROLE_SYSTEM_PUSHBUTTON, // nsIAccessible::ROLE_ICON
ROLE_SYSTEM_STATICTEXT, // nsIAccessible::ROLE_LABEL
USE_ROLE_STRING, // nsIAccessible::ROLE_LAYERED_PANE
USE_ROLE_STRING, // nsIAccessible::ROLE_OPTION_PANE
ROLE_SYSTEM_TEXT, // nsIAccessible::ROLE_PASSWORD_TEXT
ROLE_SYSTEM_MENUPOPUP, // nsIAccessible::ROLE_POPUP_MENU
ROLE_SYSTEM_MENUITEM, // nsIAccessible::ROLE_RADIO_MENU_ITEM
USE_ROLE_STRING, // nsIAccessible::ROLE_ROOT_PANE
USE_ROLE_STRING, // nsIAccessible::ROLE_SCROLL_PANE
USE_ROLE_STRING, // nsIAccessible::ROLE_SPLIT_PANE
ROLE_SYSTEM_COLUMNHEADER, // nsIAccessible::ROLE_TABLE_COLUMN_HEADER
ROLE_SYSTEM_ROWHEADER, // nsIAccessible::ROLE_TABLE_ROW_HEADER
ROLE_SYSTEM_MENUITEM, // nsIAccessible::ROLE_TEAR_OFF_MENU_ITEM
USE_ROLE_STRING, // nsIAccessible::ROLE_TERMINAL
USE_ROLE_STRING, // nsIAccessible::ROLE_TEXT_CONTAINER
USE_ROLE_STRING, // nsIAccessible::ROLE_TOGGLE_BUTTON
ROLE_SYSTEM_OUTLINE, // nsIAccessible::ROLE_TREE_TABLE
ROLE_SYSTEM_PANE, // nsIAccessible::ROLE_VIEWPORT
USE_ROLE_STRING, // nsIAccessible::ROLE_HEADER
USE_ROLE_STRING, // nsIAccessible::ROLE_FOOTER
USE_ROLE_STRING, // nsIAccessible::ROLE_PARAGRAPH
USE_ROLE_STRING, // nsIAccessible::ROLE_RULER
ROLE_SYSTEM_COMBOBOX, // nsIAccessible::ROLE_AUTOCOMPLETE
ROLE_SYSTEM_TEXT, // nsIAccessible::ROLE_EDITBAR
ROLE_SYSTEM_TEXT, // nsIAccessible::ROLE_ENTRY
USE_ROLE_STRING, // nsIAccessible::ROLE_CAPTION
USE_ROLE_STRING, // nsIAccessible::ROLE_DOCUMENT_FRAME
USE_ROLE_STRING, // nsIAccessible::ROLE_HEADING
USE_ROLE_STRING, // nsIAccessible::ROLE_PAGE
USE_ROLE_STRING, // nsIAccessible::ROLE_SECTION
USE_ROLE_STRING, // nsIAccessible::ROLE_REDUNDANT_OBJECT
USE_ROLE_STRING, // nsIAccessible::ROLE_FORM
USE_ROLE_STRING, // nsIAccessible::ROLE_IME
ROLE_SYSTEM_APPLICATION, // nsIAccessible::ROLE_APP_ROOT
ROLE_SYSTEM_MENUITEM, // nsIAccessible::ROLE_PARENT_MENUITEM
ROLE_SYSTEM_CLIENT, // nsIAccessible::ROLE_CALENDAR
ROLE_SYSTEM_LIST, // nsIAccessible::ROLE_COMBOBOX_LIST
ROLE_SYSTEM_LISTITEM, // nsIAccessible::ROLE_COMBOBOX_LISTITEM
ROLE_MSAA_LAST_ENTRY // nsIAccessible::ROLE_LAST_ENTRY
struct WindowsRoleMapItem
{
PRUint32 msaaRole;
long ia2Role;
};
// Map array from cross platform roles to MSAA/IA2 roles
static const WindowsRoleMapItem gWindowsRoleMap[] = {
// nsIAccessible::ROLE_NOTHING
{ USE_ROLE_STRING, IA2_ROLE_UNKNOWN },
// nsIAccessible::ROLE_TITLEBAR
{ ROLE_SYSTEM_TITLEBAR, ROLE_SYSTEM_TITLEBAR },
// nsIAccessible::ROLE_MENUBAR
{ ROLE_SYSTEM_MENUBAR, ROLE_SYSTEM_MENUBAR },
// nsIAccessible::ROLE_SCROLLBAR
{ ROLE_SYSTEM_SCROLLBAR, ROLE_SYSTEM_SCROLLBAR },
// nsIAccessible::ROLE_GRIP
{ ROLE_SYSTEM_GRIP, ROLE_SYSTEM_GRIP },
// nsIAccessible::ROLE_SOUND
{ ROLE_SYSTEM_SOUND, ROLE_SYSTEM_SOUND },
// nsIAccessible::ROLE_CURSOR
{ ROLE_SYSTEM_CURSOR, ROLE_SYSTEM_CURSOR },
// nsIAccessible::ROLE_CARET
{ ROLE_SYSTEM_CARET, ROLE_SYSTEM_CARET },
// nsIAccessible::ROLE_ALERT
{ ROLE_SYSTEM_ALERT, ROLE_SYSTEM_ALERT },
// nsIAccessible::ROLE_WINDOW
{ ROLE_SYSTEM_WINDOW, ROLE_SYSTEM_WINDOW },
// nsIAccessible::ROLE_CLIENT
{ USE_ROLE_STRING, IA2_ROLE_UNKNOWN},
// nsIAccessible::ROLE_MENUPOPUP
{ ROLE_SYSTEM_MENUPOPUP, ROLE_SYSTEM_MENUPOPUP },
// nsIAccessible::ROLE_MENUITEM
{ ROLE_SYSTEM_MENUITEM, ROLE_SYSTEM_MENUITEM },
// nsIAccessible::ROLE_TOOLTIP
{ ROLE_SYSTEM_TOOLTIP, ROLE_SYSTEM_TOOLTIP },
// nsIAccessible::ROLE_APPLICATION
{ ROLE_SYSTEM_APPLICATION, ROLE_SYSTEM_APPLICATION },
// nsIAccessible::ROLE_DOCUMENT
{ ROLE_SYSTEM_DOCUMENT, ROLE_SYSTEM_DOCUMENT },
// nsIAccessible::ROLE_PANE
{ ROLE_SYSTEM_PANE, ROLE_SYSTEM_PANE },
// nsIAccessible::ROLE_CHART
{ ROLE_SYSTEM_CHART, ROLE_SYSTEM_CHART },
// nsIAccessible::ROLE_DIALOG
{ ROLE_SYSTEM_DIALOG, ROLE_SYSTEM_DIALOG },
// nsIAccessible::ROLE_BORDER
{ ROLE_SYSTEM_BORDER, ROLE_SYSTEM_BORDER },
// nsIAccessible::ROLE_GROUPING
{ ROLE_SYSTEM_GROUPING, ROLE_SYSTEM_GROUPING },
// nsIAccessible::ROLE_SEPARATOR
{ ROLE_SYSTEM_SEPARATOR, ROLE_SYSTEM_SEPARATOR },
// nsIAccessible::ROLE_TOOLBAR
{ ROLE_SYSTEM_TOOLBAR, ROLE_SYSTEM_TOOLBAR },
// nsIAccessible::ROLE_STATUSBAR
{ ROLE_SYSTEM_STATUSBAR, ROLE_SYSTEM_STATUSBAR },
// nsIAccessible::ROLE_TABLE
{ ROLE_SYSTEM_TABLE, ROLE_SYSTEM_TABLE },
// nsIAccessible::ROLE_COLUMNHEADER,
{ ROLE_SYSTEM_COLUMNHEADER, ROLE_SYSTEM_COLUMNHEADER },
// nsIAccessible::ROLE_ROWHEADER
{ ROLE_SYSTEM_ROWHEADER, ROLE_SYSTEM_ROWHEADER },
// nsIAccessible::ROLE_COLUMN
{ ROLE_SYSTEM_COLUMN, ROLE_SYSTEM_COLUMN },
// nsIAccessible::ROLE_ROW
{ ROLE_SYSTEM_ROW, ROLE_SYSTEM_ROW },
// nsIAccessible::ROLE_CELL
{ ROLE_SYSTEM_CELL, ROLE_SYSTEM_CELL },
// nsIAccessible::ROLE_LINK
{ ROLE_SYSTEM_LINK, ROLE_SYSTEM_LINK },
// nsIAccessible::ROLE_HELPBALLOON
{ ROLE_SYSTEM_HELPBALLOON, ROLE_SYSTEM_HELPBALLOON },
// nsIAccessible::ROLE_CHARACTER
{ ROLE_SYSTEM_CHARACTER, ROLE_SYSTEM_CHARACTER },
// nsIAccessible::ROLE_LIST
{ ROLE_SYSTEM_LIST, ROLE_SYSTEM_LIST },
// nsIAccessible::ROLE_LISTITEM
{ ROLE_SYSTEM_LISTITEM, ROLE_SYSTEM_LISTITEM },
// nsIAccessible::ROLE_OUTLINE
{ ROLE_SYSTEM_OUTLINE, ROLE_SYSTEM_OUTLINE },
// nsIAccessible::ROLE_OUTLINEITEM
{ ROLE_SYSTEM_OUTLINEITEM, ROLE_SYSTEM_OUTLINEITEM },
// nsIAccessible::ROLE_PAGETAB
{ ROLE_SYSTEM_PAGETAB, ROLE_SYSTEM_PAGETAB },
// nsIAccessible::ROLE_PROPERTYPAGE
{ ROLE_SYSTEM_PROPERTYPAGE, ROLE_SYSTEM_PROPERTYPAGE },
// nsIAccessible::ROLE_INDICATOR
{ ROLE_SYSTEM_INDICATOR, ROLE_SYSTEM_INDICATOR },
// nsIAccessible::ROLE_GRAPHIC
{ ROLE_SYSTEM_GRAPHIC, ROLE_SYSTEM_GRAPHIC },
// nsIAccessible::ROLE_STATICTEXT
{ ROLE_SYSTEM_STATICTEXT, ROLE_SYSTEM_STATICTEXT },
// nsIAccessible::ROLE_TEXT_LEAF
{ ROLE_SYSTEM_TEXT, ROLE_SYSTEM_TEXT },
// nsIAccessible::ROLE_PUSHBUTTON
{ ROLE_SYSTEM_PUSHBUTTON, ROLE_SYSTEM_PUSHBUTTON },
// nsIAccessible::ROLE_CHECKBUTTON
{ ROLE_SYSTEM_CHECKBUTTON, ROLE_SYSTEM_CHECKBUTTON },
// nsIAccessible::ROLE_RADIOBUTTON
{ ROLE_SYSTEM_RADIOBUTTON, ROLE_SYSTEM_RADIOBUTTON },
// nsIAccessible::ROLE_COMBOBOX
{ ROLE_SYSTEM_COMBOBOX, ROLE_SYSTEM_COMBOBOX },
// nsIAccessible::ROLE_DROPLIST
{ ROLE_SYSTEM_DROPLIST, ROLE_SYSTEM_DROPLIST },
// nsIAccessible::ROLE_PROGRESSBAR
{ ROLE_SYSTEM_PROGRESSBAR, ROLE_SYSTEM_PROGRESSBAR },
// nsIAccessible::ROLE_DIAL
{ ROLE_SYSTEM_DIAL, ROLE_SYSTEM_DIAL },
// nsIAccessible::ROLE_HOTKEYFIELD
{ ROLE_SYSTEM_HOTKEYFIELD, ROLE_SYSTEM_HOTKEYFIELD },
// nsIAccessible::ROLE_SLIDER
{ ROLE_SYSTEM_SLIDER, ROLE_SYSTEM_SLIDER },
// nsIAccessible::ROLE_SPINBUTTON
{ ROLE_SYSTEM_SPINBUTTON, ROLE_SYSTEM_SPINBUTTON },
// nsIAccessible::ROLE_DIAGRAM
{ ROLE_SYSTEM_DIAGRAM, ROLE_SYSTEM_DIAGRAM },
// nsIAccessible::ROLE_ANIMATION
{ ROLE_SYSTEM_ANIMATION, ROLE_SYSTEM_ANIMATION },
// nsIAccessible::ROLE_EQUATION
{ ROLE_SYSTEM_EQUATION, ROLE_SYSTEM_EQUATION },
// nsIAccessible::ROLE_BUTTONDROPDOWN
{ ROLE_SYSTEM_BUTTONDROPDOWN, ROLE_SYSTEM_BUTTONDROPDOWN },
// nsIAccessible::ROLE_BUTTONMENU
{ ROLE_SYSTEM_BUTTONMENU, ROLE_SYSTEM_BUTTONMENU },
// nsIAccessible::ROLE_BUTTONDROPDOWNGRID
{ ROLE_SYSTEM_BUTTONDROPDOWNGRID, ROLE_SYSTEM_BUTTONDROPDOWNGRID },
// nsIAccessible::ROLE_WHITESPACE
{ ROLE_SYSTEM_WHITESPACE, ROLE_SYSTEM_WHITESPACE },
// nsIAccessible::ROLE_PAGETABLIST
{ ROLE_SYSTEM_PAGETABLIST, ROLE_SYSTEM_PAGETABLIST },
// nsIAccessible::ROLE_CLOCK
{ ROLE_SYSTEM_CLOCK, ROLE_SYSTEM_CLOCK },
// nsIAccessible::ROLE_SPLITBUTTON
{ ROLE_SYSTEM_SPLITBUTTON, ROLE_SYSTEM_SPLITBUTTON },
// nsIAccessible::ROLE_IPADDRESS
{ ROLE_SYSTEM_IPADDRESS, ROLE_SYSTEM_IPADDRESS },
// Make up for Gecko roles that we don't have in MSAA or IA2. When in doubt
// map them to USE_ROLE_STRING (IA2_ROLE_UNKNOWN).
// nsIAccessible::ROLE_ACCEL_LABEL
{ ROLE_SYSTEM_STATICTEXT, ROLE_SYSTEM_STATICTEXT },
// nsIAccessible::ROLE_ARROW
{ ROLE_SYSTEM_INDICATOR, ROLE_SYSTEM_INDICATOR },
// nsIAccessible::ROLE_CANVAS
{ USE_ROLE_STRING, IA2_ROLE_UNKNOWN },
// nsIAccessible::ROLE_CHECK_MENU_ITEM
{ ROLE_SYSTEM_MENUITEM, IA2_ROLE_CHECK_MENU_ITEM },
// nsIAccessible::ROLE_COLOR_CHOOSER
{ ROLE_SYSTEM_DIALOG, IA2_ROLE_COLOR_CHOOSER },
// nsIAccessible::ROLE_DATE_EDITOR
{ USE_ROLE_STRING, IA2_ROLE_DATE_EDITOR },
// nsIAccessible::ROLE_DESKTOP_ICON
{ USE_ROLE_STRING, IA2_ROLE_DESKTOP_ICON },
// nsIAccessible::ROLE_DESKTOP_FRAME
{ USE_ROLE_STRING, IA2_ROLE_DESKTOP_PANE },
// nsIAccessible::ROLE_DIRECTORY_PANE
{ USE_ROLE_STRING, IA2_ROLE_DIRECTORY_PANE },
// nsIAccessible::ROLE_FILE_CHOOSER
{ USE_ROLE_STRING, IA2_ROLE_FILE_CHOOSER },
// nsIAccessible::ROLE_FONT_CHOOSER
{ USE_ROLE_STRING, IA2_ROLE_FONT_CHOOSER },
// nsIAccessible::ROLE_CHROME_WINDOW
{ ROLE_SYSTEM_APPLICATION, IA2_ROLE_FRAME },
// nsIAccessible::ROLE_GLASS_PANE
{ USE_ROLE_STRING, IA2_ROLE_GLASS_PANE },
// nsIAccessible::ROLE_HTML_CONTAINER
{ USE_ROLE_STRING, IA2_ROLE_UNKNOWN },
// nsIAccessible::ROLE_ICON
{ ROLE_SYSTEM_PUSHBUTTON, IA2_ROLE_ICON },
// nsIAccessible::ROLE_LABEL
{ ROLE_SYSTEM_STATICTEXT, IA2_ROLE_LABEL },
// nsIAccessible::ROLE_LAYERED_PANE
{ USE_ROLE_STRING, IA2_ROLE_LAYERED_PANE },
// nsIAccessible::ROLE_OPTION_PANE
{ USE_ROLE_STRING, IA2_ROLE_OPTION_PANE },
// nsIAccessible::ROLE_PASSWORD_TEXT
{ ROLE_SYSTEM_TEXT, ROLE_SYSTEM_TEXT },
// nsIAccessible::ROLE_POPUP_MENU
{ ROLE_SYSTEM_MENUPOPUP, ROLE_SYSTEM_MENUPOPUP },
// nsIAccessible::ROLE_RADIO_MENU_ITEM
{ ROLE_SYSTEM_MENUITEM, IA2_ROLE_RADIO_MENU_ITEM },
// nsIAccessible::ROLE_ROOT_PANE
{ USE_ROLE_STRING, IA2_ROLE_ROOT_PANE },
// nsIAccessible::ROLE_SCROLL_PANE
{ USE_ROLE_STRING, IA2_ROLE_SCROLL_PANE },
// nsIAccessible::ROLE_SPLIT_PANE
{ USE_ROLE_STRING, IA2_ROLE_SPLIT_PANE },
// nsIAccessible::ROLE_TABLE_COLUMN_HEADER
{ ROLE_SYSTEM_COLUMNHEADER, ROLE_SYSTEM_COLUMNHEADER },
// nsIAccessible::ROLE_TABLE_ROW_HEADER
{ ROLE_SYSTEM_ROWHEADER, ROLE_SYSTEM_ROWHEADER },
// nsIAccessible::ROLE_TEAR_OFF_MENU_ITEM
{ ROLE_SYSTEM_MENUITEM, ROLE_SYSTEM_MENUITEM },
// nsIAccessible::ROLE_TERMINAL
{ USE_ROLE_STRING, IA2_ROLE_UNKNOWN },
// nsIAccessible::ROLE_TEXT_CONTAINER
{ USE_ROLE_STRING, IA2_ROLE_TEXT_FRAME },
// nsIAccessible::ROLE_TOGGLE_BUTTON
{ USE_ROLE_STRING, IA2_ROLE_TOGGLE_BUTTON },
// nsIAccessible::ROLE_TREE_TABLE
{ ROLE_SYSTEM_OUTLINE, ROLE_SYSTEM_OUTLINE },
// nsIAccessible::ROLE_VIEWPORT
{ ROLE_SYSTEM_PANE, IA2_ROLE_VIEW_PORT },
// nsIAccessible::ROLE_HEADER
{ USE_ROLE_STRING, IA2_ROLE_HEADER },
// nsIAccessible::ROLE_FOOTER
{ USE_ROLE_STRING, IA2_ROLE_FOOTER },
// nsIAccessible::ROLE_PARAGRAPH
{ USE_ROLE_STRING, IA2_ROLE_PARAGRAPH },
// nsIAccessible::ROLE_RULER
{ USE_ROLE_STRING, IA2_ROLE_RULER },
// nsIAccessible::ROLE_AUTOCOMPLETE
{ ROLE_SYSTEM_COMBOBOX, ROLE_SYSTEM_COMBOBOX },
// nsIAccessible::ROLE_EDITBAR
{ ROLE_SYSTEM_TEXT, IA2_ROLE_EDITBAR },
// nsIAccessible::ROLE_ENTRY
{ ROLE_SYSTEM_TEXT, ROLE_SYSTEM_TEXT },
// nsIAccessible::ROLE_CAPTION
{ USE_ROLE_STRING, IA2_ROLE_CAPTION },
// nsIAccessible::ROLE_DOCUMENT_FRAME
{ USE_ROLE_STRING, IA2_ROLE_UNKNOWN },
// nsIAccessible::ROLE_HEADING
{ USE_ROLE_STRING, IA2_ROLE_HEADING },
// nsIAccessible::ROLE_PAGE
{ USE_ROLE_STRING, IA2_ROLE_PAGE },
// nsIAccessible::ROLE_SECTION
{ USE_ROLE_STRING, IA2_ROLE_SECTION },
// nsIAccessible::ROLE_REDUNDANT_OBJECT
{ USE_ROLE_STRING, IA2_ROLE_REDUNDANT_OBJECT },
// nsIAccessible::ROLE_FORM
{ USE_ROLE_STRING, IA2_ROLE_FORM },
// nsIAccessible::ROLE_IME
{ USE_ROLE_STRING, IA2_ROLE_INPUT_METHOD_WINDOW },
// nsIAccessible::ROLE_APP_ROOT
{ ROLE_SYSTEM_APPLICATION, ROLE_SYSTEM_APPLICATION },
// nsIAccessible::ROLE_PARENT_MENUITEM
{ ROLE_SYSTEM_MENUITEM, ROLE_SYSTEM_MENUITEM },
// nsIAccessible::ROLE_CALENDAR
{ ROLE_SYSTEM_CLIENT, ROLE_SYSTEM_CLIENT },
// nsIAccessible::ROLE_COMBOBOX_LIST
{ ROLE_SYSTEM_LIST, ROLE_SYSTEM_LIST },
// nsIAccessible::ROLE_COMBOBOX_LISTITEM
{ ROLE_SYSTEM_LISTITEM, ROLE_SYSTEM_LISTITEM },
// nsIAccessible::ROLE_LAST_ENTRY
{ ROLE_WINDOWS_LAST_ENTRY, ROLE_WINDOWS_LAST_ENTRY }
};