diff --git a/accessible/public/nsIAccessible.idl b/accessible/public/nsIAccessible.idl
index 0e3e832f0d6c..d82f3cce116b 100644
--- a/accessible/public/nsIAccessible.idl
+++ b/accessible/public/nsIAccessible.idl
@@ -336,7 +336,6 @@ interface nsIAccessible : nsISupports
  * RELATION_DEFAULT_BUTTON:   Part of a form/dialog with a related default button.
  * RELATION_DESCRIBED_BY:     Described by one or more target objects.
  * RELATION_DESCRIPTION_FOR:  Description for one or more target objects.
- * RELATION_LAST_DEFINED:
  */
 
   const unsigned long RELATION_NUL = 0x00;               // ATK_RELATION_NUL
@@ -357,297 +356,139 @@ interface nsIAccessible : nsISupports
   const unsigned long RELATION_DESCRIPTION_FOR = 0x0f;   // ATK_RELATION_DESCRIPTION_FOR
   const unsigned long RELATION_DEFAULT_BUTTON = 0x4000;  // MSAA only, no ATK relation
 
-%{C++
-#ifdef MOZ_ACCESSIBILITY_ATK
-
-  enum { RELATION_LAST_DEFINED = 14U };
-
-/**
- * The following nsIAccessible roles are translated to ATK_ROLE_UNKNOWN
- * 
- *  ROLE_TITLEBAR, ROLE_SOUND, ROLE_CURSOR, ROLE_CARET, ROLE_BORDER,
- *  ROLE_GROUPING, ROLE_EQUATION, ROLE_COLUMN, ROLE_ROW, ROLE_LINK,
- *  ROLE_WHITESPACE, ROLE_CLOCK, ROLE_IPADDRESS, ROLE_NOTHING
- *
- *  ROLE_GRIP
- *    The object represents a special mouse pointer, which allows a user to
- *    manipulate user interface elements such as windows.
- *
- *  ROLE_HELPBALLOON
- *    The object displays a Help topic in the form of a ToolTip or Help balloon.
- *
- *  ROLE_PROPERTYPAGE
- *    The object represents a property sheet.
- *
- *  ROLE_INDICATOR
- *    The object represents an indicator, such as a pointer graphic pointing to
- *    the current item.
- *
- *  ROLE_HOTKEYFIELD
- *    The object represents a hot-key field that allow the user to enter a
- *    sequence of keystroke.
- *
- * The following ATK roles have no corresponding nsIAccessible roles. Perhaps
- * there are not these types of widget/control in Mozilla, so don't need these
- * ATK roles? Or need add some of them?
- *
- *   ATK_ROLE_ARROW
- *     An arrow in one of the four cardinal directions.
- *
- *   ATK_ROLE_INTERNAL_FRAME
- *     A frame-like object that is clipped by a desktop pane.
- * 
- *  ATK_ROLE_ACCEL_LABEL, ATK_ROLE_CANVAS, ATK_ROLE_CHECK_MENU_ITEM,
- *   ATK_ROLE_COLOR_CHOOSER, ATK_ROLE_DATE_EDITOR, ATK_ROLE_DESKTOP_ICON,
- *   ATK_ROLE_DESKTOP_FRAME, ATK_ROLE_DIRECTORY_PANE, ATK_ROLE_FILE_CHOOSER,
- *   ATK_ROLE_FILLER, ATK_ROLE_FONT_CHOOSER, ATK_ROLE_GLASS_PANE,
- *  ATK_ROLE_HTML_CONTAINER, ATK_ROLE_ICON, ATK_ROLE_LAYERED_PANE,
- *   ATK_ROLE_POPUP_MENU, ATK_ROLE_OPTION_PANE, ATK_ROLE_PASSWORD_TEXT,
- *  ATK_ROLE_RADIO_MENU_ITEM, ATK_ROLE_ROOT_PANE, ATK_ROLE_SCROLL_PANE,
- *  ATK_ROLE_SPLIT_PANE, ATK_ROLE_TEAR_OFF_MENU_ITEM, ATK_ROLE_TERMINAL,
- *  ATK_ROLE_TOGGLE_BUTTON, ATK_ROLE_TREE_TABLE, ATK_ROLE_VIEWPORT, ATK_ROLE_LABEL
- *
- * Important:
- * Following value should keep synchronization with the definitions in atk.h
- */
-  enum { ROLE_TITLEBAR = 66U };    // ATK_ROLE_UNKNOWN
-  enum { ROLE_MENUBAR = 33U };     // ATK_ROLE_MENU_BAR
-  enum { ROLE_SCROLLBAR = 47U };   // ATK_ROLE_SCROLL_BAR
-  enum { ROLE_GRIP = 66U };        // ATK_ROLE_UNKNOWN
-  enum { ROLE_SOUND = 66U };       // ATK_ROLE_UNKNOWN
-  enum { ROLE_CURSOR = 66U };      // ATK_ROLE_UNKNOWN
-  enum { ROLE_CARET = 66U };       // ATK_ROLE_UNKNOWN
-  enum { ROLE_ALERT = 2U };        // ATK_ROLE_ALERT
-  enum { ROLE_WINDOW = 68U };      // ATK_ROLE_WINDOW
-  // An object used for drawing custom user interface elements
-  enum { ROLE_CLIENT = 18U };      // ATK_ROLE_DRAWING_AREA
-  enum { ROLE_MENUPOPUP = 32U };   // ATK_ROLE_MENU
-  enum { ROLE_MENUITEM = 34U };    // ATK_ROLE_MENU_ITEM
-  enum { ROLE_TOOLTIP = 63U };     // ATK_ROLE_TOOL_TIP
-  // The object represents a main window for a application
-  enum { ROLE_APPLICATION = 73U }; // ATK_ROLE_APPLICATION
-  // The object represents a document window, only for MDI windows
-  enum { ROLE_DOCUMENT = 80U };    // ATK_ROLE_DOCUMENT_FRAME
-  enum { ROLE_PANE = 38U };        // ATK_ROLE_PANEL
-  enum { ROLE_CHART = 78U };       // ATK_ROLE_CHART
-  enum { ROLE_DIALOG = 16U };      // ATK_ROLE_DIALOG
-  enum { ROLE_BORDER = 66U };      // ATK_ROLE_UNKNOWN
-  enum { ROLE_GROUPING = 38U };    // ATK_ROLE_PANEL
-  enum { ROLE_SEPARATOR = 49U };   // ATK_ROLE_SEPARATOR
-  enum { ROLE_TOOLBAR = 62U };     // ATK_ROLE_TOOL_BAR
-  enum { ROLE_STATUSBAR = 53U };   // ATK_ROLE_STATUSBAR
-  enum { ROLE_TABLE = 54U };       // ATK_ROLE_TABLE
-  // Or ATK_ROLE_TABLE_COLUMN_HEADER?
-  enum { ROLE_COLUMNHEADER = 10U };// ATK_ROLE_COLUMN_HEADER
-  // Or ATK_ROLE_TABLE_ROW_HEADER ?
-  enum { ROLE_ROWHEADER = 46U };   // ATK_ROLE_ROW_HEADER
-  enum { ROLE_COLUMN = 66U };      // ATK_ROLE_UNKNOWN
-  enum { ROLE_ROW = 66U };         // ATK_ROLE_UNKNOWN
-  enum { ROLE_CELL = 55U };        // ATK_ROLE_TABLE_CELL
-  enum { ROLE_HELPBALLOON = 66U }; // ATK_ROLE_UNKNOWN
-  // The object represents a cartoon-like graphic object
-  enum { ROLE_CHARACTER = 26U };   // ATK_ROLE_IMAGE
-  enum { ROLE_LIST = 30U };        // ATK_ROLE_LIST
-  enum { ROLE_LISTITEM = 31U };    // ATK_ROLE_LIST_ITEM
-  // The object represents an outline or tree structure
-  enum { ROLE_OUTLINE = 64U };     // ATK_ROLE_TREE
-  // The object represents an item in an outline or tree structure
-  enum { ROLE_OUTLINEITEM = 31U }; // ATK_ROLE_LIST_ITEM
-  enum { ROLE_PAGETAB = 36U };     // ATK_ROLE_PAGE_TAB
-  enum { ROLE_PROPERTYPAGE = 66U };// ATK_ROLE_UNKNOWN
-  enum { ROLE_INDICATOR = 66U };   // ATK_ROLE_UNKNOWN
-  enum { ROLE_GRAPHIC = 26U };     // ATK_ROLE_IMAGE
-  // Read-only text, can't be modified or selected
-  enum { ROLE_STATICTEXT = 50000U };  // No matching ATK role, we will strip out
-  enum { ROLE_TEXT_LEAF = 50000U };   // No matching ATK role, we will strip out
-  enum { ROLE_TEXT_CONTAINER = 60U }; // ATK_ROLE_TEXT
-  enum { ROLE_PUSHBUTTON = 42U };  // ATK_ROLE_PUSH_BUTTON
-  enum { ROLE_CHECKBUTTON = 7U };  // ATK_ROLE_CHECK_BOX
-  enum { ROLE_RADIOBUTTON = 43U }; // ATK_ROLE_RADIO_BUTTON
-  enum { ROLE_COMBOBOX = 11U };    // ATK_ROLE_COMBO_BOX
-  // Just represents the calender control
-  enum { ROLE_DROPLIST = 5U };     // ATK_ROLE_CALENDAR
-  enum { ROLE_PROGRESSBAR = 41U }; // ATK_ROLE_PROGRESS_BAR
-  enum { ROLE_DIAL = 15U };        // ATK_ROLE_DIAL
-  enum { ROLE_HOTKEYFIELD = 66U }; // ATK_ROLE_UNKNOWN
-  enum { ROLE_SLIDER = 50U };      // ATK_ROLE_SLIDER
-  enum { ROLE_SPINBUTTON = 52U };  // ATK_ROLE_SPIN_BUTTON
-  enum { ROLE_DIAGRAM = 26U };     // ATK_ROLE_IMAGE
-  enum { ROLE_ANIMATION = 3U };    // ATK_ROLE_ANIMATION
-  enum { ROLE_EQUATION = 66U };    // ATK_ROLE_UNKNOWN
-  enum { ROLE_BUTTONDROPDOWN = 42U }; // ATK_ROLE_PUSH_BUTTON
-  enum { ROLE_BUTTONMENU = 42U };  // ATK_ROLE_PUSH_BUTTON
-  // Represents a button that drops down a grid
-  enum { ROLE_BUTTONDROPDOWNGRID = 66U }; // ATK_ROLE_UNKNOWN
-  enum { ROLE_WHITESPACE = 66U };  // ATK_ROLE_UNKNOWN
-  enum { ROLE_PAGETABLIST = 37U }; // ATK_ROLE_PAGE_TAB_LIST
-  enum { ROLE_CLOCK = 66U };       // ATK_ROLE_UNKNOWN
-  // Represents a button on the toolbar that has a drop-down list icon
-  // directly adjacent to the button
-  enum { ROLE_SPLITBUTTON = 42U }; // ATK_ROLE_PUSH_BUTTON
-  enum { ROLE_IPADDRESS = 66U };   // ATK_ROLE_UNKNOWN
-  enum { ROLE_NOTHING = 66U };     // ATK_ROLE_UNKNOWN
-  // Represent top level window
-  enum { ROLE_FRAME = 22U };       // ATK_ROLE_FRAME
-
-  // Other roles from atk.h
-  enum { ROLE_ACCEL_LABEL = 1U };          // ATK_ROLE_ACCEL_LABEL
-  enum { ROLE_ARROW  = 4U };               // ATK_ROLE_ARROW
-  enum { ROLE_CANVAS = 6U };               // ATK_ROLE_CANVAS
-  enum { ROLE_CHECK_MENU_ITEM = 8U };      // ATK_ROLE_CHECK_MENU_ITEM
-  enum { ROLE_COLOR_CHOOSER  = 9U };       // ATK_ROLE_COLOR_CHOOSER
-  enum { ROLE_DATE_EDITOR = 12U };         // ATK_ROLE_DATE_EDITOR
-  enum { ROLE_DESKTOP_ICON = 13U };        // ATK_ROLE_DESKTOP_ICON
-  enum { ROLE_DESKTOP_FRAME = 14U };       // ATK_ROLE_DESKTOP_FRAME
-  enum { ROLE_DIRECTORY_PANE = 17U };      // ATK_ROLE_DIRECTORY_PANE
-  enum { ROLE_FILE_CHOOSER = 19U};         // ATK_ROLE_FILE_CHOOSER
-  enum { ROLE_FILLER = 20U };              // ATK_ROLE_FILLER
-  enum { ROLE_FONT_CHOOSER = 21U };        // ATK_ROLE_FONT_CHOOSER
-  enum { ROLE_GLASS_PANE = 23U };          // ATK_ROLE_GLASS_PANE
-  enum { ROLE_HTML_CONTAINER = 24U };      // ATK_ROLE_HTML_CONTAINER
-  enum { ROLE_ICON = 25U };                // ATK_ROLE_ICON
-  enum { ROLE_INTERNAL_FRAME = 27U };      // ATK_ROLE_INTERNAL_FRAME
-  enum { ROLE_LABEL = 28U };               // ATK_ROLE_LABEL
-  enum { ROLE_LAYERED_PANE = 29U };        // ATK_ROLE_LAYERED_PANE
-  enum { ROLE_OPTION_PANE = 35U };         // ATK_ROLE_OPTION_PANE
-  enum { ROLE_PASSWORD_TEXT = 39U };       // ATK_ROLE_PASSWORD_TEXT
-  enum { ROLE_POPUP_MENU = 40U };          // ATK_ROLE_POPUP_MENU
-  enum { ROLE_RADIO_MENU_ITEM = 44U };     // ATK_ROLE_RADIO_MENU_ITEM
-  enum { ROLE_ROOT_PANE = 45U };           // ATK_ROLE_ROOT_PANE
-  enum { ROLE_SCROLL_PANE = 48U };         // ATK_ROLE_SCROLL_PANE
-  enum { ROLE_SPLIT_PANE = 51U };          // ATK_ROLE_SPLIT_PANE
-  enum { ROLE_TABLE_COLUMN_HEADER = 56U }; // ATK_ROLE_TABLE_COLUMN_HEADER
-  enum { ROLE_TABLE_ROW_HEADER = 57U };    // ATK_ROLE_TABLE_ROW_HEADER
-  enum { ROLE_TEAR_OFF_MENU_ITEM = 58U };  // ATK_ROLE_TEAR_OFF_MENU_ITEM
-  enum { ROLE_TERMINAL = 59U };            // ATK_ROLE_TERMINAL
-  enum { ROLE_TOGGLE_BUTTON = 61U };       // ATK_ROLE_TOGGLE_BUTTON
-  enum { ROLE_TREE_TABLE = 65U };          // ATK_ROLE_TREE_TABLE
-  enum { ROLE_VIEWPORT = 67U };            // ATK_ROLE_VIEWPORT
-  enum { ROLE_HEADER = 69U };              // ATK_ROLE_HEADER
-  enum { ROLE_FOOTER = 70U };              // ATK_ROLE_FOOTER
-  enum { ROLE_PARAGRAPH = 71U };           // ATK_ROLE_PARAGRAPH
-  enum { ROLE_RULER = 72U };               // ATK_ROLE_RULER
-  enum { ROLE_AUTOCOMPLETE = 74U };        // ATK_ROLE_AUTOCOMPLETE
-  enum { ROLE_EDITBAR = 75U };             // ATK_ROLE_EDITBAR
-  enum { ROLE_EMBEDDED = 76U };            // ATK_ROLE_EMBEDDED
-  enum { ROLE_ENTRY = 77U };               // ATK_ROLE_ENTRY
-  enum { ROLE_CAPTION = 79U };             // ATK_ROLE_CAPTION
-  enum { ROLE_DOCUMENT_FRAME = 80U };      // ATK_ROLE_DOCUMENT_FRAME
-  enum { ROLE_HEADING = 81U };             // ATK_ROLE_HEADING
-  enum { ROLE_PAGE = 82U };                // ATK_ROLE_PAGE
-  enum { ROLE_SECTION = 83U };             // ATK_ROLE_SECTION
-  enum { ROLE_REDUNDANT_OBJECT = 84U };    // ATK_ROLE_REDUNDANT_OBJECT
-  enum { ROLE_FORM = 85U };                // ATK_ROLE_FORM
-  enum { ROLE_LINK = 86U };                // ATK_ROLE_LINK
-  enum { ROLE_IME = 87U };                 // ATK_ROLE_INPUT_METHOD_WINDOW
-#else
-// MSAA Roles - only one per nsIAccessible or IAccessible
-  enum { ROLE_TITLEBAR = 1U };
-  enum { ROLE_MENUBAR = 2U };
-  enum { ROLE_SCROLLBAR = 3U };
-  enum { ROLE_GRIP = 4U };
-  enum { ROLE_SOUND = 5U };
-  enum { ROLE_CURSOR = 6U };
-  enum { ROLE_CARET = 7U };
-  enum { ROLE_ALERT = 8U };
-  enum { ROLE_WINDOW = 9U };
-  enum { ROLE_CLIENT = 10U };
-  enum { ROLE_MENUPOPUP = 11U };
-  enum { ROLE_MENUITEM = 12U };
-  enum { ROLE_RADIO_MENU_ITEM = 12U }; // Same as ROLE_MENUITEM
-  enum { ROLE_CHECK_MENU_ITEM = 12U }; // Same as ROLE_MENUITEM
-  enum { ROLE_TOOLTIP = 13U };
-  enum { ROLE_APPLICATION = 14U };
-  enum { ROLE_DOCUMENT = 15U };
-  enum { ROLE_PANE = 16U };
-  enum { ROLE_CHART = 17U };
-  enum { ROLE_DIALOG = 18U };
-  enum { ROLE_BORDER = 19U };
-  enum { ROLE_GROUPING = 20U };
-  enum { ROLE_SEPARATOR = 21U };
-  enum { ROLE_TOOLBAR = 22U };
-  enum { ROLE_STATUSBAR = 23U };
-  enum { ROLE_TABLE = 24U };
-  enum { ROLE_COLUMNHEADER = 25U };
-  enum { ROLE_ROWHEADER = 26U };
-  enum { ROLE_COLUMN = 27U };
-  enum { ROLE_ROW = 28U };
-  enum { ROLE_CELL = 29U };
-  enum { ROLE_LINK = 30U };
-  enum { ROLE_HELPBALLOON = 31U };
-  enum { ROLE_CHARACTER = 32U };
-  enum { ROLE_LIST = 33U };
-  enum { ROLE_LISTITEM = 34U };
-  enum { ROLE_OUTLINE = 35U };
-  enum { ROLE_TREE_TABLE = 35U }; // Same as ROLE_OUTLINE
-  enum { ROLE_OUTLINEITEM = 36U };
-  enum { ROLE_PAGETAB = 37U };
-  enum { ROLE_PROPERTYPAGE = 38U };
-  enum { ROLE_INDICATOR = 39U };
-  enum { ROLE_GRAPHIC = 40U };
-  enum { ROLE_STATICTEXT = 41U };
-  enum { ROLE_TEXT_LEAF = 42U };
-  enum { ROLE_PUSHBUTTON = 43U };
-  enum { ROLE_CHECKBUTTON = 44U };
-  enum { ROLE_RADIOBUTTON = 45U };
-  enum { ROLE_COMBOBOX = 46U };
-  enum { ROLE_DROPLIST = 47U };
-  enum { ROLE_PROGRESSBAR = 48U };
-  enum { ROLE_DIAL = 49U };
-  enum { ROLE_HOTKEYFIELD = 50U };
-  enum { ROLE_SLIDER = 51U };
-  enum { ROLE_SPINBUTTON = 52U };
-  enum { ROLE_DIAGRAM = 53U };
-  enum { ROLE_ANIMATION = 54U };
-  enum { ROLE_EQUATION = 55U };
-  enum { ROLE_BUTTONDROPDOWN = 56U };
-  enum { ROLE_BUTTONMENU = 57U };
-  enum { ROLE_BUTTONDROPDOWNGRID = 58U };
-  enum { ROLE_WHITESPACE = 59U };
-  enum { ROLE_PAGETABLIST = 60U };
-  enum { ROLE_CLOCK = 61U };
-  enum { ROLE_SPLITBUTTON = 62U };
-  enum { ROLE_IPADDRESS = 63U };
-  enum { ROLE_NOTHING = 4294967295U };
-
-// Make up for ATK roles that we don't have in MSAA
-// When in doubt map them to ROLE_NOTHING so that the role string is exposed
-  enum { ROLE_ICON = ROLE_NOTHING };
-  enum { ROLE_PASSWORD_TEXT = 1000U };
-  enum { ROLE_AUTOCOMPLETE = ROLE_COMBOBOX };
-  enum { ROLE_EDITBAR = ROLE_NOTHING };
-  enum { ROLE_EMBEDDED = ROLE_NOTHING };
-  enum { ROLE_ENTRY = 1001U };
-  enum { ROLE_CAPTION = ROLE_NOTHING };
-  enum { ROLE_DOCUMENT_FRAME = ROLE_NOTHING };
-  enum { ROLE_HEADING = ROLE_NOTHING };
-  enum { ROLE_PAGE = ROLE_NOTHING };
-  enum { ROLE_SECTION = ROLE_NOTHING };
-  enum { ROLE_REDUNDANT_OBJECT = ROLE_NOTHING };
-  enum { ROLE_HTML_CONTAINER = ROLE_NOTHING };
-  enum { ROLE_FORM = ROLE_NOTHING };
-  enum { ROLE_PARAGRAPH = ROLE_NOTHING };
-  enum { ROLE_TEXT_CONTAINER = ROLE_NOTHING };
-  enum { ROLE_LABEL = ROLE_STATICTEXT };
+  // Cross Platform Roles
+  // When adding a new role, be sure to also add it to nsRoleMap.h for each platform
+  const unsigned long ROLE_NOTHING = 0;
+  const unsigned long ROLE_TITLEBAR = 1;
+  const unsigned long ROLE_MENUBAR = 2;
+  const unsigned long ROLE_SCROLLBAR = 3;
+  const unsigned long ROLE_GRIP = 4;
+  const unsigned long ROLE_SOUND = 5;
+  const unsigned long ROLE_CURSOR = 6;
+  const unsigned long ROLE_CARET = 7;
+  const unsigned long ROLE_ALERT = 8;
+  const unsigned long ROLE_WINDOW = 9;
+  const unsigned long ROLE_CLIENT = 10;
+  const unsigned long ROLE_MENUPOPUP = 11;
+  const unsigned long ROLE_MENUITEM = 12;
+  const unsigned long ROLE_TOOLTIP = 13;
+  const unsigned long ROLE_APPLICATION = 14;
+  const unsigned long ROLE_DOCUMENT = 15;
+  const unsigned long ROLE_PANE = 16;
+  const unsigned long ROLE_CHART = 17;
+  const unsigned long ROLE_DIALOG = 18;
+  const unsigned long ROLE_BORDER = 19;
+  const unsigned long ROLE_GROUPING = 20;
+  const unsigned long ROLE_SEPARATOR = 21;
+  const unsigned long ROLE_TOOLBAR = 22;
+  const unsigned long ROLE_STATUSBAR = 23;
+  const unsigned long ROLE_TABLE = 24;
+  const unsigned long ROLE_COLUMNHEADER = 25;
+  const unsigned long ROLE_ROWHEADER = 26;
+  const unsigned long ROLE_COLUMN = 27;
+  const unsigned long ROLE_ROW = 28;
+  const unsigned long ROLE_CELL = 29;
+  const unsigned long ROLE_LINK = 30;
+  const unsigned long ROLE_HELPBALLOON = 31;
+  const unsigned long ROLE_CHARACTER = 32;
+  const unsigned long ROLE_LIST = 33;
+  const unsigned long ROLE_LISTITEM = 34;
+  const unsigned long ROLE_OUTLINE = 35;
+  const unsigned long ROLE_OUTLINEITEM = 36;
+  const unsigned long ROLE_PAGETAB = 37;
+  const unsigned long ROLE_PROPERTYPAGE = 38;
+  const unsigned long ROLE_INDICATOR = 39;
+  const unsigned long ROLE_GRAPHIC = 40;
+  const unsigned long ROLE_STATICTEXT = 41;
+  const unsigned long ROLE_TEXT_LEAF = 42;
+  const unsigned long ROLE_PUSHBUTTON = 43;
+  const unsigned long ROLE_CHECKBUTTON = 44;
+  const unsigned long ROLE_RADIOBUTTON = 45;
+  const unsigned long ROLE_COMBOBOX = 46;
+  const unsigned long ROLE_DROPLIST = 47;
+  const unsigned long ROLE_PROGRESSBAR = 48;
+  const unsigned long ROLE_DIAL = 49;
+  const unsigned long ROLE_HOTKEYFIELD = 50;
+  const unsigned long ROLE_SLIDER = 51;
+  const unsigned long ROLE_SPINBUTTON = 52;
+  const unsigned long ROLE_DIAGRAM = 53;
+  const unsigned long ROLE_ANIMATION = 54;
+  const unsigned long ROLE_EQUATION = 55;
+  const unsigned long ROLE_BUTTONDROPDOWN = 56;
+  const unsigned long ROLE_BUTTONMENU = 57;
+  const unsigned long ROLE_BUTTONDROPDOWNGRID = 58;
+  const unsigned long ROLE_WHITESPACE = 59;
+  const unsigned long ROLE_PAGETABLIST = 60;
+  const unsigned long ROLE_CLOCK = 61;
+  const unsigned long ROLE_SPLITBUTTON = 62;
+  const unsigned long ROLE_IPADDRESS = 63;
+  const unsigned long ROLE_ACCEL_LABEL = 64;
+  const unsigned long ROLE_ARROW  = 65;
+  const unsigned long ROLE_CANVAS = 66;
+  const unsigned long ROLE_CHECK_MENU_ITEM = 67;
+  const unsigned long ROLE_COLOR_CHOOSER  = 68;
+  const unsigned long ROLE_DATE_EDITOR = 69;
+  const unsigned long ROLE_DESKTOP_ICON = 70;
+  const unsigned long ROLE_DESKTOP_FRAME = 71;
+  const unsigned long ROLE_DIRECTORY_PANE = 72;
+  const unsigned long ROLE_FILE_CHOOSER = 73;
+  const unsigned long ROLE_FILLER = 74;
+  const unsigned long ROLE_FONT_CHOOSER = 75;
+  const unsigned long ROLE_FRAME = 76;
+  const unsigned long ROLE_GLASS_PANE = 77;
+  const unsigned long ROLE_HTML_CONTAINER = 78;
+  const unsigned long ROLE_ICON = 79;
+  const unsigned long ROLE_INTERNAL_FRAME = 80;
+  const unsigned long ROLE_LABEL = 81;
+  const unsigned long ROLE_LAYERED_PANE = 82;
+  const unsigned long ROLE_OPTION_PANE = 83;
+  const unsigned long ROLE_PASSWORD_TEXT = 84;
+  const unsigned long ROLE_POPUP_MENU = 85;
+  const unsigned long ROLE_RADIO_MENU_ITEM = 86;
+  const unsigned long ROLE_ROOT_PANE = 87;
+  const unsigned long ROLE_SCROLL_PANE = 88;
+  const unsigned long ROLE_SPLIT_PANE = 89;
+  const unsigned long ROLE_TABLE_COLUMN_HEADER = 90;
+  const unsigned long ROLE_TABLE_ROW_HEADER = 91;
+  const unsigned long ROLE_TEAR_OFF_MENU_ITEM = 92;
+  const unsigned long ROLE_TERMINAL =93;
+  const unsigned long ROLE_TEXT_CONTAINER = 94;
+  const unsigned long ROLE_TOGGLE_BUTTON = 95;
+  const unsigned long ROLE_TREE_TABLE = 96;
+  const unsigned long ROLE_VIEWPORT = 97;
+  const unsigned long ROLE_HEADER = 98;
+  const unsigned long ROLE_FOOTER = 99;
+  const unsigned long ROLE_PARAGRAPH = 100;
+  const unsigned long ROLE_RULER = 101;
+  const unsigned long ROLE_AUTOCOMPLETE = 102;
+  const unsigned long ROLE_EDITBAR = 103;
+  const unsigned long ROLE_EMBEDDED = 104;
+  const unsigned long ROLE_ENTRY = 105;
+  const unsigned long ROLE_CAPTION = 106;
+  const unsigned long ROLE_DOCUMENT_FRAME = 107;
+  const unsigned long ROLE_HEADING = 108;
+  const unsigned long ROLE_PAGE = 109;
+  const unsigned long ROLE_SECTION = 110;
+  const unsigned long ROLE_REDUNDANT_OBJECT = 111;
+  const unsigned long ROLE_FORM = 112;
+  const unsigned long ROLE_IME = 113;
+  const unsigned long ROLE_LAST_ENTRY = 114; // Important -- helps ensure nsRoleMap's are synchronized
 
 // MSAA relationship extensions to accNavigate
-  enum { NAVRELATION_CONTROLLED_BY = 0x1000 };
-  enum { NAVRELATION_CONTROLLER_FOR = 0x1001 };
-  enum { NAVRELATION_LABEL_FOR = 0x1002 };
-  enum { NAVRELATION_LABELLED_BY = 0x1003 };
-  enum { NAVRELATION_MEMBER_OF = 0x1004 };
-  enum { NAVRELATION_NODE_CHILD_OF = 0x1005 };
-  enum { NAVRELATION_FLOWS_TO = 0x1006 };
-  enum { NAVRELATION_FLOWS_FROM = 0x1007 };
-  enum { NAVRELATION_SUBWINDOW_OF = 0x1008 };
-  enum { NAVRELATION_EMBEDS = 0x1009 };
-  enum { NAVRELATION_EMBEDDED_BY = 0x100a };
-  enum { NAVRELATION_POPUP_FOR = 0x100b };
-  enum { NAVRELATION_PARENT_WINDOW_OF = 0x100c };
-  enum { NAVRELATION_DEFAULT_BUTTON = 0x100d };
-  enum { NAVRELATION_DESCRIBED_BY = 0x100e };
-  enum { NAVRELATION_DESCRIPTION_FOR = 0x100f };
-
-#endif
-%}
+  const unsigned long NAVRELATION_CONTROLLED_BY = 0x1000;
+  const unsigned long NAVRELATION_CONTROLLER_FOR = 0x1001;
+  const unsigned long NAVRELATION_LABEL_FOR = 0x1002;
+  const unsigned long NAVRELATION_LABELLED_BY = 0x1003;
+  const unsigned long NAVRELATION_MEMBER_OF = 0x1004;
+  const unsigned long NAVRELATION_NODE_CHILD_OF = 0x1005;
+  const unsigned long NAVRELATION_FLOWS_TO = 0x1006;
+  const unsigned long NAVRELATION_FLOWS_FROM = 0x1007;
+  const unsigned long NAVRELATION_SUBWINDOW_OF = 0x1008;
+  const unsigned long NAVRELATION_EMBEDS = 0x1009;
+  const unsigned long NAVRELATION_EMBEDDED_BY = 0x100a;
+  const unsigned long NAVRELATION_POPUP_FOR = 0x100b;
+  const unsigned long NAVRELATION_PARENT_WINDOW_OF = 0x100c;
+  const unsigned long NAVRELATION_DEFAULT_BUTTON = 0x100d;
+  const unsigned long NAVRELATION_DESCRIBED_BY = 0x100e;
+  const unsigned long NAVRELATION_DESCRIPTION_FOR = 0x100f;
 };
