diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-07-31 15:50:41 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-08-30 12:35:23 +0000 |
commit | 7b2ffa587235a47d4094787d72f38102089f402a (patch) | |
tree | 30e82af9cbab08a7fa028bb18f4f2987a3f74dfa /chromium/content/browser/accessibility/browser_accessibility_unittest.cc | |
parent | d94af01c90575348c4e81a418257f254b6f8d225 (diff) | |
download | qtwebengine-chromium-7b2ffa587235a47d4094787d72f38102089f402a.tar.gz |
BASELINE: Update Chromium to 76.0.3809.94
Change-Id: I321c3f5f929c105aec0f98c5091ef6108822e647
Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
Diffstat (limited to 'chromium/content/browser/accessibility/browser_accessibility_unittest.cc')
-rw-r--r-- | chromium/content/browser/accessibility/browser_accessibility_unittest.cc | 428 |
1 files changed, 428 insertions, 0 deletions
diff --git a/chromium/content/browser/accessibility/browser_accessibility_unittest.cc b/chromium/content/browser/accessibility/browser_accessibility_unittest.cc index d070c069c87..873b961a61f 100644 --- a/chromium/content/browser/accessibility/browser_accessibility_unittest.cc +++ b/chromium/content/browser/accessibility/browser_accessibility_unittest.cc @@ -175,4 +175,432 @@ TEST_F(BrowserAccessibilityTest, TestGetDescendants) { } #endif // defined(OS_WIN) || BUILDFLAG(USE_ATK) +TEST_F(BrowserAccessibilityTest, GetInnerTextRangeBoundsRect) { + ui::AXNodeData root; + root.id = 1; + root.role = ax::mojom::Role::kRootWebArea; + root.relative_bounds.bounds = gfx::RectF(0, 0, 800, 600); + + ui::AXNodeData static_text; + static_text.id = 2; + static_text.SetName("Hello, world."); + static_text.role = ax::mojom::Role::kStaticText; + static_text.relative_bounds.bounds = gfx::RectF(100, 100, 29, 18); + root.child_ids.push_back(2); + + ui::AXNodeData inline_text1; + inline_text1.id = 3; + inline_text1.SetName("Hello, "); + inline_text1.role = ax::mojom::Role::kInlineTextBox; + inline_text1.relative_bounds.bounds = gfx::RectF(100, 100, 29, 9); + inline_text1.SetTextDirection(ax::mojom::TextDirection::kLtr); + std::vector<int32_t> character_offsets1; + character_offsets1.push_back(6); + character_offsets1.push_back(11); + character_offsets1.push_back(16); + character_offsets1.push_back(21); + character_offsets1.push_back(26); + character_offsets1.push_back(29); + character_offsets1.push_back(29); + inline_text1.AddIntListAttribute( + ax::mojom::IntListAttribute::kCharacterOffsets, character_offsets1); + static_text.child_ids.push_back(3); + + ui::AXNodeData inline_text2; + inline_text2.id = 4; + inline_text2.SetName("world."); + inline_text2.role = ax::mojom::Role::kInlineTextBox; + inline_text2.relative_bounds.bounds = gfx::RectF(100, 109, 28, 9); + inline_text2.SetTextDirection(ax::mojom::TextDirection::kLtr); + std::vector<int32_t> character_offsets2; + character_offsets2.push_back(5); + character_offsets2.push_back(10); + character_offsets2.push_back(15); + character_offsets2.push_back(20); + character_offsets2.push_back(25); + character_offsets2.push_back(28); + inline_text2.AddIntListAttribute( + ax::mojom::IntListAttribute::kCharacterOffsets, character_offsets2); + static_text.child_ids.push_back(4); + + std::unique_ptr<BrowserAccessibilityManager> browser_accessibility_manager( + BrowserAccessibilityManager::Create( + MakeAXTreeUpdate(root, static_text, inline_text1, inline_text2), + test_browser_accessibility_delegate_.get(), + new BrowserAccessibilityFactory())); + + BrowserAccessibility* root_accessible = + browser_accessibility_manager->GetRoot(); + ASSERT_NE(nullptr, root_accessible); + BrowserAccessibility* static_text_accessible = + root_accessible->PlatformGetChild(0); + ASSERT_NE(nullptr, static_text_accessible); + +#ifdef OS_ANDROID + // Android disallows getting inner text from root accessibility nodes. + EXPECT_EQ(gfx::Rect(0, 0, 0, 0).ToString(), + root_accessible + ->GetInnerTextRangeBoundsRect( + 0, 1, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); +#else + // Validate the bounding box of 'H' from root. + EXPECT_EQ(gfx::Rect(100, 100, 6, 9).ToString(), + root_accessible + ->GetInnerTextRangeBoundsRect( + 0, 1, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); +#endif + + // Validate the bounding box of 'H' from static text. + EXPECT_EQ(gfx::Rect(100, 100, 6, 9).ToString(), + static_text_accessible + ->GetInnerTextRangeBoundsRect( + 0, 1, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); + + // Validate the bounding box of 'Hello' from static text. + EXPECT_EQ(gfx::Rect(100, 100, 26, 9).ToString(), + static_text_accessible + ->GetInnerTextRangeBoundsRect( + 0, 5, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); + + // Validate the bounding box of 'Hello, world.' from static text. + EXPECT_EQ(gfx::Rect(100, 100, 29, 18).ToString(), + static_text_accessible + ->GetInnerTextRangeBoundsRect( + 0, 13, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); + +#ifdef OS_ANDROID + // Android disallows getting inner text from root accessibility nodes. + EXPECT_EQ(gfx::Rect(0, 0, 0, 0).ToString(), + root_accessible + ->GetInnerTextRangeBoundsRect( + 0, 13, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); +#else + // Validate the bounding box of 'Hello, world.' from root. + EXPECT_EQ(gfx::Rect(100, 100, 29, 18).ToString(), + root_accessible + ->GetInnerTextRangeBoundsRect( + 0, 13, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); +#endif +} + +TEST_F(BrowserAccessibilityTest, GetInnerTextRangeBoundsRectMultiElement) { + ui::AXNodeData root; + root.id = 1; + root.role = ax::mojom::Role::kRootWebArea; + root.relative_bounds.bounds = gfx::RectF(0, 0, 800, 600); + + ui::AXNodeData static_text; + static_text.id = 2; + static_text.SetName("ABC"); + static_text.role = ax::mojom::Role::kStaticText; + static_text.relative_bounds.bounds = gfx::RectF(0, 20, 33, 9); + root.child_ids.push_back(2); + + ui::AXNodeData inline_text1; + inline_text1.id = 3; + inline_text1.SetName("ABC"); + inline_text1.role = ax::mojom::Role::kInlineTextBox; + inline_text1.relative_bounds.bounds = gfx::RectF(0, 20, 33, 9); + inline_text1.SetTextDirection(ax::mojom::TextDirection::kLtr); + std::vector<int32_t> character_offsets{10, 21, 33}; + inline_text1.AddIntListAttribute( + ax::mojom::IntListAttribute::kCharacterOffsets, character_offsets); + static_text.child_ids.push_back(3); + + ui::AXNodeData static_text2; + static_text2.id = 4; + static_text2.SetName("ABC"); + static_text2.role = ax::mojom::Role::kStaticText; + static_text2.relative_bounds.bounds = gfx::RectF(10, 40, 33, 9); + root.child_ids.push_back(4); + + ui::AXNodeData inline_text2; + inline_text2.id = 5; + inline_text2.SetName("ABC"); + inline_text2.role = ax::mojom::Role::kInlineTextBox; + inline_text2.relative_bounds.bounds = gfx::RectF(10, 40, 33, 9); + inline_text2.SetTextDirection(ax::mojom::TextDirection::kLtr); + inline_text2.AddIntListAttribute( + ax::mojom::IntListAttribute::kCharacterOffsets, character_offsets); + static_text2.child_ids.push_back(5); + + std::unique_ptr<BrowserAccessibilityManager> browser_accessibility_manager( + BrowserAccessibilityManager::Create( + MakeAXTreeUpdate(root, static_text, inline_text1, static_text2, + inline_text2), + test_browser_accessibility_delegate_.get(), + new BrowserAccessibilityFactory())); + + BrowserAccessibility* root_accessible = + browser_accessibility_manager->GetRoot(); + ASSERT_NE(nullptr, root_accessible); + BrowserAccessibility* static_text_accessible = + root_accessible->PlatformGetChild(0); + ASSERT_NE(nullptr, static_text_accessible); + BrowserAccessibility* static_text_accessible2 = + root_accessible->PlatformGetChild(1); + ASSERT_NE(nullptr, static_text_accessible); + + // Validate the bounds of 'ABC' on the first line. + EXPECT_EQ(gfx::Rect(0, 20, 33, 9).ToString(), + static_text_accessible + ->GetInnerTextRangeBoundsRect( + 0, 3, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); + + // Validate the bounds of only 'AB' on the first line. + EXPECT_EQ(gfx::Rect(0, 20, 21, 9).ToString(), + static_text_accessible + ->GetInnerTextRangeBoundsRect( + 0, 2, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); + + // Validate the bounds of only 'BC' on the first line. + EXPECT_EQ(gfx::Rect(10, 20, 23, 9).ToString(), + static_text_accessible + ->GetInnerTextRangeBoundsRect( + 1, 3, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); + + // Validate the bounds of 'ABC' on the second line. + EXPECT_EQ(gfx::Rect(10, 40, 33, 9).ToString(), + static_text_accessible2 + ->GetInnerTextRangeBoundsRect( + 0, 3, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); + +#ifdef OS_ANDROID + // Android disallows getting inner text from accessibility root nodes. + EXPECT_EQ(gfx::Rect(0, 0, 0, 0).ToString(), + root_accessible + ->GetInnerTextRangeBoundsRect( + 0, 6, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); + + // Android disallows getting inner text from accessibility root nodes. + EXPECT_EQ(gfx::Rect(0, 0, 0, 0).ToString(), + root_accessible + ->GetInnerTextRangeBoundsRect( + 2, 4, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); +#else + // Validate the bounds of 'ABCABC' from both lines. + EXPECT_EQ(gfx::Rect(0, 20, 43, 29).ToString(), + root_accessible + ->GetInnerTextRangeBoundsRect( + 0, 6, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); + + // Validate the bounds of 'CA' from both lines. + EXPECT_EQ(gfx::Rect(10, 20, 23, 29).ToString(), + root_accessible + ->GetInnerTextRangeBoundsRect( + 2, 4, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); +#endif +} + +TEST_F(BrowserAccessibilityTest, GetInnerTextRangeBoundsRectBiDi) { + // In this example, we assume that the string "123abc" is rendered with "123" + // going left-to-right and "abc" going right-to-left. In other words, + // on-screen it would look like "123cba". + ui::AXNodeData root; + root.id = 1; + root.role = ax::mojom::Role::kRootWebArea; + root.relative_bounds.bounds = gfx::RectF(0, 0, 800, 600); + + ui::AXNodeData static_text; + static_text.id = 2; + static_text.SetName("123abc"); + static_text.role = ax::mojom::Role::kStaticText; + static_text.relative_bounds.bounds = gfx::RectF(100, 100, 60, 20); + root.child_ids.push_back(2); + + ui::AXNodeData inline_text1; + inline_text1.id = 3; + inline_text1.SetName("123"); + inline_text1.role = ax::mojom::Role::kInlineTextBox; + inline_text1.relative_bounds.bounds = gfx::RectF(100, 100, 30, 20); + inline_text1.SetTextDirection(ax::mojom::TextDirection::kLtr); + std::vector<int32_t> character_offsets1; + character_offsets1.push_back(10); // 0 + character_offsets1.push_back(20); // 1 + character_offsets1.push_back(30); // 2 + inline_text1.AddIntListAttribute( + ax::mojom::IntListAttribute::kCharacterOffsets, character_offsets1); + static_text.child_ids.push_back(3); + + ui::AXNodeData inline_text2; + inline_text2.id = 4; + inline_text2.SetName("abc"); + inline_text2.role = ax::mojom::Role::kInlineTextBox; + inline_text2.relative_bounds.bounds = gfx::RectF(130, 100, 30, 20); + inline_text2.SetTextDirection(ax::mojom::TextDirection::kRtl); + std::vector<int32_t> character_offsets2; + character_offsets2.push_back(10); + character_offsets2.push_back(20); + character_offsets2.push_back(30); + inline_text2.AddIntListAttribute( + ax::mojom::IntListAttribute::kCharacterOffsets, character_offsets2); + static_text.child_ids.push_back(4); + + std::unique_ptr<BrowserAccessibilityManager> browser_accessibility_manager( + BrowserAccessibilityManager::Create( + MakeAXTreeUpdate(root, static_text, inline_text1, inline_text2), + test_browser_accessibility_delegate_.get(), + new BrowserAccessibilityFactory())); + + BrowserAccessibility* root_accessible = + browser_accessibility_manager->GetRoot(); + ASSERT_NE(nullptr, root_accessible); + BrowserAccessibility* static_text_accessible = + root_accessible->PlatformGetChild(0); + ASSERT_NE(nullptr, static_text_accessible); + + EXPECT_EQ(gfx::Rect(100, 100, 60, 20).ToString(), + static_text_accessible + ->GetInnerTextRangeBoundsRect( + 0, 6, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); + + EXPECT_EQ(gfx::Rect(100, 100, 10, 20).ToString(), + static_text_accessible + ->GetInnerTextRangeBoundsRect( + 0, 1, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); + + EXPECT_EQ(gfx::Rect(100, 100, 30, 20).ToString(), + static_text_accessible + ->GetInnerTextRangeBoundsRect( + 0, 3, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); + + EXPECT_EQ(gfx::Rect(150, 100, 10, 20).ToString(), + static_text_accessible + ->GetInnerTextRangeBoundsRect( + 3, 4, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); + + EXPECT_EQ(gfx::Rect(130, 100, 30, 20).ToString(), + static_text_accessible + ->GetInnerTextRangeBoundsRect( + 3, 6, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); + + // This range is only two characters, but because of the direction switch + // the bounds are as wide as four characters. + EXPECT_EQ(gfx::Rect(120, 100, 40, 20).ToString(), + static_text_accessible + ->GetInnerTextRangeBoundsRect( + 2, 4, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); +} + +TEST_F(BrowserAccessibilityTest, GetInnerTextRangeBoundsRectScrolledWindow) { + ui::AXNodeData root; + root.id = 1; + root.role = ax::mojom::Role::kRootWebArea; + root.AddIntAttribute(ax::mojom::IntAttribute::kScrollX, 25); + root.AddIntAttribute(ax::mojom::IntAttribute::kScrollY, 50); + root.relative_bounds.bounds = gfx::RectF(0, 0, 800, 600); + + ui::AXNodeData static_text; + static_text.id = 2; + static_text.SetName("ABC"); + static_text.role = ax::mojom::Role::kStaticText; + static_text.relative_bounds.bounds = gfx::RectF(100, 100, 16, 9); + root.child_ids.push_back(2); + + ui::AXNodeData inline_text; + inline_text.id = 3; + inline_text.SetName("ABC"); + inline_text.role = ax::mojom::Role::kInlineTextBox; + inline_text.relative_bounds.bounds = gfx::RectF(100, 100, 16, 9); + inline_text.SetTextDirection(ax::mojom::TextDirection::kLtr); + std::vector<int32_t> character_offsets1; + character_offsets1.push_back(6); // 0 + character_offsets1.push_back(11); // 1 + character_offsets1.push_back(16); // 2 + inline_text.AddIntListAttribute( + ax::mojom::IntListAttribute::kCharacterOffsets, character_offsets1); + static_text.child_ids.push_back(3); + + std::unique_ptr<BrowserAccessibilityManager> browser_accessibility_manager( + BrowserAccessibilityManager::Create( + MakeAXTreeUpdate(root, static_text, inline_text), + test_browser_accessibility_delegate_.get(), + new BrowserAccessibilityFactory())); + + BrowserAccessibility* root_accessible = + browser_accessibility_manager->GetRoot(); + ASSERT_NE(nullptr, root_accessible); + BrowserAccessibility* static_text_accessible = + root_accessible->PlatformGetChild(0); + ASSERT_NE(nullptr, static_text_accessible); + + if (browser_accessibility_manager + ->UseRootScrollOffsetsWhenComputingBounds()) { + EXPECT_EQ(gfx::Rect(75, 50, 16, 9).ToString(), + static_text_accessible + ->GetInnerTextRangeBoundsRect( + 0, 3, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); + } else { + EXPECT_EQ(gfx::Rect(100, 100, 16, 9).ToString(), + static_text_accessible + ->GetInnerTextRangeBoundsRect( + 0, 3, ui::AXCoordinateSystem::kRootFrame, + ui::AXClippingBehavior::kUnclipped) + .ToString()); + } +} + +TEST_F(BrowserAccessibilityTest, GetAuthorUniqueId) { + ui::AXNodeData root; + root.id = 1; + root.role = ax::mojom::Role::kRootWebArea; + root.html_attributes.push_back(std::make_pair("id", "my_html_id")); + + std::unique_ptr<BrowserAccessibilityManager> browser_accessibility_manager( + BrowserAccessibilityManager::Create( + MakeAXTreeUpdate(root), test_browser_accessibility_delegate_.get(), + new BrowserAccessibilityFactory())); + ASSERT_NE(nullptr, browser_accessibility_manager.get()); + + BrowserAccessibility* root_accessible = + browser_accessibility_manager->GetRoot(); + ASSERT_NE(nullptr, root_accessible); + + ASSERT_EQ(base::WideToUTF16(L"my_html_id"), + root_accessible->GetAuthorUniqueId()); +} } // namespace content |