From 1382eff4f0dce7c0cac69381eb16d6e2b5fc8605 Mon Sep 17 00:00:00 2001 From: "aaronleventhal%moonset.net" Date: Sat, 4 Aug 2007 02:15:53 +0000 Subject: [PATCH] Bug 390280. Add missing ARIA roles. r=ginn.chen, a=dsicore --- accessible/public/nsIAccessibleRole.idl | 9 +- accessible/src/atk/nsAccessibleWrap.cpp | 85 ++++++++++--------- accessible/src/atk/nsAccessibleWrap.h | 3 + .../src/atk/nsMaiInterfaceComponent.cpp | 2 +- accessible/src/atk/nsRoleMap.h | 1 + accessible/src/base/nsARIAMap.cpp | 5 ++ accessible/src/base/nsAccessibilityService.h | 3 +- accessible/src/html/nsHTMLImageAccessible.cpp | 5 +- accessible/src/mac/nsAccessibleWrap.h | 4 +- accessible/src/mac/nsRoleMap.h | 1 + accessible/src/msaa/nsAccessibleWrap.cpp | 10 +++ accessible/src/msaa/nsAccessibleWrap.h | 9 +- accessible/src/msaa/nsRoleMap.h | 3 + 13 files changed, 87 insertions(+), 53 deletions(-) diff --git a/accessible/public/nsIAccessibleRole.idl b/accessible/public/nsIAccessibleRole.idl index f1ac945b8c1..ba4cd9c355c 100755 --- a/accessible/public/nsIAccessibleRole.idl +++ b/accessible/public/nsIAccessibleRole.idl @@ -44,7 +44,7 @@ * @note - When adding a new role, be sure to also add it to nsRoleMap.h for * each platform. */ -[scriptable, uuid(d6d73bc4-0fe9-46a1-a8dd-6d93b041e54b)] +[scriptable, uuid(31685b85-36a3-448c-99ed-b034a198e303)] interface nsIAccessibleRole : nsISupports { /** @@ -743,10 +743,15 @@ interface nsIAccessibleRole : nsISupports */ const unsigned long ROLE_COMBOBOX_LISTITEM = 115; + /** + * An image map -- has child links representing the areas + */ + const unsigned long ROLE_IMAGE_MAP = 116; + /** * It's not role actually. This contanst is important to help ensure * nsRoleMap's are synchronized. */ - const unsigned long ROLE_LAST_ENTRY = 116; + const unsigned long ROLE_LAST_ENTRY = 117; }; diff --git a/accessible/src/atk/nsAccessibleWrap.cpp b/accessible/src/atk/nsAccessibleWrap.cpp index f64d40544ed..2975485aec7 100644 --- a/accessible/src/atk/nsAccessibleWrap.cpp +++ b/accessible/src/atk/nsAccessibleWrap.cpp @@ -427,7 +427,7 @@ nsAccessibleWrap::CreateMaiInterfaces(void) PRUint32 accRole; GetRole(&accRole); - + //nsIAccessibleText nsCOMPtr accessInterfaceText; QueryInterface(NS_GET_IID(nsIAccessibleText), @@ -444,14 +444,6 @@ nsAccessibleWrap::CreateMaiInterfaces(void) interfacesBits |= 1 << MAI_INTERFACE_EDITABLE_TEXT; } - //nsIAccessibleSelection - nsCOMPtr accessInterfaceSelection; - QueryInterface(NS_GET_IID(nsIAccessibleSelectable), - getter_AddRefs(accessInterfaceSelection)); - if (accessInterfaceSelection) { - interfacesBits |= 1 << MAI_INTERFACE_SELECTION; - } - //nsIAccessibleValue nsCOMPtr accessInterfaceValue; QueryInterface(NS_GET_IID(nsIAccessibleValue), @@ -460,34 +452,6 @@ nsAccessibleWrap::CreateMaiInterfaces(void) interfacesBits |= 1 << MAI_INTERFACE_VALUE; } - //nsIAccessibleHypertext - PRInt32 linkCount = 0; - nsCOMPtr accessInterfaceHypertext; - QueryInterface(NS_GET_IID(nsIAccessibleHyperText), - getter_AddRefs(accessInterfaceHypertext)); - if (accessInterfaceHypertext) { - nsresult rv = accessInterfaceHypertext->GetLinks(&linkCount); - if (NS_SUCCEEDED(rv) && (linkCount > 0)) { - interfacesBits |= 1 << MAI_INTERFACE_HYPERTEXT; - } - } - - //nsIAccessibleHyperLink - nsCOMPtr accessInterfaceHyperlink; - QueryInterface(NS_GET_IID(nsIAccessibleHyperLink), - getter_AddRefs(accessInterfaceHyperlink)); - if (accessInterfaceHyperlink) { - interfacesBits |= 1 << MAI_INTERFACE_HYPERLINK_IMPL; - } - - //nsIAccessibleTable - nsCOMPtr accessInterfaceTable; - QueryInterface(NS_GET_IID(nsIAccessibleTable), - getter_AddRefs(accessInterfaceTable)); - if (accessInterfaceTable) { - interfacesBits |= 1 << MAI_INTERFACE_TABLE; - } - //nsIAccessibleDocument nsCOMPtr accessInterfaceDocument; QueryInterface(NS_GET_IID(nsIAccessibleDocument), @@ -504,6 +468,44 @@ nsAccessibleWrap::CreateMaiInterfaces(void) interfacesBits |= 1 << MAI_INTERFACE_IMAGE; } + //nsIAccessibleHyperLink + nsCOMPtr accessInterfaceHyperlink; + QueryInterface(NS_GET_IID(nsIAccessibleHyperLink), + getter_AddRefs(accessInterfaceHyperlink)); + if (accessInterfaceHyperlink) { + interfacesBits |= 1 << MAI_INTERFACE_HYPERLINK_IMPL; + } + + if (!MustPrune(this)) { // These interfaces require children + //nsIAccessibleHypertext + PRInt32 linkCount = 0; + nsCOMPtr accessInterfaceHypertext; + QueryInterface(NS_GET_IID(nsIAccessibleHyperText), + getter_AddRefs(accessInterfaceHypertext)); + if (accessInterfaceHypertext) { + nsresult rv = accessInterfaceHypertext->GetLinks(&linkCount); + if (NS_SUCCEEDED(rv) && (linkCount > 0)) { + interfacesBits |= 1 << MAI_INTERFACE_HYPERTEXT; + } + } + + //nsIAccessibleTable + nsCOMPtr accessInterfaceTable; + QueryInterface(NS_GET_IID(nsIAccessibleTable), + getter_AddRefs(accessInterfaceTable)); + if (accessInterfaceTable) { + interfacesBits |= 1 << MAI_INTERFACE_TABLE; + } + + //nsIAccessibleSelection + nsCOMPtr accessInterfaceSelection; + QueryInterface(NS_GET_IID(nsIAccessibleSelectable), + getter_AddRefs(accessInterfaceSelection)); + if (accessInterfaceSelection) { + interfacesBits |= 1 << MAI_INTERFACE_SELECTION; + } + } + return interfacesBits; } @@ -872,7 +874,7 @@ gint getChildCountCB(AtkObject *aAtkObj) { nsAccessibleWrap *accWrap = GetAccessibleWrap(aAtkObj); - if (!accWrap) { + if (!accWrap || nsAccessibleWrap::MustPrune(accWrap)) { return 0; } @@ -906,7 +908,7 @@ refChildCB(AtkObject *aAtkObj, gint aChildIndex) // or we should cache an array of children in each nsAccessible // (instead of mNextSibling on the children) nsAccessibleWrap *accWrap = GetAccessibleWrap(aAtkObj); - if (!accWrap) { + if (!accWrap || nsAccessibleWrap::MustPrune(accWrap)) { return nsnull; } @@ -1551,3 +1553,8 @@ nsAccessibleWrap::FireAtkShowHideEvent(nsIAccessibleEvent *aEvent, return NS_OK; } +PRBool nsAccessibleWrap::MustPrune(nsIAccessible *aAccessible) +{ + PRUint32 role = Role(aAccessible); + return role == nsIAccessibleRole::ROLE_GRAPHIC; +} diff --git a/accessible/src/atk/nsAccessibleWrap.h b/accessible/src/atk/nsAccessibleWrap.h index 421c257530b..d514376fff0 100644 --- a/accessible/src/atk/nsAccessibleWrap.h +++ b/accessible/src/atk/nsAccessibleWrap.h @@ -127,6 +127,9 @@ protected: AtkObject *mAtkObject; + // Should this accessible be allowed to have any ATK children + static PRBool MustPrune(nsIAccessible *aAccessible); + private: PRUint16 CreateMaiInterfaces(void); }; diff --git a/accessible/src/atk/nsMaiInterfaceComponent.cpp b/accessible/src/atk/nsMaiInterfaceComponent.cpp index b583da12950..90ae15c49fc 100644 --- a/accessible/src/atk/nsMaiInterfaceComponent.cpp +++ b/accessible/src/atk/nsMaiInterfaceComponent.cpp @@ -69,7 +69,7 @@ refAccessibleAtPointCB(AtkComponent *aComponent, AtkCoordType aCoordType) { nsAccessibleWrap *accWrap = GetAccessibleWrap(ATK_OBJECT(aComponent)); - if (!accWrap) + if (!accWrap || nsAccessibleWrap::MustPrune(accWrap)) return nsnull; // or ATK_XY_SCREEN what is definition this in nsIAccessible ??? diff --git a/accessible/src/atk/nsRoleMap.h b/accessible/src/atk/nsRoleMap.h index aa7301e6c56..3b8653267a3 100644 --- a/accessible/src/atk/nsRoleMap.h +++ b/accessible/src/atk/nsRoleMap.h @@ -162,6 +162,7 @@ static const PRUint32 atkRoleMap[] = { ATK_ROLE_CALENDAR, // nsIAccessibleRole::ROLE_CALENDAR 113 ATK_ROLE_MENU, // nsIAccessibleRole::ROLE_COMBOBOX_LIST 114 ATK_ROLE_MENU_ITEM, // nsIAccessibleRole::ROLE_COMBOBOX_LISTITEM 115 + ATK_ROLE_IMAGE, // nsIAccessibleRole::ROLE_IMAGE_MAP 116 kROLE_ATK_LAST_ENTRY // nsIAccessibleRole::ROLE_LAST_ENTRY }; diff --git a/accessible/src/base/nsARIAMap.cpp b/accessible/src/base/nsARIAMap.cpp index 7447af435ff..0d1101c3cbd 100644 --- a/accessible/src/base/nsARIAMap.cpp +++ b/accessible/src/base/nsARIAMap.cpp @@ -100,6 +100,8 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] = {"selected", "false", nsIAccessibleStates::STATE_SELECTABLE}, {"readonly", kBoolState, nsIAccessibleStates::STATE_READONLY}, kEndEntry}, {"group", nsIAccessibleRole::ROLE_GROUPING, eNameLabelOrTitle, eNoValue, kNoReqStates, kEndEntry}, + {"heading", nsIAccessibleRole::ROLE_HEADING, eNameLabelOrTitle, eNoValue, kNoReqStates, kEndEntry}, + {"img", nsIAccessibleRole::ROLE_GRAPHIC, eNameLabelOrTitle, eNoValue, kNoReqStates, kEndEntry}, {"label", nsIAccessibleRole::ROLE_LABEL, eNameOkFromChildren, eNoValue, kNoReqStates, kEndEntry}, {"link", nsIAccessibleRole::ROLE_LINK, eNameOkFromChildren, eNoValue, nsIAccessibleStates::STATE_LINKED, {"disabled", kBoolState, nsIAccessibleStates::STATE_UNAVAILABLE}, kEndEntry}, @@ -143,6 +145,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] = {"checked", kBoolState, nsIAccessibleStates::STATE_CHECKED}, kEndEntry}, {"radiogroup", nsIAccessibleRole::ROLE_GROUPING, eNameLabelOrTitle, eNoValue, kNoReqStates, {"disabled", kBoolState, nsIAccessibleStates::STATE_UNAVAILABLE}, kEndEntry}, + {"region", nsIAccessibleRole::ROLE_PANE, eNameLabelOrTitle, eNoValue, kNoReqStates, kEndEntry}, {"row", nsIAccessibleRole::ROLE_ROW, eNameOkFromChildren, eNoValue, kNoReqStates, {"disabled", kBoolState, nsIAccessibleStates::STATE_UNAVAILABLE}, {"selected", kBoolState, nsIAccessibleStates::STATE_SELECTED | nsIAccessibleStates::STATE_SELECTABLE}, @@ -157,6 +160,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] = {"secret", nsIAccessibleRole::ROLE_PASSWORD_TEXT, eNameLabelOrTitle, eNoValue, nsIAccessibleStates::STATE_PROTECTED, // Manually map EXT_STATE_SINGLE_LINE and EXT_STATE_MULTI_LINE FROM aaa:multiline {"disabled", kBoolState, nsIAccessibleStates::STATE_UNAVAILABLE}, kEndEntry}, + {"section", nsIAccessibleRole::ROLE_SECTION, eNameLabelOrTitle, eNoValue, kNoReqStates, kEndEntry}, {"separator", nsIAccessibleRole::ROLE_SEPARATOR, eNameLabelOrTitle, eNoValue, kNoReqStates, kEndEntry}, {"slider", nsIAccessibleRole::ROLE_SLIDER, eNameLabelOrTitle, eHasValueMinMax, kNoReqStates, {"disabled", kBoolState, nsIAccessibleStates::STATE_UNAVAILABLE}, @@ -175,6 +179,7 @@ nsRoleMapEntry nsARIAMap::gWAIRoleMap[] = {"readonly", kBoolState, nsIAccessibleStates::STATE_READONLY}, kEndEntry}, {"toolbar", nsIAccessibleRole::ROLE_TOOLBAR, eNameLabelOrTitle, eNoValue, kNoReqStates, {"disabled", kBoolState, nsIAccessibleStates::STATE_UNAVAILABLE}, kEndEntry}, + {"tooltip", nsIAccessibleRole::ROLE_TOOLTIP, eNameOkFromChildren, eNoValue, kNoReqStates, kEndEntry}, {"tree", nsIAccessibleRole::ROLE_OUTLINE, eNameLabelOrTitle, eNoValue, kNoReqStates, {"disabled", kBoolState, nsIAccessibleStates::STATE_UNAVAILABLE}, {"readonly", kBoolState, nsIAccessibleStates::STATE_READONLY}, diff --git a/accessible/src/base/nsAccessibilityService.h b/accessible/src/base/nsAccessibilityService.h index 891bedb0a4d..58772e6ddb9 100644 --- a/accessible/src/base/nsAccessibilityService.h +++ b/accessible/src/base/nsAccessibilityService.h @@ -168,7 +168,8 @@ static const char kRoleNames[][20] = { "parent menuitem", //ROLE_PARENT_MENUITEM "calendar", //ROLE_CALENDAR "combobox list", //ROLE_COMBOBOX_LIST - "combobox listitem" //ROLE_COMBOBOX_LISTITEM + "combobox listitem", //ROLE_COMBOBOX_LISTITEM + "image map" //ROLE_IMAGE_MAP }; class nsAccessibilityService : public nsIAccessibilityService, diff --git a/accessible/src/html/nsHTMLImageAccessible.cpp b/accessible/src/html/nsHTMLImageAccessible.cpp index aa835ef825d..c90bd5bcbef 100644 --- a/accessible/src/html/nsHTMLImageAccessible.cpp +++ b/accessible/src/html/nsHTMLImageAccessible.cpp @@ -144,7 +144,10 @@ NS_IMETHODIMP nsHTMLImageAccessible::GetName(nsAString& aName) /* wstring getRole (); */ NS_IMETHODIMP nsHTMLImageAccessible::GetRole(PRUint32 *_retval) { - *_retval = nsIAccessibleRole::ROLE_GRAPHIC; + PRInt32 numChildren; + GetChildCount(&numChildren); + *_retval = (numChildren > 0) ? nsIAccessibleRole::ROLE_IMAGE_MAP : + nsIAccessibleRole::ROLE_GRAPHIC; return NS_OK; } diff --git a/accessible/src/mac/nsAccessibleWrap.h b/accessible/src/mac/nsAccessibleWrap.h index 1f81f0b9f3e..84a1c98937a 100644 --- a/accessible/src/mac/nsAccessibleWrap.h +++ b/accessible/src/mac/nsAccessibleWrap.h @@ -81,13 +81,15 @@ class nsAccessibleWrap : public nsAccessible // we'll flatten buttons and checkboxes. usually they have a text node // child, that is their title. Works in conjunction with IsPruned() below. + // XXX There is no IsPruned() method, so what does that comment mean? PRBool IsFlat() { PRUint32 role = Role(this); return (role == nsIAccessibleRole::ROLE_CHECKBUTTON || role == nsIAccessibleRole::ROLE_PUSHBUTTON || role == nsIAccessibleRole::ROLE_TOGGLE_BUTTON || role == nsIAccessibleRole::ROLE_SPLITBUTTON || - role == nsIAccessibleRole::ROLE_ENTRY); + role == nsIAccessibleRole::ROLE_ENTRY || + role == nsIAccessibleRole::ROLE_IMAGE); } // ignored means that the accessible might still have children, but is not displayed diff --git a/accessible/src/mac/nsRoleMap.h b/accessible/src/mac/nsRoleMap.h index 2a93ea9cfb2..23c570c7822 100644 --- a/accessible/src/mac/nsRoleMap.h +++ b/accessible/src/mac/nsRoleMap.h @@ -158,5 +158,6 @@ static const NSString* AXRoles [] = { NSAccessibilityGroupRole, // ROLE_CALENDAR NSAccessibilityMenuRole, // ROLE_COMBOBOX_LIST NSAccessibilityMenuItemRole, // ROLE_COMBOBOX_LISTITEM + NSAccessibilityImageRole, // ROLE_IMAGE_MAP @"ROLE_LAST_ENTRY" // ROLE_LAST_ENTRY. bogus role that will never be shown (just marks the end of this array)! }; diff --git a/accessible/src/msaa/nsAccessibleWrap.cpp b/accessible/src/msaa/nsAccessibleWrap.cpp index 25d4ee39262..64598681b36 100644 --- a/accessible/src/msaa/nsAccessibleWrap.cpp +++ b/accessible/src/msaa/nsAccessibleWrap.cpp @@ -1712,3 +1712,13 @@ void nsAccessibleWrap::UpdateSystemCaret() } } +PRBool nsAccessibleWrap::MustPrune(nsIAccessible *aAccessible) +{ + PRUint32 role = Role(aAccessible); + return role == nsIAccessibleRole::ROLE_MENUITEM || + role == nsIAccessibleRole::ROLE_ENTRY || + role == nsIAccessibleRole::ROLE_PASSWORD_TEXT || + role == nsIAccessibleRole::ROLE_PUSHBUTTON || + role == nsIAccessibleRole::ROLE_TOGGLE_BUTTON || + role == nsIAccessibleRole::ROLE_GRAPHIC; +} diff --git a/accessible/src/msaa/nsAccessibleWrap.h b/accessible/src/msaa/nsAccessibleWrap.h index 0d0bb0a4afd..922b4b16b8c 100644 --- a/accessible/src/msaa/nsAccessibleWrap.h +++ b/accessible/src/msaa/nsAccessibleWrap.h @@ -323,14 +323,7 @@ protected: PRUint16 mEnumVARIANTPosition; // Should this accessible be allowed to have any MSAA children - static PRBool MustPrune(nsIAccessible *accessible) - { - PRUint32 role = Role(accessible); - return role == nsIAccessibleRole::ROLE_MENUITEM || - role == nsIAccessibleRole::ROLE_ENTRY || - role == nsIAccessibleRole::ROLE_PASSWORD_TEXT || - role == nsIAccessibleRole::ROLE_PUSHBUTTON; - } + static PRBool MustPrune(nsIAccessible *aAccessible); enum navRelations { NAVRELATION_CONTROLLED_BY = 0x1000, diff --git a/accessible/src/msaa/nsRoleMap.h b/accessible/src/msaa/nsRoleMap.h index 8726745753f..6312c37f8a2 100644 --- a/accessible/src/msaa/nsRoleMap.h +++ b/accessible/src/msaa/nsRoleMap.h @@ -422,6 +422,9 @@ static const WindowsRoleMapItem gWindowsRoleMap[] = { // nsIAccessibleRole::ROLE_COMBOBOX_LISTITEM { ROLE_SYSTEM_LISTITEM, ROLE_SYSTEM_LISTITEM }, + // nsIAccessibleRole::ROLE_IMAGE_MAP + { ROLE_SYSTEM_GRAPHIC, ROLE_SYSTEM_GRAPHIC }, + // nsIAccessibleRole::ROLE_LAST_ENTRY { ROLE_WINDOWS_LAST_ENTRY, ROLE_WINDOWS_LAST_ENTRY } };