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); |