Chromium Code Reviews| 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 01b5e28fd78e4782c85ca438de5f67de756504b0..48e7395f3400ad286dc8051f8512452ec6341cf8 100644 |
| --- a/content/browser/accessibility/browser_accessibility_win.cc |
| +++ b/content/browser/accessibility/browser_accessibility_win.cc |
| @@ -2486,11 +2486,11 @@ STDMETHODIMP BrowserAccessibilityWin::get_textAtOffset( |
| if (!start_offset || !end_offset || !text) |
| return E_INVALIDARG; |
| - const base::string16& text_str = GetText(); |
| HandleSpecialTextOffset(&offset); |
| if (offset < 0) |
| return E_INVALIDARG; |
| + const base::string16& text_str = GetText(); |
| LONG text_len = text_str.length(); |
| if (offset > text_len) |
| return E_INVALIDARG; |
| @@ -3889,8 +3889,9 @@ void BrowserAccessibilityWin::ComputeStylesIfNeeded() { |
| // |offset| could either be a text character or a child index in case of |
| // non-text objects. |
| +// TODO(nektar): Remove this function once selection bugs are fixed in Blink. |
| BrowserAccessibilityWin::AXPlatformPositionInstance |
| -BrowserAccessibilityWin::CreatePositionAt(int offset) const { |
| +BrowserAccessibilityWin::CreatePositionForSelectionAt(int offset) const { |
| if (!IsNativeTextControl() && !IsTextOnlyObject()) { |
| DCHECK(manager_); |
| const BrowserAccessibilityWin* child = this; |
| @@ -3920,7 +3921,7 @@ BrowserAccessibilityWin::CreatePositionAt(int offset) const { |
| } |
| return position; |
| } |
| - return BrowserAccessibility::CreatePositionAt(offset); |
| + return CreatePositionAt(offset); |
| } |
| base::string16 BrowserAccessibilityWin::GetText() const { |
| @@ -4577,9 +4578,9 @@ void BrowserAccessibilityWin::SetIA2HypertextSelection(LONG start_offset, |
| HandleSpecialTextOffset(&start_offset); |
| HandleSpecialTextOffset(&end_offset); |
| AXPlatformPositionInstance start_position = |
| - CreatePositionAt(static_cast<int>(start_offset)); |
| + CreatePositionForSelectionAt(static_cast<int>(start_offset)); |
| AXPlatformPositionInstance end_position = |
| - CreatePositionAt(static_cast<int>(end_offset)); |
| + CreatePositionForSelectionAt(static_cast<int>(end_offset)); |
| manager_->SetSelection(AXPlatformRange(start_position->AsTextPosition(), |
| end_position->AsTextPosition())); |
| } |
| @@ -4987,13 +4988,61 @@ LONG BrowserAccessibilityWin::FindBoundary( |
| : ui::AX_TEXT_AFFINITY_DOWNSTREAM; |
| HandleSpecialTextOffset(&start_offset); |
| - if (ia2_boundary == IA2_TEXT_BOUNDARY_WORD) |
| - return GetWordStartBoundary(static_cast<int>(start_offset), direction); |
| + if (ia2_boundary == IA2_TEXT_BOUNDARY_WORD) { |
| + switch (direction) { |
| + case ui::FORWARDS_DIRECTION: { |
| + AXPlatformPositionInstance position = |
| + CreatePositionAt(static_cast<int>(start_offset), affinity); |
| + AXPlatformPositionInstance next_word = |
| + position->CreateNextWordStartPosition(); |
| + if (next_word->IsNullPosition()) |
| + next_word = position->CreatePositionAtEndOfAnchor(); |
| + return next_word->text_offset(); |
| + } |
| + case ui::BACKWARDS_DIRECTION: { |
| + AXPlatformPositionInstance position = |
| + CreatePositionAt(static_cast<int>(start_offset), affinity); |
| + AXPlatformPositionInstance previous_word; |
| + if (!position->AtStartOfWord()) { |
| + previous_word = position->CreatePreviousWordStartPosition(); |
|
dmazzoni
2017/04/10 22:39:49
Just curious, should CreatePreviousWordStartPositi
|
| + if (previous_word->IsNullPosition()) |
| + previous_word = position->CreatePositionAtStartOfAnchor(); |
| + } else { |
| + previous_word = std::move(position); |
| + } |
| + return previous_word->text_offset(); |
| + } |
| + } |
|
dmazzoni
2017/04/10 22:39:49
Maybe add a NOTREACHED() after the switch since th
|
| + } |
| + |
| if (ia2_boundary == IA2_TEXT_BOUNDARY_LINE) { |
| - return GetLineStartBoundary( |
| - static_cast<int>(start_offset), direction, affinity); |
| + switch (direction) { |
| + case ui::FORWARDS_DIRECTION: { |
| + AXPlatformPositionInstance position = |
| + CreatePositionAt(static_cast<int>(start_offset), affinity); |
| + AXPlatformPositionInstance next_line = |
| + position->CreateNextLineStartPosition(); |
| + if (next_line->IsNullPosition()) |
| + next_line = position->CreatePositionAtEndOfAnchor(); |
| + return next_line->text_offset(); |
| + } |
| + case ui::BACKWARDS_DIRECTION: { |
| + AXPlatformPositionInstance position = |
| + CreatePositionAt(static_cast<int>(start_offset), affinity); |
| + AXPlatformPositionInstance previous_line; |
| + if (!position->AtStartOfLine()) { |
| + previous_line = position->CreatePreviousLineStartPosition(); |
| + if (previous_line->IsNullPosition()) |
| + previous_line = position->CreatePositionAtStartOfAnchor(); |
| + } else { |
| + previous_line = std::move(position); |
| + } |
| + return previous_line->text_offset(); |
| + } |
| + } |
|
dmazzoni
2017/04/10 22:39:49
NOTREACHED
|
| } |
| + // TODO(nektar): |AXPosition| can handle other types of boundaries as well. |
| ui::TextBoundaryType boundary = IA2TextBoundaryToTextBoundary(ia2_boundary); |
| return ui::FindAccessibleTextBoundary(text, GetLineStartOffsets(), boundary, |
| start_offset, direction, affinity); |