Commit b9442af0 authored by Kurt Catti-Schmidt's avatar Kurt Catti-Schmidt Committed by Commit Bot

Implement ExpandToEnclosingUnit for TextUnit_Format

This change builds upon the functionality for AXPosition added in
https://chromium-review.googlesource.com/c/chromium/src/+/1584596

Unit tests were added.

Bug: 928948
Change-Id: Id52d39a73725a35a9b041ea2c3172c4a9c522171
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1594084Reviewed-by: default avatarKevin Babbitt <kbabbitt@microsoft.com>
Commit-Queue: Dominic Mazzoni <dmazzoni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#658745}
parent 60031ab6
...@@ -717,4 +717,54 @@ IN_PROC_BROWSER_TEST_F(AXPlatformNodeTextRangeProviderWinBrowserTest, ...@@ -717,4 +717,54 @@ IN_PROC_BROWSER_TEST_F(AXPlatformNodeTextRangeProviderWinBrowserTest,
L"2", L"2",
/*expected_count*/ -1); /*expected_count*/ -1);
} }
IN_PROC_BROWSER_TEST_F(AXPlatformNodeTextRangeProviderWinBrowserTest,
ExpandToEnclosingFormat) {
LoadInitialAccessibilityTreeFromHtml(
R"HTML(<!DOCTYPE html>
<html>
<body>
<div>plain</div>
<div>text</div>
<div style="font-style: italic">italic<div>
<div style="font-style: italic">text<div>
</body>
</html>)HTML");
auto* node = FindNode(ax::mojom::Role::kStaticText, "plain");
ASSERT_NE(nullptr, node);
EXPECT_TRUE(node->PlatformIsLeaf());
EXPECT_EQ(0u, node->PlatformChildCount());
ComPtr<ITextRangeProvider> text_range_provider;
GetTextRangeProviderFromTextNode(text_range_provider, node);
ASSERT_NE(nullptr, text_range_provider.Get());
EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"plain");
EXPECT_UIA_MOVE_ENDPOINT_BY_UNIT(
text_range_provider, TextPatternRangeEndpoint_Start, TextUnit_Character,
/*count*/ 3,
/*expected_text*/ L"in",
/*expected_count*/ 3);
ASSERT_HRESULT_SUCCEEDED(
text_range_provider->ExpandToEnclosingUnit(TextUnit_Format));
EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"plaintext");
EXPECT_UIA_MOVE_ENDPOINT_BY_UNIT(
text_range_provider, TextPatternRangeEndpoint_End, TextUnit_Character,
/*count*/ 3,
/*expected_text*/ L"plaintextita",
/*expected_count*/ 3);
EXPECT_UIA_MOVE_ENDPOINT_BY_UNIT(
text_range_provider, TextPatternRangeEndpoint_Start, TextUnit_Character,
/*count*/ 10,
/*expected_text*/ L"ta",
/*expected_count*/ 10);
ASSERT_HRESULT_SUCCEEDED(
text_range_provider->ExpandToEnclosingUnit(TextUnit_Format));
EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"italictext");
}
} // namespace content } // namespace content
...@@ -134,7 +134,11 @@ STDMETHODIMP AXPlatformNodeTextRangeProviderWin::ExpandToEnclosingUnit( ...@@ -134,7 +134,11 @@ STDMETHODIMP AXPlatformNodeTextRangeProviderWin::ExpandToEnclosingUnit(
return S_OK; return S_OK;
} }
case TextUnit_Format: case TextUnit_Format:
return E_NOTIMPL; start_ = start_->CreatePreviousFormatStartPosition(
ui::AXBoundaryBehavior::StopIfAlreadyAtBoundary);
end_ = start_->CreateNextFormatEndPosition(
ui::AXBoundaryBehavior::StopIfAlreadyAtBoundary);
return S_OK;
case TextUnit_Word: case TextUnit_Word:
start_ = start_->CreatePreviousWordStartPosition( start_ = start_->CreatePreviousWordStartPosition(
ui::AXBoundaryBehavior::StopIfAlreadyAtBoundary); ui::AXBoundaryBehavior::StopIfAlreadyAtBoundary);
......
...@@ -850,6 +850,70 @@ TEST_F(AXPlatformNodeTextRangeProviderTest, ...@@ -850,6 +850,70 @@ TEST_F(AXPlatformNodeTextRangeProviderTest,
EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"not line #1"); EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"not line #1");
} }
TEST_F(AXPlatformNodeTextRangeProviderTest,
TestITextRangeProviderExpandToEnclosingFormat) {
Init(BuildAXTreeForMoveByFormat());
AXNodePosition::SetTreeForTesting(tree_.get());
AXNode* root_node = GetRootNode();
ComPtr<ITextRangeProvider> text_range_provider;
GetTextRangeProviderFromTextNode(text_range_provider, root_node);
EXPECT_UIA_TEXTRANGE_EQ(
text_range_provider,
L"Text with formattingStandalone line with no formattingbold "
L"textParagraph 1Paragraph 2Paragraph 3");
ASSERT_HRESULT_SUCCEEDED(
text_range_provider->ExpandToEnclosingUnit(TextUnit_Format));
EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"Text with formatting");
// Set it up so that the text range is in the middle of a format boundary
// and expand by format.
int count;
ASSERT_HRESULT_SUCCEEDED(
text_range_provider->Move(TextUnit_Character, /*count*/ 31, &count));
ASSERT_EQ(31, count);
EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"l");
ASSERT_HRESULT_SUCCEEDED(
text_range_provider->ExpandToEnclosingUnit(TextUnit_Format));
EXPECT_UIA_TEXTRANGE_EQ(text_range_provider,
L"Standalone line with no formatting");
ASSERT_HRESULT_SUCCEEDED(
text_range_provider->Move(TextUnit_Character, /*count*/ 35, &count));
ASSERT_EQ(35, count);
EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"o");
ASSERT_HRESULT_SUCCEEDED(
text_range_provider->ExpandToEnclosingUnit(TextUnit_Format));
EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"bold text");
ASSERT_HRESULT_SUCCEEDED(
text_range_provider->Move(TextUnit_Character, /*count*/ 10, &count));
ASSERT_EQ(10, count);
EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"a");
ASSERT_HRESULT_SUCCEEDED(
text_range_provider->ExpandToEnclosingUnit(TextUnit_Format));
EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"Paragraph 1");
ASSERT_HRESULT_SUCCEEDED(
text_range_provider->Move(TextUnit_Character, /*count*/ 15, &count));
ASSERT_EQ(15, count);
EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"g");
ASSERT_HRESULT_SUCCEEDED(
text_range_provider->ExpandToEnclosingUnit(TextUnit_Format));
EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"Paragraph 2Paragraph 3");
// Test expanding a degenerate range
ASSERT_HRESULT_SUCCEEDED(text_range_provider->MoveEndpointByUnit(
TextPatternRangeEndpoint_End, TextUnit_Character, /*count*/ -22, &count));
ASSERT_EQ(-22, count);
EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"");
ASSERT_HRESULT_SUCCEEDED(
text_range_provider->ExpandToEnclosingUnit(TextUnit_Format));
EXPECT_UIA_TEXTRANGE_EQ(text_range_provider, L"Paragraph 2Paragraph 3");
}
TEST_F(AXPlatformNodeTextRangeProviderTest, TEST_F(AXPlatformNodeTextRangeProviderTest,
TestITextRangeProviderExpandToEnclosingDocument) { TestITextRangeProviderExpandToEnclosingDocument) {
Init(BuildTextDocument({"some text", "more text", "even more text"})); Init(BuildTextDocument({"some text", "more text", "even more text"}));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment