Chromium Code Reviews| Index: content/browser/accessibility/android_hit_testing_browsertest.cc |
| diff --git a/content/browser/accessibility/android_hit_testing_browsertest.cc b/content/browser/accessibility/android_hit_testing_browsertest.cc |
| index 12817d10b0c769c3dcd4d615a73d825fdb6d98ea..45449942f352ba21c66654b2a281b5cd687b655d 100644 |
| --- a/content/browser/accessibility/android_hit_testing_browsertest.cc |
| +++ b/content/browser/accessibility/android_hit_testing_browsertest.cc |
| @@ -29,10 +29,52 @@ |
| namespace content { |
| +namespace { |
| + |
| +bool AXTreeContainsNodeWithName(BrowserAccessibility* node, |
|
nasko
2016/03/30 21:01:41
style: First param on a new line.
dmazzoni
2016/03/31 16:15:54
Done.
|
| + const std::string& name) { |
| + if (node->GetStringAttribute(ui::AX_ATTR_NAME) == name) |
| + return true; |
| + |
| + for (unsigned i = 0; i < node->PlatformChildCount(); i++) { |
| + if (AXTreeContainsNodeWithName(node->PlatformGetChild(i), name)) |
| + return true; |
| + } |
| + |
| + return false; |
| +} |
| + |
| +} // namespace |
| + |
| class AndroidHitTestingBrowserTest : public ContentBrowserTest { |
| public: |
| AndroidHitTestingBrowserTest() {} |
| ~AndroidHitTestingBrowserTest() override {} |
| + |
| + protected: |
| + BrowserAccessibility* HitTestAndWaitForResult(const gfx::Point& point) { |
| + WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( |
| + shell()->web_contents()); |
| + FrameTree* frame_tree = web_contents->GetFrameTree(); |
| + BrowserAccessibilityManager* manager = |
| + web_contents->GetRootBrowserAccessibilityManager(); |
| + |
| + AccessibilityNotificationWaiter hover_waiter( |
| + shell(), AccessibilityModeComplete, |
| + ui::AX_EVENT_HOVER); |
| + for (FrameTreeNode* node : frame_tree->Nodes()) |
| + hover_waiter.ListenToAdditionalFrame(node->current_frame_host()); |
| + manager->delegate()->AccessibilityHitTest(point); |
| + hover_waiter.WaitForNotification(); |
| + |
| + RenderFrameHostImpl* target_frame = hover_waiter.event_render_frame_host(); |
| + BrowserAccessibilityManager* target_manager = |
| + target_frame->browser_accessibility_manager(); |
| + int hover_target_id = hover_waiter.event_target_id(); |
| + BrowserAccessibility* hovered_node = target_manager->GetFromID( |
| + hover_target_id); |
| + return hovered_node; |
| + } |
| }; |
| IN_PROC_BROWSER_TEST_F(AndroidHitTestingBrowserTest, |
| @@ -56,24 +98,74 @@ IN_PROC_BROWSER_TEST_F(AndroidHitTestingBrowserTest, |
| NavigateToURL(shell(), url); |
| waiter.WaitForNotification(); |
| - // Get the BrowserAccessibilityManager. |
| - WebContentsImpl* web_contents = |
| - static_cast<WebContentsImpl*>(shell()->web_contents()); |
| + BrowserAccessibility* hovered_node = HitTestAndWaitForResult( |
| + gfx::Point(-1, -1)); |
| + ASSERT_TRUE(hovered_node != NULL); |
| + ASSERT_EQ(ui::AX_ROLE_ROOT_WEB_AREA, hovered_node->GetRole()); |
| +} |
| + |
| +IN_PROC_BROWSER_TEST_F(AndroidHitTestingBrowserTest, |
| + HitTestingInIframes) { |
| + ASSERT_TRUE(embedded_test_server()->Start()); |
| + |
| + AccessibilityNotificationWaiter waiter( |
| + shell(), AccessibilityModeComplete, |
| + ui::AX_EVENT_LOAD_COMPLETE); |
| + GURL url(embedded_test_server()->GetURL( |
| + "/accessibility/html/iframe-coordinates.html")); |
| + NavigateToURL(shell(), url); |
| + waiter.WaitForNotification(); |
| + |
| + WebContentsImpl* web_contents = static_cast<WebContentsImpl*>( |
| + shell()->web_contents()); |
| + FrameTree* frame_tree = web_contents->GetFrameTree(); |
| BrowserAccessibilityManager* manager = |
| web_contents->GetRootBrowserAccessibilityManager(); |
| + BrowserAccessibility* root = manager->GetRoot(); |
| + while (!AXTreeContainsNodeWithName(root, "Ordinary Button") || |
| + !AXTreeContainsNodeWithName(root, "Scrolled Button")) { |
| + AccessibilityNotificationWaiter waiter( |
| + shell(), AccessibilityModeComplete, |
| + ui::AX_EVENT_NONE); |
| + for (FrameTreeNode* node : frame_tree->Nodes()) |
| + waiter.ListenToAdditionalFrame(node->current_frame_host()); |
| + waiter.WaitForNotification(); |
| + } |
| - // Send a hit test request, and wait for the hover event in response. |
| - AccessibilityNotificationWaiter hover_waiter( |
| - shell(), AccessibilityModeComplete, |
| - ui::AX_EVENT_HOVER); |
| - manager->delegate()->AccessibilityHitTest(gfx::Point(-1, -1)); |
| - hover_waiter.WaitForNotification(); |
| + // Send a series of hit test requests, and for each one |
| + // wait for the hover event in response, verifying we hit the |
| + // correct object. |
| - // Assert that the hover event was fired on the root of the tree. |
| - int hover_target_id = hover_waiter.event_target_id(); |
| - BrowserAccessibility* hovered_node = manager->GetFromID(hover_target_id); |
| + // (50, 50) -> "Button" |
| + BrowserAccessibility* hovered_node; |
| + hovered_node = HitTestAndWaitForResult(gfx::Point(50, 50)); |
| ASSERT_TRUE(hovered_node != NULL); |
| - ASSERT_EQ(ui::AX_ROLE_ROOT_WEB_AREA, hovered_node->GetRole()); |
| + ASSERT_EQ(ui::AX_ROLE_BUTTON, hovered_node->GetRole()); |
| + ASSERT_EQ("Button", hovered_node->GetStringAttribute(ui::AX_ATTR_NAME)); |
| + |
| + // (50, 305) -> div in first iframe |
| + hovered_node = HitTestAndWaitForResult(gfx::Point(50, 305)); |
| + ASSERT_TRUE(hovered_node != NULL); |
| + ASSERT_EQ(ui::AX_ROLE_DIV, hovered_node->GetRole()); |
| + |
| + // (50, 350) -> "Ordinary Button" |
| + hovered_node = HitTestAndWaitForResult(gfx::Point(50, 350)); |
| + ASSERT_TRUE(hovered_node != NULL); |
| + ASSERT_EQ(ui::AX_ROLE_BUTTON, hovered_node->GetRole()); |
| + ASSERT_EQ("Ordinary Button", |
| + hovered_node->GetStringAttribute(ui::AX_ATTR_NAME)); |
| + |
| + // (50, 455) -> "Scrolled Button" |
| + hovered_node = HitTestAndWaitForResult(gfx::Point(50, 455)); |
| + ASSERT_TRUE(hovered_node != NULL); |
| + ASSERT_EQ(ui::AX_ROLE_BUTTON, hovered_node->GetRole()); |
| + ASSERT_EQ("Scrolled Button", |
| + hovered_node->GetStringAttribute(ui::AX_ATTR_NAME)); |
| + |
| + // (50, 505) -> div in second iframe |
| + hovered_node = HitTestAndWaitForResult(gfx::Point(50, 505)); |
| + ASSERT_TRUE(hovered_node != NULL); |
| + ASSERT_EQ(ui::AX_ROLE_DIV, hovered_node->GetRole()); |
| } |
| } // namespace content |