Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(580)

Unified Diff: content/browser/accessibility/browser_accessibility_win.cc

Issue 2806773002: Switched to using |AXPosition| for calculating word and line boundaries on Windows. (Closed)
Patch Set: Fixed line boundaries. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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);

Powered by Google App Engine
This is Rietveld 408576698