diff options
author | aaronlevbugs@gmail.com <aaronlevbugs@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-10 21:46:07 +0000 |
---|---|---|
committer | aaronlevbugs@gmail.com <aaronlevbugs@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-02-10 21:46:07 +0000 |
commit | 38f1e3b05e1383da415835831a79f457d2e87006 (patch) | |
tree | 8bed8aa0943c08ad79f35e9bb5f0c3a878e70d7b | |
parent | 20bed01e980a5853dd87d4c0d65d4912697f22ae (diff) | |
download | chromium_src-38f1e3b05e1383da415835831a79f457d2e87006.zip chromium_src-38f1e3b05e1383da415835831a79f457d2e87006.tar.gz chromium_src-38f1e3b05e1383da415835831a79f457d2e87006.tar.bz2 |
Expose IAccessible2 role IA2_ROLE_TOGGLE_BUTTON when aria-pressed used with any kind of button
R=dmazzoni@chromium.org
BUG=98979
TEST=Manually with accProbe
Review URL: http://codereview.chromium.org/9375045
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@121545 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | AUTHORS | 1 | ||||
-rw-r--r-- | content/browser/accessibility/browser_accessibility.cc | 25 | ||||
-rw-r--r-- | content/browser/accessibility/browser_accessibility.h | 16 | ||||
-rw-r--r-- | content/browser/accessibility/browser_accessibility_win.cc | 8 |
4 files changed, 50 insertions, 0 deletions
@@ -162,3 +162,4 @@ Eriq Augustine <eriq.augustine@gmail.com> Francois Kritzinger <francoisk777@gmail.com> Erik Hill <erikghill@gmail.com> Mao Yujie <maojie0924@gmail.com> +Aaron Leventhal <aaronlevbugs@gmail.com> diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc index f71f428..7972e3b 100644 --- a/content/browser/accessibility/browser_accessibility.cc +++ b/content/browser/accessibility/browser_accessibility.cc @@ -260,6 +260,31 @@ bool BrowserAccessibility::GetHtmlAttribute( return false; } +bool BrowserAccessibility::GetAriaTristate( + const char* html_attr, + bool* is_defined, + bool* is_mixed) const { + *is_defined = false; + *is_mixed = false; + + string16 value; + if (!GetHtmlAttribute(html_attr, &value) || + value.empty() || + EqualsASCII(value, "undefined")) { + return false; // Not set (and *is_defined is also false) + } + + *is_defined = true; + + if (EqualsASCII(value, "true")) + return true; + + if (EqualsASCII(value, "mixed")) + *is_mixed = true; + + return false; // Not set +} + bool BrowserAccessibility::HasState(WebAccessibility::State state_enum) const { return (state_ >> state_enum) & 1; } diff --git a/content/browser/accessibility/browser_accessibility.h b/content/browser/accessibility/browser_accessibility.h index d0317f3..452deb9 100644 --- a/content/browser/accessibility/browser_accessibility.h +++ b/content/browser/accessibility/browser_accessibility.h @@ -221,6 +221,22 @@ class CONTENT_EXPORT BrowserAccessibility { // returns true if found. bool GetHtmlAttribute(const char* attr, string16* value) const; + // Utility method to handle special cases for ARIA booleans, tristates and + // booleans which have a "mixed" state. + // + // Warning: the term "Tristate" is used loosely by the spec and here, + // as some attributes support a 4th state. + // + // The following attributes are appropriate to use with this method: + // aria-selected (selectable) + // aria-grabbed (grabbable) + // aria-expanded (expandable) + // aria-pressed (toggleable/pressable) -- supports 4th "mixed" state + // aria-checked (checkable) -- supports 4th "mixed state" + bool GetAriaTristate(const char* attr_name, + bool* is_defined, + bool* is_mixed) const; + // Returns true if the bit corresponding to the given state enum is 1. bool HasState(WebAccessibility::State state_enum) const; diff --git a/content/browser/accessibility/browser_accessibility_win.cc b/content/browser/accessibility/browser_accessibility_win.cc index 97f7814..98a264a 100644 --- a/content/browser/accessibility/browser_accessibility_win.cc +++ b/content/browser/accessibility/browser_accessibility_win.cc @@ -2990,6 +2990,14 @@ void BrowserAccessibilityWin::InitRoleAndState() { break; case WebAccessibility::ROLE_BUTTON: ia_role_ = ROLE_SYSTEM_PUSHBUTTON; + bool is_aria_pressed_defined; + bool is_mixed; + if (GetAriaTristate("aria-pressed", &is_aria_pressed_defined, &is_mixed)) + ia_state_ |= STATE_SYSTEM_PRESSED; + if (is_aria_pressed_defined) + ia2_role_ = IA2_ROLE_TOGGLE_BUTTON; + if (is_mixed) + ia_state_ |= STATE_SYSTEM_MIXED; break; case WebAccessibility::ROLE_CELL: ia_role_ = ROLE_SYSTEM_CELL; |