diff options
author | dmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-15 22:15:06 +0000 |
---|---|---|
committer | dmazzoni@chromium.org <dmazzoni@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-06-15 22:15:06 +0000 |
commit | be4eeb0b5899d07f1a8ba1c4511def39c3787734 (patch) | |
tree | 60d20cebdbcad34ab55f81e6c8c8215f61d07cba /chrome/browser/accessibility | |
parent | fc29c306035eb72ab3aef89c49836d8f6b7cd233 (diff) | |
download | chromium_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')
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)); |