arc-a11y: Add a focus highlight feature test
This also removes an obsolete (unused) parameter from
AccessibilityManager::OnViewFocusedInArc().
AX-Relnotes: n/a. test addition.
Bug: b:149959127
Test: browser_test
Change-Id: Ib792496a3ea9ede5c7e754cd1a93ba041e6be4d3
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3053254
Reviewed-by: David Tseng <dtseng@chromium.org>
Commit-Queue: Hiroki Sato <hirokisato@chromium.org>
Cr-Commit-Position: refs/heads/master@{#905509}
diff --git a/chrome/browser/ash/accessibility/accessibility_manager.cc b/chrome/browser/ash/accessibility/accessibility_manager.cc
index 7ef5e06..8b66e241 100644
--- a/chrome/browser/ash/accessibility/accessibility_manager.cc
+++ b/chrome/browser/ash/accessibility/accessibility_manager.cc
@@ -562,8 +562,8 @@
EnableSpokenFeedback(true);
}
-void AccessibilityManager::OnViewFocusedInArc(const gfx::Rect& bounds_in_screen,
- bool is_editable) {
+void AccessibilityManager::OnViewFocusedInArc(
+ const gfx::Rect& bounds_in_screen) {
AccessibilityController::Get()->SetFocusHighlightRect(bounds_in_screen);
}
diff --git a/chrome/browser/ash/accessibility/accessibility_manager.h b/chrome/browser/ash/accessibility/accessibility_manager.h
index d13998b..1fe8392 100644
--- a/chrome/browser/ash/accessibility/accessibility_manager.h
+++ b/chrome/browser/ash/accessibility/accessibility_manager.h
@@ -268,7 +268,7 @@
bool PlaySpokenFeedbackToggleCountdown(int tick_count);
// Update when a view is focused in ARC++.
- void OnViewFocusedInArc(const gfx::Rect& bounds_in_screen, bool is_editable);
+ void OnViewFocusedInArc(const gfx::Rect& bounds_in_screen);
// Plays an earcon. Earcons are brief and distinctive sounds that indicate
// the their mapped event has occurred. The |sound_key| enums can be found in
diff --git a/chrome/browser/ash/arc/accessibility/arc_accessibility_helper_bridge.cc b/chrome/browser/ash/arc/accessibility/arc_accessibility_helper_bridge.cc
index 9567babe..b20eb199 100644
--- a/chrome/browser/ash/arc/accessibility/arc_accessibility_helper_bridge.cc
+++ b/chrome/browser/ash/arc/accessibility/arc_accessibility_helper_bridge.cc
@@ -106,10 +106,7 @@
display::Screen::GetScreen()->GetDisplayNearestView(active_window);
bounds_in_screen.Offset(display.bounds().x(), display.bounds().y());
- bool is_editable = arc::GetBooleanProperty(
- node_data, arc::mojom::AccessibilityBooleanProperty::EDITABLE);
-
- accessibility_manager->OnViewFocusedInArc(bounds_in_screen, is_editable);
+ accessibility_manager->OnViewFocusedInArc(bounds_in_screen);
}
// Singleton factory for ArcAccessibilityHelperBridge.
diff --git a/chrome/browser/ash/arc/accessibility/arc_accessibility_helper_bridge_browsertest.cc b/chrome/browser/ash/arc/accessibility/arc_accessibility_helper_bridge_browsertest.cc
index 78c3313..62ddee6 100644
--- a/chrome/browser/ash/arc/accessibility/arc_accessibility_helper_bridge_browsertest.cc
+++ b/chrome/browser/ash/arc/accessibility/arc_accessibility_helper_bridge_browsertest.cc
@@ -7,6 +7,8 @@
#include <memory>
#include <utility>
+#include "ash/accessibility/ui/accessibility_focus_ring_controller_impl.h"
+#include "ash/accessibility/ui/accessibility_focus_ring_layer.h"
#include "ash/shell.h"
#include "base/feature_list.h"
#include "chrome/browser/ash/accessibility/accessibility_manager.h"
@@ -30,6 +32,7 @@
#include "components/viz/common/features.h"
#include "content/public/test/browser_test.h"
#include "ui/aura/client/aura_constants.h"
+#include "ui/compositor/layer.h"
#include "ui/views/widget/widget.h"
#include "ui/wm/public/activation_client.h"
@@ -214,4 +217,72 @@
EXPECT_FALSE(fake_accessibility_helper_instance_->explore_by_touch_enabled());
}
+IN_PROC_BROWSER_TEST_F(ArcAccessibilityHelperBridgeBrowserTest,
+ FocusHighlight) {
+ AccessibilityManager::Get()->SetFocusHighlightEnabled(true);
+
+ ArcTestWindow test_window = MakeTestWindow("org.chromium.arc.1");
+ wm::ActivationClient* activation_client =
+ ash::Shell::Get()->activation_client();
+ activation_client->ActivateWindow(
+ test_window.shell_surface->GetWidget()->GetNativeWindow());
+
+ const gfx::Rect node_rect1 = gfx::Rect(50, 50, 50, 50);
+
+ auto event = mojom::AccessibilityEventData::New();
+ event->event_type = mojom::AccessibilityEventType::VIEW_FOCUSED;
+ event->task_id = 1;
+ event->node_data.push_back(mojom::AccessibilityNodeInfoData::New());
+ auto& node = event->node_data.back();
+ node->bounds_in_screen = node_rect1;
+
+ ArcAccessibilityHelperBridge* bridge =
+ ArcAccessibilityHelperBridge::GetForBrowserContext(browser()->profile());
+ bridge->OnAccessibilityEvent(event.Clone());
+
+ ash::AccessibilityFocusRingControllerImpl* ring_controller =
+ ash::Shell::Get()->accessibility_focus_ring_controller();
+ const std::vector<std::unique_ptr<ash::AccessibilityFocusRingLayer>>&
+ layers1 =
+ ring_controller->GetFocusRingGroupForTesting("HighlightController")
+ ->focus_layers_for_testing();
+ EXPECT_EQ(1u, layers1.size());
+ // Focus ring bounds has some extra margin, so only check some attributes.
+ const gfx::Rect drawn_rect1 = layers1[0]->layer()->bounds();
+ EXPECT_EQ(node_rect1.CenterPoint(), drawn_rect1.CenterPoint());
+ EXPECT_TRUE(drawn_rect1.Contains(node_rect1))
+ << "drawn_rect " << drawn_rect1.ToString()
+ << " should contain the given rect " << node_rect1.ToString();
+
+ // Next, set the filter type to ALL by enabling Select-to-Speak.
+ // We still expect that the focus highlight is updated on a focus event.
+ AccessibilityManager::Get()->SetSelectToSpeakEnabled(true);
+
+ const gfx::Rect node_rect2 = gfx::Rect(100, 100, 100, 100);
+
+ // Create a full event data.
+ event->source_id = 10;
+ event->window_data = std::vector<mojom::AccessibilityWindowInfoDataPtr>();
+ event->window_data->push_back(mojom::AccessibilityWindowInfoData::New());
+ auto& window = event->window_data->back();
+ window->window_id = 100;
+ window->root_node_id = 10;
+ node->id = 10;
+ node->bounds_in_screen = node_rect2;
+
+ bridge->OnAccessibilityEvent(event.Clone());
+
+ const std::vector<std::unique_ptr<ash::AccessibilityFocusRingLayer>>&
+ layers2 =
+ ring_controller->GetFocusRingGroupForTesting("HighlightController")
+ ->focus_layers_for_testing();
+ EXPECT_EQ(1u, layers2.size());
+ // Focus ring bounds has some extra margin, so only check some attributes.
+ const gfx::Rect drawn_rect2 = layers2[0]->layer()->bounds();
+ EXPECT_EQ(node_rect2.CenterPoint(), drawn_rect2.CenterPoint());
+ EXPECT_TRUE(drawn_rect2.Contains(node_rect2))
+ << "drawn_rect " << drawn_rect2.ToString()
+ << " should contain the given rect " << node_rect2.ToString();
+}
+
} // namespace arc