Bug 390280. Add missing ARIA roles. r=ginn.chen, a=dsicore

This commit is contained in:
aaronleventhal%moonset.net 2007-08-04 02:15:53 +00:00
Родитель d229841f8d
Коммит 1382eff4f0
13 изменённых файлов: 87 добавлений и 53 удалений

Просмотреть файл

@ -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;
};

Просмотреть файл

@ -427,7 +427,7 @@ nsAccessibleWrap::CreateMaiInterfaces(void)
PRUint32 accRole;
GetRole(&accRole);
//nsIAccessibleText
nsCOMPtr<nsIAccessibleText> accessInterfaceText;
QueryInterface(NS_GET_IID(nsIAccessibleText),
@ -444,14 +444,6 @@ nsAccessibleWrap::CreateMaiInterfaces(void)
interfacesBits |= 1 << MAI_INTERFACE_EDITABLE_TEXT;
}
//nsIAccessibleSelection
nsCOMPtr<nsIAccessibleSelectable> accessInterfaceSelection;
QueryInterface(NS_GET_IID(nsIAccessibleSelectable),
getter_AddRefs(accessInterfaceSelection));
if (accessInterfaceSelection) {
interfacesBits |= 1 << MAI_INTERFACE_SELECTION;
}
//nsIAccessibleValue
nsCOMPtr<nsIAccessibleValue> accessInterfaceValue;
QueryInterface(NS_GET_IID(nsIAccessibleValue),
@ -460,34 +452,6 @@ nsAccessibleWrap::CreateMaiInterfaces(void)
interfacesBits |= 1 << MAI_INTERFACE_VALUE;
}
//nsIAccessibleHypertext
PRInt32 linkCount = 0;
nsCOMPtr<nsIAccessibleHyperText> 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<nsIAccessibleHyperLink> accessInterfaceHyperlink;
QueryInterface(NS_GET_IID(nsIAccessibleHyperLink),
getter_AddRefs(accessInterfaceHyperlink));
if (accessInterfaceHyperlink) {
interfacesBits |= 1 << MAI_INTERFACE_HYPERLINK_IMPL;
}
//nsIAccessibleTable
nsCOMPtr<nsIAccessibleTable> accessInterfaceTable;
QueryInterface(NS_GET_IID(nsIAccessibleTable),
getter_AddRefs(accessInterfaceTable));
if (accessInterfaceTable) {
interfacesBits |= 1 << MAI_INTERFACE_TABLE;
}
//nsIAccessibleDocument
nsCOMPtr<nsIAccessibleDocument> accessInterfaceDocument;
QueryInterface(NS_GET_IID(nsIAccessibleDocument),
@ -504,6 +468,44 @@ nsAccessibleWrap::CreateMaiInterfaces(void)
interfacesBits |= 1 << MAI_INTERFACE_IMAGE;
}
//nsIAccessibleHyperLink
nsCOMPtr<nsIAccessibleHyperLink> 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<nsIAccessibleHyperText> 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<nsIAccessibleTable> accessInterfaceTable;
QueryInterface(NS_GET_IID(nsIAccessibleTable),
getter_AddRefs(accessInterfaceTable));
if (accessInterfaceTable) {
interfacesBits |= 1 << MAI_INTERFACE_TABLE;
}
//nsIAccessibleSelection
nsCOMPtr<nsIAccessibleSelectable> 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;
}

Просмотреть файл

@ -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);
};

Просмотреть файл

@ -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 ???

Просмотреть файл

@ -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
};

Просмотреть файл

@ -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},

Просмотреть файл

@ -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,

Просмотреть файл

@ -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;
}

Просмотреть файл

@ -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

Просмотреть файл

@ -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)!
};

Просмотреть файл

@ -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;
}

Просмотреть файл

@ -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,

Просмотреть файл

@ -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 }
};