summaryrefslogtreecommitdiffstats
path: root/chrome/browser/accessibility
diff options
context:
space:
mode:
authordmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-15 22:15:06 +0000
committerdmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-06-15 22:15:06 +0000
commitbe4eeb0b5899d07f1a8ba1c4511def39c3787734 (patch)
tree60d20cebdbcad34ab55f81e6c8c8215f61d07cba /chrome/browser/accessibility
parentfc29c306035eb72ab3aef89c49836d8f6b7cd233 (diff)
downloadchromium_src-be4eeb0b5899d07f1a8ba1c4511def39c3787734.zip
chromium_src-be4eeb0b5899d07f1a8ba1c4511def39c3787734.tar.gz
chromium_src-be4eeb0b5899d07f1a8ba1c4511def39c3787734.tar.bz2
Support for accessible multiline text editing for Windows
screen readers. Tested with JAWS and NVDA. BUG=85253 TEST=manual testing Review URL: http://codereview.chromium.org/7104142 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@89258 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/accessibility')
-rw-r--r--chrome/browser/accessibility/browser_accessibility.cc1
-rw-r--r--chrome/browser/accessibility/browser_accessibility.h1
-rw-r--r--chrome/browser/accessibility/browser_accessibility_win.cc36
-rw-r--r--chrome/browser/accessibility/browser_accessibility_win_unittest.cc5
4 files changed, 35 insertions, 8 deletions
diff --git a/chrome/browser/accessibility/browser_accessibility.cc b/chrome/browser/accessibility/browser_accessibility.cc
index 48b88f4..92a4819 100644
--- a/chrome/browser/accessibility/browser_accessibility.cc
+++ b/chrome/browser/accessibility/browser_accessibility.cc
@@ -61,6 +61,7 @@ void BrowserAccessibility::Initialize(
role_ = src.role;
state_ = src.state;
indirect_child_ids_ = src.indirect_child_ids;
+ line_breaks_ = src.line_breaks;
Initialize();
}
diff --git a/chrome/browser/accessibility/browser_accessibility.h b/chrome/browser/accessibility/browser_accessibility.h
index 7cbc094..99fc425 100644
--- a/chrome/browser/accessibility/browser_accessibility.h
+++ b/chrome/browser/accessibility/browser_accessibility.h
@@ -208,6 +208,7 @@ class BrowserAccessibility {
string16 role_name_;
gfx::Rect location_;
std::vector<int32> indirect_child_ids_;
+ std::vector<int32> line_breaks_;
// BrowserAccessibility objects are reference-counted on some platforms.
// When we're done with this object and it's removed from our accessibility
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;
diff --git a/chrome/browser/accessibility/browser_accessibility_win_unittest.cc b/chrome/browser/accessibility/browser_accessibility_win_unittest.cc
index e40d505..66cf70d 100644
--- a/chrome/browser/accessibility/browser_accessibility_win_unittest.cc
+++ b/chrome/browser/accessibility/browser_accessibility_win_unittest.cc
@@ -285,6 +285,7 @@ TEST_F(BrowserAccessibilityTest, TestTextBoundaries) {
text1.role = WebAccessibility::ROLE_TEXT_FIELD;
text1.state = 0;
text1.value = L"One two three.\nFour five six.";
+ text1.line_breaks.push_back(15);
WebAccessibility root;
root.id = 1;
@@ -354,8 +355,8 @@ TEST_F(BrowserAccessibilityTest, TestTextBoundaries) {
ASSERT_EQ(S_OK, text1_obj->get_textAtOffset(
1, IA2_TEXT_BOUNDARY_LINE, &start, &end, &text));
ASSERT_EQ(start, 0);
- ASSERT_EQ(end, 13);
- ASSERT_EQ(text, string16(L"One two three"));
+ ASSERT_EQ(end, 15);
+ ASSERT_EQ(text, string16(L"One two three.\n"));
SysFreeString(text);
ASSERT_EQ(S_OK, text1_obj->get_text(0, IA2_TEXT_OFFSET_LENGTH, &text));