summaryrefslogtreecommitdiffstats
path: root/chrome/browser/accessibility/browser_accessibility_win.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/accessibility/browser_accessibility_win.cc')
-rw-r--r--chrome/browser/accessibility/browser_accessibility_win.cc36
1 files changed, 30 insertions, 6 deletions
diff --git a/chrome/browser/accessibility/browser_accessibility_win.cc b/chrome/browser/accessibility/browser_accessibility_win.cc
index a78454c..a543c12 100644
--- a/chrome/browser/accessibility/browser_accessibility_win.cc
+++ b/chrome/browser/accessibility/browser_accessibility_win.cc
@@ -548,7 +548,8 @@ STDMETHODIMP BrowserAccessibilityWin::get_nCharacters(LONG* n_characters) {
if (!n_characters)
return E_INVALIDARG;
- if (role_ == WebAccessibility::ROLE_TEXT_FIELD) {
+ if (role_ == WebAccessibility::ROLE_TEXT_FIELD ||
+ role_ == WebAccessibility::ROLE_TEXTAREA) {
*n_characters = value_.length();
} else {
*n_characters = name_.length();
@@ -564,7 +565,8 @@ STDMETHODIMP BrowserAccessibilityWin::get_caretOffset(LONG* offset) {
if (!offset)
return E_INVALIDARG;
- if (role_ == WebAccessibility::ROLE_TEXT_FIELD) {
+ if (role_ == WebAccessibility::ROLE_TEXT_FIELD ||
+ role_ == WebAccessibility::ROLE_TEXTAREA) {
int sel_start = 0;
if (GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_START, &sel_start)) {
*offset = sel_start;
@@ -585,7 +587,8 @@ STDMETHODIMP BrowserAccessibilityWin::get_nSelections(LONG* n_selections) {
if (!n_selections)
return E_INVALIDARG;
- if (role_ == WebAccessibility::ROLE_TEXT_FIELD) {
+ if (role_ == WebAccessibility::ROLE_TEXT_FIELD ||
+ role_ == WebAccessibility::ROLE_TEXTAREA) {
int sel_start = 0;
int sel_end = 0;
if (GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_START, &sel_start) &&
@@ -611,7 +614,8 @@ STDMETHODIMP BrowserAccessibilityWin::get_selection(LONG selection_index,
if (!start_offset || !end_offset || selection_index != 0)
return E_INVALIDARG;
- if (role_ == WebAccessibility::ROLE_TEXT_FIELD) {
+ if (role_ == WebAccessibility::ROLE_TEXT_FIELD ||
+ role_ == WebAccessibility::ROLE_TEXTAREA) {
int sel_start = 0;
int sel_end = 0;
if (GetAttributeAsInt(WebAccessibility::ATTR_TEXT_SEL_START, &sel_start) &&
@@ -1209,7 +1213,8 @@ string16 BrowserAccessibilityWin::Escape(const string16& str) {
}
const string16& BrowserAccessibilityWin::TextForIAccessibleText() {
- if (role_ == WebAccessibility::ROLE_TEXT_FIELD) {
+ if (role_ == WebAccessibility::ROLE_TEXT_FIELD ||
+ role_ == WebAccessibility::ROLE_TEXTAREA) {
return value_;
} else {
return name_;
@@ -1243,6 +1248,20 @@ LONG BrowserAccessibilityWin::FindBoundary(
return start_offset + 1;
else
return start_offset;
+ } else if (boundary == IA2_TEXT_BOUNDARY_LINE) {
+ if (direction == 1) {
+ for (int j = 0; j < static_cast<int>(line_breaks_.size()); j++) {
+ if (line_breaks_[j] > start_offset)
+ return line_breaks_[j];
+ }
+ return text_size;
+ } else {
+ for (int j = static_cast<int>(line_breaks_.size()) - 1; j >= 0; j--) {
+ if (line_breaks_[j] <= start_offset)
+ return line_breaks_[j];
+ }
+ return 0;
+ }
}
LONG result = start_offset;
@@ -1259,11 +1278,14 @@ LONG BrowserAccessibilityWin::FindBoundary(
}
switch (boundary) {
+ case IA2_TEXT_BOUNDARY_CHAR:
+ case IA2_TEXT_BOUNDARY_LINE:
+ NOTREACHED(); // These are handled above.
+ break;
case IA2_TEXT_BOUNDARY_WORD:
if (IsWhitespace(text[pos]))
return result;
break;
- case IA2_TEXT_BOUNDARY_LINE:
case IA2_TEXT_BOUNDARY_PARAGRAPH:
if (text[pos] == '\n')
return result;
@@ -1552,11 +1574,13 @@ void BrowserAccessibilityWin::InitRoleAndState() {
ia_role_ = ROLE_SYSTEM_TEXT;
ia2_state_ |= IA2_STATE_MULTI_LINE;
ia2_state_ |= IA2_STATE_EDITABLE;
+ ia2_state_ |= IA2_STATE_SELECTABLE_TEXT;
break;
case WebAccessibility::ROLE_TEXT_FIELD:
ia_role_ = ROLE_SYSTEM_TEXT;
ia2_state_ |= IA2_STATE_SINGLE_LINE;
ia2_state_ |= IA2_STATE_EDITABLE;
+ ia2_state_ |= IA2_STATE_SELECTABLE_TEXT;
break;
case WebAccessibility::ROLE_TIMER:
ia_role_ = ROLE_SYSTEM_CLOCK;