summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoraaronlevbugs@gmail.com <aaronlevbugs@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-10 21:46:07 +0000
committeraaronlevbugs@gmail.com <aaronlevbugs@gmail.com@0039d316-1c4b-4281-b951-d872f2087c98>2012-02-10 21:46:07 +0000
commit38f1e3b05e1383da415835831a79f457d2e87006 (patch)
tree8bed8aa0943c08ad79f35e9bb5f0c3a878e70d7b
parent20bed01e980a5853dd87d4c0d65d4912697f22ae (diff)
downloadchromium_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--AUTHORS1
-rw-r--r--content/browser/accessibility/browser_accessibility.cc25
-rw-r--r--content/browser/accessibility/browser_accessibility.h16
-rw-r--r--content/browser/accessibility/browser_accessibility_win.cc8
4 files changed, 50 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
index dcba188..5f5480c 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -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;