diff --git a/accessible/src/atk/nsAccessibleWrap.cpp b/accessible/src/atk/nsAccessibleWrap.cpp
index e1ef6145247c..32c114e2f59f 100644
--- a/accessible/src/atk/nsAccessibleWrap.cpp
+++ b/accessible/src/atk/nsAccessibleWrap.cpp
@@ -44,6 +44,7 @@
 #include "nsAppRootAccessible.h"
 #include "nsString.h"
 #include "prprf.h"
+#include "nsRoleMap.h"
 
 #include "nsMaiInterfaceComponent.h"
 #include "nsMaiInterfaceAction.h"
@@ -793,68 +794,24 @@ getRoleCB(AtkObject *aAtkObj)
         nsAccessibleWrap *accWrap =
             NS_REINTERPRET_CAST(MaiAtkObject*, aAtkObj)->accWrap;
 
-        PRUint32 accRole;
+        PRUint32 accRole = 0, atkRole = 0;
         nsresult rv = accWrap->GetFinalRole(&accRole);
         NS_ENSURE_SUCCESS(rv, ATK_ROLE_INVALID);
 
         //the cross-platform Accessible object returns the same value for
         //both "ROLE_MENUITEM" and "ROLE_MENUPOPUP"
+        // XXX move this logic into nsXULMenuitem::GetRole()
         if (accRole == nsIAccessible::ROLE_MENUITEM) {
             PRInt32 childCount = 0;
             accWrap->GetChildCount(&childCount);
-            if (childCount > 0)
+            if (childCount > 0) {
                 accRole = nsIAccessible::ROLE_MENUPOPUP;
-        }
-#ifndef USE_ATK_ROLE_LINK
-        else if (accRole == nsIAccessible::ROLE_LINK) {
-            //ATK doesn't have role-link now
-            //register it on runtime
-            static AtkRole linkRole = (AtkRole)0;
-            if (linkRole == 0) {
-                linkRole = atk_role_register("hyper link");
             }
-            accRole = linkRole;
         }
-#endif
-        else if (accRole == nsIAccessible::ROLE_TEXT_CONTAINER) {
-          accRole = ATK_ROLE_TEXT;
-        }
-#ifndef USE_ATK_ROLE_AUTOCOMPLETE
-        else if (accRole == nsIAccessible::ROLE_AUTOCOMPLETE) {
-          accRole = ATK_ROLE_COMBO_BOX;
-        }
-#endif
-#ifndef USE_ATK_ROLE_ENTRY
-        else if (accRole == nsIAccessible::ROLE_ENTRY) {
-          accRole = ATK_ROLE_TEXT;
-        }
-#endif
-#ifndef USE_ATK_ROLE_FORM
-        else if (accRole == nsIAccessible::ROLE_FORM) {
-          accRole = ATK_ROLE_PANEL;
-        }
-#endif
-#ifndef USE_ATK_ROLE_HEADING
-        else if (accRole == nsIAccessible::ROLE_HEADING) {
-          accRole = ATK_ROLE_TEXT;
-        }
-#endif
-#ifndef USE_ATK_ROLE_SECTION
-        else if (accRole == nsIAccessible::ROLE_SECTION) {
-          accRole = ATK_ROLE_TEXT;
-        }
-#endif
-#ifndef USE_ATK_ROLE_PARAGRAPH
-        else if (accRole == nsIAccessible::ROLE_PARAGRAPH) {
-          accRole = ATK_ROLE_TEXT;
-        }
-#endif
-#ifndef USE_ATK_ROLE_DOCUMENT_FRAME
-        else if (accRole == nsIAccessible::ROLE_DOCUMENT) {
-          accRole = ATK_ROLE_HTML_CONTAINER;
-        }
-#endif
-        aAtkObj->role = NS_STATIC_CAST(AtkRole, accRole);
+        atkRole = atkRoleMap[accRole]; // map to the actual value
+        NS_ASSERTION(atkRoleMap[nsIAccessible::ROLE_LAST_ENTRY] ==
+                     ROLE_ATK_LAST_ENTRY, "ATK role map skewed");
+        aAtkObj->role = NS_STATIC_CAST(AtkRole, atkRole);
     }
     return aAtkObj->role;
 }
