diff --git a/content/browser/accessibility/accessibility_action_browsertest.cc b/content/browser/accessibility/accessibility_action_browsertest.cc index 4f4d67edd9a78..d55ac94791d85 100644 --- a/content/browser/accessibility/accessibility_action_browsertest.cc +++ b/content/browser/accessibility/accessibility_action_browsertest.cc @@ -474,7 +474,7 @@ IN_PROC_BROWSER_TEST_F(AccessibilityActionBrowserTest, TextareaSetValue) { target->CreateTextPositionAt(0); BrowserAccessibility::AXPosition end_of_line_1 = start_position->CreateNextLineEndPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); EXPECT_EQ(5, end_of_line_1->text_offset()); #endif } @@ -508,7 +508,7 @@ IN_PROC_BROWSER_TEST_F(AccessibilityActionBrowserTest, target->CreateTextPositionAt(0); BrowserAccessibility::AXPosition end_of_line_1 = start_position->CreateNextLineEndPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); EXPECT_EQ(5, end_of_line_1->text_offset()); #endif } diff --git a/content/browser/accessibility/accessibility_auralinux_browsertest.cc b/content/browser/accessibility/accessibility_auralinux_browsertest.cc index 0ea4ace465158..20fe460a42b62 100644 --- a/content/browser/accessibility/accessibility_auralinux_browsertest.cc +++ b/content/browser/accessibility/accessibility_auralinux_browsertest.cc @@ -460,7 +460,7 @@ IN_PROC_BROWSER_TEST_F(AccessibilityAuraLinuxBrowserTest, } IN_PROC_BROWSER_TEST_F(AccessibilityAuraLinuxBrowserTest, - TestParagraphTextAtOffsetWithBoundarySentence) { + DISABLED_TestParagraphTextAtOffsetWithBoundarySentence) { LoadInitialAccessibilityTreeFromHtml(std::string( R"HTML( diff --git a/content/browser/accessibility/accessibility_win_browsertest.cc b/content/browser/accessibility/accessibility_win_browsertest.cc index 4fdbe79c7c15d..abd5bf58cea9f 100644 --- a/content/browser/accessibility/accessibility_win_browsertest.cc +++ b/content/browser/accessibility/accessibility_win_browsertest.cc @@ -1774,7 +1774,7 @@ IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, Microsoft::WRL::ComPtr input_text; SetUpScrollableInputField(&input_text); - int contents_string_length = static_cast(InputContentsString().size()); + LONG contents_string_length = static_cast(InputContentsString().size()); constexpr LONG visible_characters_start = 21; LONG n_characters; ASSERT_HRESULT_SUCCEEDED(input_text->get_nCharacters(&n_characters)); @@ -1969,7 +1969,7 @@ IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, Microsoft::WRL::ComPtr input_text; SetUpScrollableInputTypeSearchField(&input_text); - int contents_string_length = static_cast(InputContentsString().size()); + LONG contents_string_length = static_cast(InputContentsString().size()); constexpr LONG visible_characters_start = 21; LONG n_characters; ASSERT_HRESULT_SUCCEEDED(input_text->get_nCharacters(&n_characters)); @@ -2618,7 +2618,7 @@ IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, TestSetSelection) { AccessibilityNotificationWaiter waiter( shell()->web_contents(), ui::kAXModeComplete, ax::mojom::Event::kTextSelectionChanged); - int contents_string_length = static_cast(InputContentsString().size()); + LONG contents_string_length = static_cast(InputContentsString().size()); start_offset = 0; end_offset = contents_string_length; EXPECT_HRESULT_FAILED(input_text->setSelection(1, start_offset, end_offset)); @@ -2654,7 +2654,7 @@ IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, TestSetSelectionRanges) { LONG n_ranges = 1; IA2Range* ranges = reinterpret_cast(CoTaskMemAlloc(sizeof(IA2Range))); - int contents_string_length = static_cast(InputContentsString().size()); + LONG contents_string_length = static_cast(InputContentsString().size()); ranges[0].anchor = ax_input.Get(); ranges[0].anchorOffset = -1; ranges[0].active = ax_input.Get(); @@ -2859,7 +2859,7 @@ IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, TestMultiLineSetSelection) { // There is no selection, just a caret. EXPECT_EQ(E_INVALIDARG, hr); - int contents_string_length = static_cast(InputContentsString().size()); + LONG contents_string_length = static_cast(InputContentsString().size()); AccessibilityNotificationWaiter waiter( shell()->web_contents(), ui::kAXModeComplete, ax::mojom::Event::kTextSelectionChanged); @@ -2896,7 +2896,7 @@ IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, Microsoft::WRL::ComPtr ax_textarea; ASSERT_HRESULT_SUCCEEDED(textarea_text.As(&ax_textarea)); - int contents_string_length = static_cast(InputContentsString().size()); + LONG contents_string_length = static_cast(InputContentsString().size()); LONG n_ranges = 1; IA2Range* ranges = reinterpret_cast(CoTaskMemAlloc(sizeof(IA2Range))); @@ -3471,7 +3471,7 @@ IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, EXPECT_EQ(nullptr, text.Get()); hr = input_text->get_textAtOffset(invalid_offset, IA2_TEXT_BOUNDARY_SENTENCE, &start_offset, &end_offset, text.Receive()); - EXPECT_EQ(S_FALSE, hr); + EXPECT_EQ(E_INVALIDARG, hr); EXPECT_EQ(0, start_offset); EXPECT_EQ(0, end_offset); EXPECT_EQ(nullptr, text.Get()); @@ -3508,7 +3508,7 @@ IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, hr = input_text->get_textAtOffset(IA2_TEXT_OFFSET_LENGTH, IA2_TEXT_BOUNDARY_SENTENCE, &start_offset, &end_offset, text.Receive()); - EXPECT_EQ(S_FALSE, hr); + EXPECT_EQ(E_INVALIDARG, hr); EXPECT_EQ(0, start_offset); EXPECT_EQ(0, end_offset); EXPECT_EQ(nullptr, text.Get()); @@ -3578,7 +3578,7 @@ IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, hr = textarea_text->get_textAtOffset( invalid_offset, IA2_TEXT_BOUNDARY_SENTENCE, &start_offset, &end_offset, text.Receive()); - EXPECT_EQ(S_FALSE, hr); + EXPECT_EQ(E_INVALIDARG, hr); EXPECT_EQ(0, start_offset); EXPECT_EQ(0, end_offset); EXPECT_EQ(nullptr, text.Get()); @@ -3617,7 +3617,7 @@ IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, hr = textarea_text->get_textAtOffset( IA2_TEXT_OFFSET_LENGTH, IA2_TEXT_BOUNDARY_SENTENCE, &start_offset, &end_offset, text.Receive()); - EXPECT_EQ(S_FALSE, hr); + EXPECT_EQ(E_INVALIDARG, hr); EXPECT_EQ(0, start_offset); EXPECT_EQ(0, end_offset); EXPECT_EQ(nullptr, text.Get()); @@ -3643,7 +3643,7 @@ IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, Microsoft::WRL::ComPtr input_text; SetUpInputField(&input_text); - int contents_string_length = static_cast(InputContentsString().size()); + LONG contents_string_length = static_cast(InputContentsString().size()); for (LONG offset = 0; offset < contents_string_length; ++offset) { std::wstring expected_text(1, InputContentsString()[offset]); LONG expected_start_offset = offset; @@ -3671,7 +3671,7 @@ IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, Microsoft::WRL::ComPtr textarea_text; SetUpTextareaField(&textarea_text); - int contents_string_length = InputContentsString().size(); + LONG contents_string_length = static_cast(InputContentsString().size()); for (LONG offset = 0; offset < contents_string_length; ++offset) { std::wstring expected_text(1, TextAreaContentsString()[offset]); LONG expected_start_offset = offset; @@ -3859,7 +3859,7 @@ IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, CheckTextAtOffset(input_text, 39, IA2_TEXT_BOUNDARY_WORD, 38, 40, L", "); // Trailing final punctuation should not be part of the last word. - int contents_string_length = static_cast(InputContentsString().size()); + LONG contents_string_length = static_cast(InputContentsString().size()); CheckTextAtOffset(input_text, 40, IA2_TEXT_BOUNDARY_WORD, 40, 44, L"like"); CheckTextAtOffset(input_text, 41, IA2_TEXT_BOUNDARY_WORD, 40, 44, L"like"); CheckTextAtOffset(input_text, 44, IA2_TEXT_BOUNDARY_WORD, 44, @@ -3924,7 +3924,7 @@ IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, CheckTextAtOffset(textarea_text, 39, IA2_TEXT_BOUNDARY_WORD, 38, 40, L", "); // Trailing final punctuation should not be part of the last word. - int contents_string_length = static_cast(InputContentsString().size()); + LONG contents_string_length = static_cast(InputContentsString().size()); CheckTextAtOffset(textarea_text, 40, IA2_TEXT_BOUNDARY_WORD, 40, 44, L"like"); CheckTextAtOffset(textarea_text, 41, IA2_TEXT_BOUNDARY_WORD, 40, 44, L"like"); CheckTextAtOffset(textarea_text, 44, IA2_TEXT_BOUNDARY_WORD, 44, @@ -3967,33 +3967,78 @@ IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, } IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, - TestTextAtOffsetWithBoundarySentence) { + DISABLED_TestTextAtOffsetWithBoundarySentence) { Microsoft::WRL::ComPtr input_text; SetUpInputField(&input_text); - // Sentence navigation is not currently implemented. - LONG start_offset = 0; - LONG end_offset = 0; - base::win::ScopedBstr text; - HRESULT hr = - input_text->get_textAtOffset(5, IA2_TEXT_BOUNDARY_SENTENCE, &start_offset, - &end_offset, text.Receive()); - EXPECT_EQ(S_FALSE, hr); + const LONG contents_string_length = + static_cast(InputContentsString().size()); + const std::wstring expected_text = base::SysUTF8ToWide(InputContentsString()); + for (LONG offset = 0; offset < contents_string_length; ++offset) { + CheckTextAtOffset(input_text, offset, IA2_TEXT_BOUNDARY_SENTENCE, 0, + contents_string_length, expected_text); + } + + // Test special offsets. + CheckTextAtOffset(input_text, IA2_TEXT_OFFSET_CARET, + IA2_TEXT_BOUNDARY_SENTENCE, 0, contents_string_length, + expected_text); + { + LONG start_offset = 0; + LONG end_offset = 0; + base::win::ScopedBstr text; + HRESULT hr = input_text->get_textAtOffset( + IA2_TEXT_OFFSET_LENGTH, IA2_TEXT_BOUNDARY_SENTENCE, &start_offset, + &end_offset, text.Receive()); + EXPECT_EQ(E_INVALIDARG, hr); + EXPECT_EQ(0, start_offset); + EXPECT_EQ(0, end_offset); + EXPECT_EQ(nullptr, text.Get()); + } } IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, - TestMultiLineTextAtOffsetWithBoundarySentence) { + DISABLED_TestMultiLineTextAtOffsetWithBoundarySentence) { Microsoft::WRL::ComPtr textarea_text; SetUpTextareaField(&textarea_text); - // Sentence navigation is not currently implemented. - LONG start_offset = 0; - LONG end_offset = 0; - base::win::ScopedBstr text; - HRESULT hr = textarea_text->get_textAtOffset(25, IA2_TEXT_BOUNDARY_SENTENCE, - &start_offset, &end_offset, - text.Receive()); - EXPECT_EQ(S_FALSE, hr); + const LONG contents_string_length = + static_cast(TextAreaContentsString().size()); + const std::vector sentence_starts{0, 23, 24, 31, 32}; + const std::vector sentence_ends{23, 24, 31, 32, contents_string_length}; + size_t sentence_index = 0; + for (LONG offset = 0; offset < contents_string_length && + sentence_index < sentence_starts.size(); + ++offset) { + if (offset == sentence_starts[sentence_index + 1]) + ++sentence_index; + LONG expected_start_offset = sentence_starts[sentence_index]; + LONG expected_end_offset = sentence_ends[sentence_index]; + const std::wstring expected_text = + base::SysUTF8ToWide(TextAreaContentsString().substr( + sentence_starts[sentence_index], + (sentence_ends[sentence_index] - sentence_starts[sentence_index]))); + CheckTextAtOffset(textarea_text, offset, IA2_TEXT_BOUNDARY_SENTENCE, + expected_start_offset, expected_end_offset, + expected_text); + } + + // Test special offsets. + CheckTextAtOffset(textarea_text, IA2_TEXT_OFFSET_CARET, + IA2_TEXT_BOUNDARY_SENTENCE, 32, contents_string_length, + base::SysUTF8ToWide(TextAreaContentsString().substr(32))); + { + LONG start_offset = 0; + LONG end_offset = 0; + base::win::ScopedBstr text; + HRESULT hr = textarea_text->get_textAtOffset( + IA2_TEXT_OFFSET_LENGTH, IA2_TEXT_BOUNDARY_SENTENCE, &start_offset, + &end_offset, text.Receive()); + EXPECT_EQ(E_INVALIDARG, hr); + EXPECT_EQ(0, start_offset); + EXPECT_EQ(0, end_offset); + EXPECT_EQ(nullptr, text.Get()); + } } IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, @@ -4002,7 +4047,7 @@ IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, SetUpInputField(&input_text); // Single line text fields should return the whole text. - int contents_string_length = static_cast(InputContentsString().size()); + LONG contents_string_length = static_cast(InputContentsString().size()); CheckTextAtOffset(input_text, 0, IA2_TEXT_BOUNDARY_LINE, 0, contents_string_length, base::SysUTF8ToWide(InputContentsString())); @@ -4029,7 +4074,7 @@ IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, L"WebKit \n"); // Last line does not have a trailing newline. - int contents_string_length = static_cast(InputContentsString().size()); + LONG contents_string_length = static_cast(InputContentsString().size()); CheckTextAtOffset(textarea_text, 32, IA2_TEXT_BOUNDARY_LINE, 32, contents_string_length, L"\"KHTML, like\"."); @@ -4067,8 +4112,8 @@ IN_PROC_BROWSER_TEST_F(AccessibilityWinBrowserTest, // Blink represents the blank line with a newline character, so in total there // should be two more newlines. The second newline is not part of the HTML // value attribute however. - int contents_string_length = - static_cast(InputContentsString().size()) + 1; + LONG contents_string_length = + static_cast(InputContentsString().size()) + 1; CheckTextAtOffset(textarea_text, 32, IA2_TEXT_BOUNDARY_LINE, 32, contents_string_length, L"\"KHTML, like\".\n"); CheckTextAtOffset(textarea_text, 46, IA2_TEXT_BOUNDARY_LINE, 32, diff --git a/content/browser/accessibility/ax_platform_node_textrangeprovider_win_browsertest.cc b/content/browser/accessibility/ax_platform_node_textrangeprovider_win_browsertest.cc index da59ff14beb09..24ab89a97bb69 100644 --- a/content/browser/accessibility/ax_platform_node_textrangeprovider_win_browsertest.cc +++ b/content/browser/accessibility/ax_platform_node_textrangeprovider_win_browsertest.cc @@ -2758,7 +2758,7 @@ IN_PROC_BROWSER_TEST_F(AXPlatformNodeTextRangeProviderWinBrowserTest, /*expected_count*/ -1); ASSERT_HRESULT_SUCCEEDED( text_range_provider->ExpandToEnclosingUnit(TextUnit_Word)); - EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"\xA0\n"); + EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"\xA0"); // Case 2: test on range that includes the whitespace and the following word. GetTextRangeProviderFromTextNode(*node, &text_range_provider); @@ -2771,7 +2771,7 @@ IN_PROC_BROWSER_TEST_F(AXPlatformNodeTextRangeProviderWinBrowserTest, /*expected_count*/ 1); ASSERT_HRESULT_SUCCEEDED( text_range_provider->ExpandToEnclosingUnit(TextUnit_Word)); - EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"\xA0\n"); + EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"\xA0"); // Case 3: test on degenerate range after whitespace. node = FindNode(ax::mojom::Role::kStaticText, "3.14"); diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc index 4f02ac6c85f91..da885b9ab9154 100644 --- a/content/browser/accessibility/browser_accessibility.cc +++ b/content/browser/accessibility/browser_accessibility.cc @@ -106,26 +106,6 @@ BrowserAccessibility* GetTextFieldInnerEditorElement( return nullptr; } -int GetBoundaryTextOffsetInsideBaseAnchor( - ax::mojom::MoveDirection direction, - const BrowserAccessibility::AXPosition& base, - const BrowserAccessibility::AXPosition& position) { - if (base->GetAnchor() == position->GetAnchor()) - return position->text_offset(); - - // If the position is outside the anchor of the base position, then return - // the first or last position in the same direction. - switch (direction) { - case ax::mojom::MoveDirection::kNone: - NOTREACHED(); - return position->text_offset(); - case ax::mojom::MoveDirection::kBackward: - return base->CreatePositionAtStartOfAnchor()->text_offset(); - case ax::mojom::MoveDirection::kForward: - return base->CreatePositionAtEndOfAnchor()->text_offset(); - } -} - } // namespace bool BrowserAccessibility::IsValid() const { @@ -1188,29 +1168,6 @@ std::string BrowserAccessibility::SubtreeToStringHelper(size_t level) { return result; } -absl::optional BrowserAccessibility::FindTextBoundary( - ax::mojom::TextBoundary boundary, - int offset, - ax::mojom::MoveDirection direction, - ax::mojom::TextAffinity affinity) const { - const AXPosition position = CreateTextPositionAt(offset, affinity); - - // On Windows and Linux ATK, searching for a text boundary should always stop - // at the boundary of the current object. - auto boundary_behavior = ui::AXBoundaryBehavior::StopAtAnchorBoundary; - // On Windows and Linux ATK, it is standard text navigation behavior to stop - // if we are searching in the backwards direction and the current position is - // already at the required text boundary. - DCHECK_NE(direction, ax::mojom::MoveDirection::kNone); - if (direction == ax::mojom::MoveDirection::kBackward) - boundary_behavior = ui::AXBoundaryBehavior::StopIfAlreadyAtBoundary; - - return GetBoundaryTextOffsetInsideBaseAnchor( - direction, position, - position->CreatePositionAtTextBoundary(boundary, direction, - boundary_behavior)); -} - const std::vector BrowserAccessibility::GetUIADirectChildrenInRange( ui::AXPlatformNodeDelegate* start, diff --git a/content/browser/accessibility/browser_accessibility.h b/content/browser/accessibility/browser_accessibility.h index 3d0c6117b4414..529eb092cd72f 100644 --- a/content/browser/accessibility/browser_accessibility.h +++ b/content/browser/accessibility/browser_accessibility.h @@ -510,12 +510,6 @@ class CONTENT_EXPORT BrowserAccessibility : public ui::AXPlatformNodeDelegate { int GetIndexInParent() override; gfx::AcceleratedWidget GetTargetForNativeAccessibilityEvent() override; - absl::optional FindTextBoundary( - ax::mojom::TextBoundary boundary, - int offset, - ax::mojom::MoveDirection direction, - ax::mojom::TextAffinity affinity) const override; - const std::vector GetUIADirectChildrenInRange( ui::AXPlatformNodeDelegate* start, ui::AXPlatformNodeDelegate* end) override; diff --git a/content/browser/accessibility/browser_accessibility_cocoa.mm b/content/browser/accessibility/browser_accessibility_cocoa.mm index befdae21ac067..c9e39525536e8 100644 --- a/content/browser/accessibility/browser_accessibility_cocoa.mm +++ b/content/browser/accessibility/browser_accessibility_cocoa.mm @@ -2540,7 +2540,7 @@ - (id)accessibilityAttributeValue:(NSString*)attribute if (position->IsNullPosition()) return nil; return CreateTextMarker(position->CreateNextCharacterPosition( - ui::AXBoundaryBehavior::CrossBoundary)); + ui::AXBoundaryBehavior::kCrossBoundary)); } if ([attribute @@ -2551,7 +2551,7 @@ - (id)accessibilityAttributeValue:(NSString*)attribute if (position->IsNullPosition()) return nil; return CreateTextMarker(position->CreatePreviousCharacterPosition( - ui::AXBoundaryBehavior::CrossBoundary)); + ui::AXBoundaryBehavior::kCrossBoundary)); } if ([attribute @@ -2564,10 +2564,10 @@ - (id)accessibilityAttributeValue:(NSString*)attribute BrowserAccessibility::AXPosition startWordPosition = endPosition->CreatePreviousWordStartPosition( - ui::AXBoundaryBehavior::StopAtAnchorBoundary); + ui::AXBoundaryBehavior::kStopAtAnchorBoundary); BrowserAccessibility::AXPosition endWordPosition = endPosition->CreatePreviousWordEndPosition( - ui::AXBoundaryBehavior::StopAtAnchorBoundary); + ui::AXBoundaryBehavior::kStopAtAnchorBoundary); BrowserAccessibility::AXPosition startPosition = *startWordPosition <= *endWordPosition ? std::move(endWordPosition) : std::move(startWordPosition); @@ -2586,10 +2586,10 @@ - (id)accessibilityAttributeValue:(NSString*)attribute BrowserAccessibility::AXPosition endWordPosition = startPosition->CreateNextWordEndPosition( - ui::AXBoundaryBehavior::StopAtAnchorBoundary); + ui::AXBoundaryBehavior::kStopAtAnchorBoundary); BrowserAccessibility::AXPosition startWordPosition = startPosition->CreateNextWordStartPosition( - ui::AXBoundaryBehavior::StopAtAnchorBoundary); + ui::AXBoundaryBehavior::kStopAtAnchorBoundary); BrowserAccessibility::AXPosition endPosition = *startWordPosition <= *endWordPosition ? std::move(startWordPosition) : std::move(endWordPosition); @@ -2606,7 +2606,7 @@ - (id)accessibilityAttributeValue:(NSString*)attribute if (position->IsNullPosition()) return nil; return CreateTextMarker(position->CreateNextWordEndPosition( - ui::AXBoundaryBehavior::CrossBoundary)); + ui::AXBoundaryBehavior::kCrossBoundary)); } if ([attribute @@ -2617,7 +2617,7 @@ - (id)accessibilityAttributeValue:(NSString*)attribute if (position->IsNullPosition()) return nil; return CreateTextMarker(position->CreatePreviousWordStartPosition( - ui::AXBoundaryBehavior::CrossBoundary)); + ui::AXBoundaryBehavior::kCrossBoundary)); } if ([attribute isEqualToString: @@ -2654,10 +2654,10 @@ - (id)accessibilityAttributeValue:(NSString*)attribute // Make sure that the line start position is really at the start of the // current line. lineStartPosition = lineStartPosition->CreatePreviousLineStartPosition( - ui::AXBoundaryBehavior::StopIfAlreadyAtBoundary); + ui::AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); BrowserAccessibility::AXPosition lineEndPosition = lineStartPosition->CreateNextLineEndPosition( - ui::AXBoundaryBehavior::StopAtAnchorBoundary); + ui::AXBoundaryBehavior::kStopAtAnchorBoundary); BrowserAccessibility::AXRange range(std::move(lineStartPosition), std::move(lineEndPosition)); return CreateTextMarkerRange(std::move(range)); @@ -2673,10 +2673,10 @@ - (id)accessibilityAttributeValue:(NSString*)attribute BrowserAccessibility::AXPosition startLinePosition = endPosition->CreatePreviousLineStartPosition( - ui::AXBoundaryBehavior::StopAtLastAnchorBoundary); + ui::AXBoundaryBehavior::kStopAtLastAnchorBoundary); BrowserAccessibility::AXPosition endLinePosition = endPosition->CreatePreviousLineEndPosition( - ui::AXBoundaryBehavior::StopAtLastAnchorBoundary); + ui::AXBoundaryBehavior::kStopAtLastAnchorBoundary); BrowserAccessibility::AXPosition startPosition = *startLinePosition <= *endLinePosition ? std::move(endLinePosition) : std::move(startLinePosition); @@ -2695,10 +2695,10 @@ - (id)accessibilityAttributeValue:(NSString*)attribute BrowserAccessibility::AXPosition startLinePosition = startPosition->CreateNextLineStartPosition( - ui::AXBoundaryBehavior::StopAtLastAnchorBoundary); + ui::AXBoundaryBehavior::kStopAtLastAnchorBoundary); BrowserAccessibility::AXPosition endLinePosition = startPosition->CreateNextLineEndPosition( - ui::AXBoundaryBehavior::StopAtLastAnchorBoundary); + ui::AXBoundaryBehavior::kStopAtLastAnchorBoundary); BrowserAccessibility::AXPosition endPosition = *startLinePosition <= *endLinePosition ? std::move(startLinePosition) : std::move(endLinePosition); @@ -2715,7 +2715,7 @@ - (id)accessibilityAttributeValue:(NSString*)attribute if (position->IsNullPosition()) return nil; return CreateTextMarker(position->CreateNextLineEndPosition( - ui::AXBoundaryBehavior::CrossBoundary)); + ui::AXBoundaryBehavior::kCrossBoundary)); } if ([attribute @@ -2726,7 +2726,22 @@ - (id)accessibilityAttributeValue:(NSString*)attribute if (position->IsNullPosition()) return nil; return CreateTextMarker(position->CreatePreviousLineStartPosition( - ui::AXBoundaryBehavior::CrossBoundary)); + ui::AXBoundaryBehavior::kCrossBoundary)); + } + + if ([attribute + isEqualToString: + NSAccessibilitySentenceTextMarkerRangeForTextMarkerParameterizedAttribute]) { + BrowserAccessibility::AXPosition position = + CreatePositionFromTextMarker(parameter); + if (position->IsNullPosition()) + return nil; + + BrowserAccessibility::AXRange range = + position->ExpandToEnclosingTextBoundary( + ax::mojom::TextBoundary::kSentenceStartOrEnd, + ui::AXRangeExpandBehavior::kLeftFirst); + return CreateTextMarkerRange(std::move(range)); } if ([attribute @@ -2737,14 +2752,10 @@ - (id)accessibilityAttributeValue:(NSString*)attribute if (position->IsNullPosition()) return nil; - BrowserAccessibility::AXPosition startPosition = - position->CreatePreviousParagraphStartPosition( - ui::AXBoundaryBehavior::StopIfAlreadyAtBoundary); - BrowserAccessibility::AXPosition endPosition = - position->CreateNextParagraphEndPosition( - ui::AXBoundaryBehavior::StopIfAlreadyAtBoundary); - BrowserAccessibility::AXRange range(std::move(startPosition), - std::move(endPosition)); + BrowserAccessibility::AXRange range = + position->ExpandToEnclosingTextBoundary( + ax::mojom::TextBoundary::kParagraphStartOrEnd, + ui::AXRangeExpandBehavior::kLeftFirst); return CreateTextMarkerRange(std::move(range)); } @@ -2756,7 +2767,7 @@ - (id)accessibilityAttributeValue:(NSString*)attribute if (position->IsNullPosition()) return nil; return CreateTextMarker(position->CreateNextParagraphEndPosition( - ui::AXBoundaryBehavior::CrossBoundary)); + ui::AXBoundaryBehavior::kCrossBoundary)); } if ([attribute @@ -2767,7 +2778,7 @@ - (id)accessibilityAttributeValue:(NSString*)attribute if (position->IsNullPosition()) return nil; return CreateTextMarker(position->CreatePreviousParagraphStartPosition( - ui::AXBoundaryBehavior::CrossBoundary)); + ui::AXBoundaryBehavior::kCrossBoundary)); } if ([attribute @@ -2780,10 +2791,10 @@ - (id)accessibilityAttributeValue:(NSString*)attribute BrowserAccessibility::AXPosition startPosition = position->CreatePreviousFormatStartPosition( - ui::AXBoundaryBehavior::StopIfAlreadyAtBoundary); + ui::AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); BrowserAccessibility::AXPosition endPosition = position->CreateNextFormatEndPosition( - ui::AXBoundaryBehavior::StopIfAlreadyAtBoundary); + ui::AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); BrowserAccessibility::AXRange range(std::move(startPosition), std::move(endPosition)); return CreateTextMarkerRange(std::move(range)); @@ -2867,10 +2878,10 @@ - (id)accessibilityAttributeValue:(NSString*)attribute // Note that hard line breaks are on a line of their own. BrowserAccessibility::AXPosition startPosition = position->CreatePreviousLineStartPosition( - ui::AXBoundaryBehavior::StopIfAlreadyAtBoundary); + ui::AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); BrowserAccessibility::AXPosition endPosition = startPosition->CreateNextLineStartPosition( - ui::AXBoundaryBehavior::StopAtLastAnchorBoundary); + ui::AXBoundaryBehavior::kStopAtLastAnchorBoundary); BrowserAccessibility::AXRange range(std::move(startPosition), std::move(endPosition)); return CreateTextMarkerRange(std::move(range)); diff --git a/content/browser/accessibility/browser_accessibility_unittest.cc b/content/browser/accessibility/browser_accessibility_unittest.cc index 71832263810a8..4c22f297987f1 100644 --- a/content/browser/accessibility/browser_accessibility_unittest.cc +++ b/content/browser/accessibility/browser_accessibility_unittest.cc @@ -829,7 +829,7 @@ TEST_F(BrowserAccessibilityTest, NextWordPositionWithHypertext) { BrowserAccessibility::AXPosition next_word_start = position->CreateNextWordStartPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); if (position->MaxTextOffset() == 0) { EXPECT_TRUE(next_word_start->IsNullPosition()); } else { @@ -841,7 +841,7 @@ TEST_F(BrowserAccessibilityTest, NextWordPositionWithHypertext) { BrowserAccessibility::AXPosition next_word_end = position->CreateNextWordEndPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); if (position->MaxTextOffset() == 0) { EXPECT_TRUE(next_word_end->IsNullPosition()); } else { diff --git a/content/browser/accessibility/dump_accessibility_events_browsertest.cc b/content/browser/accessibility/dump_accessibility_events_browsertest.cc index e244cab55d036..26974556065ec 100644 --- a/content/browser/accessibility/dump_accessibility_events_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_events_browsertest.cc @@ -493,8 +493,8 @@ IN_PROC_BROWSER_TEST_P(DumpAccessibilityEventsTest, RunEventTest(FILE_PATH_LITERAL("caret-move.html")); } -// Flaky on Windows: https://crbug.com/1186887 -#if defined(OS_WIN) +// Flaky on Windows, disabled on Linux: https://crbug.com/1186887 +#if defined(OS_LINUX) || defined(OS_WIN) #define MAYBE_AccessibilityEventsCaretMoveHiddenInput \ DISABLED_AccessibilityEventsCaretMoveHiddenInput #else diff --git a/extensions/renderer/api/automation/automation_internal_custom_bindings.cc b/extensions/renderer/api/automation/automation_internal_custom_bindings.cc index 2017213ca4330..be326fad8f7e4 100644 --- a/extensions/renderer/api/automation/automation_internal_custom_bindings.cc +++ b/extensions/renderer/api/automation/automation_internal_custom_bindings.cc @@ -2853,7 +2853,7 @@ std::vector AutomationInternalCustomBindings::CalculateSentenceBoundary( if (!head_pos->AtStartOfParagraph()) { ui::AXNodePosition::AXPositionInstance start_para_pos = head_pos->CreatePreviousParagraphStartPosition( - ui::AXBoundaryBehavior::StopAtLastAnchorBoundary); + ui::AXBoundaryBehavior::kStopAtLastAnchorBoundary); ui::AXRange> pre_range( start_para_pos->Clone(), head_pos->Clone()); pre_str = pre_range.GetText(); @@ -2863,7 +2863,7 @@ std::vector AutomationInternalCustomBindings::CalculateSentenceBoundary( // node to the end of the paragraph. ui::AXNodePosition::AXPositionInstance end_para_pos = head_pos->CreateNextParagraphEndPosition( - ui::AXBoundaryBehavior::StopAtLastAnchorBoundary); + ui::AXBoundaryBehavior::kStopAtLastAnchorBoundary); ui::AXRange> post_range( head_pos->Clone(), end_para_pos->Clone()); post_str = post_range.GetText(); diff --git a/extensions/renderer/api/automation/automation_position.cc b/extensions/renderer/api/automation/automation_position.cc index a704805bc6c37..445862f9473f7 100644 --- a/extensions/renderer/api/automation/automation_position.cc +++ b/extensions/renderer/api/automation/automation_position.cc @@ -273,118 +273,118 @@ void AutomationPosition::MoveToPreviousLeafTextPosition( void AutomationPosition::MoveToNextCharacterPosition( gin::Arguments* arguments) { position_ = position_->CreateNextCharacterPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); } void AutomationPosition::MoveToPreviousCharacterPosition( gin::Arguments* arguments) { position_ = position_->CreatePreviousCharacterPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); } void AutomationPosition::MoveToNextWordStartPosition( gin::Arguments* arguments) { position_ = position_->CreateNextWordStartPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); } void AutomationPosition::MoveToPreviousWordStartPosition( gin::Arguments* arguments) { position_ = position_->CreatePreviousWordStartPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); } void AutomationPosition::MoveToNextWordEndPosition(gin::Arguments* arguments) { position_ = position_->CreateNextWordEndPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); } void AutomationPosition::MoveToPreviousWordEndPosition( gin::Arguments* arguments) { position_ = position_->CreatePreviousWordEndPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); } void AutomationPosition::MoveToNextLineStartPosition( gin::Arguments* arguments) { position_ = position_->CreateNextLineStartPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); } void AutomationPosition::MoveToPreviousLineStartPosition( gin::Arguments* arguments) { position_ = position_->CreatePreviousLineStartPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); } void AutomationPosition::MoveToNextLineEndPosition(gin::Arguments* arguments) { position_ = position_->CreateNextLineEndPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); } void AutomationPosition::MoveToPreviousLineEndPosition( gin::Arguments* arguments) { position_ = position_->CreatePreviousLineEndPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); } void AutomationPosition::MoveToPreviousFormatStartPosition( gin::Arguments* arguments) { position_ = position_->CreatePreviousFormatStartPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); } void AutomationPosition::MoveToNextFormatEndPosition( gin::Arguments* arguments) { position_ = position_->CreateNextFormatEndPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); } void AutomationPosition::MoveToNextParagraphStartPosition( gin::Arguments* arguments) { position_ = position_->CreateNextParagraphStartPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); } void AutomationPosition::MoveToPreviousParagraphStartPosition( gin::Arguments* arguments) { position_ = position_->CreatePreviousParagraphStartPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); } void AutomationPosition::MoveToNextParagraphEndPosition( gin::Arguments* arguments) { position_ = position_->CreateNextParagraphEndPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); } void AutomationPosition::MoveToPreviousParagraphEndPosition( gin::Arguments* arguments) { position_ = position_->CreatePreviousParagraphEndPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); } void AutomationPosition::MoveToNextPageStartPosition( gin::Arguments* arguments) { position_ = position_->CreateNextPageStartPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); } void AutomationPosition::MoveToPreviousPageStartPosition( gin::Arguments* arguments) { position_ = position_->CreatePreviousPageStartPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); } void AutomationPosition::MoveToNextPageEndPosition(gin::Arguments* arguments) { position_ = position_->CreateNextPageEndPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); } void AutomationPosition::MoveToPreviousPageEndPosition( gin::Arguments* arguments) { position_ = position_->CreatePreviousPageEndPosition( - ui::AXBoundaryBehavior::CrossBoundary); + ui::AXBoundaryBehavior::kCrossBoundary); } void AutomationPosition::MoveToNextAnchorPosition(gin::Arguments* arguments) { diff --git a/ui/accessibility/ax_computed_node_data.cc b/ui/accessibility/ax_computed_node_data.cc index 6e15815ade11e..e175016cd18ca 100644 --- a/ui/accessibility/ax_computed_node_data.cc +++ b/ui/accessibility/ax_computed_node_data.cc @@ -280,9 +280,13 @@ void AXComputedNodeData::ComputeSentenceOffsetsIfNeeded() const { sentence_starts_ = std::vector(); sentence_ends_ = std::vector(); + if (owner_->IsLineBreak()) + return; const std::u16string& text_content = GetOrComputeTextContentUTF16(); - if (text_content.empty()) + if (text_content.empty() || + base::ContainsOnlyChars(text_content, base::kWhitespaceUTF16)) { return; + } // Unlike in ICU, a sentence boundary is not valid in Blink if it falls within // some whitespace that is used to separate sentences. We therefore need to diff --git a/ui/accessibility/ax_node_position_unittest.cc b/ui/accessibility/ax_node_position_unittest.cc index a7368e0204738..2876598448fbd 100644 --- a/ui/accessibility/ax_node_position_unittest.cc +++ b/ui/accessibility/ax_node_position_unittest.cc @@ -388,6 +388,10 @@ void AXPositionTest::SetUp() { inline_box1_.role = ax::mojom::Role::kInlineTextBox; inline_box1_.AddState(ax::mojom::State::kEditable); inline_box1_.SetName("Line 1"); + inline_box1_.AddIntListAttribute(ax::mojom::IntListAttribute::kSentenceStarts, + {0}); + inline_box1_.AddIntListAttribute(ax::mojom::IntListAttribute::kSentenceEnds, + {6}); inline_box1_.AddIntListAttribute(ax::mojom::IntListAttribute::kWordStarts, std::vector{0, 5}); inline_box1_.AddIntListAttribute(ax::mojom::IntListAttribute::kWordEnds, @@ -412,6 +416,10 @@ void AXPositionTest::SetUp() { inline_box2_.role = ax::mojom::Role::kInlineTextBox; inline_box2_.AddState(ax::mojom::State::kEditable); inline_box2_.SetName("Line 2"); + inline_box2_.AddIntListAttribute(ax::mojom::IntListAttribute::kSentenceStarts, + {0}); + inline_box2_.AddIntListAttribute(ax::mojom::IntListAttribute::kSentenceEnds, + {6}); inline_box2_.AddIntListAttribute(ax::mojom::IntListAttribute::kWordStarts, std::vector{0, 5}); inline_box2_.AddIntListAttribute(ax::mojom::IntListAttribute::kWordEnds, @@ -3222,19 +3230,19 @@ TEST_F(AXPositionTest, CreateNextOrPreviousParagraphPositionWithIgnoredNodes) { ax::mojom::TextAffinity::kDownstream); paragraph_start_position = paragraph_start_position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); ASSERT_TRUE(paragraph_start_position->IsTextPosition()); EXPECT_EQ(inline_text_data_b_1.id, paragraph_start_position->anchor_id()); EXPECT_EQ(0, paragraph_start_position->text_offset()); paragraph_start_position = paragraph_start_position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); ASSERT_TRUE(paragraph_start_position->IsTextPosition()); EXPECT_EQ(inline_text_data_c.id, paragraph_start_position->anchor_id()); EXPECT_EQ(0, paragraph_start_position->text_offset()); paragraph_start_position = paragraph_start_position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_TRUE(paragraph_start_position->IsNullPosition()); paragraph_start_position = AXNodePosition::CreateTextPosition( @@ -3242,25 +3250,25 @@ TEST_F(AXPositionTest, CreateNextOrPreviousParagraphPositionWithIgnoredNodes) { ax::mojom::TextAffinity::kDownstream); paragraph_start_position = paragraph_start_position->CreatePreviousParagraphStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); ASSERT_TRUE(paragraph_start_position->IsTextPosition()); EXPECT_EQ(inline_text_data_c.id, paragraph_start_position->anchor_id()); EXPECT_EQ(0, paragraph_start_position->text_offset()); paragraph_start_position = paragraph_start_position->CreatePreviousParagraphStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); ASSERT_TRUE(paragraph_start_position->IsTextPosition()); EXPECT_EQ(inline_text_data_b_1.id, paragraph_start_position->anchor_id()); EXPECT_EQ(0, paragraph_start_position->text_offset()); paragraph_start_position = paragraph_start_position->CreatePreviousParagraphStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); ASSERT_TRUE(paragraph_start_position->IsTextPosition()); EXPECT_EQ(inline_text_data_a.id, paragraph_start_position->anchor_id()); EXPECT_EQ(0, paragraph_start_position->text_offset()); paragraph_start_position = paragraph_start_position->CreatePreviousParagraphStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_TRUE(paragraph_start_position->IsNullPosition()); TestPositionType paragraph_end_position = AXNodePosition::CreateTextPosition( @@ -3268,28 +3276,28 @@ TEST_F(AXPositionTest, CreateNextOrPreviousParagraphPositionWithIgnoredNodes) { ax::mojom::TextAffinity::kDownstream); paragraph_end_position = paragraph_end_position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); ASSERT_TRUE(paragraph_end_position->IsTextPosition()); EXPECT_EQ(inline_text_data_a.id, paragraph_end_position->anchor_id()); // "First paragraph<>". EXPECT_EQ(15, paragraph_end_position->text_offset()); paragraph_end_position = paragraph_end_position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); ASSERT_TRUE(paragraph_end_position->IsTextPosition()); EXPECT_EQ(inline_text_data_b_3.id, paragraph_end_position->anchor_id()); // "paragraph<>". EXPECT_EQ(9, paragraph_end_position->text_offset()); paragraph_end_position = paragraph_end_position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); ASSERT_TRUE(paragraph_end_position->IsTextPosition()); EXPECT_EQ(inline_text_data_c.id, paragraph_end_position->anchor_id()); // "Third paragraph<>". EXPECT_EQ(15, paragraph_end_position->text_offset()); paragraph_end_position = paragraph_end_position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_TRUE(paragraph_end_position->IsNullPosition()); paragraph_end_position = AXNodePosition::CreateTextPosition( @@ -3297,21 +3305,21 @@ TEST_F(AXPositionTest, CreateNextOrPreviousParagraphPositionWithIgnoredNodes) { ax::mojom::TextAffinity::kDownstream); paragraph_end_position = paragraph_end_position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); ASSERT_TRUE(paragraph_end_position->IsTextPosition()); EXPECT_EQ(inline_text_data_b_3.id, paragraph_end_position->anchor_id()); // "paragraph<>". EXPECT_EQ(9, paragraph_end_position->text_offset()); paragraph_end_position = paragraph_end_position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); ASSERT_TRUE(paragraph_end_position->IsTextPosition()); EXPECT_EQ(inline_text_data_a.id, paragraph_end_position->anchor_id()); // "First paragraph<>". EXPECT_EQ(15, paragraph_end_position->text_offset()); paragraph_end_position = paragraph_end_position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_TRUE(paragraph_end_position->IsNullPosition()); } @@ -3363,7 +3371,7 @@ TEST_F( ax::mojom::TextAffinity::kDownstream); test_position = test_position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(root_data.id, test_position->anchor_id()); EXPECT_EQ(5, test_position->text_offset()); @@ -4516,9 +4524,9 @@ TEST_F(AXPositionTest, CreatePositionAtTextBoundaryContentStartEndIsIgnored) { inline_box_data_1.SetName("One"); inline_box_data_1.AddState(ax::mojom::State::kIgnored); inline_box_data_1.AddIntListAttribute( - ax::mojom::IntListAttribute::kWordStarts, std::vector{0}); + ax::mojom::IntListAttribute::kWordStarts, {0}); inline_box_data_1.AddIntListAttribute(ax::mojom::IntListAttribute::kWordEnds, - std::vector{3}); + {3}); inline_box_data_1.AddIntAttribute(ax::mojom::IntAttribute::kNextOnLineId, kInlineBox2Id); @@ -4532,9 +4540,9 @@ TEST_F(AXPositionTest, CreatePositionAtTextBoundaryContentStartEndIsIgnored) { inline_box_data_2.role = ax::mojom::Role::kInlineTextBox; inline_box_data_2.SetName("Two"); inline_box_data_2.AddIntListAttribute( - ax::mojom::IntListAttribute::kWordStarts, std::vector{0}); + ax::mojom::IntListAttribute::kWordStarts, {0}); inline_box_data_2.AddIntListAttribute(ax::mojom::IntListAttribute::kWordEnds, - std::vector{3}); + {3}); inline_box_data_2.AddIntAttribute(ax::mojom::IntAttribute::kPreviousOnLineId, kInlineBox1Id); inline_box_data_2.AddIntAttribute(ax::mojom::IntAttribute::kNextOnLineId, @@ -4550,9 +4558,9 @@ TEST_F(AXPositionTest, CreatePositionAtTextBoundaryContentStartEndIsIgnored) { inline_box_data_3.role = ax::mojom::Role::kInlineTextBox; inline_box_data_3.SetName("Three"); inline_box_data_3.AddIntListAttribute( - ax::mojom::IntListAttribute::kWordStarts, std::vector{0}); + ax::mojom::IntListAttribute::kWordStarts, {0}); inline_box_data_3.AddIntListAttribute(ax::mojom::IntListAttribute::kWordEnds, - std::vector{5}); + {5}); inline_box_data_3.AddIntAttribute(ax::mojom::IntAttribute::kPreviousOnLineId, kInlineBox2Id); inline_box_data_3.AddIntAttribute(ax::mojom::IntAttribute::kNextOnLineId, @@ -4569,9 +4577,9 @@ TEST_F(AXPositionTest, CreatePositionAtTextBoundaryContentStartEndIsIgnored) { inline_box_data_4.SetName("Four"); inline_box_data_4.AddState(ax::mojom::State::kIgnored); inline_box_data_3.AddIntListAttribute( - ax::mojom::IntListAttribute::kWordStarts, std::vector{0}); + ax::mojom::IntListAttribute::kWordStarts, {0}); inline_box_data_3.AddIntListAttribute(ax::mojom::IntListAttribute::kWordEnds, - std::vector{4}); + {4}); inline_box_data_3.AddIntAttribute(ax::mojom::IntAttribute::kPreviousOnLineId, kInlineBox3Id); @@ -4593,7 +4601,7 @@ TEST_F(AXPositionTest, CreatePositionAtTextBoundaryContentStartEndIsIgnored) { ASSERT_FALSE(text_position->IsIgnored()); TestPositionType test_position = text_position->CreatePositionAtTextBoundary( ax::mojom::TextBoundary::kWordStart, ax::mojom::MoveDirection::kForward, - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box_data_3.id, test_position->anchor_id()); @@ -4601,7 +4609,7 @@ TEST_F(AXPositionTest, CreatePositionAtTextBoundaryContentStartEndIsIgnored) { EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, test_position->affinity()); test_position = text_position->CreatePositionAtTextBoundary( ax::mojom::TextBoundary::kWordStart, ax::mojom::MoveDirection::kBackward, - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box_data_2.id, test_position->anchor_id()); @@ -4614,7 +4622,7 @@ TEST_F(AXPositionTest, CreatePositionAtTextBoundaryContentStartEndIsIgnored) { ASSERT_FALSE(text_position->IsIgnored()); test_position = text_position->CreatePositionAtTextBoundary( ax::mojom::TextBoundary::kWordStart, ax::mojom::MoveDirection::kForward, - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box_data_3.id, test_position->anchor_id()); @@ -4622,7 +4630,7 @@ TEST_F(AXPositionTest, CreatePositionAtTextBoundaryContentStartEndIsIgnored) { EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, test_position->affinity()); test_position = text_position->CreatePositionAtTextBoundary( ax::mojom::TextBoundary::kWordStart, ax::mojom::MoveDirection::kBackward, - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box_data_2.id, test_position->anchor_id()); @@ -4781,15 +4789,15 @@ TEST_F(AXPositionTest, CreatePositionAtPreviousFormatStartWithNullPosition) { ASSERT_NE(nullptr, null_position); TestPositionType test_position = null_position->CreatePreviousFormatStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); test_position = null_position->CreatePreviousFormatStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); test_position = null_position->CreatePreviousFormatStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); } @@ -4804,45 +4812,46 @@ TEST_F(AXPositionTest, CreatePositionAtPreviousFormatStartWithTreePosition) { TestPositionType test_position = tree_position->CreatePreviousFormatStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(static_text1_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->child_index()); test_position = test_position->CreatePreviousFormatStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(check_box_.id, test_position->anchor_id()); EXPECT_EQ(AXNodePosition::BEFORE_TEXT, test_position->child_index()); test_position = test_position->CreatePreviousFormatStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(button_.id, test_position->anchor_id()); EXPECT_EQ(AXNodePosition::BEFORE_TEXT, test_position->child_index()); - // StopIfAlreadyAtBoundary shouldn't move, since it's already at a boundary. + // kStopAtAnchorBoundaryOrIfAlreadyAtBoundary shouldn't move, since it's + // already at a boundary. test_position = test_position->CreatePreviousFormatStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(button_.id, test_position->anchor_id()); EXPECT_EQ(AXNodePosition::BEFORE_TEXT, test_position->child_index()); - // StopAtLastAnchorBoundary should stop at the start of the whole content - // while CrossBoundary should return a null position when crossing it. + // kStopAtLastAnchorBoundary should stop at the start of the whole content + // while kCrossBoundary should return a null position when crossing it. test_position = test_position->CreatePreviousFormatStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(button_.id, test_position->anchor_id()); EXPECT_EQ(AXNodePosition::BEFORE_TEXT, test_position->child_index()); test_position = test_position->CreatePreviousFormatStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); } @@ -4858,7 +4867,7 @@ TEST_F(AXPositionTest, CreatePositionAtPreviousFormatStartWithTextPosition) { TestPositionType test_position = text_position->CreatePreviousFormatStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); @@ -4866,38 +4875,39 @@ TEST_F(AXPositionTest, CreatePositionAtPreviousFormatStartWithTextPosition) { EXPECT_EQ(ax::mojom::TextAffinity::kDownstream, test_position->affinity()); test_position = test_position->CreatePreviousFormatStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(check_box_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); test_position = test_position->CreatePreviousFormatStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(button_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); - // StopIfAlreadyAtBoundary shouldn't move, since it's already at a boundary. + // kStopAtAnchorBoundaryOrIfAlreadyAtBoundary shouldn't move, since it's + // already at a boundary. test_position = test_position->CreatePreviousFormatStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(button_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); - // StopAtLastAnchorBoundary should stop at the start of the whole content - // while CrossBoundary should return a null position when crossing it. + // kStopAtLastAnchorBoundary should stop at the start of the whole content + // while kCrossBoundary should return a null position when crossing it. test_position = test_position->CreatePreviousFormatStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(button_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); test_position = test_position->CreatePreviousFormatStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); } @@ -4906,11 +4916,11 @@ TEST_F(AXPositionTest, CreatePositionAtNextFormatEndWithNullPosition) { TestPositionType null_position = AXNodePosition::CreateNullPosition(); ASSERT_NE(nullptr, null_position); TestPositionType test_position = null_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); test_position = null_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); } @@ -4924,52 +4934,53 @@ TEST_F(AXPositionTest, CreatePositionAtNextFormatEndWithTreePosition) { ASSERT_TRUE(tree_position->IsTreePosition()); TestPositionType test_position = tree_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(check_box_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->child_index()); test_position = test_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->child_index()); test_position = test_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(line_break_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->child_index()); test_position = test_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->child_index()); - // StopIfAlreadyAtBoundary shouldn't move, since it's already at a boundary. + // kStopAtAnchorBoundaryOrIfAlreadyAtBoundary shouldn't move, since it's + // already at a boundary. test_position = test_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->child_index()); - // StopAtLastAnchorBoundary should stop at the end of the whole content while - // CrossBoundary should return a null position when crossing it. + // kStopAtLastAnchorBoundary should stop at the end of the whole content while + // kCrossBoundary should return a null position when crossing it. test_position = test_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->child_index()); test_position = test_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); } @@ -4984,59 +4995,60 @@ TEST_F(AXPositionTest, CreatePositionAtNextFormatEndWithTextPosition) { ASSERT_TRUE(text_position->IsTextPosition()); TestPositionType test_position = text_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(button_.id, test_position->anchor_id()); EXPECT_EQ(1, test_position->text_offset()); test_position = test_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(check_box_.id, test_position->anchor_id()); EXPECT_EQ(1, test_position->text_offset()); test_position = test_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); EXPECT_EQ(6, test_position->text_offset()); test_position = test_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(line_break_.id, test_position->anchor_id()); EXPECT_EQ(1, test_position->text_offset()); test_position = test_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); EXPECT_EQ(6, test_position->text_offset()); - // StopIfAlreadyAtBoundary shouldn't move, since it's already at a boundary. + // kStopAtAnchorBoundaryOrIfAlreadyAtBoundary shouldn't move, since it's + // already at a boundary. test_position = test_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); EXPECT_EQ(6, test_position->text_offset()); - // StopAtLastAnchorBoundary should stop at the end of the whole content while - // CrossBoundary should return a null position when crossing it. + // kStopAtLastAnchorBoundary should stop at the end of the whole content while + // kCrossBoundary should return a null position when crossing it. test_position = test_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); EXPECT_EQ(6, test_position->text_offset()); test_position = test_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); } @@ -5194,7 +5206,7 @@ TEST_F(AXPositionTest, CreatePositionAtNextFormatEndOnEmbeddedObject) { // is at the end of "heading 1". TestPositionType format_end_position = text_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, format_end_position); EXPECT_TRUE(format_end_position->IsTextPosition()); EXPECT_EQ(inline_text_4.id, format_end_position->anchor_id()); @@ -5205,7 +5217,7 @@ TEST_F(AXPositionTest, CreatePositionAtNextFormatEndOnEmbeddedObject) { // Move position to end of format at "heading 1|select, option 1|<>...", which // is at the end of embedded object (popup_button_5). format_end_position = format_end_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, format_end_position); EXPECT_TRUE(format_end_position->IsTextPosition()); EXPECT_EQ(popup_button_5.id, format_end_position->anchor_id()); @@ -5216,7 +5228,7 @@ TEST_F(AXPositionTest, CreatePositionAtNextFormatEndOnEmbeddedObject) { // Move position to end of format at "...|select, option 1|heading 2<>...", // which is at the end of "heading 2". format_end_position = format_end_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, format_end_position); EXPECT_TRUE(format_end_position->IsTextPosition()); EXPECT_EQ(inline_text_10.id, format_end_position->anchor_id()); @@ -5228,7 +5240,7 @@ TEST_F(AXPositionTest, CreatePositionAtNextFormatEndOnEmbeddedObject) { // "...heading 2|select, option 2|<>|select, option 3|...", which is at the // end of embedded object (popup_button_11). format_end_position = format_end_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, format_end_position); EXPECT_TRUE(format_end_position->IsTextPosition()); EXPECT_EQ(popup_button_11.id, format_end_position->anchor_id()); @@ -5240,7 +5252,7 @@ TEST_F(AXPositionTest, CreatePositionAtNextFormatEndOnEmbeddedObject) { // "...heading 2|select, option 2||select, option 3|<>...", which is at the // end of embedded object (popup_button_14). format_end_position = format_end_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, format_end_position); EXPECT_TRUE(format_end_position->IsTextPosition()); EXPECT_EQ(popup_button_14.id, format_end_position->anchor_id()); @@ -5251,7 +5263,7 @@ TEST_F(AXPositionTest, CreatePositionAtNextFormatEndOnEmbeddedObject) { // Move position to end of format at "...|select, option 3|more text<>", which // is at the end of "more text". format_end_position = format_end_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, format_end_position); EXPECT_TRUE(format_end_position->IsTextPosition()); EXPECT_EQ(inline_text_18.id, format_end_position->anchor_id()); @@ -5289,7 +5301,7 @@ TEST_F(AXPositionTest, CreatePositionAtFormatBoundaryWithTextPosition) { ASSERT_NE(nullptr, text_position); TestPositionType test_position = text_position->CreatePreviousFormatStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(text_data.id, test_position->anchor_id()); @@ -5301,7 +5313,7 @@ TEST_F(AXPositionTest, CreatePositionAtFormatBoundaryWithTextPosition) { ax::mojom::TextAffinity::kDownstream); ASSERT_NE(nullptr, text_position); test_position = text_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(more_text_data.id, test_position->anchor_id()); @@ -5516,7 +5528,7 @@ TEST_F(AXPositionTest, MoveByFormatWithIgnoredNodes) { EXPECT_EQ(6, text_position->text_offset()); text_position = text_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, text_position); EXPECT_TRUE(text_position->IsTextPosition()); EXPECT_EQ(inline_box_11.id, text_position->anchor_id()); @@ -5532,7 +5544,7 @@ TEST_F(AXPositionTest, MoveByFormatWithIgnoredNodes) { EXPECT_EQ(0, text_position->text_offset()); text_position = text_position->CreatePreviousFormatStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, text_position); EXPECT_TRUE(text_position->IsTextPosition()); EXPECT_EQ(inline_box_5.id, text_position->anchor_id()); @@ -5552,7 +5564,7 @@ TEST_F(AXPositionTest, MoveByFormatWithIgnoredNodes) { EXPECT_EQ(7, text_position->text_offset()); text_position = text_position->CreateNextFormatEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, text_position); EXPECT_TRUE(text_position->IsTextPosition()); EXPECT_EQ(inline_box_13.id, text_position->anchor_id()); @@ -5568,7 +5580,7 @@ TEST_F(AXPositionTest, MoveByFormatWithIgnoredNodes) { EXPECT_EQ(0, text_position->text_offset()); text_position = text_position->CreatePreviousFormatStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, text_position); EXPECT_TRUE(text_position->IsTextPosition()); EXPECT_EQ(inline_box_22.id, text_position->anchor_id()); @@ -5581,22 +5593,22 @@ TEST_F(AXPositionTest, CreatePositionAtPageBoundaryWithNullPosition) { ASSERT_NE(nullptr, null_position); TestPositionType test_position = null_position->CreatePreviousPageStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); test_position = null_position->CreateNextPageStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); test_position = null_position->CreatePreviousPageEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); test_position = null_position->CreatePreviousPageStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); } @@ -5614,23 +5626,24 @@ TEST_F(AXPositionTest, CreatePositionAtPageBoundaryWithTreePosition) { ASSERT_NE(nullptr, tree_position); ASSERT_TRUE(tree_position->IsTreePosition()); - // StopIfAlreadyAtBoundary shouldn't move at all since it's at a boundary. + // kStopAtAnchorBoundaryOrIfAlreadyAtBoundary shouldn't move at all since it's + // at a boundary. TestPositionType test_position = tree_position->CreateNextPageStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(page_1_data.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->child_index()); test_position = tree_position->CreateNextPageStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(page_2_text_data.id, test_position->anchor_id()); EXPECT_EQ(AXNodePosition::BEFORE_TEXT, test_position->child_index()); test_position = tree_position->CreateNextPageStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(page_2_text_data.id, test_position->anchor_id()); @@ -5638,36 +5651,36 @@ TEST_F(AXPositionTest, CreatePositionAtPageBoundaryWithTreePosition) { // Test CreateNextPageEndPosition until the end of content is reached. test_position = tree_position->CreateNextPageEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(page_1_data.id, test_position->anchor_id()); EXPECT_EQ(1, test_position->child_index()); test_position = test_position->CreateNextPageEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(page_2_text_data.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->child_index()); test_position = test_position->CreateNextPageEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(page_2_text_data.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->child_index()); - // StopAtLastAnchorBoundary shouldn't move past the end of the whole content. + // kStopAtLastAnchorBoundary shouldn't move past the end of the whole content. test_position = test_position->CreateNextPageStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(page_3_text_data.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->child_index()); test_position = test_position->CreateNextPageEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(page_3_text_data.id, test_position->anchor_id()); @@ -5675,69 +5688,69 @@ TEST_F(AXPositionTest, CreatePositionAtPageBoundaryWithTreePosition) { // Moving forward past the end should return a null position. TestPositionType null_position = test_position->CreateNextPageStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, null_position); EXPECT_TRUE(null_position->IsNullPosition()); null_position = test_position->CreateNextPageEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, null_position); EXPECT_TRUE(null_position->IsNullPosition()); // Now move backward through the accessibility tree. tree_position = test_position->CreatePreviousPageEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, tree_position); EXPECT_TRUE(tree_position->IsTreePosition()); EXPECT_EQ(page_3_text_data.id, tree_position->anchor_id()); EXPECT_EQ(0, tree_position->child_index()); test_position = tree_position->CreatePreviousPageEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(page_2_text_data.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->child_index()); test_position = tree_position->CreatePreviousPageEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(page_2_text_data.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->child_index()); test_position = test_position->CreatePreviousPageStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(page_2_text_data.id, test_position->anchor_id()); EXPECT_EQ(AXNodePosition::BEFORE_TEXT, test_position->child_index()); test_position = test_position->CreatePreviousPageStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(page_1_text_data.id, test_position->anchor_id()); EXPECT_EQ(AXNodePosition::BEFORE_TEXT, test_position->child_index()); test_position = test_position->CreatePreviousPageStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(page_1_text_data.id, test_position->anchor_id()); EXPECT_EQ(AXNodePosition::BEFORE_TEXT, test_position->child_index()); - // StopAtLastAnchorBoundary shouldn't move past the start of the whole + // kStopAtLastAnchorBoundary shouldn't move past the start of the whole // content. test_position = test_position->CreatePreviousPageStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(page_1_text_data.id, test_position->anchor_id()); EXPECT_EQ(AXNodePosition::BEFORE_TEXT, test_position->child_index()); test_position = test_position->CreatePreviousPageEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTreePosition()); EXPECT_EQ(page_1_text_data.id, test_position->anchor_id()); @@ -5745,12 +5758,12 @@ TEST_F(AXPositionTest, CreatePositionAtPageBoundaryWithTreePosition) { // Moving before the start should return a null position. null_position = test_position->CreatePreviousPageStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, null_position); EXPECT_TRUE(null_position->IsNullPosition()); null_position = test_position->CreatePreviousPageEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, null_position); EXPECT_TRUE(null_position->IsNullPosition()); } @@ -5769,23 +5782,24 @@ TEST_F(AXPositionTest, CreatePositionAtPageBoundaryWithTextPosition) { ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); - // StopIfAlreadyAtBoundary shouldn't move at all since it's at a boundary. + // kStopAtAnchorBoundaryOrIfAlreadyAtBoundary shouldn't move at all since it's + // at a boundary. TestPositionType test_position = text_position->CreateNextPageStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(page_1_text_data.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); test_position = text_position->CreateNextPageStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(page_2_text_data.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); test_position = text_position->CreateNextPageStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(page_2_text_data.id, test_position->anchor_id()); @@ -5793,36 +5807,36 @@ TEST_F(AXPositionTest, CreatePositionAtPageBoundaryWithTextPosition) { // Test CreateNextPageEndPosition until the end of content is reached. test_position = test_position->CreateNextPageEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(page_2_text_data.id, test_position->anchor_id()); EXPECT_EQ(19, test_position->text_offset()); test_position = test_position->CreateNextPageEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(page_3_text_data.id, test_position->anchor_id()); EXPECT_EQ(24, test_position->text_offset()); test_position = test_position->CreateNextPageEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(page_3_text_data.id, test_position->anchor_id()); EXPECT_EQ(24, test_position->text_offset()); - // StopAtLastAnchorBoundary shouldn't move past the end of the whole content. + // kStopAtLastAnchorBoundary shouldn't move past the end of the whole content. test_position = test_position->CreateNextPageStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(page_3_text_data.id, test_position->anchor_id()); EXPECT_EQ(24, test_position->text_offset()); test_position = test_position->CreateNextPageEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(page_3_text_data.id, test_position->anchor_id()); @@ -5830,69 +5844,69 @@ TEST_F(AXPositionTest, CreatePositionAtPageBoundaryWithTextPosition) { // Moving forward past the end should return a null position. TestPositionType null_position = test_position->CreateNextPageStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, null_position); EXPECT_TRUE(null_position->IsNullPosition()); null_position = test_position->CreateNextPageEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, null_position); EXPECT_TRUE(null_position->IsNullPosition()); // Now move backward through the accessibility tree. text_position = test_position->CreatePreviousPageEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, text_position); EXPECT_TRUE(text_position->IsTextPosition()); EXPECT_EQ(page_3_text_data.id, text_position->anchor_id()); EXPECT_EQ(24, text_position->text_offset()); test_position = text_position->CreatePreviousPageEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(page_2_text_data.id, test_position->anchor_id()); EXPECT_EQ(19, test_position->text_offset()); test_position = text_position->CreatePreviousPageEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(page_2_text_data.id, test_position->anchor_id()); EXPECT_EQ(19, test_position->text_offset()); test_position = test_position->CreatePreviousPageStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(page_2_text_data.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); test_position = test_position->CreatePreviousPageStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(page_1_text_data.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); test_position = test_position->CreatePreviousPageStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(page_1_text_data.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); - // StopAtLastAnchorBoundary shouldn't move past the start of the whole + // kStopAtLastAnchorBoundary shouldn't move past the start of the whole // content. test_position = test_position->CreatePreviousPageStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(page_1_text_data.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); test_position = test_position->CreatePreviousPageEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(page_1_text_data.id, test_position->anchor_id()); @@ -5900,19 +5914,24 @@ TEST_F(AXPositionTest, CreatePositionAtPageBoundaryWithTextPosition) { // Moving before the start should return a null position. null_position = test_position->CreatePreviousPageStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, null_position); EXPECT_TRUE(null_position->IsNullPosition()); null_position = test_position->CreatePreviousPageEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, null_position); EXPECT_TRUE(null_position->IsNullPosition()); } TEST_F(AXPositionTest, CreatePositionAtPageBoundaryWithNonPaginatedDocument) { + // We start from the second character in the whole content instead of the + // first, so that with `AXBoundaryBehavior::kCrossBoundary` we would be able + // to move back to the start of the page. Otherwise, if we had started from + // the first character, we would already be at the start of the page, and thus + // have gotten the null position. TestPositionType text_position = AXNodePosition::CreateTextPosition( - GetTreeID(), static_text1_.id, 0 /* text_offset */, + GetTreeID(), static_text1_.id, 1 /* text_offset */, ax::mojom::TextAffinity::kDownstream); ASSERT_NE(nullptr, text_position); @@ -5921,7 +5940,7 @@ TEST_F(AXPositionTest, CreatePositionAtPageBoundaryWithNonPaginatedDocument) { // page) TestPositionType test_position = text_position->CreatePreviousPageStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(button_.id, test_position->anchor_id()); @@ -5930,21 +5949,21 @@ TEST_F(AXPositionTest, CreatePositionAtPageBoundaryWithNonPaginatedDocument) { // Since there is no next page, CreateNextPageStartPosition should return a // null position test_position = text_position->CreateNextPageStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); // Since there is no previous page, CreatePreviousPageEndPosition should // return a null position test_position = text_position->CreatePreviousPageEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); // Since there are no distinct pages, CreateNextPageEndPosition should move // to the end of the whole content, as if it's one large page. test_position = text_position->CreateNextPageEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); @@ -5953,7 +5972,7 @@ TEST_F(AXPositionTest, CreatePositionAtPageBoundaryWithNonPaginatedDocument) { // CreatePreviousPageStartPosition should move back to the beginning of the // whole content. test_position = test_position->CreatePreviousPageStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(button_.id, test_position->anchor_id()); @@ -9303,11 +9322,11 @@ TEST_F(AXPositionTest, CreateNextAndPreviousCharacterPositionWithNullPosition) { TestPositionType null_position = AXNodePosition::CreateNullPosition(); ASSERT_NE(nullptr, null_position); TestPositionType test_position = null_position->CreateNextCharacterPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); test_position = null_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); } @@ -9337,14 +9356,14 @@ TEST_F(AXPositionTest, AsValidPosition) { // Test basic cases with static MaxTextOffset TestPositionType test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_TRUE(test_position->IsValid()); ASSERT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(text_data.id, test_position->anchor_id()); EXPECT_EQ(9, test_position->text_offset()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); ASSERT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); @@ -9369,14 +9388,14 @@ TEST_F(AXPositionTest, AsValidPosition) { // Now repeat the prior tests and ensure that we can create next character // positions with the new, valid MaxTextOffset (8). test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_TRUE(test_position->IsValid()); ASSERT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(text_data.id, test_position->anchor_id()); EXPECT_EQ(8, test_position->text_offset()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); ASSERT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); @@ -9477,25 +9496,25 @@ TEST_F(AXPositionTest, CreateNextCharacterPosition) { ASSERT_TRUE(text_position->IsTextPosition()); TestPositionType test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); EXPECT_EQ(4, test_position->text_offset()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); EXPECT_EQ(5, test_position->text_offset()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); EXPECT_EQ(5, test_position->text_offset()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); @@ -9508,25 +9527,25 @@ TEST_F(AXPositionTest, CreateNextCharacterPosition) { ASSERT_TRUE(text_position->IsTextPosition()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); EXPECT_EQ(5, test_position->text_offset()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); EXPECT_EQ(6, test_position->text_offset()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); EXPECT_EQ(6, test_position->text_offset()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); @@ -9539,25 +9558,25 @@ TEST_F(AXPositionTest, CreateNextCharacterPosition) { ASSERT_TRUE(text_position->IsTextPosition()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); EXPECT_EQ(6, test_position->text_offset()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(line_break_.id, test_position->anchor_id()); EXPECT_EQ(1, test_position->text_offset()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); EXPECT_EQ(6, test_position->text_offset()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(line_break_.id, test_position->anchor_id()); @@ -9570,23 +9589,23 @@ TEST_F(AXPositionTest, CreateNextCharacterPosition) { ASSERT_TRUE(text_position->IsTextPosition()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); EXPECT_EQ(6, test_position->text_offset()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); EXPECT_EQ(6, test_position->text_offset()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); @@ -9599,25 +9618,25 @@ TEST_F(AXPositionTest, CreateNextCharacterPosition) { ASSERT_TRUE(text_position->IsTextPosition()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); EXPECT_EQ(1, test_position->text_offset()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(check_box_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(check_box_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); @@ -9630,7 +9649,7 @@ TEST_F(AXPositionTest, CreateNextCharacterPosition) { ASSERT_TRUE(text_position->IsTextPosition()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(text_field_.id, test_position->anchor_id()); @@ -9645,7 +9664,7 @@ TEST_F(AXPositionTest, CreateNextCharacterPosition) { ASSERT_TRUE(text_position->IsTextPosition()); test_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(text_field_.id, test_position->anchor_id()); @@ -9663,25 +9682,25 @@ TEST_F(AXPositionTest, CreatePreviousCharacterPosition) { TestPositionType test_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); EXPECT_EQ(5, test_position->text_offset()); test_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); EXPECT_EQ(4, test_position->text_offset()); test_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); EXPECT_EQ(4, test_position->text_offset()); test_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); @@ -9694,25 +9713,25 @@ TEST_F(AXPositionTest, CreatePreviousCharacterPosition) { ASSERT_TRUE(text_position->IsTextPosition()); test_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); EXPECT_EQ(1, test_position->text_offset()); test_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); test_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); test_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); @@ -9725,25 +9744,25 @@ TEST_F(AXPositionTest, CreatePreviousCharacterPosition) { ASSERT_TRUE(text_position->IsTextPosition()); test_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); test_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(line_break_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); test_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box2_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); test_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(line_break_.id, test_position->anchor_id()); @@ -9756,23 +9775,23 @@ TEST_F(AXPositionTest, CreatePreviousCharacterPosition) { ASSERT_TRUE(text_position->IsTextPosition()); test_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); test_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); test_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); test_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(inline_box1_.id, test_position->anchor_id()); @@ -9785,23 +9804,23 @@ TEST_F(AXPositionTest, CreatePreviousCharacterPosition) { ASSERT_TRUE(text_position->IsTextPosition()); test_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); test_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(check_box_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); test_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(check_box_.id, test_position->anchor_id()); EXPECT_EQ(0, test_position->text_offset()); test_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(check_box_.id, test_position->anchor_id()); @@ -9814,7 +9833,7 @@ TEST_F(AXPositionTest, CreatePreviousCharacterPosition) { ASSERT_TRUE(text_position->IsTextPosition()); test_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(text_field_.id, test_position->anchor_id()); @@ -9837,7 +9856,7 @@ TEST_F(AXPositionTest, CreateNextCharacterPositionAtGraphemeBoundary) { ++iter) { const int text_offset = *iter; test_position = test_position->CreateNextCharacterPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); ASSERT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); @@ -9855,7 +9874,7 @@ TEST_F(AXPositionTest, CreateNextCharacterPositionAtGraphemeBoundary) { GetTreeID(), GetTree()->root()->id(), 3 /* text_offset */, ax::mojom::TextAffinity::kDownstream); test_position = test_position->CreateNextCharacterPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); ASSERT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(GetTree()->root()->id(), test_position->anchor_id()); @@ -9866,7 +9885,7 @@ TEST_F(AXPositionTest, CreateNextCharacterPositionAtGraphemeBoundary) { GetTreeID(), GetTree()->root()->id(), 4 /* text_offset */, ax::mojom::TextAffinity::kDownstream); test_position = test_position->CreateNextCharacterPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); ASSERT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(GetTree()->root()->id(), test_position->anchor_id()); @@ -9877,7 +9896,7 @@ TEST_F(AXPositionTest, CreateNextCharacterPositionAtGraphemeBoundary) { GetTreeID(), GetTree()->root()->id(), 9 /* text_offset */, ax::mojom::TextAffinity::kUpstream); test_position = test_position->CreateNextCharacterPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); ASSERT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(GetTree()->root()->id(), test_position->anchor_id()); @@ -9888,7 +9907,7 @@ TEST_F(AXPositionTest, CreateNextCharacterPositionAtGraphemeBoundary) { GetTreeID(), GetTree()->root()->id(), 10 /* text_offset */, ax::mojom::TextAffinity::kUpstream); test_position = test_position->CreateNextCharacterPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); ASSERT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(GetTree()->root()->id(), test_position->anchor_id()); @@ -9912,7 +9931,7 @@ TEST_F(AXPositionTest, CreatePreviousCharacterPositionAtGraphemeBoundary) { ++iter) { const int text_offset = *iter; test_position = test_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); ASSERT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); @@ -9930,7 +9949,7 @@ TEST_F(AXPositionTest, CreatePreviousCharacterPositionAtGraphemeBoundary) { GetTreeID(), GetTree()->root()->id(), 3 /* text_offset */, ax::mojom::TextAffinity::kDownstream); test_position = test_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); ASSERT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(GetTree()->root()->id(), test_position->anchor_id()); @@ -9941,7 +9960,7 @@ TEST_F(AXPositionTest, CreatePreviousCharacterPositionAtGraphemeBoundary) { GetTreeID(), GetTree()->root()->id(), 4 /* text_offset */, ax::mojom::TextAffinity::kDownstream); test_position = test_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); ASSERT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(GetTree()->root()->id(), test_position->anchor_id()); @@ -9952,7 +9971,7 @@ TEST_F(AXPositionTest, CreatePreviousCharacterPositionAtGraphemeBoundary) { GetTreeID(), GetTree()->root()->id(), 9 /* text_offset */, ax::mojom::TextAffinity::kUpstream); test_position = test_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); ASSERT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(GetTree()->root()->id(), test_position->anchor_id()); @@ -9963,7 +9982,7 @@ TEST_F(AXPositionTest, CreatePreviousCharacterPositionAtGraphemeBoundary) { GetTreeID(), GetTree()->root()->id(), 10 /* text_offset */, ax::mojom::TextAffinity::kUpstream); test_position = test_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); ASSERT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsTextPosition()); EXPECT_EQ(GetTree()->root()->id(), test_position->anchor_id()); @@ -9983,7 +10002,7 @@ TEST_F(AXPositionTest, ReciprocalCreateNextAndPreviousCharacterPosition) { while (!text_position->IsNullPosition()) { TestPositionType moved_position = text_position->CreateNextCharacterPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); ASSERT_NE(nullptr, moved_position); text_position = std::move(moved_position); @@ -10000,7 +10019,7 @@ TEST_F(AXPositionTest, ReciprocalCreateNextAndPreviousCharacterPosition) { while (!text_position->IsNullPosition()) { TestPositionType moved_position = text_position->CreatePreviousCharacterPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); ASSERT_NE(nullptr, moved_position); text_position = std::move(moved_position); @@ -10015,11 +10034,11 @@ TEST_F(AXPositionTest, CreateNextAndPreviousWordStartPositionWithNullPosition) { TestPositionType null_position = AXNodePosition::CreateNullPosition(); ASSERT_NE(nullptr, null_position); TestPositionType test_position = null_position->CreateNextWordStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); test_position = null_position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); } @@ -10028,11 +10047,11 @@ TEST_F(AXPositionTest, CreateNextAndPreviousWordEndPositionWithNullPosition) { TestPositionType null_position = AXNodePosition::CreateNullPosition(); ASSERT_NE(nullptr, null_position); TestPositionType test_position = null_position->CreateNextWordEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); test_position = null_position->CreatePreviousWordEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_NE(nullptr, test_position); EXPECT_TRUE(test_position->IsNullPosition()); } @@ -11070,7 +11089,7 @@ TEST_F(AXPositionTest, CreateLinePositionsMultipleAnchorsInSingleLine) { TestPositionType next_line_start_position = text_position->CreateNextLineStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, next_line_start_position); EXPECT_TRUE(next_line_start_position->IsTextPosition()); EXPECT_EQ(inline_box3.id, next_line_start_position->anchor_id()); @@ -11078,7 +11097,7 @@ TEST_F(AXPositionTest, CreateLinePositionsMultipleAnchorsInSingleLine) { TestPositionType previous_line_start_position = text_position->CreatePreviousLineStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, previous_line_start_position); EXPECT_TRUE(previous_line_start_position->IsTextPosition()); EXPECT_EQ(inline_box1.id, previous_line_start_position->anchor_id()); @@ -11086,7 +11105,7 @@ TEST_F(AXPositionTest, CreateLinePositionsMultipleAnchorsInSingleLine) { TestPositionType next_line_end_position = text_position->CreateNextLineEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, next_line_end_position); EXPECT_TRUE(next_line_end_position->IsTextPosition()); EXPECT_EQ(inline_box3.id, next_line_end_position->anchor_id()); @@ -11094,7 +11113,7 @@ TEST_F(AXPositionTest, CreateLinePositionsMultipleAnchorsInSingleLine) { TestPositionType previous_line_end_position = text_position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, previous_line_end_position); EXPECT_TRUE(previous_line_end_position->IsTextPosition()); EXPECT_EQ(inline_box1.id, previous_line_end_position->anchor_id()); @@ -11229,7 +11248,7 @@ TEST_F(AXPositionTest, CreateNextWordPositionInList) { // "1. irst item\n2. second item" text_position = text_position->CreateNextWordStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); ASSERT_EQ(inline_box2.id, text_position->anchor_id()); @@ -11237,7 +11256,7 @@ TEST_F(AXPositionTest, CreateNextWordPositionInList) { // "1. first tem\n2. second item" text_position = text_position->CreateNextWordStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); ASSERT_EQ(inline_box2.id, text_position->anchor_id()); @@ -11245,7 +11264,7 @@ TEST_F(AXPositionTest, CreateNextWordPositionInList) { // "1. first item\n<2>. second item" text_position = text_position->CreateNextWordStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); ASSERT_EQ(inline_box3.id, text_position->anchor_id()); @@ -11253,7 +11272,7 @@ TEST_F(AXPositionTest, CreateNextWordPositionInList) { // "1. first item\n2. econd item" text_position = text_position->CreateNextWordStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); ASSERT_EQ(inline_box4.id, text_position->anchor_id()); @@ -11261,7 +11280,7 @@ TEST_F(AXPositionTest, CreateNextWordPositionInList) { // "1. first item\n2. second tem" text_position = text_position->CreateNextWordStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); ASSERT_EQ(inline_box4.id, text_position->anchor_id()); @@ -11396,7 +11415,7 @@ TEST_F(AXPositionTest, CreatePreviousWordPositionInList) { // "1. first item\n2. second tem" text_position = text_position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); ASSERT_EQ(inline_box4.id, text_position->anchor_id()); @@ -11404,7 +11423,7 @@ TEST_F(AXPositionTest, CreatePreviousWordPositionInList) { // "1. first item\n2. econd item" text_position = text_position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); ASSERT_EQ(inline_box4.id, text_position->anchor_id()); @@ -11412,7 +11431,7 @@ TEST_F(AXPositionTest, CreatePreviousWordPositionInList) { // "1. first item\n<2>. second item" text_position = text_position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); ASSERT_EQ(inline_box3.id, text_position->anchor_id()); @@ -11420,7 +11439,7 @@ TEST_F(AXPositionTest, CreatePreviousWordPositionInList) { // "1. first tem\n2. econd item" text_position = text_position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); ASSERT_EQ(inline_box2.id, text_position->anchor_id()); @@ -11428,7 +11447,7 @@ TEST_F(AXPositionTest, CreatePreviousWordPositionInList) { // "1. irst item\n2. second item" text_position = text_position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); ASSERT_EQ(inline_box2.id, text_position->anchor_id()); @@ -11436,7 +11455,7 @@ TEST_F(AXPositionTest, CreatePreviousWordPositionInList) { // "<1>. first item\n2. second item" text_position = text_position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, text_position); ASSERT_TRUE(text_position->IsTextPosition()); ASSERT_EQ(inline_box1.id, text_position->anchor_id()); @@ -11573,7 +11592,7 @@ TEST_F(AXPositionTest, EmptyObjectReplacedByCharacterTextNavigation) { ax::mojom::TextAffinity::kDownstream); TestPositionType result_position = - position->CreateNextWordStartPosition(AXBoundaryBehavior::CrossBoundary); + position->CreateNextWordStartPosition(AXBoundaryBehavior::kCrossBoundary); EXPECT_TRUE(result_position->IsTextPosition()); EXPECT_EQ(text_field_4.id, result_position->anchor_id()); EXPECT_EQ(0, result_position->text_offset()); @@ -11582,7 +11601,7 @@ TEST_F(AXPositionTest, EmptyObjectReplacedByCharacterTextNavigation) { position = std::move(result_position); result_position = - position->CreateNextWordStartPosition(AXBoundaryBehavior::CrossBoundary); + position->CreateNextWordStartPosition(AXBoundaryBehavior::kCrossBoundary); EXPECT_TRUE(result_position->IsTextPosition()); EXPECT_EQ(inline_box_7.id, result_position->anchor_id()); EXPECT_EQ(1, result_position->text_offset()); @@ -11592,7 +11611,7 @@ TEST_F(AXPositionTest, EmptyObjectReplacedByCharacterTextNavigation) { // CreatePreviousWordStartPosition tests. position = std::move(result_position); result_position = position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_TRUE(result_position->IsTextPosition()); EXPECT_EQ(text_field_4.id, result_position->anchor_id()); EXPECT_EQ(0, result_position->text_offset()); @@ -11601,7 +11620,7 @@ TEST_F(AXPositionTest, EmptyObjectReplacedByCharacterTextNavigation) { position = std::move(result_position); result_position = position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_TRUE(result_position->IsTextPosition()); EXPECT_EQ(inline_box_3.id, result_position->anchor_id()); EXPECT_EQ(0, result_position->text_offset()); @@ -11611,7 +11630,7 @@ TEST_F(AXPositionTest, EmptyObjectReplacedByCharacterTextNavigation) { // CreateNextWordEndPosition tests. position = std::move(result_position); result_position = - position->CreateNextWordEndPosition(AXBoundaryBehavior::CrossBoundary); + position->CreateNextWordEndPosition(AXBoundaryBehavior::kCrossBoundary); EXPECT_TRUE(result_position->IsTextPosition()); EXPECT_EQ(inline_box_3.id, result_position->anchor_id()); EXPECT_EQ(6, result_position->text_offset()); @@ -11620,7 +11639,7 @@ TEST_F(AXPositionTest, EmptyObjectReplacedByCharacterTextNavigation) { position = std::move(result_position); result_position = - position->CreateNextWordEndPosition(AXBoundaryBehavior::CrossBoundary); + position->CreateNextWordEndPosition(AXBoundaryBehavior::kCrossBoundary); EXPECT_TRUE(result_position->IsTextPosition()); // The position would be on `text_field_4` instead of on `generic_container_5` // because the latter is ignored, and by design we prefer not to create @@ -11632,7 +11651,7 @@ TEST_F(AXPositionTest, EmptyObjectReplacedByCharacterTextNavigation) { position = std::move(result_position); result_position = - position->CreateNextWordEndPosition(AXBoundaryBehavior::CrossBoundary); + position->CreateNextWordEndPosition(AXBoundaryBehavior::kCrossBoundary); EXPECT_TRUE(result_position->IsTextPosition()); EXPECT_EQ(inline_box_7.id, result_position->anchor_id()); EXPECT_EQ(6, result_position->text_offset()); @@ -11642,7 +11661,7 @@ TEST_F(AXPositionTest, EmptyObjectReplacedByCharacterTextNavigation) { // CreatePreviousWordEndPosition tests. position = std::move(result_position); result_position = position->CreatePreviousWordEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_TRUE(result_position->IsTextPosition()); // The position would be on `text_field_4` instead of on `generic_container_5` // because the latter is ignored, and by design we prefer not to create @@ -11654,7 +11673,7 @@ TEST_F(AXPositionTest, EmptyObjectReplacedByCharacterTextNavigation) { position = std::move(result_position); result_position = position->CreatePreviousWordEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); EXPECT_TRUE(result_position->IsTextPosition()); EXPECT_EQ(inline_box_3.id, result_position->anchor_id()); EXPECT_EQ(6, result_position->text_offset()); @@ -11719,7 +11738,7 @@ TEST_F(AXPositionTest, EmptyObjectReplacedByCharacterTextNavigation) { ASSERT_NE(nullptr, text_position); text_position = text_position->CreatePreviousFormatStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); ASSERT_NE(nullptr, text_position); EXPECT_TRUE(text_position->IsTextPosition()); EXPECT_EQ(generic_container_12.id, text_position->anchor_id()); @@ -11741,7 +11760,7 @@ TEST_F(AXPositionTest, EmptyObjectReplacedByCharacterTextNavigation) { ASSERT_NE(nullptr, text_position); text_position = text_position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, text_position); EXPECT_TRUE(text_position->IsLeafTextPosition()); EXPECT_EQ(button_14.id, text_position->anchor_id()); @@ -11846,10 +11865,14 @@ TEST_F(AXPositionTest, TextNavigationWithCollapsedCombobox) { inline_box_8.id = 8; root_1.role = ax::mojom::Role::kRootWebArea; + root_1.AddBoolAttribute(ax::mojom::BoolAttribute::kIsLineBreakingObject, + true); root_1.child_ids = {static_text_2.id, popup_button_4.id, static_text_7.id}; static_text_2.role = ax::mojom::Role::kStaticText; static_text_2.SetName("Hi"); + static_text_2.AddBoolAttribute( + ax::mojom::BoolAttribute::kIsLineBreakingObject, true); static_text_2.child_ids = {inline_box_3.id}; inline_box_3.role = ax::mojom::Role::kInlineTextBox; @@ -11868,9 +11891,13 @@ TEST_F(AXPositionTest, TextNavigationWithCollapsedCombobox) { menu_list_option_6.role = ax::mojom::Role::kMenuListOption; menu_list_option_6.SetName("Option"); menu_list_option_6.SetNameFrom(ax::mojom::NameFrom::kContents); + menu_list_option_6.AddBoolAttribute( + ax::mojom::BoolAttribute::kIsLineBreakingObject, true); static_text_7.role = ax::mojom::Role::kStaticText; static_text_7.SetName("3.14"); + static_text_7.AddBoolAttribute( + ax::mojom::BoolAttribute::kIsLineBreakingObject, true); static_text_7.child_ids = {inline_box_8.id}; inline_box_8.role = ax::mojom::Role::kInlineTextBox; @@ -11889,13 +11916,13 @@ TEST_F(AXPositionTest, TextNavigationWithCollapsedCombobox) { ASSERT_NE(nullptr, position); position = position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, position); EXPECT_EQ(popup_button_4.id, position->anchor_id()); EXPECT_EQ(0, position->text_offset()); position = position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, position); EXPECT_EQ(inline_box_8.id, position->anchor_id()); EXPECT_EQ(0, position->text_offset()); @@ -11906,15 +11933,15 @@ TEST_F(AXPositionTest, TextNavigationWithCollapsedCombobox) { ASSERT_NE(nullptr, position); position = position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, position); EXPECT_EQ(popup_button_4.id, position->anchor_id()); // The content of this popup button should be replaced with the empty object - // character of length 1. + // replacement character of length 1. EXPECT_EQ(1, position->text_offset()); position = position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, position); EXPECT_EQ(inline_box_3.id, position->anchor_id()); EXPECT_EQ(2, position->text_offset()); @@ -11932,13 +11959,13 @@ TEST_F(AXPositionTest, TextNavigationWithCollapsedCombobox) { ASSERT_NE(nullptr, position); position = position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, position); EXPECT_EQ(menu_list_option_6.id, position->anchor_id()); EXPECT_EQ(0, position->text_offset()); position = position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, position); EXPECT_EQ(inline_box_8.id, position->anchor_id()); EXPECT_EQ(0, position->text_offset()); @@ -11949,13 +11976,13 @@ TEST_F(AXPositionTest, TextNavigationWithCollapsedCombobox) { ASSERT_NE(nullptr, position); position = position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, position); EXPECT_EQ(menu_list_option_6.id, position->anchor_id()); - EXPECT_EQ(1, position->text_offset()); + EXPECT_EQ(6, position->text_offset()); position = position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); ASSERT_NE(nullptr, position); EXPECT_EQ(inline_box_3.id, position->anchor_id()); EXPECT_EQ(2, position->text_offset()); @@ -12108,31 +12135,31 @@ INSTANTIATE_TEST_SUITE_P( ExpandToEnclosingTextBoundaryTestParam{ ax::mojom::TextBoundary::kCharacter, AXRangeExpandBehavior::kLeftFirst, - "TextPosition anchor_id=4 text_offset=6 affinity=downstream " - "annotated_text=Line 1<\n>Line 2", - "TextPosition anchor_id=4 text_offset=7 affinity=downstream " - "annotated_text=Line 1\nine 2"}, - ExpandToEnclosingTextBoundaryTestParam{ - ax::mojom::TextBoundary::kCharacter, - AXRangeExpandBehavior::kRightFirst, "TextPosition anchor_id=4 text_offset=7 affinity=downstream " "annotated_text=Line 1\nine 2", "TextPosition anchor_id=4 text_offset=8 affinity=downstream " "annotated_text=Line 1\nLne 2"}, ExpandToEnclosingTextBoundaryTestParam{ - ax::mojom::TextBoundary::kFormatEnd, - AXRangeExpandBehavior::kLeftFirst, + ax::mojom::TextBoundary::kCharacter, + AXRangeExpandBehavior::kRightFirst, "TextPosition anchor_id=4 text_offset=6 affinity=downstream " "annotated_text=Line 1<\n>Line 2", "TextPosition anchor_id=4 text_offset=7 affinity=downstream " "annotated_text=Line 1\nine 2"}, ExpandToEnclosingTextBoundaryTestParam{ ax::mojom::TextBoundary::kFormatEnd, - AXRangeExpandBehavior::kRightFirst, - "TextPosition anchor_id=4 text_offset=7 affinity=downstream " + AXRangeExpandBehavior::kLeftFirst, + "TextPosition anchor_id=4 text_offset=7 affinity=upstream " "annotated_text=Line 1\nine 2", "TextPosition anchor_id=4 text_offset=13 affinity=downstream " "annotated_text=Line 1\nLine 2<>"}, + ExpandToEnclosingTextBoundaryTestParam{ + ax::mojom::TextBoundary::kFormatEnd, + AXRangeExpandBehavior::kRightFirst, + "TextPosition anchor_id=4 text_offset=6 affinity=downstream " + "annotated_text=Line 1<\n>Line 2", + "TextPosition anchor_id=4 text_offset=7 affinity=upstream " + "annotated_text=Line 1\nine 2"}, ExpandToEnclosingTextBoundaryTestParam{ ax::mojom::TextBoundary::kLineEnd, AXRangeExpandBehavior::kLeftFirst, @@ -12150,24 +12177,24 @@ INSTANTIATE_TEST_SUITE_P( ExpandToEnclosingTextBoundaryTestParam{ ax::mojom::TextBoundary::kLineStart, AXRangeExpandBehavior::kLeftFirst, + "TextPosition anchor_id=4 text_offset=7 affinity=downstream " + "annotated_text=Line 1\nine 2", + "TextPosition anchor_id=4 text_offset=13 affinity=downstream " + "annotated_text=Line 1\nLine 2<>"}, + ExpandToEnclosingTextBoundaryTestParam{ + ax::mojom::TextBoundary::kLineStart, + AXRangeExpandBehavior::kRightFirst, "TextPosition anchor_id=4 text_offset=0 affinity=downstream " "annotated_text=ine 1\nLine 2", "TextPosition anchor_id=4 text_offset=7 affinity=downstream " "annotated_text=Line 1\nine 2"}, ExpandToEnclosingTextBoundaryTestParam{ - ax::mojom::TextBoundary::kLineStart, - AXRangeExpandBehavior::kRightFirst, + ax::mojom::TextBoundary::kLineStartOrEnd, + AXRangeExpandBehavior::kLeftFirst, "TextPosition anchor_id=4 text_offset=7 affinity=downstream " "annotated_text=Line 1\nine 2", "TextPosition anchor_id=4 text_offset=13 affinity=downstream " "annotated_text=Line 1\nLine 2<>"}, - ExpandToEnclosingTextBoundaryTestParam{ - ax::mojom::TextBoundary::kLineStartOrEnd, - AXRangeExpandBehavior::kLeftFirst, - "TextPosition anchor_id=4 text_offset=0 affinity=downstream " - "annotated_text=ine 1\nLine 2", - "TextPosition anchor_id=4 text_offset=6 affinity=downstream " - "annotated_text=Line 1<\n>Line 2"}, ExpandToEnclosingTextBoundaryTestParam{ ax::mojom::TextBoundary::kLineStartOrEnd, AXRangeExpandBehavior::kRightFirst, @@ -12205,32 +12232,73 @@ INSTANTIATE_TEST_SUITE_P( ExpandToEnclosingTextBoundaryTestParam{ ax::mojom::TextBoundary::kParagraphStart, AXRangeExpandBehavior::kLeftFirst, + "TextPosition anchor_id=4 text_offset=7 affinity=downstream " + "annotated_text=Line 1\nine 2", + "TextPosition anchor_id=4 text_offset=13 affinity=downstream " + "annotated_text=Line 1\nLine 2<>"}, + ExpandToEnclosingTextBoundaryTestParam{ + ax::mojom::TextBoundary::kParagraphStart, + AXRangeExpandBehavior::kRightFirst, "TextPosition anchor_id=4 text_offset=0 affinity=downstream " "annotated_text=ine 1\nLine 2", "TextPosition anchor_id=4 text_offset=7 affinity=downstream " "annotated_text=Line 1\nine 2"}, ExpandToEnclosingTextBoundaryTestParam{ - ax::mojom::TextBoundary::kParagraphStart, - AXRangeExpandBehavior::kRightFirst, + ax::mojom::TextBoundary::kParagraphStartOrEnd, + AXRangeExpandBehavior::kLeftFirst, "TextPosition anchor_id=4 text_offset=7 affinity=downstream " "annotated_text=Line 1\nine 2", "TextPosition anchor_id=4 text_offset=13 affinity=downstream " "annotated_text=Line 1\nLine 2<>"}, ExpandToEnclosingTextBoundaryTestParam{ ax::mojom::TextBoundary::kParagraphStartOrEnd, + AXRangeExpandBehavior::kRightFirst, + "TextPosition anchor_id=4 text_offset=7 affinity=downstream " + "annotated_text=Line 1\nine 2", + "TextPosition anchor_id=4 text_offset=13 affinity=downstream " + "annotated_text=Line 1\nLine 2<>"}, + ExpandToEnclosingTextBoundaryTestParam{ + ax::mojom::TextBoundary::kSentenceEnd, AXRangeExpandBehavior::kLeftFirst, + "TextPosition anchor_id=4 text_offset=6 affinity=downstream " + "annotated_text=Line 1<\n>Line 2", + "TextPosition anchor_id=4 text_offset=13 affinity=downstream " + "annotated_text=Line 1\nLine 2<>"}, + ExpandToEnclosingTextBoundaryTestParam{ + ax::mojom::TextBoundary::kSentenceEnd, + AXRangeExpandBehavior::kRightFirst, + "TextPosition anchor_id=4 text_offset=6 affinity=downstream " + "annotated_text=Line 1<\n>Line 2", + "TextPosition anchor_id=4 text_offset=13 affinity=downstream " + "annotated_text=Line 1\nLine 2<>"}, + ExpandToEnclosingTextBoundaryTestParam{ + ax::mojom::TextBoundary::kSentenceStart, + AXRangeExpandBehavior::kLeftFirst, + "TextPosition anchor_id=4 text_offset=7 affinity=downstream " + "annotated_text=Line 1\nine 2", + "TextPosition anchor_id=4 text_offset=13 affinity=downstream " + "annotated_text=Line 1\nLine 2<>"}, + ExpandToEnclosingTextBoundaryTestParam{ + ax::mojom::TextBoundary::kSentenceStart, + AXRangeExpandBehavior::kRightFirst, "TextPosition anchor_id=4 text_offset=0 affinity=downstream " "annotated_text=ine 1\nLine 2", - "TextPosition anchor_id=4 text_offset=6 affinity=downstream " - "annotated_text=Line 1<\n>Line 2"}, + "TextPosition anchor_id=4 text_offset=7 affinity=downstream " + "annotated_text=Line 1\nine 2"}, ExpandToEnclosingTextBoundaryTestParam{ - ax::mojom::TextBoundary::kParagraphStartOrEnd, + ax::mojom::TextBoundary::kSentenceStartOrEnd, + AXRangeExpandBehavior::kLeftFirst, + "TextPosition anchor_id=4 text_offset=7 affinity=downstream " + "annotated_text=Line 1\nine 2", + "TextPosition anchor_id=4 text_offset=13 affinity=downstream " + "annotated_text=Line 1\nLine 2<>"}, + ExpandToEnclosingTextBoundaryTestParam{ + ax::mojom::TextBoundary::kSentenceStartOrEnd, AXRangeExpandBehavior::kRightFirst, "TextPosition anchor_id=4 text_offset=7 affinity=downstream " "annotated_text=Line 1\nine 2", "TextPosition anchor_id=4 text_offset=13 affinity=downstream " "annotated_text=Line 1\nLine 2<>"}, - // TODO(accessibility): Add tests for sentence boundary. ExpandToEnclosingTextBoundaryTestParam{ ax::mojom::TextBoundary::kWebPage, AXRangeExpandBehavior::kLeftFirst, @@ -12262,24 +12330,24 @@ INSTANTIATE_TEST_SUITE_P( ExpandToEnclosingTextBoundaryTestParam{ ax::mojom::TextBoundary::kWordStart, AXRangeExpandBehavior::kLeftFirst, - "TextPosition anchor_id=4 text_offset=5 affinity=downstream " - "annotated_text=Line <1>\nLine 2", "TextPosition anchor_id=4 text_offset=7 affinity=downstream " - "annotated_text=Line 1\nine 2"}, + "annotated_text=Line 1\nine 2", + "TextPosition anchor_id=4 text_offset=12 affinity=downstream " + "annotated_text=Line 1\nLine <2>"}, ExpandToEnclosingTextBoundaryTestParam{ ax::mojom::TextBoundary::kWordStart, AXRangeExpandBehavior::kRightFirst, + "TextPosition anchor_id=4 text_offset=5 affinity=downstream " + "annotated_text=Line <1>\nLine 2", "TextPosition anchor_id=4 text_offset=7 affinity=downstream " - "annotated_text=Line 1\nine 2", - "TextPosition anchor_id=4 text_offset=12 affinity=downstream " - "annotated_text=Line 1\nLine <2>"}, + "annotated_text=Line 1\nine 2"}, ExpandToEnclosingTextBoundaryTestParam{ ax::mojom::TextBoundary::kWordStartOrEnd, AXRangeExpandBehavior::kLeftFirst, - "TextPosition anchor_id=4 text_offset=5 affinity=downstream " - "annotated_text=Line <1>\nLine 2", - "TextPosition anchor_id=4 text_offset=6 affinity=downstream " - "annotated_text=Line 1<\n>Line 2"}, + "TextPosition anchor_id=4 text_offset=7 affinity=downstream " + "annotated_text=Line 1\nine 2", + "TextPosition anchor_id=4 text_offset=11 affinity=downstream " + "annotated_text=Line 1\nLine< >2"}, ExpandToEnclosingTextBoundaryTestParam{ ax::mojom::TextBoundary::kWordStartOrEnd, AXRangeExpandBehavior::kRightFirst, @@ -12288,7 +12356,7 @@ INSTANTIATE_TEST_SUITE_P( "TextPosition anchor_id=4 text_offset=11 affinity=downstream " "annotated_text=Line 1\nLine< >2"})); -// Only test with AXBoundaryBehavior::CrossBoundary for now. +// Only test with AXBoundaryBehavior::kCrossBoundary for now. // TODO(accessibility): Add more tests for other boundary behaviors if needed. INSTANTIATE_TEST_SUITE_P( CreatePositionAtTextBoundary, @@ -12297,279 +12365,295 @@ INSTANTIATE_TEST_SUITE_P( CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kCharacter, ax::mojom::MoveDirection::kBackward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=7 text_offset=0 affinity=downstream " "annotated_text=<\n>"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kCharacter, ax::mojom::MoveDirection::kForward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=8 text_offset=1 affinity=downstream " "annotated_text=Lne 2"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kFormatStart, ax::mojom::MoveDirection::kBackward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=7 text_offset=0 affinity=downstream " "annotated_text=<\n>"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kFormatEnd, ax::mojom::MoveDirection::kForward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=8 text_offset=6 affinity=downstream " "annotated_text=Line 2<>"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kLineEnd, ax::mojom::MoveDirection::kBackward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=7 text_offset=0 affinity=downstream " "annotated_text=<\n>"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kLineEnd, ax::mojom::MoveDirection::kForward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=8 text_offset=6 affinity=downstream " "annotated_text=Line 2<>"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kLineStart, ax::mojom::MoveDirection::kBackward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=6 text_offset=0 affinity=downstream " "annotated_text=ine 1"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kLineStart, ax::mojom::MoveDirection::kForward, - AXBoundaryBehavior::CrossBoundary, "NullPosition"}, + AXBoundaryBehavior::kCrossBoundary, "NullPosition"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kLineStartOrEnd, ax::mojom::MoveDirection::kBackward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=6 text_offset=0 affinity=downstream " "annotated_text=ine 1"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kLineStartOrEnd, ax::mojom::MoveDirection::kForward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=8 text_offset=6 affinity=downstream " "annotated_text=Line 2<>"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kObject, ax::mojom::MoveDirection::kBackward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=8 text_offset=0 affinity=downstream " "annotated_text=ine 2"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kObject, ax::mojom::MoveDirection::kForward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=8 text_offset=6 affinity=downstream " "annotated_text=Line 2<>"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kParagraphEnd, ax::mojom::MoveDirection::kBackward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=6 text_offset=6 affinity=downstream " "annotated_text=Line 1<>"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kParagraphEnd, ax::mojom::MoveDirection::kForward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=8 text_offset=6 affinity=downstream " "annotated_text=Line 2<>"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kParagraphStart, ax::mojom::MoveDirection::kBackward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=6 text_offset=0 affinity=downstream " "annotated_text=ine 1"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kParagraphStart, ax::mojom::MoveDirection::kForward, - AXBoundaryBehavior::CrossBoundary, "NullPosition"}, + AXBoundaryBehavior::kCrossBoundary, "NullPosition"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kParagraphStartOrEnd, ax::mojom::MoveDirection::kBackward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=6 text_offset=0 affinity=downstream " "annotated_text=ine 1"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kParagraphStartOrEnd, ax::mojom::MoveDirection::kForward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, + "TextPosition anchor_id=8 text_offset=6 affinity=downstream " + "annotated_text=Line 2<>"}, + CreatePositionAtTextBoundaryTestParam{ + ax::mojom::TextBoundary::kSentenceEnd, + ax::mojom::MoveDirection::kBackward, + AXBoundaryBehavior::kCrossBoundary, + "TextPosition anchor_id=6 text_offset=6 affinity=downstream " + "annotated_text=Line 1<>"}, + CreatePositionAtTextBoundaryTestParam{ + ax::mojom::TextBoundary::kSentenceEnd, + ax::mojom::MoveDirection::kForward, + AXBoundaryBehavior::kCrossBoundary, + "TextPosition anchor_id=8 text_offset=6 affinity=downstream " + "annotated_text=Line 2<>"}, + CreatePositionAtTextBoundaryTestParam{ + ax::mojom::TextBoundary::kSentenceStart, + ax::mojom::MoveDirection::kBackward, + AXBoundaryBehavior::kCrossBoundary, + "TextPosition anchor_id=6 text_offset=0 affinity=downstream " + "annotated_text=ine 1"}, + CreatePositionAtTextBoundaryTestParam{ + ax::mojom::TextBoundary::kSentenceStart, + ax::mojom::MoveDirection::kForward, + AXBoundaryBehavior::kCrossBoundary, "NullPosition"}, + CreatePositionAtTextBoundaryTestParam{ + ax::mojom::TextBoundary::kSentenceStartOrEnd, + ax::mojom::MoveDirection::kBackward, + AXBoundaryBehavior::kCrossBoundary, + "TextPosition anchor_id=6 text_offset=0 affinity=downstream " + "annotated_text=ine 1"}, + CreatePositionAtTextBoundaryTestParam{ + ax::mojom::TextBoundary::kSentenceStartOrEnd, + ax::mojom::MoveDirection::kForward, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=8 text_offset=6 affinity=downstream " "annotated_text=Line 2<>"}, - // TODO(accessibility): Add tests for sentence boundary. CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kWebPage, ax::mojom::MoveDirection::kBackward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=1 text_offset=0 affinity=downstream " "annotated_text=ine 1\nLine 2"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kWebPage, ax::mojom::MoveDirection::kForward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=9 text_offset=6 affinity=downstream " "annotated_text=Line 2<>"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kWordEnd, ax::mojom::MoveDirection::kBackward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=6 text_offset=6 affinity=downstream " "annotated_text=Line 1<>"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kWordEnd, ax::mojom::MoveDirection::kForward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=8 text_offset=4 affinity=downstream " "annotated_text=Line< >2"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kWordStart, ax::mojom::MoveDirection::kBackward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=6 text_offset=5 affinity=downstream " "annotated_text=Line <1>"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kWordStart, ax::mojom::MoveDirection::kForward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=8 text_offset=5 affinity=downstream " "annotated_text=Line <2>"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kWordStartOrEnd, ax::mojom::MoveDirection::kBackward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=6 text_offset=5 affinity=downstream " "annotated_text=Line <1>"}, CreatePositionAtTextBoundaryTestParam{ ax::mojom::TextBoundary::kWordStartOrEnd, ax::mojom::MoveDirection::kForward, - AXBoundaryBehavior::CrossBoundary, + AXBoundaryBehavior::kCrossBoundary, "TextPosition anchor_id=8 text_offset=4 affinity=downstream " "annotated_text=Line< >2"})); INSTANTIATE_TEST_SUITE_P( - CreateNextWordStartPositionWithBoundaryBehaviorCrossBoundary, + CreateNextSentenceStartPositionWithBoundaryBehaviorCrossBoundary, AXPositionTextNavigationTestWithParam, ::testing::Values( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { - return position->CreateNextWordStartPosition( - AXBoundaryBehavior::CrossBoundary); + return position->CreateNextSentenceStartPosition( + AXBoundaryBehavior::kCrossBoundary); }), ROOT_ID, 0 /* text_offset */, - {"TextPosition anchor_id=1 text_offset=5 " - "affinity=downstream annotated_text=Line <1>\nLine 2", - "TextPosition anchor_id=1 text_offset=7 " + {"TextPosition anchor_id=1 text_offset=7 " "affinity=downstream annotated_text=Line 1\nine 2", - "TextPosition anchor_id=1 text_offset=12 " - "affinity=downstream annotated_text=Line 1\nLine <2>", "NullPosition"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { - return position->CreateNextWordStartPosition( - AXBoundaryBehavior::CrossBoundary); + return position->CreateNextSentenceStartPosition( + AXBoundaryBehavior::kCrossBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, - {"TextPosition anchor_id=4 text_offset=5 " - "affinity=downstream annotated_text=Line <1>\nLine 2", - "TextPosition anchor_id=4 text_offset=7 " + {"TextPosition anchor_id=4 text_offset=7 " "affinity=downstream annotated_text=Line 1\nine 2", - "TextPosition anchor_id=4 text_offset=12 " - "affinity=downstream annotated_text=Line 1\nLine <2>", "NullPosition"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { - return position->CreateNextWordStartPosition( - AXBoundaryBehavior::CrossBoundary); + return position->CreateNextSentenceStartPosition( + AXBoundaryBehavior::kCrossBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, - {"TextPosition anchor_id=5 text_offset=5 " - "affinity=downstream annotated_text=Line <1>", - "TextPosition anchor_id=9 text_offset=0 " + {"TextPosition anchor_id=9 text_offset=0 " "affinity=downstream annotated_text=ine 2", - "TextPosition anchor_id=9 text_offset=5 " - "affinity=downstream annotated_text=Line <2>", "NullPosition"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { - return position->CreateNextWordStartPosition( - AXBoundaryBehavior::CrossBoundary); + return position->CreateNextSentenceStartPosition( + AXBoundaryBehavior::kCrossBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, - {"TextPosition anchor_id=9 text_offset=5 " - "affinity=downstream annotated_text=Line <2>", - "NullPosition"}})); + {"NullPosition"}})); INSTANTIATE_TEST_SUITE_P( - CreateNextWordStartPositionWithBoundaryBehaviorStopAtAnchorBoundary, + CreateNextSentenceStartPositionWithBoundaryBehaviorStopAtAnchorBoundary, AXPositionTextNavigationTestWithParam, ::testing::Values( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { - return position->CreateNextWordStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + return position->CreateNextSentenceStartPosition( + AXBoundaryBehavior::kStopAtAnchorBoundary); }), ROOT_ID, 0 /* text_offset */, - {"TextPosition anchor_id=1 text_offset=5 " - "affinity=downstream annotated_text=Line <1>\nLine 2", - "TextPosition anchor_id=1 text_offset=7 " + {"TextPosition anchor_id=1 text_offset=7 " "affinity=downstream annotated_text=Line 1\nine 2", - "TextPosition anchor_id=1 text_offset=12 " - "affinity=downstream annotated_text=Line 1\nLine <2>", + "TextPosition anchor_id=1 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>", "TextPosition anchor_id=1 text_offset=13 " "affinity=downstream annotated_text=Line 1\nLine 2<>"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { - return position->CreateNextWordStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + return position->CreateNextSentenceStartPosition( + AXBoundaryBehavior::kStopAtAnchorBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, - {"TextPosition anchor_id=4 text_offset=5 " - "affinity=downstream annotated_text=Line <1>\nLine 2", - "TextPosition anchor_id=4 text_offset=7 " + {"TextPosition anchor_id=4 text_offset=7 " "affinity=downstream annotated_text=Line 1\nine 2", - "TextPosition anchor_id=4 text_offset=12 " - "affinity=downstream annotated_text=Line 1\nLine <2>", + "TextPosition anchor_id=4 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>", "TextPosition anchor_id=4 text_offset=13 " "affinity=downstream annotated_text=Line 1\nLine 2<>"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { - return position->CreateNextWordStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + return position->CreateNextSentenceStartPosition( + AXBoundaryBehavior::kStopAtAnchorBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, - {"TextPosition anchor_id=5 text_offset=5 " - "affinity=downstream annotated_text=Line <1>", + {"TextPosition anchor_id=5 text_offset=6 " + "affinity=downstream annotated_text=Line 1<>", "TextPosition anchor_id=5 text_offset=6 " "affinity=downstream annotated_text=Line 1<>"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { - return position->CreateNextWordStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + return position->CreateNextSentenceStartPosition( + AXBoundaryBehavior::kStopAtAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, - {"TextPosition anchor_id=9 text_offset=5 " - "affinity=downstream annotated_text=Line <2>", + {"TextPosition anchor_id=9 text_offset=6 " + "affinity=downstream annotated_text=Line 2<>", "TextPosition anchor_id=9 text_offset=6 " "affinity=downstream annotated_text=Line 2<>"}})); INSTANTIATE_TEST_SUITE_P( - CreateNextWordStartPositionWithBoundaryBehaviorStopIfAlreadyAtBoundary, + CreateNextSentenceStartPositionWithBoundaryBehaviorStopAtAnchorBoundaryOrIfAlreadyAtBoundary, AXPositionTextNavigationTestWithParam, ::testing::Values( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { - return position->CreateNextWordStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + return position->CreateNextSentenceStartPosition( + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), ROOT_ID, 0 /* text_offset */, @@ -12579,8 +12663,9 @@ INSTANTIATE_TEST_SUITE_P( "affinity=downstream annotated_text=ine 1\nLine 2"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { - return position->CreateNextWordStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + return position->CreateNextSentenceStartPosition( + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, @@ -12590,136 +12675,116 @@ INSTANTIATE_TEST_SUITE_P( "affinity=downstream annotated_text=ine 1\nLine 2"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { - return position->CreateNextWordStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + return position->CreateNextSentenceStartPosition( + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, - {"TextPosition anchor_id=5 text_offset=5 " - "affinity=downstream annotated_text=Line <1>", - "TextPosition anchor_id=5 text_offset=5 " - "affinity=downstream annotated_text=Line <1>"}}, + {"TextPosition anchor_id=5 text_offset=6 affinity=downstream " + "annotated_text=Line 1<>", + "TextPosition anchor_id=5 text_offset=6 affinity=downstream " + "annotated_text=Line 1<>"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { - return position->CreateNextWordStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + return position->CreateNextSentenceStartPosition( + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, - {"TextPosition anchor_id=9 text_offset=5 " - "affinity=downstream annotated_text=Line <2>", - "TextPosition anchor_id=9 text_offset=5 " - "affinity=downstream annotated_text=Line <2>"}})); + {"TextPosition anchor_id=9 text_offset=6 " + "affinity=downstream annotated_text=Line 2<>", + "TextPosition anchor_id=9 text_offset=6 " + "affinity=downstream annotated_text=Line 2<>"}})); INSTANTIATE_TEST_SUITE_P( - CreateNextWordStartPositionWithBoundaryBehaviorStopAtLastAnchorBoundary, + CreateNextSentenceStartPositionWithBoundaryBehaviorStopAtLastAnchorBoundary, AXPositionTextNavigationTestWithParam, ::testing::Values( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { - return position->CreateNextWordStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + return position->CreateNextSentenceStartPosition( + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), ROOT_ID, 0 /* text_offset */, - {"TextPosition anchor_id=1 text_offset=5 " - "affinity=downstream annotated_text=Line <1>\nLine 2", - "TextPosition anchor_id=1 text_offset=7 " + {"TextPosition anchor_id=1 text_offset=7 " "affinity=downstream annotated_text=Line 1\nine 2", - "TextPosition anchor_id=1 text_offset=12 " - "affinity=downstream annotated_text=Line 1\nLine <2>", "TextPosition anchor_id=1 text_offset=13 " "affinity=downstream annotated_text=Line 1\nLine 2<>", "TextPosition anchor_id=1 text_offset=13 " "affinity=downstream annotated_text=Line 1\nLine 2<>"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { - return position->CreateNextWordStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + return position->CreateNextSentenceStartPosition( + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, - {"TextPosition anchor_id=4 text_offset=5 " - "affinity=downstream annotated_text=Line <1>\nLine 2", - "TextPosition anchor_id=4 text_offset=7 " + {"TextPosition anchor_id=4 text_offset=7 " "affinity=downstream annotated_text=Line 1\nine 2", - "TextPosition anchor_id=4 text_offset=12 " - "affinity=downstream annotated_text=Line 1\nLine <2>", "TextPosition anchor_id=4 text_offset=13 " "affinity=downstream annotated_text=Line 1\nLine 2<>", "TextPosition anchor_id=4 text_offset=13 " "affinity=downstream annotated_text=Line 1\nLine 2<>"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { - return position->CreateNextWordStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + return position->CreateNextSentenceStartPosition( + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, - {"TextPosition anchor_id=5 text_offset=5 " - "affinity=downstream annotated_text=Line <1>", - "TextPosition anchor_id=9 text_offset=0 " + {"TextPosition anchor_id=9 text_offset=0 " "affinity=downstream annotated_text=ine 2", - "TextPosition anchor_id=9 text_offset=5 " - "affinity=downstream annotated_text=Line <2>", "TextPosition anchor_id=9 text_offset=6 " "affinity=downstream annotated_text=Line 2<>", "TextPosition anchor_id=9 text_offset=6 " "affinity=downstream annotated_text=Line 2<>"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { - return position->CreateNextWordStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + return position->CreateNextSentenceStartPosition( + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, - {"TextPosition anchor_id=9 text_offset=5 " - "affinity=downstream annotated_text=Line <2>", - "TextPosition anchor_id=9 text_offset=6 " + {"TextPosition anchor_id=9 text_offset=6 " "affinity=downstream annotated_text=Line 2<>", "TextPosition anchor_id=9 text_offset=6 " "affinity=downstream annotated_text=Line 2<>"}})); INSTANTIATE_TEST_SUITE_P( - CreatePreviousWordStartPositionWithBoundaryBehaviorCrossBoundary, + CreatePreviousSentenceStartPositionWithBoundaryBehaviorCrossBoundary, AXPositionTextNavigationTestWithParam, ::testing::Values( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { - return position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::CrossBoundary); + return position->CreatePreviousSentenceStartPosition( + AXBoundaryBehavior::kCrossBoundary); }), ROOT_ID, 13 /* text_offset at end of root. */, - {"TextPosition anchor_id=1 text_offset=12 " - "affinity=downstream annotated_text=Line 1\nLine <2>", - "TextPosition anchor_id=1 text_offset=7 " + {"TextPosition anchor_id=1 text_offset=7 " "affinity=downstream annotated_text=Line 1\nine 2", - "TextPosition anchor_id=1 text_offset=5 " - "affinity=downstream annotated_text=Line <1>\nLine 2", "TextPosition anchor_id=1 text_offset=0 " "affinity=downstream annotated_text=ine 1\nLine 2", "NullPosition"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { - return position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::CrossBoundary); + return position->CreatePreviousSentenceStartPosition( + AXBoundaryBehavior::kCrossBoundary); }), TEXT_FIELD_ID, 13 /* text_offset at end of text field */, - {"TextPosition anchor_id=4 text_offset=12 " - "affinity=downstream annotated_text=Line 1\nLine <2>", - "TextPosition anchor_id=4 text_offset=7 " + {"TextPosition anchor_id=4 text_offset=7 " "affinity=downstream annotated_text=Line 1\nine 2", - "TextPosition anchor_id=4 text_offset=5 " - "affinity=downstream annotated_text=Line <1>\nLine 2", "TextPosition anchor_id=4 text_offset=0 " "affinity=downstream annotated_text=ine 1\nLine 2", "NullPosition"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { - return position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::CrossBoundary); + return position->CreatePreviousSentenceStartPosition( + AXBoundaryBehavior::kCrossBoundary); }), STATIC_TEXT1_ID, 5 /* text_offset */, @@ -12728,33 +12793,903 @@ INSTANTIATE_TEST_SUITE_P( "NullPosition"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { - return position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::CrossBoundary); + return position->CreatePreviousSentenceStartPosition( + AXBoundaryBehavior::kCrossBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, {"TextPosition anchor_id=9 text_offset=0 " "affinity=downstream annotated_text=ine 2", - "TextPosition anchor_id=6 text_offset=5 " - "affinity=downstream annotated_text=Line <1>", "TextPosition anchor_id=6 text_offset=0 " "affinity=downstream annotated_text=ine 1", "NullPosition"}})); INSTANTIATE_TEST_SUITE_P( - CreatePreviousWordStartPositionWithBoundaryBehaviorStopAtAnchorBoundary, + CreatePreviousSentenceStartPositionWithBoundaryBehaviorStopAtAnchorBoundary, AXPositionTextNavigationTestWithParam, ::testing::Values( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { - return position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + return position->CreatePreviousSentenceStartPosition( + AXBoundaryBehavior::kStopAtAnchorBoundary); }), ROOT_ID, 13 /* text_offset at end of root. */, - {"TextPosition anchor_id=1 text_offset=12 " - "affinity=downstream annotated_text=Line 1\nLine <2>", - "TextPosition anchor_id=1 text_offset=7 " + {"TextPosition anchor_id=1 text_offset=7 " + "affinity=downstream annotated_text=Line 1\nine 2", + "TextPosition anchor_id=1 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2", + "TextPosition anchor_id=1 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceStartPosition( + AXBoundaryBehavior::kStopAtAnchorBoundary); + }), + TEXT_FIELD_ID, + 13 /* text_offset at end of text field */, + {"TextPosition anchor_id=4 text_offset=7 " + "affinity=downstream annotated_text=Line 1\nine 2", + "TextPosition anchor_id=4 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2", + "TextPosition anchor_id=4 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceStartPosition( + AXBoundaryBehavior::kStopAtAnchorBoundary); + }), + STATIC_TEXT1_ID, + 5 /* text_offset */, + {"TextPosition anchor_id=5 text_offset=0 " + "affinity=downstream annotated_text=ine 1", + "TextPosition anchor_id=5 text_offset=0 " + "affinity=downstream annotated_text=ine 1"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceStartPosition( + AXBoundaryBehavior::kStopAtAnchorBoundary); + }), + INLINE_BOX2_ID, + 4 /* text_offset */, + {"TextPosition anchor_id=9 text_offset=0 " + "affinity=downstream annotated_text=ine 2", + "TextPosition anchor_id=9 text_offset=0 " + "affinity=downstream annotated_text=ine 2"}})); + +INSTANTIATE_TEST_SUITE_P( + CreatePreviousSentenceStartPositionWithBoundaryBehaviorStopAtAnchorBoundaryOrIfAlreadyAtBoundary, + AXPositionTextNavigationTestWithParam, + ::testing::Values( + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceStartPosition( + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); + }), + ROOT_ID, + 13 /* text_offset at end of root. */, + {"TextPosition anchor_id=1 text_offset=7 " + "affinity=downstream annotated_text=Line 1\nine 2", + "TextPosition anchor_id=1 text_offset=7 " + "affinity=downstream annotated_text=Line 1\nine 2"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceStartPosition( + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); + }), + TEXT_FIELD_ID, + 13 /* text_offset at end of text field */, + {"TextPosition anchor_id=4 text_offset=7 " + "affinity=downstream annotated_text=Line 1\nine 2", + "TextPosition anchor_id=4 text_offset=7 " + "affinity=downstream annotated_text=Line 1\nine 2"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceStartPosition( + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); + }), + STATIC_TEXT1_ID, + 5 /* text_offset */, + {"TextPosition anchor_id=5 text_offset=0 " + "affinity=downstream annotated_text=ine 1", + "TextPosition anchor_id=5 text_offset=0 " + "affinity=downstream annotated_text=ine 1"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceStartPosition( + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); + }), + INLINE_BOX2_ID, + 4 /* text_offset */, + {"TextPosition anchor_id=9 text_offset=0 " + "affinity=downstream annotated_text=ine 2", + "TextPosition anchor_id=9 text_offset=0 " + "affinity=downstream annotated_text=ine 2"}})); + +INSTANTIATE_TEST_SUITE_P( + CreatePreviousSentenceStartPositionWithBoundaryBehaviorStopAtLastAnchorBoundary, + AXPositionTextNavigationTestWithParam, + ::testing::Values( + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceStartPosition( + AXBoundaryBehavior::kStopAtLastAnchorBoundary); + }), + ROOT_ID, + 13 /* text_offset */, + {"TextPosition anchor_id=1 text_offset=7 " + "affinity=downstream annotated_text=Line 1\nine 2", + "TextPosition anchor_id=1 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2", + "TextPosition anchor_id=1 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceStartPosition( + AXBoundaryBehavior::kStopAtLastAnchorBoundary); + }), + TEXT_FIELD_ID, + 13 /* text_offset */, + {"TextPosition anchor_id=4 text_offset=7 " + "affinity=downstream annotated_text=Line 1\nine 2", + "TextPosition anchor_id=4 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2", + "TextPosition anchor_id=4 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceStartPosition( + AXBoundaryBehavior::kStopAtLastAnchorBoundary); + }), + STATIC_TEXT1_ID, + 5 /* text_offset */, + {"TextPosition anchor_id=5 text_offset=0 " + "affinity=downstream annotated_text=ine 1", + "TextPosition anchor_id=5 text_offset=0 " + "affinity=downstream annotated_text=ine 1"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceStartPosition( + AXBoundaryBehavior::kStopAtLastAnchorBoundary); + }), + INLINE_BOX2_ID, + 4 /* text_offset */, + {"TextPosition anchor_id=9 text_offset=0 " + "affinity=downstream annotated_text=ine 2", + "TextPosition anchor_id=6 text_offset=0 " + "affinity=downstream annotated_text=ine 1", + "TextPosition anchor_id=6 text_offset=0 " + "affinity=downstream annotated_text=ine 1"}})); + +INSTANTIATE_TEST_SUITE_P( + CreateNextSentenceEndPositionWithBoundaryBehaviorCrossBoundary, + AXPositionTextNavigationTestWithParam, + ::testing::Values( + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextSentenceEndPosition( + AXBoundaryBehavior::kCrossBoundary); + }), + ROOT_ID, + 0 /* text_offset */, + {"TextPosition anchor_id=1 text_offset=6 " + "affinity=downstream annotated_text=Line 1<\n>Line 2", + "TextPosition anchor_id=1 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>", + "NullPosition"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextSentenceEndPosition( + AXBoundaryBehavior::kCrossBoundary); + }), + TEXT_FIELD_ID, + 0 /* text_offset */, + {"TextPosition anchor_id=4 text_offset=6 " + "affinity=downstream annotated_text=Line 1<\n>Line 2", + "TextPosition anchor_id=4 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>", + "NullPosition"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextSentenceEndPosition( + AXBoundaryBehavior::kCrossBoundary); + }), + STATIC_TEXT1_ID, + 1 /* text_offset */, + {"TextPosition anchor_id=5 text_offset=6 " + "affinity=downstream annotated_text=Line 1<>", + "TextPosition anchor_id=9 text_offset=6 " + "affinity=downstream annotated_text=Line 2<>", + "NullPosition"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextSentenceEndPosition( + AXBoundaryBehavior::kCrossBoundary); + }), + INLINE_BOX2_ID, + 4 /* text_offset */, + {"TextPosition anchor_id=9 text_offset=6 " + "affinity=downstream annotated_text=Line 2<>", + "NullPosition"}})); + +INSTANTIATE_TEST_SUITE_P( + CreateNextSentenceEndPositionWithBoundaryBehaviorStopAtAnchorBoundary, + AXPositionTextNavigationTestWithParam, + ::testing::Values( + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextSentenceEndPosition( + AXBoundaryBehavior::kStopAtAnchorBoundary); + }), + ROOT_ID, + 0 /* text_offset */, + {"TextPosition anchor_id=1 text_offset=6 " + "affinity=downstream annotated_text=Line 1<\n>Line 2", + "TextPosition anchor_id=1 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>", + "TextPosition anchor_id=1 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextSentenceEndPosition( + AXBoundaryBehavior::kStopAtAnchorBoundary); + }), + TEXT_FIELD_ID, + 0 /* text_offset */, + {"TextPosition anchor_id=4 text_offset=6 " + "affinity=downstream annotated_text=Line 1<\n>Line 2", + "TextPosition anchor_id=4 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>", + "TextPosition anchor_id=4 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextSentenceEndPosition( + AXBoundaryBehavior::kStopAtAnchorBoundary); + }), + STATIC_TEXT1_ID, + 1 /* text_offset */, + {"TextPosition anchor_id=5 text_offset=6 " + "affinity=downstream annotated_text=Line 1<>", + "TextPosition anchor_id=5 text_offset=6 " + "affinity=downstream annotated_text=Line 1<>"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextSentenceEndPosition( + AXBoundaryBehavior::kStopAtAnchorBoundary); + }), + INLINE_BOX2_ID, + 4 /* text_offset */, + {"TextPosition anchor_id=9 text_offset=6 " + "affinity=downstream annotated_text=Line 2<>", + "TextPosition anchor_id=9 text_offset=6 " + "affinity=downstream annotated_text=Line 2<>"}})); + +INSTANTIATE_TEST_SUITE_P( + CreateNextSentenceEndPositionWithBoundaryBehaviorStopAtAnchorBoundaryOrIfAlreadyAtBoundary, + AXPositionTextNavigationTestWithParam, + ::testing::Values( + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextSentenceEndPosition( + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); + }), + ROOT_ID, + 0 /* text_offset */, + {"TextPosition anchor_id=1 text_offset=6 " + "affinity=downstream annotated_text=Line 1<\n>Line 2", + "TextPosition anchor_id=1 text_offset=6 " + "affinity=downstream annotated_text=Line 1<\n>Line 2"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextSentenceEndPosition( + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); + }), + TEXT_FIELD_ID, + 0 /* text_offset */, + {"TextPosition anchor_id=4 text_offset=6 " + "affinity=downstream annotated_text=Line 1<\n>Line 2", + "TextPosition anchor_id=4 text_offset=6 " + "affinity=downstream annotated_text=Line 1<\n>Line 2"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextSentenceEndPosition( + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); + }), + STATIC_TEXT1_ID, + 1 /* text_offset */, + {"TextPosition anchor_id=5 text_offset=6 " + "affinity=downstream annotated_text=Line 1<>", + "TextPosition anchor_id=5 text_offset=6 " + "affinity=downstream annotated_text=Line 1<>"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextSentenceEndPosition( + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); + }), + INLINE_BOX2_ID, + 4 /* text_offset */, + {"TextPosition anchor_id=9 text_offset=6 " + "affinity=downstream annotated_text=Line 2<>", + "TextPosition anchor_id=9 text_offset=6 " + "affinity=downstream annotated_text=Line 2<>"}})); + +INSTANTIATE_TEST_SUITE_P( + CreateNextSentenceEndPositionWithBoundaryBehaviorStopAtLastAnchorBoundary, + AXPositionTextNavigationTestWithParam, + ::testing::Values( + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextSentenceEndPosition( + AXBoundaryBehavior::kStopAtLastAnchorBoundary); + }), + ROOT_ID, + 0 /* text_offset */, + {"TextPosition anchor_id=1 text_offset=6 " + "affinity=downstream annotated_text=Line 1<\n>Line 2", + "TextPosition anchor_id=1 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>", + "TextPosition anchor_id=1 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextSentenceEndPosition( + AXBoundaryBehavior::kStopAtLastAnchorBoundary); + }), + TEXT_FIELD_ID, + 0 /* text_offset */, + {"TextPosition anchor_id=4 text_offset=6 " + "affinity=downstream annotated_text=Line 1<\n>Line 2", + "TextPosition anchor_id=4 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>", + "TextPosition anchor_id=4 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextSentenceEndPosition( + AXBoundaryBehavior::kStopAtLastAnchorBoundary); + }), + STATIC_TEXT1_ID, + 1 /* text_offset */, + {"TextPosition anchor_id=5 text_offset=6 " + "affinity=downstream annotated_text=Line 1<>", + "TextPosition anchor_id=9 text_offset=6 " + "affinity=downstream annotated_text=Line 2<>", + "TextPosition anchor_id=9 text_offset=6 " + "affinity=downstream annotated_text=Line 2<>"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextSentenceEndPosition( + AXBoundaryBehavior::kStopAtLastAnchorBoundary); + }), + INLINE_BOX2_ID, + 4 /* text_offset */, + {"TextPosition anchor_id=9 text_offset=6 " + "affinity=downstream annotated_text=Line 2<>", + "TextPosition anchor_id=9 text_offset=6 " + "affinity=downstream annotated_text=Line 2<>"}})); + +INSTANTIATE_TEST_SUITE_P( + CreatePreviousSentenceEndPositionWithBoundaryBehaviorCrossBoundary, + AXPositionTextNavigationTestWithParam, + ::testing::Values( + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceEndPosition( + AXBoundaryBehavior::kCrossBoundary); + }), + ROOT_ID, + 13 /* text_offset at end of root. */, + {"TextPosition anchor_id=1 text_offset=6 " + "affinity=downstream annotated_text=Line 1<\n>Line 2", + "NullPosition"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceEndPosition( + AXBoundaryBehavior::kCrossBoundary); + }), + TEXT_FIELD_ID, + 13 /* text_offset at end of text field */, + {"TextPosition anchor_id=4 text_offset=6 " + "affinity=downstream annotated_text=Line 1<\n>Line 2", + "NullPosition"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceEndPosition( + AXBoundaryBehavior::kCrossBoundary); + }), + STATIC_TEXT1_ID, + 5 /* text_offset */, + {"NullPosition"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceEndPosition( + AXBoundaryBehavior::kCrossBoundary); + }), + INLINE_BOX2_ID, + 4 /* text_offset */, + {"TextPosition anchor_id=6 text_offset=6 affinity=downstream " + "annotated_text=Line 1<>", + "NullPosition"}})); + +INSTANTIATE_TEST_SUITE_P( + CreatePreviousSentenceEndPositionWithBoundaryBehaviorStopAtAnchorBoundary, + AXPositionTextNavigationTestWithParam, + ::testing::Values( + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceEndPosition( + AXBoundaryBehavior::kStopAtAnchorBoundary); + }), + ROOT_ID, + 13 /* text_offset at end of root. */, + {"TextPosition anchor_id=1 text_offset=6 " + "affinity=downstream annotated_text=Line 1<\n>Line 2", + "TextPosition anchor_id=1 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2", + "TextPosition anchor_id=1 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceEndPosition( + AXBoundaryBehavior::kStopAtAnchorBoundary); + }), + TEXT_FIELD_ID, + 13 /* text_offset at end of text field */, + {"TextPosition anchor_id=4 text_offset=6 " + "affinity=downstream annotated_text=Line 1<\n>Line 2", + "TextPosition anchor_id=4 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2", + "TextPosition anchor_id=4 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceEndPosition( + AXBoundaryBehavior::kStopAtAnchorBoundary); + }), + STATIC_TEXT1_ID, + 5 /* text_offset */, + {"TextPosition anchor_id=5 text_offset=0 " + "affinity=downstream annotated_text=ine 1", + "TextPosition anchor_id=5 text_offset=0 " + "affinity=downstream annotated_text=ine 1"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceEndPosition( + AXBoundaryBehavior::kStopAtAnchorBoundary); + }), + INLINE_BOX2_ID, + 4 /* text_offset */, + {"TextPosition anchor_id=9 text_offset=0 " + "affinity=downstream annotated_text=ine 2", + "TextPosition anchor_id=9 text_offset=0 " + "affinity=downstream annotated_text=ine 2"}})); + +INSTANTIATE_TEST_SUITE_P( + CreatePreviousSentenceEndPositionWithBoundaryBehaviorStopAtAnchorBoundaryOrIfAlreadyAtBoundary, + AXPositionTextNavigationTestWithParam, + ::testing::Values( + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceEndPosition( + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); + }), + ROOT_ID, + 13 /* text_offset at end of root. */, + {"TextPosition anchor_id=1 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>", + "TextPosition anchor_id=1 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceEndPosition( + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); + }), + TEXT_FIELD_ID, + 13 /* text_offset at end of text field */, + {"TextPosition anchor_id=4 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>", + "TextPosition anchor_id=4 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceEndPosition( + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); + }), + STATIC_TEXT1_ID, + 5 /* text_offset */, + {"TextPosition anchor_id=5 text_offset=0 " + "affinity=downstream annotated_text=ine 1", + "TextPosition anchor_id=5 text_offset=0 " + "affinity=downstream annotated_text=ine 1"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceEndPosition( + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); + }), + INLINE_BOX2_ID, + 4 /* text_offset */, + {"TextPosition anchor_id=9 text_offset=0 " + "affinity=downstream annotated_text=ine 2", + "TextPosition anchor_id=9 text_offset=0 " + "affinity=downstream annotated_text=ine 2"}})); + +INSTANTIATE_TEST_SUITE_P( + CreatePreviousSentenceEndPositionWithBoundaryBehaviorStopAtLastAnchorBoundary, + AXPositionTextNavigationTestWithParam, + ::testing::Values( + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceEndPosition( + AXBoundaryBehavior::kStopAtLastAnchorBoundary); + }), + ROOT_ID, + 13 /* text_offset at end of root. */, + {"TextPosition anchor_id=1 text_offset=6 " + "affinity=downstream annotated_text=Line 1<\n>Line 2", + "TextPosition anchor_id=1 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2", + "TextPosition anchor_id=1 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceEndPosition( + AXBoundaryBehavior::kStopAtLastAnchorBoundary); + }), + TEXT_FIELD_ID, + 13 /* text_offset at end of text field */, + {"TextPosition anchor_id=4 text_offset=6 " + "affinity=downstream annotated_text=Line 1<\n>Line 2", + "TextPosition anchor_id=2 text_offset=0 " + "affinity=downstream annotated_text=<>", + "TextPosition anchor_id=2 text_offset=0 " + "affinity=downstream annotated_text=<>"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceEndPosition( + AXBoundaryBehavior::kStopAtLastAnchorBoundary); + }), + STATIC_TEXT1_ID, + 5 /* text_offset */, + {"TextPosition anchor_id=2 text_offset=0 " + "affinity=downstream annotated_text=<>", + "TextPosition anchor_id=2 text_offset=0 " + "affinity=downstream annotated_text=<>"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousSentenceEndPosition( + AXBoundaryBehavior::kStopAtLastAnchorBoundary); + }), + INLINE_BOX2_ID, + 4 /* text_offset */, + {"TextPosition anchor_id=6 text_offset=6 affinity=downstream " + "annotated_text=Line 1<>", + "TextPosition anchor_id=2 text_offset=0 " + "affinity=downstream annotated_text=<>"}})); + +INSTANTIATE_TEST_SUITE_P( + CreateNextWordStartPositionWithBoundaryBehaviorCrossBoundary, + AXPositionTextNavigationTestWithParam, + ::testing::Values( + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextWordStartPosition( + AXBoundaryBehavior::kCrossBoundary); + }), + ROOT_ID, + 0 /* text_offset */, + {"TextPosition anchor_id=1 text_offset=5 " + "affinity=downstream annotated_text=Line <1>\nLine 2", + "TextPosition anchor_id=1 text_offset=7 " + "affinity=downstream annotated_text=Line 1\nine 2", + "TextPosition anchor_id=1 text_offset=12 " + "affinity=downstream annotated_text=Line 1\nLine <2>", + "NullPosition"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextWordStartPosition( + AXBoundaryBehavior::kCrossBoundary); + }), + TEXT_FIELD_ID, + 0 /* text_offset */, + {"TextPosition anchor_id=4 text_offset=5 " + "affinity=downstream annotated_text=Line <1>\nLine 2", + "TextPosition anchor_id=4 text_offset=7 " + "affinity=downstream annotated_text=Line 1\nine 2", + "TextPosition anchor_id=4 text_offset=12 " + "affinity=downstream annotated_text=Line 1\nLine <2>", + "NullPosition"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextWordStartPosition( + AXBoundaryBehavior::kCrossBoundary); + }), + STATIC_TEXT1_ID, + 1 /* text_offset */, + {"TextPosition anchor_id=5 text_offset=5 " + "affinity=downstream annotated_text=Line <1>", + "TextPosition anchor_id=9 text_offset=0 " + "affinity=downstream annotated_text=ine 2", + "TextPosition anchor_id=9 text_offset=5 " + "affinity=downstream annotated_text=Line <2>", + "NullPosition"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextWordStartPosition( + AXBoundaryBehavior::kCrossBoundary); + }), + INLINE_BOX2_ID, + 4 /* text_offset */, + {"TextPosition anchor_id=9 text_offset=5 " + "affinity=downstream annotated_text=Line <2>", + "NullPosition"}})); + +INSTANTIATE_TEST_SUITE_P( + CreateNextWordStartPositionWithBoundaryBehaviorStopAtAnchorBoundary, + AXPositionTextNavigationTestWithParam, + ::testing::Values( + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextWordStartPosition( + AXBoundaryBehavior::kStopAtAnchorBoundary); + }), + ROOT_ID, + 0 /* text_offset */, + {"TextPosition anchor_id=1 text_offset=5 " + "affinity=downstream annotated_text=Line <1>\nLine 2", + "TextPosition anchor_id=1 text_offset=7 " + "affinity=downstream annotated_text=Line 1\nine 2", + "TextPosition anchor_id=1 text_offset=12 " + "affinity=downstream annotated_text=Line 1\nLine <2>", + "TextPosition anchor_id=1 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextWordStartPosition( + AXBoundaryBehavior::kStopAtAnchorBoundary); + }), + TEXT_FIELD_ID, + 0 /* text_offset */, + {"TextPosition anchor_id=4 text_offset=5 " + "affinity=downstream annotated_text=Line <1>\nLine 2", + "TextPosition anchor_id=4 text_offset=7 " + "affinity=downstream annotated_text=Line 1\nine 2", + "TextPosition anchor_id=4 text_offset=12 " + "affinity=downstream annotated_text=Line 1\nLine <2>", + "TextPosition anchor_id=4 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextWordStartPosition( + AXBoundaryBehavior::kStopAtAnchorBoundary); + }), + STATIC_TEXT1_ID, + 1 /* text_offset */, + {"TextPosition anchor_id=5 text_offset=5 " + "affinity=downstream annotated_text=Line <1>", + "TextPosition anchor_id=5 text_offset=6 " + "affinity=downstream annotated_text=Line 1<>"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextWordStartPosition( + AXBoundaryBehavior::kStopAtAnchorBoundary); + }), + INLINE_BOX2_ID, + 4 /* text_offset */, + {"TextPosition anchor_id=9 text_offset=5 " + "affinity=downstream annotated_text=Line <2>", + "TextPosition anchor_id=9 text_offset=6 " + "affinity=downstream annotated_text=Line 2<>"}})); + +INSTANTIATE_TEST_SUITE_P( + CreateNextWordStartPositionWithBoundaryBehaviorStopAtAnchorBoundaryOrIfAlreadyAtBoundary, + AXPositionTextNavigationTestWithParam, + ::testing::Values( + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextWordStartPosition( + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); + }), + ROOT_ID, + 0 /* text_offset */, + {"TextPosition anchor_id=1 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2", + "TextPosition anchor_id=1 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextWordStartPosition( + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); + }), + TEXT_FIELD_ID, + 0 /* text_offset */, + {"TextPosition anchor_id=4 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2", + "TextPosition anchor_id=4 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextWordStartPosition( + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); + }), + STATIC_TEXT1_ID, + 1 /* text_offset */, + {"TextPosition anchor_id=5 text_offset=5 " + "affinity=downstream annotated_text=Line <1>", + "TextPosition anchor_id=5 text_offset=5 " + "affinity=downstream annotated_text=Line <1>"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextWordStartPosition( + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); + }), + INLINE_BOX2_ID, + 4 /* text_offset */, + {"TextPosition anchor_id=9 text_offset=5 " + "affinity=downstream annotated_text=Line <2>", + "TextPosition anchor_id=9 text_offset=5 " + "affinity=downstream annotated_text=Line <2>"}})); + +INSTANTIATE_TEST_SUITE_P( + CreateNextWordStartPositionWithBoundaryBehaviorStopAtLastAnchorBoundary, + AXPositionTextNavigationTestWithParam, + ::testing::Values( + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextWordStartPosition( + AXBoundaryBehavior::kStopAtLastAnchorBoundary); + }), + ROOT_ID, + 0 /* text_offset */, + {"TextPosition anchor_id=1 text_offset=5 " + "affinity=downstream annotated_text=Line <1>\nLine 2", + "TextPosition anchor_id=1 text_offset=7 " + "affinity=downstream annotated_text=Line 1\nine 2", + "TextPosition anchor_id=1 text_offset=12 " + "affinity=downstream annotated_text=Line 1\nLine <2>", + "TextPosition anchor_id=1 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>", + "TextPosition anchor_id=1 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextWordStartPosition( + AXBoundaryBehavior::kStopAtLastAnchorBoundary); + }), + TEXT_FIELD_ID, + 0 /* text_offset */, + {"TextPosition anchor_id=4 text_offset=5 " + "affinity=downstream annotated_text=Line <1>\nLine 2", + "TextPosition anchor_id=4 text_offset=7 " + "affinity=downstream annotated_text=Line 1\nine 2", + "TextPosition anchor_id=4 text_offset=12 " + "affinity=downstream annotated_text=Line 1\nLine <2>", + "TextPosition anchor_id=4 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>", + "TextPosition anchor_id=4 text_offset=13 " + "affinity=downstream annotated_text=Line 1\nLine 2<>"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextWordStartPosition( + AXBoundaryBehavior::kStopAtLastAnchorBoundary); + }), + STATIC_TEXT1_ID, + 1 /* text_offset */, + {"TextPosition anchor_id=5 text_offset=5 " + "affinity=downstream annotated_text=Line <1>", + "TextPosition anchor_id=9 text_offset=0 " + "affinity=downstream annotated_text=ine 2", + "TextPosition anchor_id=9 text_offset=5 " + "affinity=downstream annotated_text=Line <2>", + "TextPosition anchor_id=9 text_offset=6 " + "affinity=downstream annotated_text=Line 2<>", + "TextPosition anchor_id=9 text_offset=6 " + "affinity=downstream annotated_text=Line 2<>"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreateNextWordStartPosition( + AXBoundaryBehavior::kStopAtLastAnchorBoundary); + }), + INLINE_BOX2_ID, + 4 /* text_offset */, + {"TextPosition anchor_id=9 text_offset=5 " + "affinity=downstream annotated_text=Line <2>", + "TextPosition anchor_id=9 text_offset=6 " + "affinity=downstream annotated_text=Line 2<>", + "TextPosition anchor_id=9 text_offset=6 " + "affinity=downstream annotated_text=Line 2<>"}})); + +INSTANTIATE_TEST_SUITE_P( + CreatePreviousWordStartPositionWithBoundaryBehaviorCrossBoundary, + AXPositionTextNavigationTestWithParam, + ::testing::Values( + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousWordStartPosition( + AXBoundaryBehavior::kCrossBoundary); + }), + ROOT_ID, + 13 /* text_offset at end of root. */, + {"TextPosition anchor_id=1 text_offset=12 " + "affinity=downstream annotated_text=Line 1\nLine <2>", + "TextPosition anchor_id=1 text_offset=7 " + "affinity=downstream annotated_text=Line 1\nine 2", + "TextPosition anchor_id=1 text_offset=5 " + "affinity=downstream annotated_text=Line <1>\nLine 2", + "TextPosition anchor_id=1 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2", + "NullPosition"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousWordStartPosition( + AXBoundaryBehavior::kCrossBoundary); + }), + TEXT_FIELD_ID, + 13 /* text_offset at end of text field */, + {"TextPosition anchor_id=4 text_offset=12 " + "affinity=downstream annotated_text=Line 1\nLine <2>", + "TextPosition anchor_id=4 text_offset=7 " + "affinity=downstream annotated_text=Line 1\nine 2", + "TextPosition anchor_id=4 text_offset=5 " + "affinity=downstream annotated_text=Line <1>\nLine 2", + "TextPosition anchor_id=4 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2", + "NullPosition"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousWordStartPosition( + AXBoundaryBehavior::kCrossBoundary); + }), + STATIC_TEXT1_ID, + 5 /* text_offset */, + {"TextPosition anchor_id=5 text_offset=0 " + "affinity=downstream annotated_text=ine 1", + "NullPosition"}}, + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousWordStartPosition( + AXBoundaryBehavior::kCrossBoundary); + }), + INLINE_BOX2_ID, + 4 /* text_offset */, + {"TextPosition anchor_id=9 text_offset=0 " + "affinity=downstream annotated_text=ine 2", + "TextPosition anchor_id=6 text_offset=5 " + "affinity=downstream annotated_text=Line <1>", + "TextPosition anchor_id=6 text_offset=0 " + "affinity=downstream annotated_text=ine 1", + "NullPosition"}})); + +INSTANTIATE_TEST_SUITE_P( + CreatePreviousWordStartPositionWithBoundaryBehaviorStopAtAnchorBoundary, + AXPositionTextNavigationTestWithParam, + ::testing::Values( + TextNavigationTestParam{ + base::BindRepeating([](const TestPositionType& position) { + return position->CreatePreviousWordStartPosition( + AXBoundaryBehavior::kStopAtAnchorBoundary); + }), + ROOT_ID, + 13 /* text_offset at end of root. */, + {"TextPosition anchor_id=1 text_offset=12 " + "affinity=downstream annotated_text=Line 1\nLine <2>", + "TextPosition anchor_id=1 text_offset=7 " "affinity=downstream annotated_text=Line 1\nine 2", "TextPosition anchor_id=1 text_offset=5 " "affinity=downstream annotated_text=Line <1>\nLine 2", @@ -12765,7 +13700,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), TEXT_FIELD_ID, 13 /* text_offset at end of text field */, @@ -12782,7 +13717,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), STATIC_TEXT1_ID, 5 /* text_offset */, @@ -12793,7 +13728,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -12803,13 +13738,14 @@ INSTANTIATE_TEST_SUITE_P( "affinity=downstream annotated_text=ine 2"}})); INSTANTIATE_TEST_SUITE_P( - CreatePreviousWordStartPositionWithBoundaryBehaviorStopIfAlreadyAtBoundary, + CreatePreviousWordStartPositionWithBoundaryBehaviorStopAtAnchorBoundaryOrIfAlreadyAtBoundary, AXPositionTextNavigationTestWithParam, ::testing::Values( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), ROOT_ID, 13 /* text_offset at end of root. */, @@ -12820,7 +13756,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), TEXT_FIELD_ID, 13 /* text_offset at end of text field */, @@ -12831,7 +13768,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), STATIC_TEXT1_ID, 5 /* text_offset */, @@ -12840,7 +13778,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -12856,7 +13795,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), ROOT_ID, 13 /* text_offset */, @@ -12873,7 +13812,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), TEXT_FIELD_ID, 13 /* text_offset */, @@ -12890,7 +13829,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), STATIC_TEXT1_ID, 5 /* text_offset */, @@ -12901,7 +13840,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -12921,7 +13860,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextWordEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), ROOT_ID, 0 /* text_offset */, @@ -12937,7 +13876,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextWordEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, @@ -12953,7 +13892,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextWordEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, @@ -12969,7 +13908,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextWordEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -12984,7 +13923,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextWordEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), ROOT_ID, 0 /* text_offset */, @@ -13001,7 +13940,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextWordEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, @@ -13018,7 +13957,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextWordEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, @@ -13031,7 +13970,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextWordEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -13041,13 +13980,14 @@ INSTANTIATE_TEST_SUITE_P( "affinity=downstream annotated_text=Line 2<>"}})); INSTANTIATE_TEST_SUITE_P( - CreateNextWordEndPositionWithBoundaryBehaviorStopIfAlreadyAtBoundary, + CreateNextWordEndPositionWithBoundaryBehaviorStopAtAnchorBoundaryOrIfAlreadyAtBoundary, AXPositionTextNavigationTestWithParam, ::testing::Values( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextWordEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), ROOT_ID, 0 /* text_offset */, @@ -13058,7 +13998,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextWordEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, @@ -13069,7 +14010,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextWordEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, @@ -13080,7 +14022,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextWordEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -13094,7 +14037,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextWordEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), ROOT_ID, 0 /* text_offset */, @@ -13111,7 +14054,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextWordEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, @@ -13128,7 +14071,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextWordEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, @@ -13145,7 +14088,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextWordEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -13161,7 +14104,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), ROOT_ID, 13 /* text_offset at end of root. */, @@ -13175,7 +14118,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), TEXT_FIELD_ID, 13 /* text_offset at end of text field */, @@ -13189,7 +14132,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), STATIC_TEXT1_ID, 5 /* text_offset */, @@ -13199,12 +14142,12 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, - {"TextPosition anchor_id=6 text_offset=6 " - "affinity=downstream annotated_text=Line 1<>", + {"TextPosition anchor_id=6 text_offset=6 affinity=downstream " + "annotated_text=Line 1<>", "TextPosition anchor_id=6 text_offset=4 " "affinity=downstream annotated_text=Line< >1", "NullPosition"}})); @@ -13216,24 +14159,24 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), ROOT_ID, 13 /* text_offset at end of root. */, - { - "TextPosition anchor_id=1 text_offset=11 " - "affinity=downstream annotated_text=Line 1\nLine< >2", - "TextPosition anchor_id=1 text_offset=6 " - "affinity=downstream annotated_text=Line 1<\n>Line 2", - "TextPosition anchor_id=1 text_offset=4 " - "affinity=downstream annotated_text=Line< >1\nLine 2", - "TextPosition anchor_id=1 text_offset=0 " - "affinity=downstream annotated_text=ine 1\nLine 2", - }}, + {"TextPosition anchor_id=1 text_offset=11 " + "affinity=downstream annotated_text=Line 1\nLine< >2", + "TextPosition anchor_id=1 text_offset=6 " + "affinity=downstream annotated_text=Line 1<\n>Line 2", + "TextPosition anchor_id=1 text_offset=4 " + "affinity=downstream annotated_text=Line< >1\nLine 2", + "TextPosition anchor_id=1 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2", + "TextPosition anchor_id=1 text_offset=0 " + "affinity=downstream annotated_text=ine 1\nLine 2"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), TEXT_FIELD_ID, 13 /* text_offset at end of text field */, @@ -13248,7 +14191,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), STATIC_TEXT1_ID, 5 /* text_offset */, @@ -13259,7 +14202,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -13267,13 +14210,14 @@ INSTANTIATE_TEST_SUITE_P( "affinity=downstream annotated_text=ine 2"}})); INSTANTIATE_TEST_SUITE_P( - CreatePreviousWordEndPositionWithBoundaryBehaviorStopIfAlreadyAtBoundary, + CreatePreviousWordEndPositionWithBoundaryBehaviorStopAtAnchorBoundaryOrIfAlreadyAtBoundary, AXPositionTextNavigationTestWithParam, ::testing::Values( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), ROOT_ID, 13 /* text_offset at end of root. */, @@ -13282,7 +14226,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), TEXT_FIELD_ID, 13 /* text_offset at end of text field */, @@ -13291,7 +14236,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), STATIC_TEXT1_ID, 5 /* text_offset */, @@ -13302,7 +14248,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -13316,7 +14263,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), ROOT_ID, 13 /* text_offset at end of root. */, @@ -13333,7 +14280,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), TEXT_FIELD_ID, 13 /* text_offset at end of text field */, @@ -13350,7 +14297,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), STATIC_TEXT1_ID, 5 /* text_offset */, @@ -13363,12 +14310,12 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousWordEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, - {"TextPosition anchor_id=6 text_offset=6 " - "affinity=downstream annotated_text=Line 1<>", + {"TextPosition anchor_id=6 text_offset=6 affinity=downstream " + "annotated_text=Line 1<>", "TextPosition anchor_id=6 text_offset=4 " "affinity=downstream annotated_text=Line< >1", "TextPosition anchor_id=2 text_offset=0 " @@ -13383,7 +14330,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), ROOT_ID, 0 /* text_offset */, @@ -13393,7 +14340,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, @@ -13403,7 +14350,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, @@ -13413,7 +14360,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -13426,7 +14373,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), ROOT_ID, 0 /* text_offset */, @@ -13437,7 +14384,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, @@ -13448,7 +14395,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, @@ -13457,7 +14404,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -13465,13 +14412,14 @@ INSTANTIATE_TEST_SUITE_P( "affinity=downstream annotated_text=Line 2<>"}})); INSTANTIATE_TEST_SUITE_P( - CreateNextLineStartPositionWithBoundaryBehaviorStopIfAlreadyAtBoundary, + CreateNextLineStartPositionWithBoundaryBehaviorStopAtAnchorBoundaryOrIfAlreadyAtBoundary, AXPositionTextNavigationTestWithParam, ::testing::Values( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), ROOT_ID, 0 /* text_offset */, @@ -13482,7 +14430,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, @@ -13493,22 +14442,25 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, - {"TextPosition anchor_id=9 text_offset=0 " - "affinity=downstream annotated_text=ine 2", - "TextPosition anchor_id=9 text_offset=0 " - "affinity=downstream annotated_text=ine 2"}}, + {"TextPosition anchor_id=5 text_offset=6 affinity=downstream " + "annotated_text=Line 1<>", + "TextPosition anchor_id=5 text_offset=6 affinity=downstream " + "annotated_text=Line 1<>"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, - {"NullPosition"}})); + {"TextPosition anchor_id=9 text_offset=6 affinity=downstream " + "annotated_text=Line 2<>"}})); INSTANTIATE_TEST_SUITE_P( CreateNextLineStartPositionWithBoundaryBehaviorStopAtLastAnchorBoundary, @@ -13517,7 +14469,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), ROOT_ID, 0 /* text_offset */, @@ -13530,7 +14482,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, @@ -13543,7 +14495,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, @@ -13556,7 +14508,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -13572,7 +14524,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), ROOT_ID, 13 /* text_offset at the end of root. */, @@ -13584,7 +14536,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), TEXT_FIELD_ID, 13 /* text_offset at end of text field */, @@ -13596,7 +14548,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), STATIC_TEXT1_ID, 5 /* text_offset */, @@ -13606,7 +14558,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -13623,7 +14575,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), ROOT_ID, 13 /* text_offset at the end of root. */, @@ -13636,7 +14588,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), TEXT_FIELD_ID, 13 /* text_offset at end of text field */, @@ -13649,7 +14601,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), STATIC_TEXT1_ID, 5 /* text_offset */, @@ -13660,7 +14612,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -13670,13 +14622,14 @@ INSTANTIATE_TEST_SUITE_P( "affinity=downstream annotated_text=ine 2"}})); INSTANTIATE_TEST_SUITE_P( - CreatePreviousLineStartPositionWithBoundaryBehaviorStopIfAlreadyAtBoundary, + CreatePreviousLineStartPositionWithBoundaryBehaviorStopAtAnchorBoundaryOrIfAlreadyAtBoundary, AXPositionTextNavigationTestWithParam, ::testing::Values( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), ROOT_ID, 13 /* text_offset at the end of root. */, @@ -13687,7 +14640,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), TEXT_FIELD_ID, 13 /* text_offset at end of text field */, @@ -13698,7 +14652,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), STATIC_TEXT1_ID, 5 /* text_offset */, @@ -13709,7 +14664,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -13725,7 +14681,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), ROOT_ID, 13 /* text_offset at the end of root. */, @@ -13738,7 +14694,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), TEXT_FIELD_ID, 13 /* text_offset at end of text field */, @@ -13751,7 +14707,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), STATIC_TEXT1_ID, 5 /* text_offset */, @@ -13762,7 +14718,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -13780,7 +14736,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), ROOT_ID, 0 /* text_offset */, @@ -13792,7 +14748,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, @@ -13804,7 +14760,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, @@ -13816,7 +14772,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -13831,7 +14787,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), ROOT_ID, 0 /* text_offset */, @@ -13844,7 +14800,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, @@ -13857,7 +14813,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, @@ -13868,7 +14824,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -13878,13 +14834,14 @@ INSTANTIATE_TEST_SUITE_P( "affinity=downstream annotated_text=Line 2<>"}})); INSTANTIATE_TEST_SUITE_P( - CreateNextLineEndPositionWithBoundaryBehaviorStopIfAlreadyAtBoundary, + CreateNextLineEndPositionWithBoundaryBehaviorStopAtAnchorBoundaryOrIfAlreadyAtBoundary, AXPositionTextNavigationTestWithParam, ::testing::Values( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), ROOT_ID, 0 /* text_offset */, @@ -13895,7 +14852,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, @@ -13906,7 +14864,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, @@ -13917,7 +14876,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -13933,7 +14893,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), ROOT_ID, 0 /* text_offset */, @@ -13946,7 +14906,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, @@ -13959,7 +14919,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, @@ -13972,7 +14932,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextLineEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -13988,7 +14948,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), ROOT_ID, 13 /* text_offset at end of root. */, @@ -13998,7 +14958,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), TEXT_FIELD_ID, 13 /* text_offset at end of text field */, @@ -14008,7 +14968,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), ROOT_ID, 5 /* text_offset on the last character of "Line 1". */, @@ -14016,7 +14976,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), TEXT_FIELD_ID, 5 /* text_offset on the last character of "Line 1". */, @@ -14024,7 +14984,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -14034,7 +14994,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), INLINE_BOX2_ID, 0 /* text_offset */, @@ -14049,7 +15009,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), ROOT_ID, 13 /* text_offset at end of root. */, @@ -14060,7 +15020,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), TEXT_FIELD_ID, 13 /* text_offset at end of text field */, @@ -14071,7 +15031,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), ROOT_ID, 5 /* text_offset on the last character of "Line 1". */, @@ -14082,7 +15042,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), TEXT_FIELD_ID, 5 /* text_offset on the last character of "Line 1". */, @@ -14093,7 +15053,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -14104,7 +15064,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), INLINE_BOX2_ID, 0 /* text_offset */, @@ -14114,13 +15074,14 @@ INSTANTIATE_TEST_SUITE_P( "affinity=downstream annotated_text=ine 2"}})); INSTANTIATE_TEST_SUITE_P( - CreatePreviousLineEndPositionWithBoundaryBehaviorStopIfAlreadyAtBoundary, + CreatePreviousLineEndPositionWithBoundaryBehaviorStopAtAnchorBoundaryOrIfAlreadyAtBoundary, AXPositionTextNavigationTestWithParam, ::testing::Values( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), ROOT_ID, 12 /* text_offset one before the end of root. */, @@ -14131,7 +15092,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), TEXT_FIELD_ID, 12 /* text_offset one before the end of text field */, @@ -14142,33 +15104,39 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), INLINE_BOX1_ID, 2 /* text_offset */, - {"NullPosition"}}, + {"TextPosition anchor_id=6 text_offset=0 affinity=downstream " + "annotated_text=ine 1", + "TextPosition anchor_id=6 text_offset=0 affinity=downstream " + "annotated_text=ine 1"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, - {"TextPosition anchor_id=6 text_offset=6 " - "affinity=downstream annotated_text=Line 1<>", - "TextPosition anchor_id=6 text_offset=6 " - "affinity=downstream annotated_text=Line 1<>"}}, + {"TextPosition anchor_id=9 text_offset=0 affinity=downstream " + "annotated_text=ine 2", + "TextPosition anchor_id=9 text_offset=0 affinity=downstream " + "annotated_text=ine 2"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), INLINE_BOX2_ID, 0 /* text_offset */, - {"TextPosition anchor_id=6 text_offset=6 " - "affinity=downstream annotated_text=Line 1<>", - "TextPosition anchor_id=6 text_offset=6 " - "affinity=downstream annotated_text=Line 1<>"}})); + {"TextPosition anchor_id=9 text_offset=0 affinity=downstream " + "annotated_text=ine 2", + "TextPosition anchor_id=9 text_offset=0 affinity=downstream " + "annotated_text=ine 2"}})); INSTANTIATE_TEST_SUITE_P( CreatePreviousLineEndPositionWithBoundaryBehaviorStopAtLastAnchorBoundary, @@ -14177,7 +15145,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), ROOT_ID, 13 /* text_offset at end of root. */, @@ -14190,7 +15158,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), TEXT_FIELD_ID, 13 /* text_offset at end of text field */, @@ -14203,7 +15171,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), ROOT_ID, 5 /* text_offset on the last character of "Line 1". */, @@ -14214,7 +15182,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), TEXT_FIELD_ID, 5 /* text_offset on the last character of "Line 1". */, @@ -14225,7 +15193,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -14238,7 +15206,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousLineEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), INLINE_BOX2_ID, 0 /* text_offset */, @@ -14256,7 +15224,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), ROOT_ID, 0 /* text_offset */, @@ -14265,7 +15233,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, @@ -14274,7 +15242,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, @@ -14283,7 +15251,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -14296,7 +15264,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), ROOT_ID, 0 /* text_offset */, @@ -14307,7 +15275,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, @@ -14318,7 +15286,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, @@ -14327,7 +15295,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -14335,13 +15303,14 @@ INSTANTIATE_TEST_SUITE_P( "affinity=downstream annotated_text=Line 2<>"}})); INSTANTIATE_TEST_SUITE_P( - CreateNextParagraphStartPositionWithBoundaryBehaviorStopIfAlreadyAtBoundary, + CreateNextParagraphStartPositionWithBoundaryBehaviorStopAtAnchorBoundaryOrIfAlreadyAtBoundary, AXPositionTextNavigationTestWithParam, ::testing::Values( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), ROOT_ID, 0 /* text_offset */, @@ -14352,7 +15321,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, @@ -14363,22 +15333,25 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, - {"TextPosition anchor_id=9 text_offset=0 " - "affinity=downstream annotated_text=ine 2", - "TextPosition anchor_id=9 text_offset=0 " - "affinity=downstream annotated_text=ine 2"}}, + {"TextPosition anchor_id=5 text_offset=6 affinity=downstream " + "annotated_text=Line 1<>", + "TextPosition anchor_id=5 text_offset=6 affinity=downstream " + "annotated_text=Line 1<>"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, - {"NullPosition"}})); + {"TextPosition anchor_id=9 text_offset=6 affinity=downstream " + "annotated_text=Line 2<>"}})); INSTANTIATE_TEST_SUITE_P( CreateNextParagraphStartPositionWithBoundaryBehaviorStopAtLastAnchorBoundary, @@ -14387,7 +15360,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), ROOT_ID, 0 /* text_offset */, @@ -14400,7 +15373,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, @@ -14413,7 +15386,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, @@ -14426,7 +15399,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -14442,7 +15415,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), ROOT_ID, 13 /* text_offset at the end of root. */, @@ -14454,7 +15427,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), TEXT_FIELD_ID, 13 /* text_offset at end of text field */, @@ -14466,7 +15439,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), STATIC_TEXT1_ID, 5 /* text_offset */, @@ -14476,7 +15449,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -14493,7 +15466,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), ROOT_ID, 13 /* text_offset at the end of root. */, @@ -14506,7 +15479,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), TEXT_FIELD_ID, 13 /* text_offset at end of text field */, @@ -14519,7 +15492,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), STATIC_TEXT1_ID, 5 /* text_offset */, @@ -14530,7 +15503,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -14540,13 +15513,14 @@ INSTANTIATE_TEST_SUITE_P( "affinity=downstream annotated_text=ine 2"}})); INSTANTIATE_TEST_SUITE_P( - CreatePreviousParagraphStartPositionWithBoundaryBehaviorStopIfAlreadyAtBoundary, + CreatePreviousParagraphStartPositionWithBoundaryBehaviorStopAtAnchorBoundaryOrIfAlreadyAtBoundary, AXPositionTextNavigationTestWithParam, ::testing::Values( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), ROOT_ID, 13 /* text_offset at the end of root. */, @@ -14557,7 +15531,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), TEXT_FIELD_ID, 13 /* text_offset at end of text field */, @@ -14568,7 +15543,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), STATIC_TEXT1_ID, 5 /* text_offset */, @@ -14579,7 +15555,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -14595,7 +15572,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), ROOT_ID, 13 /* text_offset at the end of root. */, @@ -14610,7 +15587,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), TEXT_FIELD_ID, 13 /* text_offset at end of text field */, @@ -14623,7 +15600,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), STATIC_TEXT1_ID, 5 /* text_offset */, @@ -14634,7 +15611,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphStartPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -14652,7 +15629,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), ROOT_ID, 0 /* text_offset */, @@ -14664,7 +15641,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, @@ -14676,7 +15653,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, @@ -14688,7 +15665,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -14703,7 +15680,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), ROOT_ID, 0 /* text_offset */, @@ -14718,7 +15695,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, @@ -14733,7 +15710,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, @@ -14744,7 +15721,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -14754,13 +15731,14 @@ INSTANTIATE_TEST_SUITE_P( "affinity=downstream annotated_text=Line 2<>"}})); INSTANTIATE_TEST_SUITE_P( - CreateNextParagraphEndPositionWithBoundaryBehaviorStopIfAlreadyAtBoundary, + CreateNextParagraphEndPositionWithBoundaryBehaviorStopAtAnchorBoundaryOrIfAlreadyAtBoundary, AXPositionTextNavigationTestWithParam, ::testing::Values( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), ROOT_ID, 0 /* text_offset */, @@ -14776,18 +15754,20 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), TEXT_FIELD_ID, 5 /* text_offset */, {"TextPosition anchor_id=4 text_offset=6 " "affinity=downstream annotated_text=Line 1<\n>Line 2", - "TextPosition anchor_id=4 text_offset=13 " - "affinity=downstream annotated_text=Line 1\nLine 2<>"}}, + "TextPosition anchor_id=4 text_offset=6 affinity=downstream " + "annotated_text=Line 1<\n>Line 2"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, @@ -14798,7 +15778,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -14809,25 +15790,27 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), LINE_BREAK_ID, 0 /* text_offset */, - {"TextPosition anchor_id=9 text_offset=6 " - "affinity=downstream annotated_text=Line 2<>", - "TextPosition anchor_id=9 text_offset=6 " - "affinity=downstream annotated_text=Line 2<>"}}, + {"TextPosition anchor_id=7 text_offset=1 affinity=downstream " + "annotated_text=\n<>", + "TextPosition anchor_id=7 text_offset=1 affinity=downstream " + "annotated_text=\n<>"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), LINE_BREAK_ID, 1 /* text_offset */, - {"TextPosition anchor_id=9 text_offset=6 " - "affinity=downstream annotated_text=Line 2<>", - "TextPosition anchor_id=9 text_offset=6 " - "affinity=downstream annotated_text=Line 2<>"}})); + {"TextPosition anchor_id=7 text_offset=1 affinity=downstream " + "annotated_text=\n<>", + "TextPosition anchor_id=7 text_offset=1 affinity=downstream " + "annotated_text=\n<>"}})); INSTANTIATE_TEST_SUITE_P( CreateNextParagraphEndPositionWithBoundaryBehaviorStopAtLastAnchorBoundary, @@ -14836,7 +15819,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), ROOT_ID, 0 /* text_offset */, @@ -14849,7 +15832,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), TEXT_FIELD_ID, 0 /* text_offset */, @@ -14862,7 +15845,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), STATIC_TEXT1_ID, 1 /* text_offset */, @@ -14875,7 +15858,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreateNextParagraphEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -14891,7 +15874,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), ROOT_ID, 13 /* text_offset at end of root. */, @@ -14903,7 +15886,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), TEXT_FIELD_ID, 13 /* text_offset at end of text field */, @@ -14915,7 +15898,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), ROOT_ID, 5 /* text_offset on the last character of "Line 1". */, @@ -14925,7 +15908,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), TEXT_FIELD_ID, 5 /* text_offset on the last character of "Line 1". */, @@ -14935,7 +15918,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -14947,7 +15930,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); }), INLINE_BOX2_ID, 0 /* text_offset */, @@ -14964,7 +15947,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), ROOT_ID, 13 /* text_offset at end of root. */, @@ -14977,7 +15960,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), TEXT_FIELD_ID, 13 /* text_offset at end of text field */, @@ -14990,7 +15973,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), ROOT_ID, 5 /* text_offset on the last character of "Line 1". */, @@ -15001,7 +15984,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), TEXT_FIELD_ID, 5 /* text_offset on the last character of "Line 1". */, @@ -15012,7 +15995,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -15023,7 +16006,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopAtAnchorBoundary); + AXBoundaryBehavior::kStopAtAnchorBoundary); }), INLINE_BOX2_ID, 0 /* text_offset */, @@ -15033,13 +16016,14 @@ INSTANTIATE_TEST_SUITE_P( "annotated_text=ine 2"}})); INSTANTIATE_TEST_SUITE_P( - CreatePreviousParagraphEndPositionWithBoundaryBehaviorStopIfAlreadyAtBoundary, + CreatePreviousParagraphEndPositionWithBoundaryBehaviorStopAtAnchorBoundaryOrIfAlreadyAtBoundary, AXPositionTextNavigationTestWithParam, ::testing::Values( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), ROOT_ID, 12 /* text_offset one before the end of root. */, @@ -15050,7 +16034,8 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), TEXT_FIELD_ID, 12 /* text_offset one before the end of text field */, @@ -15061,58 +16046,63 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), INLINE_BOX1_ID, 2 /* text_offset */, - {"TextPosition anchor_id=3 text_offset=0 " - "affinity=downstream annotated_text=<>", - "TextPosition anchor_id=3 text_offset=0 " - "affinity=downstream annotated_text=<>"}}, + {"TextPosition anchor_id=6 text_offset=0 affinity=downstream " + "annotated_text=ine 1", + "TextPosition anchor_id=6 text_offset=0 affinity=downstream " + "annotated_text=ine 1"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, - {"TextPosition anchor_id=6 text_offset=6 " - "affinity=downstream annotated_text=Line 1<>", - "TextPosition anchor_id=6 text_offset=6 " - "affinity=downstream annotated_text=Line 1<>"}}, + {"TextPosition anchor_id=9 text_offset=0 affinity=downstream " + "annotated_text=ine 2", + "TextPosition anchor_id=9 text_offset=0 affinity=downstream " + "annotated_text=ine 2"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), INLINE_BOX2_ID, 0 /* text_offset */, - {"TextPosition anchor_id=6 text_offset=6 " - "affinity=downstream annotated_text=Line 1<>", - "TextPosition anchor_id=6 text_offset=6 " - "affinity=downstream annotated_text=Line 1<>"}}, + {"TextPosition anchor_id=9 text_offset=0 affinity=downstream " + "annotated_text=ine 2", + "TextPosition anchor_id=9 text_offset=0 affinity=downstream " + "annotated_text=ine 2"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), LINE_BREAK_ID, 0 /* text_offset */, - {"TextPosition anchor_id=6 text_offset=6 " - "affinity=downstream annotated_text=Line 1<>", - "TextPosition anchor_id=6 text_offset=6 " - "affinity=downstream annotated_text=Line 1<>"}}, + {"TextPosition anchor_id=7 text_offset=0 affinity=downstream " + "annotated_text=<\n>", + "TextPosition anchor_id=7 text_offset=0 affinity=downstream " + "annotated_text=<\n>"}}, TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary); + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary); }), LINE_BREAK_ID, 1 /* text_offset */, - {"TextPosition anchor_id=6 text_offset=6 " - "affinity=downstream annotated_text=Line 1<>", - "TextPosition anchor_id=6 text_offset=6 " - "affinity=downstream annotated_text=Line 1<>"}})); + {"TextPosition anchor_id=7 text_offset=0 affinity=downstream " + "annotated_text=<\n>", + "TextPosition anchor_id=7 text_offset=0 affinity=downstream " + "annotated_text=<\n>"}})); INSTANTIATE_TEST_SUITE_P( CreatePreviousParagraphEndPositionWithBoundaryBehaviorStopAtLastAnchorBoundary, @@ -15121,7 +16111,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), ROOT_ID, 13 /* text_offset at end of root. */, @@ -15134,7 +16124,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), TEXT_FIELD_ID, 13 /* text_offset at end of text field */, @@ -15147,7 +16137,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), ROOT_ID, 5 /* text_offset on the last character of "Line 1". */, @@ -15158,7 +16148,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), TEXT_FIELD_ID, 5 /* text_offset on the last character of "Line 1". */, @@ -15169,7 +16159,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), INLINE_BOX2_ID, 4 /* text_offset */, @@ -15182,7 +16172,7 @@ INSTANTIATE_TEST_SUITE_P( TextNavigationTestParam{ base::BindRepeating([](const TestPositionType& position) { return position->CreatePreviousParagraphEndPosition( - AXBoundaryBehavior::StopAtLastAnchorBoundary); + AXBoundaryBehavior::kStopAtLastAnchorBoundary); }), INLINE_BOX2_ID, 0 /* text_offset */, diff --git a/ui/accessibility/ax_position.h b/ui/accessibility/ax_position.h index beb5dd280c23a..186aba71cb022 100644 --- a/ui/accessibility/ax_position.h +++ b/ui/accessibility/ax_position.h @@ -47,13 +47,30 @@ namespace ui { enum class AXPositionKind { NULL_POSITION, TREE_POSITION, TEXT_POSITION }; // Defines how creating the next or previous position should behave whenever we -// are at or are crossing a boundary, such as at the start of an anchor, a word -// or a line. +// are at or are crossing a text boundary, (such as the start of a word or the +// end of a sentence), or whenever we are crossing the initial position's +// anchor. Note that the "anchor" is the node to which an AXPosition is attached +// to. It is provided when a position is created. enum class AXBoundaryBehavior { - CrossBoundary, - StopAtAnchorBoundary, - StopIfAlreadyAtBoundary, - StopAtLastAnchorBoundary + // Crosses all boundaries. If the bounds of the current window-like container, + // such as the current webpage, have been reached, returns a null position. + kCrossBoundary, + // Stops if the current anchor is crossed, regardless of how the resulting + // position has been computed. For example, even though in order to find the + // next or previous word start in a text field we need to descend to the leaf + // equivalent position, this behavior will only stop when the bounds of the + // original anchor, i.e. the text field, have been crossed. + kStopAtAnchorBoundary, + // Stops if the current anchor is crossed or if we are already at the + // requested boundary. For an example of the former, imagine a position inside + // a text field and the resulting position outside it. For an example of the + // latter, say we are moving to the previous word start position when we are + // already at the start of a word. + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary, + // Stops if we have reached the start or the end of of a window-like + // container, such as a webpage, a PDF, a dialog, the browser's UI (AKA + // Views), or the whole desktop. + kStopAtLastAnchorBoundary }; // Describes in further detail what type of boundary a current position is on. @@ -198,7 +215,8 @@ class AXPosition { base::RepeatingCallback; using BoundaryTextOffsetsFunc = - base::RepeatingCallback(const AXPositionInstance&)>; + base::RepeatingCallback&( + const AXPositionInstance&)>; static const int BEFORE_TEXT = -1; static const int INVALID_INDEX = -2; @@ -343,7 +361,7 @@ class AXPosition { } } - if (!IsTextPosition() || text_offset_ > MaxTextOffset()) + if (!IsTextPosition() || text_offset_ < 0 || text_offset_ > MaxTextOffset()) return str; const std::u16string& text = GetText(); @@ -558,7 +576,18 @@ class AXPosition { } bool AtStartOfWord() const { - AXPositionInstance text_position = AsLeafTextPosition(); + AXPositionInstance text_position; + if (!AtEndOfAnchor()) { + // We could get a leaf text position at the end of its anchor, where word + // start offsets would surely not be present. In such cases, we need to + // normalize to the start of the next leaf anchor. We avoid making this + // change when we are at the end of our anchor because this could + // effectively shift the position forward. + text_position = AsLeafTextPositionBeforeCharacter(); + } else { + text_position = AsLeafTextPosition(); + } + switch (text_position->kind_) { case AXPositionKind::NULL_POSITION: return false; @@ -566,7 +595,7 @@ class AXPosition { NOTREACHED(); return false; case AXPositionKind::TEXT_POSITION: { - const std::vector word_starts = + const std::vector& word_starts = text_position->GetWordStartOffsets(); return base::Contains(word_starts, int32_t{text_position->text_offset_}); @@ -575,7 +604,18 @@ class AXPosition { } bool AtEndOfWord() const { - AXPositionInstance text_position = AsLeafTextPosition(); + AXPositionInstance text_position; + if (!AtStartOfAnchor()) { + // We could get a leaf text position at the start of its anchor, where + // word end offsets would surely not be present. In such cases, we need to + // normalize to the end of the previous leaf anchor. We avoid making this + // change when we are at the start of our anchor because this could + // effectively shift the position backward. + text_position = AsLeafTextPositionAfterCharacter(); + } else { + text_position = AsLeafTextPosition(); + } + switch (text_position->kind_) { case AXPositionKind::NULL_POSITION: return false; @@ -583,13 +623,71 @@ class AXPosition { NOTREACHED(); return false; case AXPositionKind::TEXT_POSITION: { - const std::vector word_ends = + const std::vector& word_ends = text_position->GetWordEndOffsets(); return base::Contains(word_ends, int32_t{text_position->text_offset_}); } } } + bool AtStartOfSentence() const { + AXPositionInstance text_position; + if (!AtEndOfAnchor()) { + // We could get a leaf text position at the end of its anchor, where + // sentence start offsets would surely not be present. In such cases, we + // need to normalize to the start of the next leaf anchor. We avoid making + // this change when we are at the end of our anchor because this could + // effectively shift the position forward. + text_position = AsLeafTextPositionBeforeCharacter(); + } else { + text_position = AsLeafTextPosition(); + } + + switch (text_position->kind_) { + case AXPositionKind::NULL_POSITION: + return false; + case AXPositionKind::TREE_POSITION: + NOTREACHED(); + return false; + case AXPositionKind::TEXT_POSITION: { + const std::vector& sentence_starts = + text_position->GetAnchor()->GetIntListAttribute( + ax::mojom::IntListAttribute::kSentenceStarts); + return base::Contains(sentence_starts, + int32_t{text_position->text_offset_}); + } + } + } + + bool AtEndOfSentence() const { + AXPositionInstance text_position; + if (!AtStartOfAnchor()) { + // We could get a leaf text position at the start of its anchor, where + // sentence end offsets would surely not be present. In such cases, we + // need to normalize to the end of the previous leaf anchor. We avoid + // making this change when we are at the start of our anchor because this + // could effectively shift the position backward. + text_position = AsLeafTextPositionAfterCharacter(); + } else { + text_position = AsLeafTextPosition(); + } + + switch (text_position->kind_) { + case AXPositionKind::NULL_POSITION: + return false; + case AXPositionKind::TREE_POSITION: + NOTREACHED(); + return false; + case AXPositionKind::TEXT_POSITION: { + const std::vector& sentence_ends = + text_position->GetAnchor()->GetIntListAttribute( + ax::mojom::IntListAttribute::kSentenceEnds); + return base::Contains(sentence_ends, + int32_t{text_position->text_offset_}); + } + } + } + bool AtStartOfLine() const { AXPositionInstance text_position = AsLeafTextPosition(); switch (text_position->kind_) { @@ -1606,40 +1704,50 @@ class AXPosition { // text boundary, and creates an AXRange that spans from the former to the // latter. The resulting AXRange is always a forward range: its anchor always // comes before its focus in document order. The resulting AXRange is bounded - // by the anchor of this position, i.e. the AXBoundaryBehavior is set to - // StopAtAnchorBoundary. The exception is ax::mojom::TextBoundary::kWebPage, - // where this behavior won't make sense. This behavior is based on current - // platform needs and might be relaxed if necessary in the future. + // by the anchor of this position and the requested boundary type, i.e. the + // AXBoundaryBehavior is set to + // `AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary`. The + // exception is `ax::mojom::TextBoundary::kWebPage`, where this behavior won't + // make sense. This behavior is based on current platform needs and might be + // relaxed if necessary in the future. // - // Please note that |expand_behavior| should have no effect for - // ax::mojom::TextBoundary::kObject and ax::mojom::TextBoundary::kWebPage + // Observe that `expand_behavior` has an effect only when this position is + // between text units, e.g. between words, lines, paragraphs, etc. Also, + // please note that `expand_behavior` should have no effect for + // `ax::mojom::TextBoundary::kObject` and `ax::mojom::TextBoundary::kWebPage` // because the range should be the same regardless if we first move left or // right. AXRangeType ExpandToEnclosingTextBoundary( ax::mojom::TextBoundary boundary, AXRangeExpandBehavior expand_behavior) const { - AXBoundaryBehavior boundary_behavior = - AXBoundaryBehavior::StopAtAnchorBoundary; - if (boundary == ax::mojom::TextBoundary::kWebPage) - boundary_behavior = AXBoundaryBehavior::CrossBoundary; + AXBoundaryBehavior left_boundary_behavior = + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary; + AXBoundaryBehavior right_boundary_behavior = + AXBoundaryBehavior::kStopAtAnchorBoundary; + if (boundary == ax::mojom::TextBoundary::kWebPage) { + left_boundary_behavior = AXBoundaryBehavior::kCrossBoundary; + right_boundary_behavior = AXBoundaryBehavior::kCrossBoundary; + } switch (expand_behavior) { case AXRangeExpandBehavior::kLeftFirst: { AXPositionInstance left_position = CreatePositionAtTextBoundary( - boundary, ax::mojom::MoveDirection::kBackward, boundary_behavior); + boundary, ax::mojom::MoveDirection::kBackward, + left_boundary_behavior); AXPositionInstance right_position = left_position->CreatePositionAtTextBoundary( boundary, ax::mojom::MoveDirection::kForward, - boundary_behavior); + right_boundary_behavior); return AXRangeType(std::move(left_position), std::move(right_position)); } case AXRangeExpandBehavior::kRightFirst: { AXPositionInstance right_position = CreatePositionAtTextBoundary( - boundary, ax::mojom::MoveDirection::kForward, boundary_behavior); + boundary, ax::mojom::MoveDirection::kForward, + left_boundary_behavior); AXPositionInstance left_position = right_position->CreatePositionAtTextBoundary( boundary, ax::mojom::MoveDirection::kBackward, - boundary_behavior); + right_boundary_behavior); return AXRangeType(std::move(left_position), std::move(right_position)); } } @@ -1898,19 +2006,55 @@ class AXPosition { break; case ax::mojom::TextBoundary::kSentenceEnd: - NOTREACHED() << "Sentence boundaries are not yet supported."; - return CreateNullPosition(); + switch (direction) { + case ax::mojom::MoveDirection::kNone: + NOTREACHED(); + break; + case ax::mojom::MoveDirection::kBackward: + resulting_position = + CreatePreviousSentenceEndPosition(boundary_behavior); + break; + case ax::mojom::MoveDirection::kForward: + resulting_position = + CreateNextSentenceEndPosition(boundary_behavior); + break; + } + break; case ax::mojom::TextBoundary::kSentenceStart: - NOTREACHED() << "Sentence boundaries are not yet supported."; - return CreateNullPosition(); + switch (direction) { + case ax::mojom::MoveDirection::kNone: + NOTREACHED(); + break; + case ax::mojom::MoveDirection::kBackward: + resulting_position = + CreatePreviousSentenceStartPosition(boundary_behavior); + break; + case ax::mojom::MoveDirection::kForward: + resulting_position = + CreateNextSentenceStartPosition(boundary_behavior); + break; + } + break; case ax::mojom::TextBoundary::kSentenceStartOrEnd: - NOTREACHED() << "Sentence boundaries are not yet supported."; - return CreateNullPosition(); + switch (direction) { + case ax::mojom::MoveDirection::kNone: + NOTREACHED(); + break; + case ax::mojom::MoveDirection::kBackward: + resulting_position = + CreatePreviousSentenceStartPosition(boundary_behavior); + break; + case ax::mojom::MoveDirection::kForward: + resulting_position = + CreateNextSentenceEndPosition(boundary_behavior); + break; + } + break; case ax::mojom::TextBoundary::kWebPage: - DCHECK_EQ(boundary_behavior, AXBoundaryBehavior::CrossBoundary) + DCHECK_EQ(boundary_behavior, AXBoundaryBehavior::kCrossBoundary) << "We can't reach the start of the whole contents if we are " "disallowed from crossing boundaries."; switch (direction) { @@ -2499,17 +2643,18 @@ class AXPosition { // See also http://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries AXPositionInstance CreateNextCharacterPosition( AXBoundaryBehavior boundary_behavior) const { - if (boundary_behavior == AXBoundaryBehavior::StopAtAnchorBoundary && + if ((boundary_behavior == AXBoundaryBehavior::kStopAtAnchorBoundary || + boundary_behavior == + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary) && AtEndOfAnchor()) { return Clone(); } AXPositionInstance text_position = AsLeafTextPositionBeforeCharacter(); if (text_position->IsNullPosition()) { - if (boundary_behavior == AXBoundaryBehavior::StopIfAlreadyAtBoundary || - boundary_behavior == AXBoundaryBehavior::StopAtLastAnchorBoundary) { + if (boundary_behavior != AXBoundaryBehavior::kCrossBoundary) text_position = Clone(); - } + return text_position; } @@ -2525,7 +2670,8 @@ class AXPosition { // positions that have the same affinity, since // `AsLeafTextPositionBeforeCharacter` resets the affinity to downstream, // while the original affinity might have been upstream. - if (boundary_behavior == AXBoundaryBehavior::StopIfAlreadyAtBoundary && + if (boundary_behavior == + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary && (AtEndOfAnchor() || *text_position == *CloneWithDownstreamAffinity())) { return Clone(); } @@ -2551,9 +2697,9 @@ class AXPosition { if (GetAnchor() == common_anchor) { text_position = text_position->CreateAncestorPosition( common_anchor, ax::mojom::MoveDirection::kForward); - } else if (boundary_behavior == AXBoundaryBehavior::StopAtAnchorBoundary) { + } else if (boundary_behavior == AXBoundaryBehavior::kStopAtAnchorBoundary) { // If the next character position crosses the current anchor boundary - // with StopAtAnchorBoundary, snap to the end of the current anchor. + // with kStopAtAnchorBoundary, snap to the end of the current anchor. return CreatePositionAtEndOfAnchor(); } @@ -2575,17 +2721,18 @@ class AXPosition { // grapheme cluster. AXPositionInstance CreatePreviousCharacterPosition( AXBoundaryBehavior boundary_behavior) const { - if (boundary_behavior == AXBoundaryBehavior::StopAtAnchorBoundary && + if ((boundary_behavior == AXBoundaryBehavior::kStopAtAnchorBoundary || + boundary_behavior == + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary) && AtStartOfAnchor()) { return Clone(); } AXPositionInstance text_position = AsLeafTextPositionAfterCharacter(); if (text_position->IsNullPosition()) { - if (boundary_behavior == AXBoundaryBehavior::StopIfAlreadyAtBoundary || - boundary_behavior == AXBoundaryBehavior::StopAtLastAnchorBoundary) { + if (boundary_behavior != AXBoundaryBehavior::kCrossBoundary) text_position = Clone(); - } + return text_position; } @@ -2600,7 +2747,8 @@ class AXPosition { // our current anchor. We also need to ignore any differences that might be // due to the affinity, because that should not be a determining factor as // to whether we would stop if we are already at boundary or not. - if (boundary_behavior == AXBoundaryBehavior::StopIfAlreadyAtBoundary && + if (boundary_behavior == + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary && (AtStartOfAnchor() || *text_position == *CloneWithUpstreamAffinity() || *text_position == *CloneWithDownstreamAffinity())) { return Clone(); @@ -2625,7 +2773,7 @@ class AXPosition { if (GetAnchor() == common_anchor) { text_position = text_position->CreateAncestorPosition( common_anchor, ax::mojom::MoveDirection::kBackward); - } else if (boundary_behavior == AXBoundaryBehavior::StopAtAnchorBoundary) { + } else if (boundary_behavior == AXBoundaryBehavior::kStopAtAnchorBoundary) { // If the previous character position crosses the current anchor boundary // with StopAtAnchorBoundary, snap to the start of the current anchor. return CreatePositionAtStartOfAnchor(); @@ -2839,18 +2987,30 @@ class AXPosition { BoundaryConditionPredicate at_end_condition, BoundaryTextOffsetsFunc get_start_offsets = BoundaryTextOffsetsFunc()) const { - AXPositionInstance text_position = AsLeafTextPosition(); + AXPositionInstance text_position; + if (!AtEndOfAnchor()) { + // We could get a leaf text position at the end of its anchor, where + // boundary start offsets would surely not be present. In such cases, we + // need to normalize to the start of the next leaf anchor. We avoid making + // this change when we are at the end of our anchor because this could + // effectively shift the position forward. + text_position = AsLeafTextPositionBeforeCharacter(); + } else { + text_position = AsLeafTextPosition(); + } + if (text_position->IsNullPosition()) return text_position; - if (boundary_behavior != AXBoundaryBehavior::StopIfAlreadyAtBoundary) { + if (boundary_behavior != + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary) { text_position = text_position->CreateAdjacentLeafTextPosition(move_direction); if (text_position->IsNullPosition()) { // There is no adjacent position to move to; in such case, CrossBoundary // behavior shall return a null position, while any other behavior shall // fallback to return the initial position. - if (boundary_behavior == AXBoundaryBehavior::CrossBoundary) + if (boundary_behavior == AXBoundaryBehavior::kCrossBoundary) return text_position; return Clone(); } @@ -2883,7 +3043,10 @@ class AXPosition { } if (next_position->IsNullPosition()) { - if (boundary_behavior == AXBoundaryBehavior::StopAtAnchorBoundary) { + if (boundary_behavior == AXBoundaryBehavior::kStopAtAnchorBoundary || + boundary_behavior == + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary) { switch (move_direction) { case ax::mojom::MoveDirection::kNone: NOTREACHED(); @@ -2898,7 +3061,7 @@ class AXPosition { } if (boundary_behavior == - AXBoundaryBehavior::StopAtLastAnchorBoundary) { + AXBoundaryBehavior::kStopAtLastAnchorBoundary) { // We can't simply return the following position; break and after // this loop we'll try to do some adjustments to text_position. switch (move_direction) { @@ -2934,7 +3097,10 @@ class AXPosition { if (GetAnchor() == common_anchor) { text_position = text_position->CreateAncestorPosition(common_anchor, move_direction); - } else if (boundary_behavior == AXBoundaryBehavior::StopAtAnchorBoundary) { + } else if (boundary_behavior == AXBoundaryBehavior::kStopAtAnchorBoundary || + boundary_behavior == + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary) { switch (move_direction) { case ax::mojom::MoveDirection::kNone: NOTREACHED(); @@ -2955,14 +3121,13 @@ class AXPosition { text_position = text_position->AsTreePosition(); AXPositionInstance unignored_position = text_position->AsUnignoredPosition( AXPositionAdjustmentBehavior::kMoveForward); - // If there are no unignored positions in |move_direction| then - // `text_position` is anchored in ignored content at the end of the whole - // content. For StopAtLastAnchorBoundary, try to adjust in the opposite - // direction to return a position within the whole content just before - // crossing into the ignored content. This will be the last unignored anchor - // boundary. + // If there are no unignored positions then `text_position` is anchored in + // ignored content at the end of the whole content. For + // `kStopAtLastAnchorBoundary`, try to adjust in the opposite direction to + // return a position within the whole content just before crossing into the + // ignored content. This will be the last unignored anchor boundary. if (unignored_position->IsNullPosition() && - boundary_behavior == AXBoundaryBehavior::StopAtLastAnchorBoundary) { + boundary_behavior == AXBoundaryBehavior::kStopAtLastAnchorBoundary) { unignored_position = text_position->AsUnignoredPosition( AXPositionAdjustmentBehavior::kMoveBackward); } @@ -2976,18 +3141,30 @@ class AXPosition { BoundaryConditionPredicate at_end_condition, BoundaryTextOffsetsFunc get_end_offsets = BoundaryTextOffsetsFunc()) const { - AXPositionInstance text_position = AsLeafTextPosition(); + AXPositionInstance text_position; + if (!AtStartOfAnchor()) { + // We could get a leaf text position at the start of its anchor, where + // boundary end offsets would surely not be present. In such cases, we + // need to normalize to the end of the previous leaf anchor. We avoid + // making this change when we are at the start of our anchor because this + // could effectively shift the position backward. + text_position = AsLeafTextPositionAfterCharacter(); + } else { + text_position = AsLeafTextPosition(); + } + if (text_position->IsNullPosition()) return text_position; - if (boundary_behavior != AXBoundaryBehavior::StopIfAlreadyAtBoundary) { + if (boundary_behavior != + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary) { text_position = text_position->CreateAdjacentLeafTextPosition(move_direction); if (text_position->IsNullPosition()) { // There is no adjacent position to move to; in such case, CrossBoundary // behavior shall return a null position, while any other behavior shall // fallback to return the initial position. - if (boundary_behavior == AXBoundaryBehavior::CrossBoundary) + if (boundary_behavior == AXBoundaryBehavior::kCrossBoundary) return text_position; return Clone(); } @@ -3023,7 +3200,10 @@ class AXPosition { } if (next_position->IsNullPosition()) { - if (boundary_behavior == AXBoundaryBehavior::StopAtAnchorBoundary) { + if (boundary_behavior == AXBoundaryBehavior::kStopAtAnchorBoundary || + boundary_behavior == + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary) { switch (move_direction) { case ax::mojom::MoveDirection::kNone: NOTREACHED(); @@ -3038,7 +3218,7 @@ class AXPosition { } if (boundary_behavior == - AXBoundaryBehavior::StopAtLastAnchorBoundary) { + AXBoundaryBehavior::kStopAtLastAnchorBoundary) { // We can't simply return the following position; break and after // this loop we'll try to do some adjustments to text_position. switch (move_direction) { @@ -3074,7 +3254,10 @@ class AXPosition { if (GetAnchor() == common_anchor) { text_position = text_position->CreateAncestorPosition(common_anchor, move_direction); - } else if (boundary_behavior == AXBoundaryBehavior::StopAtAnchorBoundary) { + } else if (boundary_behavior == AXBoundaryBehavior::kStopAtAnchorBoundary || + boundary_behavior == + AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary) { switch (move_direction) { case ax::mojom::MoveDirection::kNone: NOTREACHED(); @@ -3101,7 +3284,7 @@ class AXPosition { text_position->CloneWithDownstreamAffinity(); if (downstream_position->AtStartOfAnchor() || downstream_position->AtEndOfAnchor() || - !at_start_condition.Run(downstream_position)) { + !downstream_position->AtStartOfLine()) { text_position->affinity_ = ax::mojom::TextAffinity::kDownstream; } } @@ -3110,21 +3293,54 @@ class AXPosition { text_position = text_position->AsTreePosition(); AXPositionInstance unignored_position = text_position->AsUnignoredPosition( AXPositionAdjustmentBehavior::kMoveBackward); - // If there are no unignored positions in |move_direction| then - // |text_position| is anchored in ignored content at the start or end - // of the whole content. - // For StopAtLastAnchorBoundary, try to adjust in the opposite direction - // to return a position within the whole content just before crossing into - // the ignored content. This will be the last unignored anchor boundary. + // If there are no unignored positions then `text_position` is anchored in + // ignored content at the start or end of the whole content. For + // `kStopAtLastAnchorBoundary`, try to adjust in the opposite direction to + // return a position within the whole content just before crossing into the + // ignored content. This will be the last unignored anchor boundary. if (unignored_position->IsNullPosition() && - boundary_behavior == AXBoundaryBehavior::StopAtLastAnchorBoundary) { + boundary_behavior == AXBoundaryBehavior::kStopAtLastAnchorBoundary) { unignored_position = text_position->AsUnignoredPosition( AXPositionAdjustmentBehavior::kMoveForward); } return unignored_position; } - // TODO(nektar): Add sentence navigation methods. + AXPositionInstance CreateNextSentenceStartPosition( + AXBoundaryBehavior boundary_behavior) const { + return CreateBoundaryStartPosition( + boundary_behavior, ax::mojom::MoveDirection::kForward, + base::BindRepeating(&AtStartOfSentencePredicate), + base::BindRepeating(&AtEndOfSentencePredicate), + base::BindRepeating(&GetSentenceStartOffsetsFunc)); + } + + AXPositionInstance CreatePreviousSentenceStartPosition( + AXBoundaryBehavior boundary_behavior) const { + return CreateBoundaryStartPosition( + boundary_behavior, ax::mojom::MoveDirection::kBackward, + base::BindRepeating(&AtStartOfSentencePredicate), + base::BindRepeating(&AtEndOfSentencePredicate), + base::BindRepeating(&GetSentenceStartOffsetsFunc)); + } + + AXPositionInstance CreateNextSentenceEndPosition( + AXBoundaryBehavior boundary_behavior) const { + return CreateBoundaryEndPosition( + boundary_behavior, ax::mojom::MoveDirection::kForward, + base::BindRepeating(&AtStartOfSentencePredicate), + base::BindRepeating(&AtEndOfSentencePredicate), + base::BindRepeating(&GetSentenceEndOffsetsFunc)); + } + + AXPositionInstance CreatePreviousSentenceEndPosition( + AXBoundaryBehavior boundary_behavior) const { + return CreateBoundaryEndPosition( + boundary_behavior, ax::mojom::MoveDirection::kBackward, + base::BindRepeating(&AtStartOfSentencePredicate), + base::BindRepeating(&AtEndOfSentencePredicate), + base::BindRepeating(&GetSentenceEndOffsetsFunc)); + } // Uses depth-first pre-order traversal. AXPositionInstance CreateNextAnchorPosition() const { @@ -3649,13 +3865,13 @@ class AXPosition { if (GetAnchor()->IsCollapsedMenuListPopUpButton()) return true; - // All anchor nodes that are empty leaf nodes or have only ignored - // descendants should be treated as empty objects. Empty leaf nodes do not - // expose their descendants to platform accessibility APIs, but may have - // unignored descendants. They do not have any text content, however, hence - // they are still empty from our perspective. For example, an empty text - // field may still have an unignored generic container inside it. - if (AnchorUnignoredChildCount() && !GetAnchor()->IsEmptyLeaf()) + // All anchor nodes that are empty leaf nodes should be treated as empty + // objects. Empty leaf nodes do not expose their descendants to platform + // accessibility APIs, but may have unignored descendants. They do not have + // any inner text, hence they are empty from our perspective. For example, + // an empty text field may still have an unignored generic container inside + // it. + if (!GetAnchor()->IsEmptyLeaf()) return false; // and elements with non empty children should not be @@ -4092,35 +4308,55 @@ class AXPosition { return current_anchor_text_attributes; } - std::vector GetWordStartOffsets() const { - if (IsNullPosition()) - return std::vector(); + const std::vector& GetWordStartOffsets() const { + if (IsNullPosition()) { + static const base::NoDestructor> empty_word_starts; + return *empty_word_starts; + } DCHECK(GetAnchor()); - // Embedded object replacement characters are not represented in the - // "kWordStarts" attribute so we need to special case them here. - if (IsEmptyObjectReplacedByCharacter()) - return {0}; + // An embedded object replacement character is exposed in a node's text + // representation when a control, such as a text field, is empty. Since the + // control has no text, no word start offsets are present in the + // `ax::mojom::IntListAttribute::kWordStarts` attribute, so we need to + // special case them here. + if (IsEmptyObjectReplacedByCharacter()) { + // Using braces ensures that the vector will contain the given value, and + // not create a vector of size 0. + static const base::NoDestructor> + embedded_word_starts({0}); + return *embedded_word_starts; + } return GetAnchor()->GetIntListAttribute( ax::mojom::IntListAttribute::kWordStarts); } - std::vector GetWordEndOffsets() const { - if (IsNullPosition()) - return std::vector(); + const std::vector& GetWordEndOffsets() const { + if (IsNullPosition()) { + static const base::NoDestructor> empty_word_ends; + return *empty_word_ends; + } DCHECK(GetAnchor()); - // Embedded object replacement characters are not represented in the - // "kWordEnds" attribute so we need to special case them here. + // An embedded object replacement character is exposed in a node's text + // representation when a control, such as a text field, is empty. Since the + // control has no text, no word end offsets are present in the + // `ax::mojom::IntListAttribute::kWordEnds` attribute, so we need to special + // case them here. // // Since the whole text exposed inside of an embedded object is of // length 1 (the embedded object replacement character), the word end offset - // is positioned at 1. Because we want to treat the embedded object - // replacement characters as ordinary characters, it wouldn't be consistent - // to assume they have no length and return 0 instead of 1. - if (IsEmptyObjectReplacedByCharacter()) - return {1}; + // is positioned at 1. Because we want to treat embedded object replacement + // characters as ordinary characters, it wouldn't be consistent to assume + // they have no length and return 0 instead of 1. + if (IsEmptyObjectReplacedByCharacter()) { + // Using braces ensures that the vector will contain the given value, and + // not create a vector of size 1. + static const base::NoDestructor> embedded_word_ends( + {1}); + return *embedded_word_ends; + } return GetAnchor()->GetIntListAttribute( ax::mojom::IntListAttribute::kWordEnds); @@ -4442,6 +4678,22 @@ class AXPosition { return position->AtEndOfLine(); } + static bool AtStartOfSentencePredicate(const AXPositionInstance& position) { + // Sentence boundaries should be at specific text offsets that are "visible" + // to assistive software, hence not ignored. Ignored nodes are often used + // for additional layout information, such as line and paragraph boundaries. + // Their text is not currently processed. + return !position->IsIgnored() && position->AtStartOfSentence(); + } + + static bool AtEndOfSentencePredicate(const AXPositionInstance& position) { + // Sentence boundaries should be at specific text offsets that are "visible" + // to assistive software, hence not ignored. Ignored nodes are often used + // for additional layout information, such as line and paragraph boundaries. + // Their text is not currently processed. + return !position->IsIgnored() && position->AtEndOfSentence(); + } + static bool AtStartOfFormatPredicate(const AXPositionInstance& position) { return position->AtStartOfFormat(); } @@ -4667,12 +4919,35 @@ class AXPosition { return false; } - static std::vector GetWordStartOffsetsFunc( + static const std::vector& GetSentenceStartOffsetsFunc( + const AXPositionInstance& position) { + if (position->IsNullPosition()) { + static const base::NoDestructor> + empty_sentence_starts; + return *empty_sentence_starts; + } + DCHECK(position->GetAnchor()); + return position->GetAnchor()->GetIntListAttribute( + ax::mojom::IntListAttribute::kSentenceStarts); + } + + static const std::vector& GetSentenceEndOffsetsFunc( + const AXPositionInstance& position) { + if (position->IsNullPosition()) { + static const base::NoDestructor> empty_sentence_ends; + return *empty_sentence_ends; + } + DCHECK(position->GetAnchor()); + return position->GetAnchor()->GetIntListAttribute( + ax::mojom::IntListAttribute::kSentenceEnds); + } + + static const std::vector& GetWordStartOffsetsFunc( const AXPositionInstance& position) { return position->GetWordStartOffsets(); } - static std::vector GetWordEndOffsetsFunc( + static const std::vector& GetWordEndOffsetsFunc( const AXPositionInstance& position) { return position->GetWordEndOffsets(); } @@ -4758,7 +5033,7 @@ class AXPosition { return Clone(); AXPositionInstance text_position = AsTextPosition(); - const std::vector boundary_offsets = + const std::vector& boundary_offsets = get_offsets.Run(text_position); if (boundary_offsets.empty()) return text_position; @@ -4813,7 +5088,7 @@ class AXPosition { return Clone(); AXPositionInstance text_position = AsTextPosition(); - const std::vector boundary_offsets = + const std::vector& boundary_offsets = get_offsets.Run(text_position); switch (move_direction) { case ax::mojom::MoveDirection::kNone: @@ -4846,15 +5121,16 @@ class AXPosition { // // This method is the first step for CreateBoundary[Start|End]Position to // guarantee that the resulting position when using a boundary behavior other - // than `AXBoundaryBehavior::StopIfAlreadyAtBoundary` is not equivalent to the - // initial position. That's why ignored positions are also skipped. Otherwise, - // if a boundary is present on an ignored position, the search for the next or - // previous boundary would stop prematurely. Note that if there are multiple - // adjacent ignored positions and all of them create a boundary, we'll skip - // them all on purpose. For example, adjacent ignored paragraph boundaries - // could be created by using multiple aria-hidden divs next to one another. - // These should not contribute more than one paragraph boundary to the tree's - // text representation, otherwise this will create user confusion. + // than `AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary` is + // not equivalent to the initial position. That's why ignored positions are + // also skipped. Otherwise, if a boundary is present on an ignored position, + // the search for the next or previous boundary would stop prematurely. Note + // that if there are multiple adjacent ignored positions and all of them + // create a boundary, we'll skip them all on purpose. For example, adjacent + // ignored paragraph boundaries could be created by using multiple aria-hidden + // divs next to one another. These should not contribute more than one + // paragraph boundary to the tree's text representation, otherwise this will + // create user confusion. // // Note that using the `CompareTo` method with text positions does not take // into account position affinity or the order of their anchors in the tree: diff --git a/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc b/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc index 909dcacc3698d..e2c5a8e317e27 100644 --- a/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc +++ b/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc @@ -1300,8 +1300,7 @@ TEST_F(AXPlatformNodeAuraLinuxTest, TestAtkTextCharacterGranularity) { AXNodeData root; root.id = 1; root.role = ax::mojom::Role::kTextField; - root.AddStringAttribute(ax::mojom::StringAttribute::kValue, - "A decently long string \xE2\x98\xBA with an emoji."); + root.SetValue("A decently long string \xE2\x98\xBA with an emoji."); Init(root); AtkObject* root_obj(GetRootAtkObject()); @@ -1519,7 +1518,8 @@ TEST_F(AXPlatformNodeAuraLinuxTest, TestAtkTextSentenceGranularity) { } #if ATK_CHECK_VERSION(2, 10, 0) -TEST_F(AXPlatformNodeAuraLinuxTest, TestAtkTextParagraphGranularity) { +TEST_F(AXPlatformNodeAuraLinuxTest, DISABLED_TestAtkTextParagraphGranularity) { + // TODO(nektar): Enable navigating by paragraphs in plain text. AXNodeData root; root.id = 1; root.role = ax::mojom::Role::kTextField; diff --git a/ui/accessibility/platform/ax_platform_node_base.cc b/ui/accessibility/platform/ax_platform_node_base.cc index d049c57234759..8776c85ccc29d 100644 --- a/ui/accessibility/platform/ax_platform_node_base.cc +++ b/ui/accessibility/platform/ax_platform_node_base.cc @@ -2004,17 +2004,27 @@ int AXPlatformNodeBase::FindTextBoundary( ax::mojom::MoveDirection direction, ax::mojom::TextAffinity affinity) const { DCHECK_NE(boundary, ax::mojom::TextBoundary::kNone); - if (boundary != ax::mojom::TextBoundary::kSentenceStart) { - absl::optional boundary_offset = - GetDelegate()->FindTextBoundary(boundary, offset, direction, affinity); - if (boundary_offset.has_value()) - return *boundary_offset; - } - - std::vector unused_line_start_offsets; - return static_cast( - FindAccessibleTextBoundary(GetHypertext(), unused_line_start_offsets, - boundary, offset, direction, affinity)); + if (!delegate_) + return offset; // Unable to compute text boundary. + + const AXPosition position = delegate_->CreateTextPositionAt(offset, affinity); + // On Windows and Linux ATK, searching for a text boundary should always stop + // at the boundary of the current object. + auto boundary_behavior = AXBoundaryBehavior::kStopAtAnchorBoundary; + // On Windows and Linux ATK, it is standard text navigation behavior to stop + // if we are searching in the backwards direction and the current position is + // already at the required text boundary. + if (direction == ax::mojom::MoveDirection::kBackward) { + boundary_behavior = + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary; + } + + const AXPosition boundary_position = position->CreatePositionAtTextBoundary( + boundary, direction, boundary_behavior); + if (boundary_position->IsNullPosition()) + return -1; + DCHECK_GE(boundary_position->text_offset(), 0); + return boundary_position->text_offset(); } AXPlatformNodeBase* AXPlatformNodeBase::NearestLeafToPoint( diff --git a/ui/accessibility/platform/ax_platform_node_base.h b/ui/accessibility/platform/ax_platform_node_base.h index 3ad7323461725..01f92d824df4d 100644 --- a/ui/accessibility/platform/ax_platform_node_base.h +++ b/ui/accessibility/platform/ax_platform_node_base.h @@ -15,6 +15,7 @@ #include "build/build_config.h" #include "ui/accessibility/ax_enums.mojom-forward.h" #include "ui/accessibility/ax_node.h" +#include "ui/accessibility/ax_node_position.h" #include "ui/accessibility/ax_text_attributes.h" #include "ui/accessibility/platform/ax_platform_node.h" #include "ui/accessibility/platform/ax_platform_node_delegate.h" @@ -60,6 +61,8 @@ struct AX_EXPORT AXLegacyHypertext { class AX_EXPORT AXPlatformNodeBase : public AXPlatformNode { public: + using AXPosition = AXNodePosition::AXPositionInstance; + ~AXPlatformNodeBase() override; AXPlatformNodeBase(const AXPlatformNodeBase&) = delete; AXPlatformNodeBase& operator=(const AXPlatformNodeBase&) = delete; @@ -348,6 +351,7 @@ class AX_EXPORT AXPlatformNodeBase : public AXPlatformNode { // This method finds text boundaries in the text used for platform text APIs. // Implementations may use side-channel data such as line or word indices to // produce appropriate results. + // Returns -1 if the requested boundary has not been found. virtual int FindTextBoundary(ax::mojom::TextBoundary boundary, int offset, ax::mojom::MoveDirection direction, diff --git a/ui/accessibility/platform/ax_platform_node_delegate.h b/ui/accessibility/platform/ax_platform_node_delegate.h index f17c867256278..ab273dc839bc9 100644 --- a/ui/accessibility/platform/ax_platform_node_delegate.h +++ b/ui/accessibility/platform/ax_platform_node_delegate.h @@ -469,21 +469,6 @@ class AX_EXPORT AXPlatformNodeDelegate { virtual const AXUniqueId& GetUniqueId() const = 0; - // Finds the previous or next offset from the provided offset, that matches - // the provided boundary type. - // - // This method finds text boundaries in the text used for platform text APIs. - // Implementations may use side-channel data such as line or word indices to - // produce appropriate results. It may optionally return no value, indicating - // that the delegate does not have all the information required to calculate - // this value and it is the responsibility of the AXPlatformNode itself to - // to calculate it. - virtual absl::optional FindTextBoundary( - ax::mojom::TextBoundary boundary, - int offset, - ax::mojom::MoveDirection direction, - ax::mojom::TextAffinity affinity) const = 0; - // Return a vector of all the descendants of this delegate's node. This method // is only meaningful for Windows UIA. virtual const std::vector diff --git a/ui/accessibility/platform/ax_platform_node_delegate_base.cc b/ui/accessibility/platform/ax_platform_node_delegate_base.cc index a97184ad037ed..44593eff036b4 100644 --- a/ui/accessibility/platform/ax_platform_node_delegate_base.cc +++ b/ui/accessibility/platform/ax_platform_node_delegate_base.cc @@ -265,7 +265,6 @@ const AXTree::Selection AXPlatformNodeDelegateBase::GetUnignoredSelection() AXNodePosition::AXPositionInstance AXPlatformNodeDelegateBase::CreatePositionAt( int offset, ax::mojom::TextAffinity affinity) const { - NOTIMPLEMENTED(); return AXNodePosition::CreateNullPosition(); } @@ -273,7 +272,6 @@ AXNodePosition::AXPositionInstance AXPlatformNodeDelegateBase::CreateTextPositionAt( int offset, ax::mojom::TextAffinity affinity) const { - NOTIMPLEMENTED(); return AXNodePosition::CreateNullPosition(); } @@ -943,14 +941,6 @@ const AXUniqueId& AXPlatformNodeDelegateBase::GetUniqueId() const { return *dummy_unique_id; } -absl::optional AXPlatformNodeDelegateBase::FindTextBoundary( - ax::mojom::TextBoundary boundary, - int offset, - ax::mojom::MoveDirection direction, - ax::mojom::TextAffinity affinity) const { - return absl::nullopt; -} - const std::vector AXPlatformNodeDelegateBase::GetUIADirectChildrenInRange( ui::AXPlatformNodeDelegate* start, diff --git a/ui/accessibility/platform/ax_platform_node_delegate_base.h b/ui/accessibility/platform/ax_platform_node_delegate_base.h index fde3016cf65c6..f06fbc7ea2dce 100644 --- a/ui/accessibility/platform/ax_platform_node_delegate_base.h +++ b/ui/accessibility/platform/ax_platform_node_delegate_base.h @@ -275,12 +275,6 @@ class AX_EXPORT AXPlatformNodeDelegateBase : public AXPlatformNodeDelegate { const AXUniqueId& GetUniqueId() const override; - absl::optional FindTextBoundary( - ax::mojom::TextBoundary boundary, - int offset, - ax::mojom::MoveDirection direction, - ax::mojom::TextAffinity affinity) const override; - const std::vector GetUIADirectChildrenInRange( ui::AXPlatformNodeDelegate* start, ui::AXPlatformNodeDelegate* end) override; diff --git a/ui/accessibility/platform/ax_platform_node_textprovider_win.cc b/ui/accessibility/platform/ax_platform_node_textprovider_win.cc index 5d7e546452736..b7fd12de21677 100644 --- a/ui/accessibility/platform/ax_platform_node_textprovider_win.cc +++ b/ui/accessibility/platform/ax_platform_node_textprovider_win.cc @@ -146,7 +146,7 @@ HRESULT AXPlatformNodeTextProviderWin::GetVisibleRanges( auto current_line_start = start->Clone(); while (!current_line_start->IsNullPosition() && *current_line_start < *end) { auto current_line_end = current_line_start->CreateNextLineEndPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); if (current_line_end->IsNullPosition() || *current_line_end > *end) current_line_end = end->Clone(); @@ -163,7 +163,7 @@ HRESULT AXPlatformNodeTextProviderWin::GetVisibleRanges( } current_line_start = current_line_start->CreateNextLineStartPosition( - AXBoundaryBehavior::CrossBoundary); + AXBoundaryBehavior::kCrossBoundary); } base::win::ScopedSafearray scoped_visible_ranges( diff --git a/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc b/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc index 77083e5be7c1d..d58ac425d59ea 100644 --- a/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc +++ b/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc @@ -219,14 +219,14 @@ HRESULT AXPlatformNodeTextRangeProviderWin::ExpandToEnclosingUnitImpl( // boundary, thus we only need to move the end position. AXPositionInstance end_backup = end()->Clone(); SetEnd(start()->CreateNextCharacterPosition( - AXBoundaryBehavior::CrossBoundary)); + AXBoundaryBehavior::kCrossBoundary)); if (end()->IsNullPosition()) { // The previous could fail if the start is at the end of the last anchor // of the tree, try expanding to the previous character instead. AXPositionInstance start_backup = start()->Clone(); SetStart(start()->CreatePreviousCharacterPosition( - AXBoundaryBehavior::CrossBoundary)); + AXBoundaryBehavior::kCrossBoundary)); if (start()->IsNullPosition()) { // Text representation is empty, undo everything and exit. @@ -235,7 +235,7 @@ HRESULT AXPlatformNodeTextRangeProviderWin::ExpandToEnclosingUnitImpl( return S_OK; } SetEnd(start()->CreateNextCharacterPosition( - AXBoundaryBehavior::CrossBoundary)); + AXBoundaryBehavior::kCrossBoundary)); DCHECK(!end()->IsNullPosition()); } @@ -248,39 +248,31 @@ HRESULT AXPlatformNodeTextRangeProviderWin::ExpandToEnclosingUnitImpl( } case TextUnit_Format: SetStart(start()->CreatePreviousFormatStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary)); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary)); SetEnd(start()->CreateNextFormatEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary)); + AXBoundaryBehavior::kStopAtLastAnchorBoundary)); break; case TextUnit_Word: { AXPositionInstance start_backup = start()->Clone(); SetStart(start()->CreatePreviousWordStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary)); - // Since we use AXBoundaryBehavior::StopIfAlreadyAtBoundary, the only case - // possible where CreatePreviousWordStartPosition can return a - // NullPosition is when it's called on a node before the first word - // boundary. This can happen when the document starts with nodes that have - // no word boundaries, like whitespaces and punctuation. When it happens, - // move the position back to the start of the document. - if (start()->IsNullPosition()) - SetStart(start_backup->CreatePositionAtStartOfContent()); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary)); // Since start_ is already located at a word boundary, we need to cross it // in order to move to the next one. Because Windows ATs behave // undesirably when the start and end endpoints are not in the same anchor // (for character and word navigation), stop at anchor boundary. SetEnd(start()->CreateNextWordStartPosition( - AXBoundaryBehavior::StopAtAnchorBoundary)); + AXBoundaryBehavior::kStopAtAnchorBoundary)); break; } case TextUnit_Line: SetStart(start()->CreateBoundaryStartPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary, + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary, ax::mojom::MoveDirection::kBackward, base::BindRepeating(&AtStartOfLinePredicate), base::BindRepeating(&AtEndOfLinePredicate))); SetEnd(start()->CreateBoundaryEndPosition( - AXBoundaryBehavior::StopIfAlreadyAtBoundary, + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary, ax::mojom::MoveDirection::kForward, base::BindRepeating(&AtStartOfLinePredicate), base::BindRepeating(&AtEndOfLinePredicate))); @@ -288,9 +280,9 @@ HRESULT AXPlatformNodeTextRangeProviderWin::ExpandToEnclosingUnitImpl( case TextUnit_Paragraph: SetStart( start()->CreatePreviousParagraphStartPositionSkippingEmptyParagraphs( - AXBoundaryBehavior::StopIfAlreadyAtBoundary)); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary)); SetEnd(start()->CreateNextParagraphStartPositionSkippingEmptyParagraphs( - AXBoundaryBehavior::StopAtLastAnchorBoundary)); + AXBoundaryBehavior::kStopAtLastAnchorBoundary)); break; case TextUnit_Page: { // Per UIA spec, if the document containing the current range doesn't @@ -298,9 +290,10 @@ HRESULT AXPlatformNodeTextRangeProviderWin::ExpandToEnclosingUnitImpl( const AXNode* common_anchor = start()->LowestCommonAnchor(*end()); if (common_anchor->tree()->HasPaginationSupport()) { SetStart(start()->CreatePreviousPageStartPosition( - ui::AXBoundaryBehavior::StopIfAlreadyAtBoundary)); + AXBoundaryBehavior::kStopAtAnchorBoundaryOrIfAlreadyAtBoundary)); SetEnd(start()->CreateNextPageEndPosition( - ui::AXBoundaryBehavior::StopIfAlreadyAtBoundary)); + ui::AXBoundaryBehavior:: + kStopAtAnchorBoundaryOrIfAlreadyAtBoundary)); break; } } @@ -1238,13 +1231,14 @@ AXPlatformNodeTextRangeProviderWin::MoveEndpointByUnitHelper( do { AXPositionInstance next_endpoint = GetNextTextBoundaryPosition( current_endpoint, boundary_type, - AXBoundaryBehavior::StopAtLastAnchorBoundary, boundary_direction); + AXBoundaryBehavior::kStopAtLastAnchorBoundary, boundary_direction); DCHECK(next_endpoint->IsLeafTextPosition()); - // Since AXBoundaryBehavior::StopAtLastAnchorBoundary forces the next text - // boundary position to be different than the input position, the only - // case where these are equal is when they're already located at the last - // anchor boundary. In such case, there is no next position to move to. + // Since AXBoundaryBehavior::kStopAtLastAnchorBoundary forces the next + // text boundary position to be different than the input position, the + // only case where these are equal is when they're already located at the + // last anchor boundary. In such case, there is no next position to move + // to. if (next_endpoint->GetAnchor() == current_endpoint->GetAnchor() && *next_endpoint == *current_endpoint) { *units_moved = (count > 0) ? iteration : -iteration; diff --git a/ui/accessibility/platform/ax_platform_node_unittest.cc b/ui/accessibility/platform/ax_platform_node_unittest.cc index a3aaa537fdeb4..d427e384861e6 100644 --- a/ui/accessibility/platform/ax_platform_node_unittest.cc +++ b/ui/accessibility/platform/ax_platform_node_unittest.cc @@ -26,36 +26,37 @@ void AXPlatformNodeTest::Init( const ui::AXNodeData& node6 /* = ui::AXNodeData() */, const ui::AXNodeData& node7 /* = ui::AXNodeData() */, const ui::AXNodeData& node8 /* = ui::AXNodeData() */, - const ui::AXNodeData& node9 /* = ui::AXNodeData() */, - const ui::AXNodeData& node10 /* = ui::AXNodeData() */, - const ui::AXNodeData& node11 /* = ui::AXNodeData() */, - const ui::AXNodeData& node12 /* = ui::AXNodeData() */) { - static ui::AXNodeData empty_data; - int32_t no_id = empty_data.id; + const ui::AXNodeData& node9 /* = AXNodeData() */, + const ui::AXNodeData& node10 /* = AXNodeData() */, + const ui::AXNodeData& node11 /* = AXNodeData() */, + const ui::AXNodeData& node12 /* = AXNodeData() */) { AXTreeUpdate update; update.root_id = node1.id; + update.has_tree_data = true; + update.tree_data.tree_id = AXTreeID::CreateNewAXTreeID(); + update.tree_data.title = "Dialog title"; update.nodes.push_back(node1); - if (node2.id != no_id) + if (node2.id != kInvalidAXNodeID) update.nodes.push_back(node2); - if (node3.id != no_id) + if (node3.id != kInvalidAXNodeID) update.nodes.push_back(node3); - if (node4.id != no_id) + if (node4.id != kInvalidAXNodeID) update.nodes.push_back(node4); - if (node5.id != no_id) + if (node5.id != kInvalidAXNodeID) update.nodes.push_back(node5); - if (node6.id != no_id) + if (node6.id != kInvalidAXNodeID) update.nodes.push_back(node6); - if (node7.id != no_id) + if (node7.id != kInvalidAXNodeID) update.nodes.push_back(node7); - if (node8.id != no_id) + if (node8.id != kInvalidAXNodeID) update.nodes.push_back(node8); - if (node9.id != no_id) + if (node9.id != kInvalidAXNodeID) update.nodes.push_back(node9); - if (node10.id != no_id) + if (node10.id != kInvalidAXNodeID) update.nodes.push_back(node10); - if (node11.id != no_id) + if (node11.id != kInvalidAXNodeID) update.nodes.push_back(node11); - if (node12.id != no_id) + if (node12.id != kInvalidAXNodeID) update.nodes.push_back(node12); Init(update); } diff --git a/ui/accessibility/platform/ax_platform_node_unittest.h b/ui/accessibility/platform/ax_platform_node_unittest.h index b71bc5a57327d..298c6c40b4afa 100644 --- a/ui/accessibility/platform/ax_platform_node_unittest.h +++ b/ui/accessibility/platform/ax_platform_node_unittest.h @@ -27,18 +27,18 @@ class AXPlatformNodeTest : public ::testing::Test, public TestAXTreeManager { void Init(const AXTreeUpdate& initial_state); // Convenience functions to initialize directly from a few AXNodeData objects. - void Init(const ui::AXNodeData& node1, - const ui::AXNodeData& node2 = ui::AXNodeData(), - const ui::AXNodeData& node3 = ui::AXNodeData(), - const ui::AXNodeData& node4 = ui::AXNodeData(), - const ui::AXNodeData& node5 = ui::AXNodeData(), - const ui::AXNodeData& node6 = ui::AXNodeData(), - const ui::AXNodeData& node7 = ui::AXNodeData(), - const ui::AXNodeData& node8 = ui::AXNodeData(), - const ui::AXNodeData& node9 = ui::AXNodeData(), - const ui::AXNodeData& node10 = ui::AXNodeData(), - const ui::AXNodeData& node11 = ui::AXNodeData(), - const ui::AXNodeData& node12 = ui::AXNodeData()); + void Init(const AXNodeData& node1, + const AXNodeData& node2 = AXNodeData(), + const AXNodeData& node3 = AXNodeData(), + const AXNodeData& node4 = AXNodeData(), + const AXNodeData& node5 = AXNodeData(), + const AXNodeData& node6 = AXNodeData(), + const AXNodeData& node7 = AXNodeData(), + const AXNodeData& node8 = AXNodeData(), + const AXNodeData& node9 = AXNodeData(), + const AXNodeData& node10 = AXNodeData(), + const AXNodeData& node11 = AXNodeData(), + const AXNodeData& node12 = AXNodeData()); AXTreeUpdate BuildTextField(); AXTreeUpdate BuildTextFieldWithSelectionRange(int32_t start, int32_t stop); diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc index 4a51f2f5f24b6..ddf9a441e78ef 100644 --- a/ui/accessibility/platform/ax_platform_node_win.cc +++ b/ui/accessibility/platform/ax_platform_node_win.cc @@ -3606,12 +3606,6 @@ HRESULT AXPlatformNodeWin::IAccessibleTextGetTextForOffsetType( AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes | AXMode::kInlineTextBoxes); - // https://accessibility.linuxfoundation.org/a11yspecs/ia2/docs/html/_accessible_text_8idl.html - // IA2_TEXT_BOUNDARY_SENTENCE is optional and we can let the screenreader - // handle it, the rest of the boundary types must be supported. - if (boundary_type == IA2_TEXT_BOUNDARY_SENTENCE) - return S_FALSE; - HandleSpecialTextOffset(&offset); if (offset < 0) return E_INVALIDARG; @@ -3634,7 +3628,6 @@ HRESULT AXPlatformNodeWin::IAccessibleTextGetTextForOffsetType( } LONG start, end; - switch (text_offset_type) { case TextOffsetType::kAtOffset: { end = FindBoundary(boundary_type, offset,