Commit b45243c4 authored by klink@chromium.org's avatar klink@chromium.org

Adds support for an initial set of WAI-ARIA roles, needed to support screen...

Adds support for an initial set of WAI-ARIA roles, needed to support screen readers in AJAX web applications (e.g. Gmail).

BUG=None
TEST=None

Review URL: http://codereview.chromium.org/149265

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@20094 0039d316-1c4b-4281-b951-d872f2087c98
parent a24cb443
...@@ -559,37 +559,50 @@ const WebAccessibility::OutParams& BrowserAccessibility::response() { ...@@ -559,37 +559,50 @@ const WebAccessibility::OutParams& BrowserAccessibility::response() {
long BrowserAccessibility::MSAARole(long browser_accessibility_role) { long BrowserAccessibility::MSAARole(long browser_accessibility_role) {
switch (browser_accessibility_role) { switch (browser_accessibility_role) {
case WebAccessibility::ROLE_PUSHBUTTON : case WebAccessibility::ROLE_CELL:
return ROLE_SYSTEM_PUSHBUTTON; return ROLE_SYSTEM_CELL;
case WebAccessibility::ROLE_RADIOBUTTON : case WebAccessibility::ROLE_CHECKBUTTON:
return ROLE_SYSTEM_RADIOBUTTON;
case WebAccessibility::ROLE_CHECKBUTTON :
return ROLE_SYSTEM_CHECKBUTTON; return ROLE_SYSTEM_CHECKBUTTON;
case WebAccessibility::ROLE_SLIDER : case WebAccessibility::ROLE_COLUMN:
return ROLE_SYSTEM_SLIDER;
case WebAccessibility::ROLE_PAGETABLIST :
return ROLE_SYSTEM_PAGETABLIST;
case WebAccessibility::ROLE_TEXT :
return ROLE_SYSTEM_TEXT;
case WebAccessibility::ROLE_STATICTEXT :
return ROLE_SYSTEM_STATICTEXT;
case WebAccessibility::ROLE_OUTLINE :
return ROLE_SYSTEM_OUTLINE;
case WebAccessibility::ROLE_COLUMN :
return ROLE_SYSTEM_COLUMN; return ROLE_SYSTEM_COLUMN;
case WebAccessibility::ROLE_ROW : case WebAccessibility::ROLE_COLUMNHEADER:
return ROLE_SYSTEM_ROW; return ROLE_SYSTEM_COLUMNHEADER;
case WebAccessibility::ROLE_GROUPING : case WebAccessibility::ROLE_GRAPHIC:
return ROLE_SYSTEM_GRAPHIC;
case WebAccessibility::ROLE_GROUPING:
return ROLE_SYSTEM_GROUPING; return ROLE_SYSTEM_GROUPING;
case WebAccessibility::ROLE_LIST : case WebAccessibility::ROLE_LINK:
return ROLE_SYSTEM_LINK;
case WebAccessibility::ROLE_LIST:
case WebAccessibility::ROLE_LISTBOX:
return ROLE_SYSTEM_LIST; return ROLE_SYSTEM_LIST;
case WebAccessibility::ROLE_TABLE : case WebAccessibility::ROLE_MENUITEM:
return ROLE_SYSTEM_MENUITEM;
case WebAccessibility::ROLE_MENUPOPUP:
return ROLE_SYSTEM_MENUPOPUP;
case WebAccessibility::ROLE_OUTLINE:
return ROLE_SYSTEM_OUTLINE;
case WebAccessibility::ROLE_PAGETABLIST:
return ROLE_SYSTEM_PAGETABLIST;
case WebAccessibility::ROLE_PROGRESSBAR:
return ROLE_SYSTEM_PROGRESSBAR;
case WebAccessibility::ROLE_PUSHBUTTON:
return ROLE_SYSTEM_PUSHBUTTON;
case WebAccessibility::ROLE_RADIOBUTTON:
return ROLE_SYSTEM_RADIOBUTTON;
case WebAccessibility::ROLE_ROW:
return ROLE_SYSTEM_ROW;
case WebAccessibility::ROLE_ROWHEADER:
return ROLE_SYSTEM_ROWHEADER;
case WebAccessibility::ROLE_SLIDER:
return ROLE_SYSTEM_SLIDER;
case WebAccessibility::ROLE_STATICTEXT:
return ROLE_SYSTEM_STATICTEXT;
case WebAccessibility::ROLE_TABLE:
return ROLE_SYSTEM_TABLE; return ROLE_SYSTEM_TABLE;
case WebAccessibility::ROLE_LINK : case WebAccessibility::ROLE_TEXT:
return ROLE_SYSTEM_LINK; return ROLE_SYSTEM_TEXT;
case WebAccessibility::ROLE_GRAPHIC : case WebAccessibility::ROLE_CLIENT:
return ROLE_SYSTEM_GRAPHIC;
case WebAccessibility::ROLE_CLIENT :
default: default:
// This is the default role for MSAA. // This is the default role for MSAA.
return ROLE_SYSTEM_CLIENT; return ROLE_SYSTEM_CLIENT;
...@@ -599,48 +612,48 @@ long BrowserAccessibility::MSAARole(long browser_accessibility_role) { ...@@ -599,48 +612,48 @@ long BrowserAccessibility::MSAARole(long browser_accessibility_role) {
long BrowserAccessibility::MSAAState(long browser_accessibility_state) { long BrowserAccessibility::MSAAState(long browser_accessibility_state) {
long state = 0; long state = 0;
if ((browser_accessibility_state >> WebAccessibility::STATE_LINKED) & 1) if ((browser_accessibility_state >> WebAccessibility::STATE_CHECKED) & 1)
state |= STATE_SYSTEM_LINKED; state |= STATE_SYSTEM_CHECKED;
if ((browser_accessibility_state >> WebAccessibility::STATE_HOTTRACKED) & 1)
state |= STATE_SYSTEM_HOTTRACKED;
if ((browser_accessibility_state >> WebAccessibility::STATE_UNAVAILABLE) & 1) if ((browser_accessibility_state >> WebAccessibility::STATE_FOCUSABLE) & 1)
state |= STATE_SYSTEM_UNAVAILABLE; state |= STATE_SYSTEM_FOCUSABLE;
if ((browser_accessibility_state >> WebAccessibility::STATE_READONLY) & 1) if ((browser_accessibility_state >> WebAccessibility::STATE_FOCUSED) & 1)
state |= STATE_SYSTEM_READONLY; state |= STATE_SYSTEM_FOCUSED;
if ((browser_accessibility_state >> WebAccessibility::STATE_OFFSCREEN) & 1) if ((browser_accessibility_state >> WebAccessibility::STATE_HOTTRACKED) & 1)
state |= STATE_SYSTEM_OFFSCREEN; state |= STATE_SYSTEM_HOTTRACKED;
if ((browser_accessibility_state >> if ((browser_accessibility_state >>
WebAccessibility::STATE_MULTISELECTABLE) & 1) { WebAccessibility::STATE_INDETERMINATE) & 1) {
state |= STATE_SYSTEM_MULTISELECTABLE; state |= STATE_SYSTEM_INDETERMINATE;
} }
if ((browser_accessibility_state >> WebAccessibility::STATE_PROTECTED) & 1) if ((browser_accessibility_state >> WebAccessibility::STATE_LINKED) & 1)
state |= STATE_SYSTEM_PROTECTED; state |= STATE_SYSTEM_LINKED;
if ((browser_accessibility_state >> if ((browser_accessibility_state >>
WebAccessibility::STATE_INDETERMINATE) & 1) { WebAccessibility::STATE_MULTISELECTABLE) & 1) {
state |= STATE_SYSTEM_INDETERMINATE; state |= STATE_SYSTEM_MULTISELECTABLE;
} }
if ((browser_accessibility_state >> WebAccessibility::STATE_CHECKED) & 1) if ((browser_accessibility_state >> WebAccessibility::STATE_OFFSCREEN) & 1)
state |= STATE_SYSTEM_CHECKED; state |= STATE_SYSTEM_OFFSCREEN;
if ((browser_accessibility_state >> WebAccessibility::STATE_PRESSED) & 1) if ((browser_accessibility_state >> WebAccessibility::STATE_PRESSED) & 1)
state |= STATE_SYSTEM_PRESSED; state |= STATE_SYSTEM_PRESSED;
if ((browser_accessibility_state >> WebAccessibility::STATE_FOCUSED) & 1) if ((browser_accessibility_state >> WebAccessibility::STATE_PROTECTED) & 1)
state |= STATE_SYSTEM_FOCUSED; state |= STATE_SYSTEM_PROTECTED;
if ((browser_accessibility_state >> WebAccessibility::STATE_READONLY) & 1)
state |= STATE_SYSTEM_READONLY;
if ((browser_accessibility_state >> WebAccessibility::STATE_TRAVERSED) & 1) if ((browser_accessibility_state >> WebAccessibility::STATE_TRAVERSED) & 1)
state |= STATE_SYSTEM_TRAVERSED; state |= STATE_SYSTEM_TRAVERSED;
if ((browser_accessibility_state >> WebAccessibility::STATE_FOCUSABLE) & 1) if ((browser_accessibility_state >> WebAccessibility::STATE_UNAVAILABLE) & 1)
state |= STATE_SYSTEM_FOCUSABLE; state |= STATE_SYSTEM_UNAVAILABLE;
return state; return state;
} }
...@@ -294,44 +294,44 @@ bool GlueAccessibilityObject::State(int child_id, long* state) { ...@@ -294,44 +294,44 @@ bool GlueAccessibilityObject::State(int child_id, long* state) {
if (!GetAccessibilityObjectForChild(child_id, child_obj)) if (!GetAccessibilityObjectForChild(child_id, child_obj))
return false; return false;
if (child_obj->isAnchor()) if (child_obj->isChecked())
*state |= static_cast<long>(1 << WebAccessibility::STATE_LINKED); *state |= static_cast<long>(1 << WebAccessibility::STATE_CHECKED);
if (child_obj->canSetFocusAttribute())
*state |= static_cast<long>(1 << WebAccessibility::STATE_FOCUSABLE);
if (child_obj->isFocused())
*state |= static_cast<long>(1 << WebAccessibility::STATE_FOCUSED);
if (child_obj->isHovered()) if (child_obj->isHovered())
*state |= static_cast<long>(1 << WebAccessibility::STATE_HOTTRACKED); *state |= static_cast<long>(1 << WebAccessibility::STATE_HOTTRACKED);
if (!child_obj->isEnabled()) if (child_obj->isIndeterminate())
*state |= static_cast<long>(1 << WebAccessibility::STATE_UNAVAILABLE); *state |= static_cast<long>(1 << WebAccessibility::STATE_INDETERMINATE);
if (child_obj->isReadOnly())
*state |= static_cast<long>(1 << WebAccessibility::STATE_READONLY);
if (child_obj->isOffScreen()) if (child_obj->isAnchor())
*state |= static_cast<long>(1 << WebAccessibility::STATE_OFFSCREEN); *state |= static_cast<long>(1 << WebAccessibility::STATE_LINKED);
if (child_obj->isMultiSelect()) if (child_obj->isMultiSelect())
*state |= static_cast<long>(1 << WebAccessibility::STATE_MULTISELECTABLE); *state |= static_cast<long>(1 << WebAccessibility::STATE_MULTISELECTABLE);
if (child_obj->isPasswordField()) if (child_obj->isOffScreen())
*state |= static_cast<long>(1 << WebAccessibility::STATE_PROTECTED); *state |= static_cast<long>(1 << WebAccessibility::STATE_OFFSCREEN);
if (child_obj->isIndeterminate())
*state |= static_cast<long>(1 << WebAccessibility::STATE_INDETERMINATE);
if (child_obj->isChecked())
*state |= static_cast<long>(1 << WebAccessibility::STATE_CHECKED);
if (child_obj->isPressed()) if (child_obj->isPressed())
*state |= static_cast<long>(1 << WebAccessibility::STATE_PRESSED); *state |= static_cast<long>(1 << WebAccessibility::STATE_PRESSED);
if (child_obj->isFocused()) if (child_obj->isPasswordField())
*state |= static_cast<long>(1 << WebAccessibility::STATE_FOCUSED); *state |= static_cast<long>(1 << WebAccessibility::STATE_PROTECTED);
if (child_obj->isReadOnly())
*state |= static_cast<long>(1 << WebAccessibility::STATE_READONLY);
if (child_obj->isVisited()) if (child_obj->isVisited())
*state |= static_cast<long>(1 << WebAccessibility::STATE_TRAVERSED); *state |= static_cast<long>(1 << WebAccessibility::STATE_TRAVERSED);
if (child_obj->canSetFocusAttribute()) if (!child_obj->isEnabled())
*state |= static_cast<long>(1 << WebAccessibility::STATE_FOCUSABLE); *state |= static_cast<long>(1 << WebAccessibility::STATE_UNAVAILABLE);
// TODO(klink): Add selected and selectable states. // TODO(klink): Add selected and selectable states.
...@@ -361,43 +361,60 @@ String GlueAccessibilityObject::description() const { ...@@ -361,43 +361,60 @@ String GlueAccessibilityObject::description() const {
} }
// Provides a conversion between the WebCore::AccessibilityRole and a // Provides a conversion between the WebCore::AccessibilityRole and a
// role supported on the Browser side. Static function. // role supported on the Browser side. Listed alphabetically by the
// WebAccessibility role (except for default role). Static function.
static WebAccessibility::Role SupportedRole(WebCore::AccessibilityRole role) { static WebAccessibility::Role SupportedRole(WebCore::AccessibilityRole role) {
switch (role) { switch (role) {
case WebCore::ButtonRole: case WebCore::CellRole:
return WebAccessibility::ROLE_PUSHBUTTON; return WebAccessibility::ROLE_CELL;
case WebCore::RadioButtonRole:
return WebAccessibility::ROLE_RADIOBUTTON;
case WebCore::CheckBoxRole: case WebCore::CheckBoxRole:
return WebAccessibility::ROLE_CHECKBUTTON; return WebAccessibility::ROLE_CHECKBUTTON;
case WebCore::SliderRole:
return WebAccessibility::ROLE_SLIDER;
case WebCore::TabGroupRole:
return WebAccessibility::ROLE_PAGETABLIST;
case WebCore::TextFieldRole:
case WebCore::TextAreaRole:
case WebCore::ListMarkerRole:
return WebAccessibility::ROLE_TEXT;
case WebCore::StaticTextRole:
return WebAccessibility::ROLE_STATICTEXT;
case WebCore::OutlineRole:
return WebAccessibility::ROLE_OUTLINE;
case WebCore::ColumnRole: case WebCore::ColumnRole:
return WebAccessibility::ROLE_COLUMN; return WebAccessibility::ROLE_COLUMN;
case WebCore::RowRole: case WebCore::ColumnHeaderRole:
return WebAccessibility::ROLE_ROW; return WebAccessibility::ROLE_COLUMNHEADER;
case WebCore::ImageMapRole:
case WebCore::ImageRole:
return WebAccessibility::ROLE_GRAPHIC;
case WebCore::GroupRole: case WebCore::GroupRole:
return WebAccessibility::ROLE_GROUPING; return WebAccessibility::ROLE_GROUPING;
case WebCore::LinkRole:
case WebCore::WebCoreLinkRole:
return WebAccessibility::ROLE_LINK;
case WebCore::ListRole: case WebCore::ListRole:
return WebAccessibility::ROLE_LIST; return WebAccessibility::ROLE_LIST;
case WebCore::ListBoxRole:
return WebAccessibility::ROLE_LISTBOX;
case WebCore::MenuButtonRole:
case WebCore::MenuItemRole:
return WebAccessibility::ROLE_MENUITEM;
case WebCore::MenuRole:
return WebAccessibility::ROLE_MENUPOPUP;
case WebCore::OutlineRole:
return WebAccessibility::ROLE_OUTLINE;
case WebCore::TabGroupRole:
return WebAccessibility::ROLE_PAGETABLIST;
case WebCore::ProgressIndicatorRole:
return WebAccessibility::ROLE_PROGRESSBAR;
case WebCore::ButtonRole:
return WebAccessibility::ROLE_PUSHBUTTON;
case WebCore::RadioButtonRole:
return WebAccessibility::ROLE_RADIOBUTTON;
case WebCore::RowRole:
return WebAccessibility::ROLE_ROW;
case WebCore::RowHeaderRole:
return WebAccessibility::ROLE_ROWHEADER;
case WebCore::SliderRole:
return WebAccessibility::ROLE_SLIDER;
case WebCore::StaticTextRole:
return WebAccessibility::ROLE_STATICTEXT;
case WebCore::TableRole: case WebCore::TableRole:
return WebAccessibility::ROLE_TABLE; return WebAccessibility::ROLE_TABLE;
case WebCore::LinkRole: case WebCore::ListMarkerRole:
case WebCore::WebCoreLinkRole: case WebCore::TextFieldRole:
return WebAccessibility::ROLE_LINK; case WebCore::TextAreaRole:
case WebCore::ImageMapRole: return WebAccessibility::ROLE_TEXT;
case WebCore::ImageRole: case WebCore::UnknownRole:
return WebAccessibility::ROLE_GRAPHIC;
default: default:
// This is the default role. // This is the default role.
return WebAccessibility::ROLE_CLIENT; return WebAccessibility::ROLE_CLIENT;
......
...@@ -59,47 +59,56 @@ class WebAccessibility { ...@@ -59,47 +59,56 @@ class WebAccessibility {
DIRECTION_LASTCHILD DIRECTION_LASTCHILD
}; };
// This defines an enumeration of the supported accessibility roles in our // This defines an enumeration (in alphabetical order) of the supported
// Glue layer (used in GlueAccessibilityObject::Role). Any interface using // accessibility roles in our Glue layer (used in
// roles must provide a conversion to its own roles (see e.g. // GlueAccessibilityObject::Role). Any interface using roles must provide a
// BrowserAccessibility::get_accRole and BrowserAccessibility::MSAARole). // conversion to its own roles (see e.g. BrowserAccessibility::get_accRole and
// BrowserAccessibility::MSAARole).
enum Role { enum Role {
ROLE_PUSHBUTTON, ROLE_CELL,
ROLE_RADIOBUTTON,
ROLE_CHECKBUTTON, ROLE_CHECKBUTTON,
ROLE_SLIDER, ROLE_CLIENT,
ROLE_PAGETABLIST,
ROLE_TEXT,
ROLE_STATICTEXT,
ROLE_OUTLINE,
ROLE_COLUMN, ROLE_COLUMN,
ROLE_ROW, ROLE_COLUMNHEADER,
ROLE_GRAPHIC,
ROLE_GROUPING, ROLE_GROUPING,
ROLE_LINK,
ROLE_LIST, ROLE_LIST,
ROLE_LISTBOX,
ROLE_MENUITEM,
ROLE_MENUPOPUP,
ROLE_OUTLINE,
ROLE_PAGETABLIST,
ROLE_PROGRESSBAR,
ROLE_PUSHBUTTON,
ROLE_RADIOBUTTON,
ROLE_ROW,
ROLE_ROWHEADER,
ROLE_SLIDER,
ROLE_STATICTEXT,
ROLE_TABLE, ROLE_TABLE,
ROLE_LINK, ROLE_TEXT
ROLE_GRAPHIC,
ROLE_CLIENT
}; };
// This defines an enumeration of the supported accessibility states in our // This defines an enumeration (in alphabetical order) of the supported
// Glue layer (used in GlueAccessibilityObject::State). Any interface using // accessibility states in our Glue layer (used in
// states must provide a conversion to its own states (see e.g. // GlueAccessibilityObject::State). Any interface using states must provide a
// BrowserAccessibility::get_accState and BrowserAccessibility::MSAAState). // conversion to its own states (see e.g. BrowserAccessibility::get_accState
// and BrowserAccessibility::MSAAState).
enum State { enum State {
STATE_LINKED, STATE_CHECKED,
STATE_FOCUSABLE,
STATE_FOCUSED,
STATE_HOTTRACKED, STATE_HOTTRACKED,
STATE_UNAVAILABLE,
STATE_READONLY,
STATE_OFFSCREEN,
STATE_MULTISELECTABLE,
STATE_PROTECTED,
STATE_INDETERMINATE, STATE_INDETERMINATE,
STATE_CHECKED, STATE_LINKED,
STATE_MULTISELECTABLE,
STATE_OFFSCREEN,
STATE_PRESSED, STATE_PRESSED,
STATE_FOCUSED, STATE_PROTECTED,
STATE_READONLY,
STATE_TRAVERSED, STATE_TRAVERSED,
STATE_FOCUSABLE STATE_UNAVAILABLE
}; };
// Parameters structure to hold a union of the possible accessibility function // Parameters structure to hold a union of the possible accessibility function
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment