Commit 4bb85fae authored by Kevin Babbitt's avatar Kevin Babbitt Committed by Commit Bot

Add test for Mac accessibility hit testing bug fix

Follow-up to https://crrev.com/c/2225334. Adds a test similar to other
tests for accessibility hit testing.

While developing this test I noticed that the point passed to
BrowserAccessibilityCocoa::accessibilityHitTest is actually in frame
coordinates rather than screen coordinates. Noted this in a comment.

Bug: 1086819
Change-Id: I052a78d2bbef54662e171889080e7089c510653d
AX-Relnotes: n/a
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2225818
Commit-Queue: Dominic Mazzoni <dmazzoni@chromium.org>
Reviewed-by: default avatarDominic Mazzoni <dmazzoni@chromium.org>
Cr-Commit-Position: refs/heads/master@{#774173}
parent e0044bcc
...@@ -3669,13 +3669,15 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired"; ...@@ -3669,13 +3669,15 @@ NSString* const NSAccessibilityRequiredAttributeChrome = @"AXRequired";
if (![self instanceActive]) if (![self instanceActive])
return nil; return nil;
// The point we receive is in frame coordinates.
// Convert to screen coordinates and then to physical pixel coordinates.
BrowserAccessibilityManager* manager = _owner->manager(); BrowserAccessibilityManager* manager = _owner->manager();
gfx::Point screen_point(point.x, point.y); gfx::Point screen_point(point.x, point.y);
screen_point += screen_point +=
manager->GetViewBoundsInScreenCoordinates().OffsetFromOrigin(); manager->GetViewBoundsInScreenCoordinates().OffsetFromOrigin();
gfx::Point physical_pixel_point = gfx::Point physical_pixel_point =
content::IsUseZoomForDSFEnabled() IsUseZoomForDSFEnabled()
? screen_point ? screen_point
: ScaleToRoundedPoint(screen_point, manager->device_scale_factor()); : ScaleToRoundedPoint(screen_point, manager->device_scale_factor());
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/accessibility/browser_accessibility_cocoa.h"
#include "content/browser/accessibility/browser_accessibility_mac.h"
#include "content/browser/accessibility/hit_testing_browsertest.h"
#include "content/public/test/accessibility_notification_waiter.h"
#include "content/public/test/browser_test.h"
#include "content/public/test/content_browser_test_utils.h"
#include "content/shell/browser/shell.h"
#include "ui/gfx/mac/coordinate_conversion.h"
namespace content {
#define EXPECT_ACCESSIBILITY_MAC_HIT_TEST_RESULT(css_point, expected_element, \
hit_element) \
SCOPED_TRACE(GetScopedTrace(css_point)); \
EXPECT_EQ([expected_element owner]->GetId(), [hit_element owner]->GetId());
class AccessibilityHitTestingMacBrowserTest
: public AccessibilityHitTestingBrowserTest {
public:
BrowserAccessibilityCocoa* GetWebContentRoot() {
return ToBrowserAccessibilityCocoa(
GetRootBrowserAccessibilityManager()->GetRoot());
}
};
INSTANTIATE_TEST_SUITE_P(
All,
AccessibilityHitTestingMacBrowserTest,
::testing::Combine(::testing::Values(1, 2), ::testing::Bool()),
AccessibilityHitTestingBrowserTest::TestPassToString());
IN_PROC_BROWSER_TEST_P(AccessibilityHitTestingMacBrowserTest,
AccessibilityHitTest) {
ASSERT_TRUE(embedded_test_server()->Start());
EXPECT_TRUE(NavigateToURL(shell(), GURL(url::kAboutBlankURL)));
AccessibilityNotificationWaiter waiter(shell()->web_contents(),
ui::kAXModeComplete,
ax::mojom::Event::kLoadComplete);
GURL url(embedded_test_server()->GetURL(
"/accessibility/hit_testing/simple_rectangles.html"));
EXPECT_TRUE(NavigateToURL(shell(), url));
waiter.WaitForNotification();
WaitForAccessibilityTreeToContainNodeWithName(shell()->web_contents(),
"rectA");
BrowserAccessibilityCocoa* root = GetWebContentRoot();
// Test a hit on a rect in the main frame.
{
gfx::Point rect_2_point(49, 20);
gfx::Point rect_2_point_frame = CSSToFramePoint(rect_2_point);
BrowserAccessibilityCocoa* hit_element =
[root accessibilityHitTest:NSMakePoint(rect_2_point_frame.x(),
rect_2_point_frame.y())];
BrowserAccessibilityCocoa* expected_element = ToBrowserAccessibilityCocoa(
FindNode(ax::mojom::Role::kGenericContainer, "rect2"));
EXPECT_ACCESSIBILITY_MAC_HIT_TEST_RESULT(rect_2_point, expected_element,
hit_element);
}
// Test a hit on a rect in the iframe.
{
gfx::Point rect_b_point(79, 79);
gfx::Point rect_b_point_frame = CSSToFramePoint(rect_b_point);
BrowserAccessibilityCocoa* hit_element =
[root accessibilityHitTest:NSMakePoint(rect_b_point_frame.x(),
rect_b_point_frame.y())];
BrowserAccessibilityCocoa* expected_element = ToBrowserAccessibilityCocoa(
FindNode(ax::mojom::Role::kGenericContainer, "rectB"));
EXPECT_ACCESSIBILITY_MAC_HIT_TEST_RESULT(rect_b_point, expected_element,
hit_element);
}
}
}
...@@ -1471,6 +1471,7 @@ test("content_browsertests") { ...@@ -1471,6 +1471,7 @@ test("content_browsertests") {
sources += [ sources += [
"../browser/accessibility/accessibility_tree_formatter_mac_browsertest.mm", "../browser/accessibility/accessibility_tree_formatter_mac_browsertest.mm",
"../browser/accessibility/browser_accessibility_cocoa_browsertest.mm", "../browser/accessibility/browser_accessibility_cocoa_browsertest.mm",
"../browser/accessibility/hit_testing_mac_browsertest.mm",
] ]
deps += [ deps += [
"//content/shell:content_shell", "//content/shell:content_shell",
......
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