Index: content/browser/accessibility/browser_accessibility_win.cc |
diff --git a/content/browser/accessibility/browser_accessibility_win.cc b/content/browser/accessibility/browser_accessibility_win.cc |
index 29b4b7b54959596fd02bbce61b63a320887a7eb9..de90bfd689e7ed145e79e48a010bb7b54d7b284b 100644 |
--- a/content/browser/accessibility/browser_accessibility_win.cc |
+++ b/content/browser/accessibility/browser_accessibility_win.cc |
@@ -2980,6 +2980,43 @@ void BrowserAccessibilityWin::OnDataChanged() { |
} |
} |
+ // Expose invalid state for form controls and elements with aria-invalid. |
+ int invalid_state; |
+ if (GetIntAttribute(ui::AX_ATTR_INVALID_STATE, &invalid_state)) { |
+ // TODO(nektar): Handle the possibility of having multiple aria-invalid |
+ // attributes defined, e.g., "invalid:spelling,grammar". |
+ switch (invalid_state) { |
+ case ui::AX_INVALID_STATE_NONE: |
+ break; |
+ case ui::AX_INVALID_STATE_FALSE: |
+ ia2_attributes_.push_back(L"invalid:false"); |
+ break; |
+ case ui::AX_INVALID_STATE_TRUE: |
+ ia2_attributes_.push_back(L"invalid:true"); |
+ break; |
+ case ui::AX_INVALID_STATE_SPELLING: |
+ ia2_attributes_.push_back(L"invalid:spelling"); |
+ break; |
+ case ui::AX_INVALID_STATE_GRAMMAR: |
+ ia2_attributes_.push_back(L"invalid:grammar"); |
+ break; |
+ case ui::AX_INVALID_STATE_OTHER: |
+ { |
+ base::string16 aria_invalid_value; |
+ if (GetString16Attribute(ui::AX_ATTR_ARIA_INVALID_VALUE, |
+ &aria_invalid_value)) { |
+ ia2_attributes_.push_back(L"invalid:" + aria_invalid_value); |
+ } else { |
+ // Set the attribute to L"true", since we cannot be more specific. |
+ ia2_attributes_.push_back(L"invalid:true"); |
+ } |
+ } |
+ break; |
+ default: |
+ NOTREACHED(); |
+ } |
+ } |
+ |
// The calculation of the accessible name of an element has been |
// standardized in the HTML to Platform Accessibility APIs Implementation |
// Guide (http://www.w3.org/TR/html-aapi/). In order to return the |
@@ -3294,16 +3331,22 @@ void BrowserAccessibilityWin::HandleSpecialTextOffset( |
ui::TextBoundaryType BrowserAccessibilityWin::IA2TextBoundaryToTextBoundary( |
IA2TextBoundaryType ia2_boundary) { |
switch(ia2_boundary) { |
- case IA2_TEXT_BOUNDARY_CHAR: return ui::CHAR_BOUNDARY; |
- case IA2_TEXT_BOUNDARY_WORD: return ui::WORD_BOUNDARY; |
- case IA2_TEXT_BOUNDARY_LINE: return ui::LINE_BOUNDARY; |
- case IA2_TEXT_BOUNDARY_SENTENCE: return ui::SENTENCE_BOUNDARY; |
- case IA2_TEXT_BOUNDARY_PARAGRAPH: return ui::PARAGRAPH_BOUNDARY; |
- case IA2_TEXT_BOUNDARY_ALL: return ui::ALL_BOUNDARY; |
+ case IA2_TEXT_BOUNDARY_CHAR: |
+ return ui::CHAR_BOUNDARY; |
+ case IA2_TEXT_BOUNDARY_WORD: |
+ return ui::WORD_BOUNDARY; |
+ case IA2_TEXT_BOUNDARY_LINE: |
+ return ui::LINE_BOUNDARY; |
+ case IA2_TEXT_BOUNDARY_SENTENCE: |
+ return ui::SENTENCE_BOUNDARY; |
+ case IA2_TEXT_BOUNDARY_PARAGRAPH: |
+ return ui::PARAGRAPH_BOUNDARY; |
+ case IA2_TEXT_BOUNDARY_ALL: |
+ return ui::ALL_BOUNDARY; |
default: |
NOTREACHED(); |
- return ui::CHAR_BOUNDARY; |
} |
+ return ui::CHAR_BOUNDARY; |
} |
LONG BrowserAccessibilityWin::FindBoundary( |
@@ -3344,6 +3387,9 @@ void BrowserAccessibilityWin::InitRoleAndState() { |
ia_state_ |= STATE_SYSTEM_HOTTRACKED; |
if (HasState(ui::AX_STATE_INDETERMINATE)) |
ia_state_ |= STATE_SYSTEM_INDETERMINATE; |
+ if (HasIntAttribute(ui::AX_ATTR_INVALID_STATE) && |
+ GetIntAttribute(ui::AX_ATTR_INVALID_STATE) != ui::AX_INVALID_STATE_FALSE) |
+ ia2_state_ |= IA2_STATE_INVALID_ENTRY; |
if (HasState(ui::AX_STATE_INVISIBLE)) |
ia_state_ |= STATE_SYSTEM_INVISIBLE; |
if (HasState(ui::AX_STATE_LINKED)) |
@@ -3382,10 +3428,6 @@ void BrowserAccessibilityWin::InitRoleAndState() { |
if (!HasState(ui::AX_STATE_READ_ONLY)) |
ia2_state_ |= IA2_STATE_EDITABLE; |
- base::string16 invalid; |
- if (GetHtmlAttribute("aria-invalid", &invalid)) |
- ia2_state_ |= IA2_STATE_INVALID_ENTRY; |
- |
if (GetBoolAttribute(ui::AX_ATTR_BUTTON_MIXED)) |
ia_state_ |= STATE_SYSTEM_MIXED; |