diff --git a/accessible/src/atk/nsRoleMap.h b/accessible/src/atk/nsRoleMap.h
new file mode 100644
index 000000000000..624ce1e2ecbb
--- /dev/null
+++ b/accessible/src/atk/nsRoleMap.h
@@ -0,0 +1,213 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim:expandtab:shiftwidth=4:tabstop=4:
+ */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is IBM Corporation
+ * Portions created by the Initial Developer are Copyright (C) 2006
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *   Gao, Ming (gaoming@cn.ibm.com)
+ *   Aaron Leventhal (aleventh@us.ibm.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
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include <atk/atk.h>
+#include "nsAccessibleWrap.h"
+
+#define ROLE_ATK_LAST_ENTRY -1
+
+// Map array from cross platform roles to  ATK roles
+PRUint32 atkRoleMap[] = {
+                                  // Cross Platform Roles                  #
+    ATK_ROLE_UNKNOWN,             // nsIAccessible::ROLE_NOTHING           0
+    ATK_ROLE_UNKNOWN,             // nsIAccessible::ROLE_TITLEBAR          1
+    ATK_ROLE_MENU_BAR,            // nsIAccessible::ROLE_MENUBAR           2
+    ATK_ROLE_SCROLL_BAR,          // nsIAccessible::ROLE_SCROLLBAR         3
+    ATK_ROLE_UNKNOWN,             // nsIAccessible::ROLE_GRIP              4
+    ATK_ROLE_UNKNOWN,             // nsIAccessible::ROLE_SOUND             5
+    ATK_ROLE_UNKNOWN,             // nsIAccessible::ROLE_CURSOR            6
+    ATK_ROLE_UNKNOWN,             // nsIAccessible::ROLE_CARET             7
+    ATK_ROLE_ALERT,               // nsIAccessible::ROLE_ALERT             8
+    ATK_ROLE_WINDOW,              // nsIAccessible::ROLE_WINDOW            9
+    ATK_ROLE_DRAWING_AREA,        // nsIAccessible::ROLE_CLIENT            10
+    ATK_ROLE_MENU,                // nsIAccessible::ROLE_MENUPOPUP         11
+    ATK_ROLE_MENU_ITEM,           // nsIAccessible::ROLE_MENUITEM          12
+    ATK_ROLE_TOOL_TIP,            // nsIAccessible::ROLE_TOOLTIP           13
+    ATK_ROLE_APPLICATION,         // nsIAccessible::ROLE_APPLICATION       14
+#ifdef USE_ATK_ROLE_DOCUMENT_FRAME 
+    ATK_ROLE_DOCUMENT_FRAME,      // nsIAccessible::ROLE_DOCUMENT          15
+#else
+    ATK_ROLE_HTML_CONTAINER,      // nsIAccessible::ROLE_DOCUMENT          15
+#endif
+    ATK_ROLE_PANEL,               // nsIAccessible::ROLE_PANE              16
+#ifdef USE_ATK_ROLE_CHART
+    ATK_ROLE_CHART,               // nsIAccessible::ROLE_CHART             17
+#else
+    ATK_ROLE_PANE,                // nsIAccessible::ROLE_CHART             17
+#endif
+    ATK_ROLE_DIALOG,              // nsIAccessible::ROLE_DIALOG            18
+    ATK_ROLE_UNKNOWN,             // nsIAccessible::ROLE_BORDER            19
+    ATK_ROLE_PANEL,               // nsIAccessible::ROLE_GROUPING          20
+    ATK_ROLE_SEPARATOR,           // nsIAccessible::ROLE_SEPARATOR         21
+    ATK_ROLE_TOOL_BAR,            // nsIAccessible::ROLE_TOOLBAR           22
+    ATK_ROLE_STATUSBAR,           // nsIAccessible::ROLE_STATUSBAR         23
+    ATK_ROLE_TABLE,               // nsIAccessible::ROLE_TABLE             24
+    ATK_ROLE_COLUMN_HEADER,       // nsIAccessible::ROLE_COLUMNHEADER      25
+    ATK_ROLE_ROW_HEADER,          // nsIAccessible::ROLE_ROWHEADER         26
+    ATK_ROLE_UNKNOWN,             // nsIAccessible::ROLE_COLUMN            27
+    ATK_ROLE_UNKNOWN,             // nsIAccessible::ROLE_ROW               28
+    ATK_ROLE_TABLE_CELL,          // nsIAccessible::ROLE_CELL              29
+#ifdef USE_ATK_ROLE_LINK
+    ATK_ROLE_LINK,                // nsIAccessible::ROLE_LINK              30
+#else
+    ATK_ROLE_PUSH_BUTTON,         // nsIAccessible::ROLE_LINK              30
+#endif
+    ATK_ROLE_UNKNOWN,             // nsIAccessible::ROLE_HELPBALLOON       31
+    ATK_ROLE_IMAGE,               // nsIAccessible::ROLE_CHARACTER         32
+    ATK_ROLE_LIST,                // nsIAccessible::ROLE_LIST              33
+    ATK_ROLE_LIST_ITEM,           // nsIAccessible::ROLE_LISTITEM          34
+    ATK_ROLE_TREE,                // nsIAccessible::ROLE_OUTLINE           35
+    ATK_ROLE_LIST_ITEM,           // nsIAccessible::ROLE_OUTLINEITEM       36
+    ATK_ROLE_PAGE_TAB,            // nsIAccessible::ROLE_PAGETAB           37
+    ATK_ROLE_UNKNOWN,             // nsIAccessible::ROLE_PROPERTYPAGE      38
+    ATK_ROLE_UNKNOWN,             // nsIAccessible::ROLE_INDICATOR         39
+    ATK_ROLE_IMAGE,               // nsIAccessible::ROLE_GRAPHIC           40
+    ATK_ROLE_UNKNOWN,             // nsIAccessible::ROLE_STATICTEXT        41
+    ATK_ROLE_UNKNOWN,             // nsIAccessible::ROLE_TEXT_LEAF         42
+    ATK_ROLE_PUSH_BUTTON,         // nsIAccessible::ROLE_PUSHBUTTON        43
+    ATK_ROLE_CHECK_BOX,           // nsIAccessible::ROLE_CHECKBUTTON       44
+    ATK_ROLE_RADIO_BUTTON,        // nsIAccessible::ROLE_RADIOBUTTON       45
+    ATK_ROLE_COMBO_BOX,           // nsIAccessible::ROLE_COMBOBOX          46
+    ATK_ROLE_CALENDAR,            // nsIAccessible::ROLE_DROPLIST          47
+    ATK_ROLE_PROGRESS_BAR,        // nsIAccessible::ROLE_PROGRESSBAR       48
+    ATK_ROLE_DIAL,                // nsIAccessible::ROLE_DIAL              49
+    ATK_ROLE_UNKNOWN,             // nsIAccessible::ROLE_HOTKEYFIELD       50
+    ATK_ROLE_SLIDER,              // nsIAccessible::ROLE_SLIDER            51
+    ATK_ROLE_SPIN_BUTTON,         // nsIAccessible::ROLE_SPINBUTTON        52
+    ATK_ROLE_IMAGE,               // nsIAccessible::ROLE_DIAGRAM           53
+    ATK_ROLE_ANIMATION,           // nsIAccessible::ROLE_ANIMATION         54
+    ATK_ROLE_UNKNOWN,             // nsIAccessible::ROLE_EQUATION          55
+    ATK_ROLE_PUSH_BUTTON,         // nsIAccessible::ROLE_BUTTONDROPDOWN    56
+    ATK_ROLE_PUSH_BUTTON,         // nsIAccessible::ROLE_BUTTONMENU        57
+    ATK_ROLE_UNKNOWN,             // nsIAccessible::ROLE_BUTTONDROPDOWNGRID 58
+    ATK_ROLE_UNKNOWN,             // nsIAccessible::ROLE_WHITESPACE        59
+    ATK_ROLE_PAGE_TAB_LIST,       // nsIAccessible::ROLE_PAGETABLIST       60
+    ATK_ROLE_UNKNOWN,             // nsIAccessible::ROLE_CLOCK             61
+    ATK_ROLE_PUSH_BUTTON,         // nsIAccessible::ROLE_SPLITBUTTON       62
+    ATK_ROLE_UNKNOWN,             // nsIAccessible::ROLE_IPADDRESS         63
+    ATK_ROLE_ACCEL_LABEL,         // nsIAccessible::ROLE_ACCEL_LABEL       64
+    ATK_ROLE_ARROW,               // nsIAccessible::ROLE_ARROW             65
+    ATK_ROLE_CANVAS,              // nsIAccessible::ROLE_CANVAS            66
+    ATK_ROLE_CHECK_MENU_ITEM,     // nsIAccessible::ROLE_CHECK_MENU_ITEM   67
+    ATK_ROLE_COLOR_CHOOSER,       // nsIAccessible::ROLE_COLOR_CHOOSER     68
+    ATK_ROLE_DATE_EDITOR,         // nsIAccessible::ROLE_DATE_EDITOR       69
+    ATK_ROLE_DESKTOP_ICON,        // nsIAccessible::ROLE_DESKTOP_ICON      70
+    ATK_ROLE_DESKTOP_FRAME,       // nsIAccessible::ROLE_DESKTOP_FRAME     71
+    ATK_ROLE_DIRECTORY_PANE,      // nsIAccessible::ROLE_DIRECTORY_PANE    72
+    ATK_ROLE_FILE_CHOOSER,        // nsIAccessible::ROLE_FILE_CHOOSER      73
+    ATK_ROLE_FILLER,              // nsIAccessible::ROLE_FILLER            74
+    ATK_ROLE_FONT_CHOOSER,        // nsIAccessible::ROLE_FONT_CHOOSER      75
+    ATK_ROLE_FRAME,               // nsIAccessible::ROLE_FRAME             76
+    ATK_ROLE_GLASS_PANE,          // nsIAccessible::ROLE_GLASS_PANE        77
+    ATK_ROLE_HTML_CONTAINER,      // nsIAccessible::ROLE_HTML_CONTAINER    78
+    ATK_ROLE_ICON,                // nsIAccessible::ROLE_ICON              79
+    ATK_ROLE_INTERNAL_FRAME,      // nsIAccessible::ROLE_INTERNAL_FRAME    80
+    ATK_ROLE_LABEL,               // nsIAccessible::ROLE_LABEL             81
+    ATK_ROLE_LAYERED_PANE,        // nsIAccessible::ROLE_LAYERED_PANE      82
+    ATK_ROLE_OPTION_PANE,         // nsIAccessible::ROLE_OPTION_PANE       83
+    ATK_ROLE_PASSWORD_TEXT,       // nsIAccessible::ROLE_PASSWORD_TEXT     84
+    ATK_ROLE_POPUP_MENU,          // nsIAccessible::ROLE_POPUP_MENU        85
+    ATK_ROLE_RADIO_MENU_ITEM,     // nsIAccessible::ROLE_RADIO_MENU_ITEM   86
+    ATK_ROLE_ROOT_PANE,           // nsIAccessible::ROLE_ROOT_PANE         87
+    ATK_ROLE_SCROLL_PANE,         // nsIAccessible::ROLE_SCROLL_PANE       88
+    ATK_ROLE_SPLIT_PANE,          // nsIAccessible::ROLE_SPLIT_PANE        89
+    ATK_ROLE_TABLE_COLUMN_HEADER, // nsIAccessible::ROLE_TABLE_COLUMN_HEADER 90
+    ATK_ROLE_TABLE_ROW_HEADER,    // nsIAccessible::ROLE_TABLE_ROW_HEADER  91
+    ATK_ROLE_TEAR_OFF_MENU_ITEM,  // nsIAccessible::ROLE_TEAR_OFF_MENU_ITEM  92
+    ATK_ROLE_TERMINAL,            // nsIAccessible::ROLE_TERMINAL          93
+    ATK_ROLE_TEXT,                // nsIAccessible::ROLE_TEXT_CONTAINER    94
+    ATK_ROLE_TOGGLE_BUTTON,       // nsIAccessible::ROLE_TOGGLE_BUTTON     95
+    ATK_ROLE_TREE_TABLE,          // nsIAccessible::ROLE_TREE_TABLE        96
+    ATK_ROLE_VIEWPORT,            // nsIAccessible::ROLE_VIEWPORT          97
+    ATK_ROLE_HEADER,              // nsIAccessible::ROLE_HEADER            98
+    ATK_ROLE_FOOTER,              // nsIAccessible::ROLE_FOOTER            99
+    ATK_ROLE_PARAGRAPH,           // nsIAccessible::ROLE_PARAGRAPH         100
+    ATK_ROLE_RULER,               // nsIAccessible::ROLE_RULER             101
+#ifdef USE_ATK_ROLE_AUTOCOMPLETE
+    ATK_ROLE_AUTOCOMPLETE,        // nsIAccessible::ROLE_AUTOCOMPLETE      102
+#else
+    ATK_ROLE_COMBO_BOX,           // nsIAccessible::ROLE_AUTOCOMPLETE      102
+#endif
+    ATK_ROLE_EDITBAR,             // nsIAccessible::ROLE_EDITBAR           103
+    ATK_ROLE_EMBEDDED,            // nsIAccessible::ROLE_EMBEDDED          104
+#ifdef USE_ATK_ROLE_ENTRY
+    ATK_ROLE_ENTRY,               // nsIAccessible::ROLE_ENTRY             105
+#else
+    ATK_ROLE_TEXT,                // nsIAccessible::ROLE_ENTRY             105
+#endif
+#ifdef USE_ATK_ROLE_CAPTION
+    ATK_ROLE_CAPTION,             // nsIAccessible::ROLE_CAPTION           106
+#else
+    ATK_ROLE_LABEL,               // nsIAccessible::ROLE_CAPTION           106
+#endif
+    ATK_ROLE_DOCUMENT_FRAME,      // nsIAccessible::ROLE_DOCUMENT_FRAME    107
+#ifdef USE_ATK_ROLE_HEADING
+    ATK_ROLE_HEADING,             // nsIAccessible::ROLE_HEADING           108
+#else
+    TK_ROLE_TEXT,                 // nsIAccessible::ROLE_HEADING           108
+#endif
+#ifdef USE_ATK_ROLE_PAGE
+    ATK_ROLE_PAGE,                // nsIAccessible::ROLE_PAGE              109
+#else
+    ATK_ROLE_SECTION,             // nsIAccessible::ROLE_PAGE              109
+#endif
+#ifdef USE_ATK_ROLE_SECTION
+    ATK_ROLE_SECTION,             // nsIAccessible::ROLE_SECTION           110
+#else
+    ATK_ROLE_TEXT,                // nsIAccessible::ROLE_SECTION           110
+#endif
+#ifdef USE_ATK_ROLE_REDUNDANT_OBJECT
+    ATK_ROLE_REDUNDANT_OBJECT,    // nsIAccessible::ROLE_REDUNDANT_OBJECT  111
+#else
+   ATK_ROLE_INVALD,               // nsIAccessible::ROLE_REDUNDANT_OBJECT  111
+#endif
+#ifdef USE_ATK_ROLE_FORM
+    ATK_ROLE_FORM,                // nsIAccessible::ROLE_FORM              112
+#else
+    ATK_ROLE_PANEL,               // nsIAccessible::ROLE_FORM              112
+#endif
+#ifdef USE_ATK_ROLE_INPUT_METHOD_WINDOW
+    ATK_ROLE_INPUT_METHOD_WINDOW  // nsIAccessible::ROLE_IME               113
+#else
+    ATK_ROLE_INVALID              // nsIAccessible::ROLE_IME               113
+#endif
+    ROLE_ATK_LAST_ENTRY          // nsIAccessible::ROLE_LAST_ENTRY
+};
+
diff --git a/accessible/src/msaa/nsAccessibleWrap.cpp b/accessible/src/msaa/nsAccessibleWrap.cpp
index f9b4380a640f..00dbeee7fdaa 100644
--- a/accessible/src/msaa/nsAccessibleWrap.cpp
+++ b/accessible/src/msaa/nsAccessibleWrap.cpp
@@ -50,6 +50,7 @@
 #include "nsIServiceManager.h"
 #include "nsTextFormatter.h"
 #include "nsIView.h"
+#include "nsRoleMap.h"
 
 // for the COM IEnumVARIANT solution in get_AccSelection()
 #define _ATLBASE_IMPL
@@ -433,19 +434,17 @@ STDMETHODIMP nsAccessibleWrap::get_accRole(
   if (!xpAccessible)
     return E_FAIL;
 
-  PRUint32 role = 0;
-  if (NS_FAILED(xpAccessible->GetFinalRole(&role)))
+  PRUint32 xpRole = 0, msaaRole = 0;
+  if (NS_FAILED(xpAccessible->GetFinalRole(&xpRole)))
     return E_FAIL;
-
-  // Begin check for extended roles that need to be mapped to something known
-  if (role == ROLE_ENTRY || role == ROLE_PASSWORD_TEXT) {
-    role = ROLE_TEXT_LEAF;
-  }
+  msaaRole = msaaRoleMap[xpRole];
+  NS_ASSERTION(msaaRoleMap[nsIAccessible::ROLE_LAST_ENTRY] == ROLE_MSAA_LAST_ENTRY,
+               "MSAA role map skewed");
 
   // -- Try enumerated role
-  if (role != ROLE_NOTHING && role != ROLE_CLIENT) {
+  if (msaaRole != USE_ROLE_STRING) {
     pvarRole->vt = VT_I4;
-    pvarRole->lVal = role;  // Normal enumerated role
+    pvarRole->lVal = msaaRole;  // Normal enumerated role
     return S_OK;
   }
 
@@ -460,7 +459,7 @@ STDMETHODIMP nsAccessibleWrap::get_accRole(
   NS_ASSERTION(content, "No content for accessible");
   if (content && content->IsNodeOfType(nsINode::eELEMENT)) {
     nsAutoString roleString;
-    if (role != ROLE_CLIENT && GetRoleAttribute(content, roleString)) {
+    if (msaaRole != ROLE_CLIENT && GetRoleAttribute(content, roleString)) {
       nsINodeInfo *nodeInfo = content->NodeInfo();
       nodeInfo->GetName(roleString);
       nsAutoString nameSpaceURI;
diff --git a/accessible/src/msaa/nsRoleMap.h b/accessible/src/msaa/nsRoleMap.h
new file mode 100644
index 000000000000..e942eaaafc78
--- /dev/null
+++ b/accessible/src/msaa/nsRoleMap.h
@@ -0,0 +1,165 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* vim:expandtab:shiftwidth=4:tabstop=4:
+ */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is mozilla.org code.
+ *
+ * The Initial Developer of the Original Code is IBM Corporation
+ * Portions created by the Initial Developer are Copyright (C) 2006
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ *   Gao, Ming (gaoming@cn.ibm.com)
+ *   Aaron Leventhal (aleventh@us.ibm.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
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include "OLEACC.H"
+
+#define USE_ROLE_STRING 0
+#define ROLE_MSAA_LAST_ENTRY -1
+
+// 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_FILLER
+    USE_ROLE_STRING,                 // nsIAccessible::ROLE_FONT_CHOOSER
+    USE_ROLE_STRING,                 // nsIAccessible::ROLE_FRAME
+    USE_ROLE_STRING,                 // nsIAccessible::ROLE_GLASS_PANE
+    USE_ROLE_STRING,                 // nsIAccessible::ROLE_HTML_CONTAINER
+    ROLE_SYSTEM_PUSHBUTTON,          // nsIAccessible::ROLE_ICON
+    USE_ROLE_STRING,                 // nsIAccessible::ROLE_INTERNAL_FRAME
+    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
+    USE_ROLE_STRING,                 // nsIAccessible::ROLE_EMBEDDED
+    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_MSAA_LAST_ENTRY              // nsIAccessible::ROLE_LAST_ENTRY
+};