Commit 34ff5c68 authored by Jacobo Aragunde Pérez's avatar Jacobo Aragunde Pérez Committed by Commit Bot

Refactor test code that counts accessibility events.

Created AXEventCounter class to help tests counting accessibility
events. Instead of writing their own observers, tests can create an
instance of AXEventCounter and check how many events of each type
have been registered.

Bug: None
Change-Id: I3b07a077a680b98415f5ed6bee1c4e6528237a22
AX-Relnotes: no user-facing changes.
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2336603
Commit-Queue: Jacobo Aragunde Pérez <jaragunde@igalia.com>
Reviewed-by: default avatarPeter Boström <pbos@chromium.org>
Reviewed-by: default avatarNektarios Paisios <nektar@chromium.org>
Cr-Commit-Position: refs/heads/master@{#800989}
parent f7ef2dca
...@@ -19,8 +19,7 @@ ...@@ -19,8 +19,7 @@
#include "ui/accessibility/ax_node_data.h" #include "ui/accessibility/ax_node_data.h"
#include "ui/events/base_event_utils.h" #include "ui/events/base_event_utils.h"
#include "ui/events/test/event_generator.h" #include "ui/events/test/event_generator.h"
#include "ui/views/accessibility/ax_event_manager.h" #include "ui/views/test/ax_event_counter.h"
#include "ui/views/accessibility/ax_event_observer.h"
#include "ui/views/widget/widget_utils.h" #include "ui/views/widget/widget_utils.h"
namespace { namespace {
...@@ -50,28 +49,6 @@ const struct TypeClicks kClickTestCase[] = { ...@@ -50,28 +49,6 @@ const struct TypeClicks kClickTestCase[] = {
{autofill::POPUP_ITEM_ID_PASSWORD_ACCOUNT_STORAGE_EMPTY, 1}, {autofill::POPUP_ITEM_ID_PASSWORD_ACCOUNT_STORAGE_EMPTY, 1},
}; };
class TestAXEventObserver : public views::AXEventObserver {
public:
TestAXEventObserver() : selection_event_count_(0) {
views::AXEventManager::Get()->AddObserver(this);
}
~TestAXEventObserver() override {
views::AXEventManager::Get()->RemoveObserver(this);
}
void OnViewEvent(views::View*, ax::mojom::Event event_type) override {
if (event_type == ax::mojom::Event::kSelection)
++selection_event_count_;
}
size_t GetSelectionEventCount() { return selection_event_count_; }
void ResetSelectionEventCount() { selection_event_count_ = 0; }
private:
size_t selection_event_count_;
DISALLOW_COPY_AND_ASSIGN(TestAXEventObserver);
};
class AutofillPopupViewNativeViewsTest : public ChromeViewsTestBase { class AutofillPopupViewNativeViewsTest : public ChromeViewsTestBase {
public: public:
AutofillPopupViewNativeViewsTest() = default; AutofillPopupViewNativeViewsTest() = default;
...@@ -138,7 +115,7 @@ TEST_F(AutofillPopupViewNativeViewsTest, ...@@ -138,7 +115,7 @@ TEST_F(AutofillPopupViewNativeViewsTest,
} }
TEST_F(AutofillPopupViewNativeViewsTest, AccessibilitySelectedEvent) { TEST_F(AutofillPopupViewNativeViewsTest, AccessibilitySelectedEvent) {
TestAXEventObserver observer; views::test::AXEventCounter ax_counter(views::AXEventManager::Get());
CreateAndShowView({autofill::POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY, CreateAndShowView({autofill::POPUP_ITEM_ID_AUTOCOMPLETE_ENTRY,
autofill::POPUP_ITEM_ID_SEPARATOR, autofill::POPUP_ITEM_ID_SEPARATOR,
autofill::POPUP_ITEM_ID_AUTOFILL_OPTIONS}); autofill::POPUP_ITEM_ID_AUTOFILL_OPTIONS});
...@@ -146,25 +123,22 @@ TEST_F(AutofillPopupViewNativeViewsTest, AccessibilitySelectedEvent) { ...@@ -146,25 +123,22 @@ TEST_F(AutofillPopupViewNativeViewsTest, AccessibilitySelectedEvent) {
// Checks that a selection event is not sent when the view's |is_selected_| // Checks that a selection event is not sent when the view's |is_selected_|
// member does not change. // member does not change.
view()->GetRowsForTesting()[0]->SetSelected(false); view()->GetRowsForTesting()[0]->SetSelected(false);
EXPECT_EQ(0U, observer.GetSelectionEventCount()); EXPECT_EQ(0, ax_counter.GetCount(ax::mojom::Event::kSelection));
observer.ResetSelectionEventCount();
// Checks that a selection event is sent when an unselected view becomes // Checks that a selection event is sent when an unselected view becomes
// selected. // selected.
view()->GetRowsForTesting()[0]->SetSelected(true); view()->GetRowsForTesting()[0]->SetSelected(true);
EXPECT_EQ(1U, observer.GetSelectionEventCount()); EXPECT_EQ(1, ax_counter.GetCount(ax::mojom::Event::kSelection));
observer.ResetSelectionEventCount();
// Checks that a selection event is not sent when the view's |is_selected_| // Checks that a new selection event is not sent when the view's
// member does not change. // |is_selected_| member does not change.
view()->GetRowsForTesting()[0]->SetSelected(true); view()->GetRowsForTesting()[0]->SetSelected(true);
EXPECT_EQ(0U, observer.GetSelectionEventCount()); EXPECT_EQ(1, ax_counter.GetCount(ax::mojom::Event::kSelection));
observer.ResetSelectionEventCount();
// Checks that a selection event is not sent when a selected view becomes // Checks that a new selection event is not sent when a selected view becomes
// unselected. // unselected.
view()->GetRowsForTesting()[0]->SetSelected(false); view()->GetRowsForTesting()[0]->SetSelected(false);
EXPECT_EQ(0U, observer.GetSelectionEventCount()); EXPECT_EQ(1, ax_counter.GetCount(ax::mojom::Event::kSelection));
} }
TEST_F(AutofillPopupViewNativeViewsTest, AccessibilityTest) { TEST_F(AutofillPopupViewNativeViewsTest, AccessibilityTest) {
......
...@@ -16,13 +16,12 @@ ...@@ -16,13 +16,12 @@
#include "ui/accessibility/ax_node_data.h" #include "ui/accessibility/ax_node_data.h"
#include "ui/base/test/ui_controls.h" #include "ui/base/test/ui_controls.h"
#include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/point.h"
#include "ui/views/accessibility/ax_event_manager.h"
#include "ui/views/accessibility/ax_event_observer.h"
#include "ui/views/accessibility/view_accessibility.h" #include "ui/views/accessibility/view_accessibility.h"
#include "ui/views/controls/button/button.h" #include "ui/views/controls/button/button.h"
#include "ui/views/controls/menu/menu_item_view.h" #include "ui/views/controls/menu/menu_item_view.h"
#include "ui/views/controls/menu/submenu_view.h" #include "ui/views/controls/menu/submenu_view.h"
#include "ui/views/focus/focus_manager.h" #include "ui/views/focus/focus_manager.h"
#include "ui/views/test/ax_event_counter.h"
#include "ui/views/test/widget_test.h" #include "ui/views/test/widget_test.h"
#include "ui/views/widget/widget.h" #include "ui/views/widget/widget.h"
...@@ -43,48 +42,6 @@ class TestButton : public Button { ...@@ -43,48 +42,6 @@ class TestButton : public Button {
~TestButton() override = default; ~TestButton() override = default;
}; };
class TestAXEventObserver : public views::AXEventObserver {
public:
TestAXEventObserver() { views::AXEventManager::Get()->AddObserver(this); }
~TestAXEventObserver() override {
views::AXEventManager::Get()->RemoveObserver(this);
}
void OnViewEvent(views::View*, ax::mojom::Event event_type) override {
switch (event_type) {
case ax::mojom::Event::kMenuStart:
// Fired once at the very start of menu interactions.
++menu_start_count_;
break;
case ax::mojom::Event::kMenuPopupStart:
// Fired once for each menu/submenu that is opened/shown.
++menu_popup_start_count_;
break;
case ax::mojom::Event::kMenuPopupEnd:
// Fired once for each menu/submenu that is closed/hidden.
++menu_popup_end_count_;
break;
case ax::mojom::Event::kMenuEnd:
// Fired once at the very end of menu interactions.
++menu_end_count_;
break;
default:
break;
}
}
int GetMenuStartCount() const { return menu_start_count_; }
int GetMenuPopupStartCount() const { return menu_popup_start_count_; }
int GetMenuPopupEndCount() const { return menu_popup_end_count_; }
int GetMenuEndCount() const { return menu_end_count_; }
protected:
int menu_start_count_ = 0;
int menu_popup_end_count_ = 0;
int menu_popup_start_count_ = 0;
int menu_end_count_ = 0;
};
} // namespace } // namespace
class MenuControllerUITest : public InProcessBrowserTest { class MenuControllerUITest : public InProcessBrowserTest {
...@@ -178,19 +135,19 @@ IN_PROC_BROWSER_TEST_F(MenuControllerUITest, TestMouseOverShownMenu) { ...@@ -178,19 +135,19 @@ IN_PROC_BROWSER_TEST_F(MenuControllerUITest, TestMouseOverShownMenu) {
// SetupMenu leaves the mouse position where the first menu item will be // SetupMenu leaves the mouse position where the first menu item will be
// when we run the menu. // when we run the menu.
TestAXEventObserver observer; AXEventCounter ax_counter(views::AXEventManager::Get());
EXPECT_EQ(observer.GetMenuStartCount(), 0); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuStart), 0);
EXPECT_EQ(observer.GetMenuPopupStartCount(), 0); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuPopupStart), 0);
EXPECT_EQ(observer.GetMenuPopupEndCount(), 0); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuPopupEnd), 0);
EXPECT_EQ(observer.GetMenuEndCount(), 0); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuEnd), 0);
SetupMenu(widget); SetupMenu(widget);
EXPECT_EQ(observer.GetMenuStartCount(), 1); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuStart), 1);
EXPECT_EQ(observer.GetMenuPopupStartCount(), 1); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuPopupStart), 1);
// SetupMenu creates, opens and closes a popup menu, so there will be a // SetupMenu creates, opens and closes a popup menu, so there will be a
// a menu popup end. There is also a menu end since it's the last menu. // a menu popup end. There is also a menu end since it's the last menu.
EXPECT_EQ(observer.GetMenuPopupEndCount(), 1); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuPopupEnd), 1);
EXPECT_EQ(observer.GetMenuEndCount(), 1); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuEnd), 1);
EXPECT_FALSE(first_item_->IsSelected()); EXPECT_FALSE(first_item_->IsSelected());
#if !defined(OS_CHROMEOS) // ChromeOS does not use popup focus override. #if !defined(OS_CHROMEOS) // ChromeOS does not use popup focus override.
EXPECT_FALSE(first_item_->GetViewAccessibility().IsFocusedForTesting()); EXPECT_FALSE(first_item_->GetViewAccessibility().IsFocusedForTesting());
...@@ -198,10 +155,10 @@ IN_PROC_BROWSER_TEST_F(MenuControllerUITest, TestMouseOverShownMenu) { ...@@ -198,10 +155,10 @@ IN_PROC_BROWSER_TEST_F(MenuControllerUITest, TestMouseOverShownMenu) {
menu_runner_->RunMenuAt(widget, nullptr, gfx::Rect(), menu_runner_->RunMenuAt(widget, nullptr, gfx::Rect(),
views::MenuAnchorPosition::kTopLeft, views::MenuAnchorPosition::kTopLeft,
ui::MENU_SOURCE_NONE); ui::MENU_SOURCE_NONE);
EXPECT_EQ(observer.GetMenuStartCount(), 2); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuStart), 2);
EXPECT_EQ(observer.GetMenuPopupStartCount(), 2); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuPopupStart), 2);
EXPECT_EQ(observer.GetMenuPopupEndCount(), 1); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuPopupEnd), 1);
EXPECT_EQ(observer.GetMenuEndCount(), 1); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuEnd), 1);
EXPECT_FALSE(first_item_->IsSelected()); EXPECT_FALSE(first_item_->IsSelected());
// One or two mouse events are posted by the menu being shown. // One or two mouse events are posted by the menu being shown.
// Process event(s), and check what's selected in the menu. // Process event(s), and check what's selected in the menu.
...@@ -228,10 +185,10 @@ IN_PROC_BROWSER_TEST_F(MenuControllerUITest, TestMouseOverShownMenu) { ...@@ -228,10 +185,10 @@ IN_PROC_BROWSER_TEST_F(MenuControllerUITest, TestMouseOverShownMenu) {
EXPECT_FALSE(first_item_->GetViewAccessibility().IsFocusedForTesting()); EXPECT_FALSE(first_item_->GetViewAccessibility().IsFocusedForTesting());
EXPECT_TRUE(button.GetViewAccessibility().IsFocusedForTesting()); EXPECT_TRUE(button.GetViewAccessibility().IsFocusedForTesting());
#endif #endif
EXPECT_EQ(observer.GetMenuStartCount(), 2); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuStart), 2);
EXPECT_EQ(observer.GetMenuPopupStartCount(), 2); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuPopupStart), 2);
EXPECT_EQ(observer.GetMenuPopupEndCount(), 2); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuPopupEnd), 2);
EXPECT_EQ(observer.GetMenuEndCount(), 2); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuEnd), 2);
widget->Close(); widget->Close();
} }
...@@ -248,11 +205,11 @@ IN_PROC_BROWSER_TEST_F(MenuControllerUITest, FocusOnOrphanMenu) { ...@@ -248,11 +205,11 @@ IN_PROC_BROWSER_TEST_F(MenuControllerUITest, FocusOnOrphanMenu) {
ui::AXPlatformNode::NotifyAddAXModeFlags(ui::kAXModeComplete); ui::AXPlatformNode::NotifyAddAXModeFlags(ui::kAXModeComplete);
MenuDelegate menu_delegate; MenuDelegate menu_delegate;
MenuItemView* menu_item = new MenuItemView(&menu_delegate); MenuItemView* menu_item = new MenuItemView(&menu_delegate);
TestAXEventObserver observer; AXEventCounter ax_counter(views::AXEventManager::Get());
EXPECT_EQ(observer.GetMenuStartCount(), 0); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuStart), 0);
EXPECT_EQ(observer.GetMenuPopupStartCount(), 0); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuPopupStart), 0);
EXPECT_EQ(observer.GetMenuPopupEndCount(), 0); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuPopupEnd), 0);
EXPECT_EQ(observer.GetMenuEndCount(), 0); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuEnd), 0);
std::unique_ptr<MenuRunner> menu_runner( std::unique_ptr<MenuRunner> menu_runner(
std::make_unique<MenuRunner>(menu_item, views::MenuRunner::CONTEXT_MENU)); std::make_unique<MenuRunner>(menu_item, views::MenuRunner::CONTEXT_MENU));
MenuItemView* first_item = MenuItemView* first_item =
...@@ -261,10 +218,10 @@ IN_PROC_BROWSER_TEST_F(MenuControllerUITest, FocusOnOrphanMenu) { ...@@ -261,10 +218,10 @@ IN_PROC_BROWSER_TEST_F(MenuControllerUITest, FocusOnOrphanMenu) {
menu_runner->RunMenuAt(nullptr, nullptr, gfx::Rect(), menu_runner->RunMenuAt(nullptr, nullptr, gfx::Rect(),
views::MenuAnchorPosition::kTopLeft, views::MenuAnchorPosition::kTopLeft,
ui::MENU_SOURCE_NONE); ui::MENU_SOURCE_NONE);
EXPECT_EQ(observer.GetMenuStartCount(), 1); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuStart), 1);
EXPECT_EQ(observer.GetMenuPopupStartCount(), 1); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuPopupStart), 1);
EXPECT_EQ(observer.GetMenuPopupEndCount(), 0); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuPopupEnd), 0);
EXPECT_EQ(observer.GetMenuEndCount(), 0); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuEnd), 0);
base::RunLoop loop; base::RunLoop loop;
// SendKeyPress fails if the window doesn't have focus. // SendKeyPress fails if the window doesn't have focus.
ASSERT_TRUE(ui_controls::SendKeyPressNotifyWhenDone( ASSERT_TRUE(ui_controls::SendKeyPressNotifyWhenDone(
...@@ -275,10 +232,10 @@ IN_PROC_BROWSER_TEST_F(MenuControllerUITest, FocusOnOrphanMenu) { ...@@ -275,10 +232,10 @@ IN_PROC_BROWSER_TEST_F(MenuControllerUITest, FocusOnOrphanMenu) {
EXPECT_TRUE(first_item->GetViewAccessibility().IsFocusedForTesting()); EXPECT_TRUE(first_item->GetViewAccessibility().IsFocusedForTesting());
menu_runner->Cancel(); menu_runner->Cancel();
EXPECT_FALSE(first_item->GetViewAccessibility().IsFocusedForTesting()); EXPECT_FALSE(first_item->GetViewAccessibility().IsFocusedForTesting());
EXPECT_EQ(observer.GetMenuStartCount(), 1); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuStart), 1);
EXPECT_EQ(observer.GetMenuPopupStartCount(), 1); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuPopupStart), 1);
EXPECT_EQ(observer.GetMenuPopupEndCount(), 1); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuPopupEnd), 1);
EXPECT_EQ(observer.GetMenuEndCount(), 1); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kMenuEnd), 1);
} }
#endif // OS_WIN #endif // OS_WIN
......
...@@ -35,11 +35,10 @@ ...@@ -35,11 +35,10 @@
#include "ui/gfx/canvas.h" #include "ui/gfx/canvas.h"
#include "ui/gfx/geometry/rect_conversions.h" #include "ui/gfx/geometry/rect_conversions.h"
#include "ui/gfx/skia_util.h" #include "ui/gfx/skia_util.h"
#include "ui/views/accessibility/ax_event_manager.h"
#include "ui/views/accessibility/ax_event_observer.h"
#include "ui/views/accessibility/view_accessibility.h" #include "ui/views/accessibility/view_accessibility.h"
#include "ui/views/controls/label.h" #include "ui/views/controls/label.h"
#include "ui/views/layout/flex_layout.h" #include "ui/views/layout/flex_layout.h"
#include "ui/views/test/ax_event_counter.h"
#include "ui/views/view.h" #include "ui/views/view.h"
#include "ui/views/view_class_properties.h" #include "ui/views/view_class_properties.h"
#include "ui/views/view_targeter.h" #include "ui/views/view_targeter.h"
...@@ -57,38 +56,6 @@ views::View* FindTabView(views::View* view) { ...@@ -57,38 +56,6 @@ views::View* FindTabView(views::View* view) {
return current; return current;
} }
class TestAXEventObserver : public views::AXEventObserver {
public:
TestAXEventObserver() { views::AXEventManager::Get()->AddObserver(this); }
TestAXEventObserver(const TestAXEventObserver&) = delete;
TestAXEventObserver& operator=(const TestAXEventObserver&) = delete;
~TestAXEventObserver() override {
views::AXEventManager::Get()->RemoveObserver(this);
}
// views::AXEventObserver:
void OnViewEvent(views::View* view, ax::mojom::Event event_type) override {
if (event_type == ax::mojom::Event::kSelectionRemove) {
remove_count_++;
}
if (event_type == ax::mojom::Event::kSelection) {
change_count_++;
}
if (event_type == ax::mojom::Event::kSelectionAdd) {
add_count_++;
}
}
int add_count() { return add_count_; }
int change_count() { return change_count_; }
int remove_count() { return remove_count_; }
private:
int add_count_ = 0;
int change_count_ = 0;
int remove_count_ = 0;
};
} // namespace } // namespace
class TestTabStripObserver : public TabStripObserver { class TestTabStripObserver : public TabStripObserver {
...@@ -291,7 +258,7 @@ TEST_P(TabStripTest, GetModelCount) { ...@@ -291,7 +258,7 @@ TEST_P(TabStripTest, GetModelCount) {
} }
TEST_P(TabStripTest, AccessibilityEvents) { TEST_P(TabStripTest, AccessibilityEvents) {
TestAXEventObserver observer; views::test::AXEventCounter ax_counter(views::AXEventManager::Get());
// When adding tabs, SetSelection() is called after AddTabAt(), as // When adding tabs, SetSelection() is called after AddTabAt(), as
// otherwise the index would not be meaningful. // otherwise the index would not be meaningful.
...@@ -300,24 +267,24 @@ TEST_P(TabStripTest, AccessibilityEvents) { ...@@ -300,24 +267,24 @@ TEST_P(TabStripTest, AccessibilityEvents) {
ui::ListSelectionModel selection; ui::ListSelectionModel selection;
selection.SetSelectedIndex(1); selection.SetSelectedIndex(1);
tab_strip_->SetSelection(selection); tab_strip_->SetSelection(selection);
EXPECT_EQ(0, observer.add_count()); EXPECT_EQ(0, ax_counter.GetCount(ax::mojom::Event::kSelectionAdd));
EXPECT_EQ(1, observer.change_count()); EXPECT_EQ(1, ax_counter.GetCount(ax::mojom::Event::kSelection));
EXPECT_EQ(0, observer.remove_count()); EXPECT_EQ(0, ax_counter.GetCount(ax::mojom::Event::kSelectionRemove));
// When removing tabs, SetSelection() is called before RemoveTabAt(), as // When removing tabs, SetSelection() is called before RemoveTabAt(), as
// otherwise the index would not be meaningful. // otherwise the index would not be meaningful.
selection.SetSelectedIndex(0); selection.SetSelectedIndex(0);
tab_strip_->SetSelection(selection); tab_strip_->SetSelection(selection);
tab_strip_->RemoveTabAt(nullptr, 1, true); tab_strip_->RemoveTabAt(nullptr, 1, true);
EXPECT_EQ(0, observer.add_count()); EXPECT_EQ(0, ax_counter.GetCount(ax::mojom::Event::kSelectionAdd));
EXPECT_EQ(2, observer.change_count()); EXPECT_EQ(2, ax_counter.GetCount(ax::mojom::Event::kSelection));
EXPECT_EQ(0, observer.remove_count()); EXPECT_EQ(0, ax_counter.GetCount(ax::mojom::Event::kSelectionRemove));
// When activating widget, refire selection event on tab. // When activating widget, refire selection event on tab.
widget_->OnNativeWidgetActivationChanged(true); widget_->OnNativeWidgetActivationChanged(true);
EXPECT_EQ(0, observer.add_count()); EXPECT_EQ(0, ax_counter.GetCount(ax::mojom::Event::kSelectionAdd));
EXPECT_EQ(3, observer.change_count()); EXPECT_EQ(3, ax_counter.GetCount(ax::mojom::Event::kSelection));
EXPECT_EQ(0, observer.remove_count()); EXPECT_EQ(0, ax_counter.GetCount(ax::mojom::Event::kSelectionRemove));
} }
TEST_P(TabStripTest, AccessibilityData) { TEST_P(TabStripTest, AccessibilityData) {
......
...@@ -883,6 +883,8 @@ source_set("test_support") { ...@@ -883,6 +883,8 @@ source_set("test_support") {
"controls/textfield/textfield_test_api.h", "controls/textfield/textfield_test_api.h",
"layout/animating_layout_manager_test_util.cc", "layout/animating_layout_manager_test_util.cc",
"layout/animating_layout_manager_test_util.h", "layout/animating_layout_manager_test_util.h",
"test/ax_event_counter.cc",
"test/ax_event_counter.h",
"test/button_test_api.cc", "test/button_test_api.cc",
"test/button_test_api.h", "test/button_test_api.h",
"test/capture_tracking_view.cc", "test/capture_tracking_view.cc",
......
...@@ -26,8 +26,6 @@ ...@@ -26,8 +26,6 @@
#include "ui/events/types/event_type.h" #include "ui/events/types/event_type.h"
#include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/rect.h"
#include "ui/views/accessibility/ax_event_manager.h"
#include "ui/views/accessibility/ax_event_observer.h"
#include "ui/views/accessibility/view_accessibility.h" #include "ui/views/accessibility/view_accessibility.h"
#include "ui/views/controls/button/label_button.h" #include "ui/views/controls/button/label_button.h"
#include "ui/views/controls/menu/menu_controller_delegate.h" #include "ui/views/controls/menu/menu_controller_delegate.h"
...@@ -37,6 +35,7 @@ ...@@ -37,6 +35,7 @@
#include "ui/views/controls/menu/menu_item_view.h" #include "ui/views/controls/menu/menu_item_view.h"
#include "ui/views/controls/menu/menu_scroll_view_container.h" #include "ui/views/controls/menu/menu_scroll_view_container.h"
#include "ui/views/controls/menu/submenu_view.h" #include "ui/views/controls/menu/submenu_view.h"
#include "ui/views/test/ax_event_counter.h"
#include "ui/views/test/menu_test_utils.h" #include "ui/views/test/menu_test_utils.h"
#include "ui/views/test/views_test_base.h" #include "ui/views/test/views_test_base.h"
#include "ui/views/widget/root_view.h" #include "ui/views/widget/root_view.h"
...@@ -262,22 +261,6 @@ class CancelMenuOnMousePressView : public View { ...@@ -262,22 +261,6 @@ class CancelMenuOnMousePressView : public View {
MenuController* controller_; MenuController* controller_;
}; };
class TestAXEventObserver : public views::AXEventObserver {
public:
TestAXEventObserver() { views::AXEventManager::Get()->AddObserver(this); }
~TestAXEventObserver() override {
views::AXEventManager::Get()->RemoveObserver(this);
}
bool saw_selected_children_changed_ = false;
void OnViewEvent(views::View*, ax::mojom::Event event_type) override {
if (event_type == ax::mojom::Event::kSelectedChildrenChanged) {
saw_selected_children_changed_ = true;
}
}
};
} // namespace } // namespace
class TestMenuItemViewShown : public MenuItemView { class TestMenuItemViewShown : public MenuItemView {
...@@ -2565,18 +2548,17 @@ TEST_F(MenuControllerTest, AccessibilityDoDefaultCallsAccept) { ...@@ -2565,18 +2548,17 @@ TEST_F(MenuControllerTest, AccessibilityDoDefaultCallsAccept) {
// Test that the kSelectedChildrenChanged event is emitted on // Test that the kSelectedChildrenChanged event is emitted on
// the root menu item when the selected menu item changes. // the root menu item when the selected menu item changes.
TEST_F(MenuControllerTest, AccessibilityEmitsSelectChildrenChanged) { TEST_F(MenuControllerTest, AccessibilityEmitsSelectChildrenChanged) {
TestAXEventObserver observer; AXEventCounter ax_counter(views::AXEventManager::Get());
menu_controller()->Run(owner(), nullptr, menu_item(), gfx::Rect(), menu_controller()->Run(owner(), nullptr, menu_item(), gfx::Rect(),
MenuAnchorPosition::kTopLeft, false, false); MenuAnchorPosition::kTopLeft, false, false);
// Arrow down to select an item checking the event has been emitted. // Arrow down to select an item checking the event has been emitted.
EXPECT_EQ(observer.saw_selected_children_changed_, false); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kSelectedChildrenChanged), 0);
DispatchKey(ui::VKEY_DOWN); DispatchKey(ui::VKEY_DOWN);
EXPECT_EQ(observer.saw_selected_children_changed_, true); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kSelectedChildrenChanged), 1);
observer.saw_selected_children_changed_ = false;
DispatchKey(ui::VKEY_DOWN); DispatchKey(ui::VKEY_DOWN);
EXPECT_EQ(observer.saw_selected_children_changed_, true); EXPECT_EQ(ax_counter.GetCount(ax::mojom::Event::kSelectedChildrenChanged), 2);
} }
#if defined(OS_APPLE) #if defined(OS_APPLE)
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
#include "ui/views/controls/progress_bar.h" #include "ui/views/controls/progress_bar.h"
#include <string>
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h" #include "testing/gtest/include/gtest/gtest.h"
#include "ui/accessibility/ax_enums.mojom.h" #include "ui/accessibility/ax_enums.mojom.h"
...@@ -11,40 +13,12 @@ ...@@ -11,40 +13,12 @@
#include "ui/events/test/event_generator.h" #include "ui/events/test/event_generator.h"
#include "ui/gfx/color_utils.h" #include "ui/gfx/color_utils.h"
#include "ui/native_theme/native_theme.h" #include "ui/native_theme/native_theme.h"
#include "ui/views/accessibility/ax_event_manager.h" #include "ui/views/test/ax_event_counter.h"
#include "ui/views/accessibility/ax_event_observer.h"
#include "ui/views/test/views_test_base.h" #include "ui/views/test/views_test_base.h"
#include "ui/views/widget/widget_utils.h" #include "ui/views/widget/widget_utils.h"
namespace views { namespace views {
namespace {
class TestAXEventObserver : public AXEventObserver {
public:
TestAXEventObserver() { AXEventManager::Get()->AddObserver(this); }
~TestAXEventObserver() override {
AXEventManager::Get()->RemoveObserver(this);
}
TestAXEventObserver(const TestAXEventObserver&) = delete;
TestAXEventObserver& operator=(const TestAXEventObserver&) = delete;
int value_changed_count() const { return value_changed_count_; }
// AXEventObserver:
void OnViewEvent(View* view, ax::mojom::Event event_type) override {
if (event_type == ax::mojom::Event::kValueChanged)
value_changed_count_++;
}
private:
int value_changed_count_ = 0;
};
} // namespace
class ProgressBarTest : public ViewsTestBase { class ProgressBarTest : public ViewsTestBase {
protected: protected:
// ViewsTestBase: // ViewsTestBase:
...@@ -87,31 +61,31 @@ TEST_F(ProgressBarTest, AccessibleNodeData) { ...@@ -87,31 +61,31 @@ TEST_F(ProgressBarTest, AccessibleNodeData) {
// Verifies the correct a11y events are raised for an accessible progress bar. // Verifies the correct a11y events are raised for an accessible progress bar.
TEST_F(ProgressBarTest, AccessibilityEvents) { TEST_F(ProgressBarTest, AccessibilityEvents) {
TestAXEventObserver observer; test::AXEventCounter ax_counter(views::AXEventManager::Get());
EXPECT_EQ(0, observer.value_changed_count()); EXPECT_EQ(0, ax_counter.GetCount(ax::mojom::Event::kValueChanged));
bar_->SetValue(0.50); bar_->SetValue(0.50);
EXPECT_EQ(1, observer.value_changed_count()); EXPECT_EQ(1, ax_counter.GetCount(ax::mojom::Event::kValueChanged));
bar_->SetValue(0.63); bar_->SetValue(0.63);
EXPECT_EQ(2, observer.value_changed_count()); EXPECT_EQ(2, ax_counter.GetCount(ax::mojom::Event::kValueChanged));
bar_->SetValue(0.636); bar_->SetValue(0.636);
EXPECT_EQ(2, observer.value_changed_count()); EXPECT_EQ(2, ax_counter.GetCount(ax::mojom::Event::kValueChanged));
bar_->SetValue(0.642); bar_->SetValue(0.642);
EXPECT_EQ(3, observer.value_changed_count()); EXPECT_EQ(3, ax_counter.GetCount(ax::mojom::Event::kValueChanged));
widget_->Hide(); widget_->Hide();
widget_->Show(); widget_->Show();
EXPECT_EQ(3, observer.value_changed_count()); EXPECT_EQ(3, ax_counter.GetCount(ax::mojom::Event::kValueChanged));
widget_->Hide(); widget_->Hide();
bar_->SetValue(0.8); bar_->SetValue(0.8);
EXPECT_EQ(3, observer.value_changed_count()); EXPECT_EQ(3, ax_counter.GetCount(ax::mojom::Event::kValueChanged));
widget_->Show(); widget_->Show();
EXPECT_EQ(4, observer.value_changed_count()); EXPECT_EQ(4, ax_counter.GetCount(ax::mojom::Event::kValueChanged));
} }
// Test that default colors can be overridden. Used by Chromecast. // Test that default colors can be overridden. Used by Chromecast.
......
...@@ -20,8 +20,7 @@ ...@@ -20,8 +20,7 @@
#include "ui/events/gesture_event_details.h" #include "ui/events/gesture_event_details.h"
#include "ui/events/keycodes/keyboard_codes.h" #include "ui/events/keycodes/keyboard_codes.h"
#include "ui/events/test/event_generator.h" #include "ui/events/test/event_generator.h"
#include "ui/views/accessibility/ax_event_manager.h" #include "ui/views/test/ax_event_counter.h"
#include "ui/views/accessibility/ax_event_observer.h"
#include "ui/views/test/slider_test_api.h" #include "ui/views/test/slider_test_api.h"
#include "ui/views/test/views_test_base.h" #include "ui/views/test/views_test_base.h"
#include "ui/views/view.h" #include "ui/views/view.h"
...@@ -108,28 +107,6 @@ void TestSliderListener::SliderDragEnded(views::Slider* sender) { ...@@ -108,28 +107,6 @@ void TestSliderListener::SliderDragEnded(views::Slider* sender) {
last_drag_ended_epoch_ = ++last_event_epoch_; last_drag_ended_epoch_ = ++last_event_epoch_;
} }
class TestAXEventObserver : public views::AXEventObserver {
public:
TestAXEventObserver() { views::AXEventManager::Get()->AddObserver(this); }
~TestAXEventObserver() override {
views::AXEventManager::Get()->RemoveObserver(this);
}
bool value_changed() const { return value_changed_; }
// views::AXEventObserver:
void OnViewEvent(views::View* view, ax::mojom::Event event_type) override {
if (event_type == ax::mojom::Event::kValueChanged)
value_changed_ = true;
}
private:
bool value_changed_ = false;
DISALLOW_COPY_AND_ASSIGN(TestAXEventObserver);
};
} // namespace } // namespace
namespace views { namespace views {
...@@ -368,8 +345,8 @@ TEST_F(SliderTest, SliderListenerEventsForMultiFingerScrollGesture) { ...@@ -368,8 +345,8 @@ TEST_F(SliderTest, SliderListenerEventsForMultiFingerScrollGesture) {
// Verifies the correct SliderListener events are raised for an accessible // Verifies the correct SliderListener events are raised for an accessible
// slider. // slider.
TEST_F(SliderTest, SliderRaisesA11yEvents) { TEST_F(SliderTest, SliderRaisesA11yEvents) {
TestAXEventObserver observer; test::AXEventCounter ax_counter(views::AXEventManager::Get());
EXPECT_FALSE(observer.value_changed()); EXPECT_EQ(0, ax_counter.GetCount(ax::mojom::Event::kValueChanged));
// First, detach/reattach the slider without setting value. // First, detach/reattach the slider without setting value.
// Temporarily detach the slider. // Temporarily detach the slider.
...@@ -378,18 +355,18 @@ TEST_F(SliderTest, SliderRaisesA11yEvents) { ...@@ -378,18 +355,18 @@ TEST_F(SliderTest, SliderRaisesA11yEvents) {
// Re-attachment should cause nothing to get fired. // Re-attachment should cause nothing to get fired.
root_view->AddChildView(slider()); root_view->AddChildView(slider());
EXPECT_FALSE(observer.value_changed()); EXPECT_EQ(0, ax_counter.GetCount(ax::mojom::Event::kValueChanged));
// Now, set value before reattaching. // Now, set value before reattaching.
root_view->RemoveChildView(slider()); root_view->RemoveChildView(slider());
// Value changes won't trigger accessibility events before re-attachment. // Value changes won't trigger accessibility events before re-attachment.
slider()->SetValue(22); slider()->SetValue(22);
EXPECT_FALSE(observer.value_changed()); EXPECT_EQ(0, ax_counter.GetCount(ax::mojom::Event::kValueChanged));
// Re-attachment should trigger the value change. // Re-attachment should trigger the value change.
root_view->AddChildView(slider()); root_view->AddChildView(slider());
EXPECT_TRUE(observer.value_changed()); EXPECT_EQ(1, ax_counter.GetCount(ax::mojom::Event::kValueChanged));
} }
#endif // !defined(OS_APPLE) || defined(USE_AURA) #endif // !defined(OS_APPLE) || defined(USE_AURA)
......
// 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 "ui/views/test/ax_event_counter.h"
namespace views {
namespace test {
AXEventCounter::AXEventCounter(views::AXEventManager* event_manager)
: tree_observer_(this) {
tree_observer_.Add(event_manager);
}
AXEventCounter::~AXEventCounter() = default;
void AXEventCounter::OnViewEvent(views::View*, ax::mojom::Event event_type) {
++event_counts_[event_type];
}
int AXEventCounter::GetCount(ax::mojom::Event event_type) {
return event_counts_[event_type];
}
} // namespace test
} // namespace views
// 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.
#ifndef UI_VIEWS_TEST_AX_EVENT_COUNTER_H_
#define UI_VIEWS_TEST_AX_EVENT_COUNTER_H_
#include "base/containers/flat_map.h"
#include "base/scoped_observer.h"
#include "ui/views/accessibility/ax_event_manager.h"
#include "ui/views/accessibility/ax_event_observer.h"
namespace views {
namespace test {
// AXEventCounter provides a convenient way to count events registered by the
// AXEventManager by their event type.
class AXEventCounter : public views::AXEventObserver {
public:
explicit AXEventCounter(views::AXEventManager* event_manager);
~AXEventCounter() override;
AXEventCounter(const AXEventCounter&) = delete;
AXEventCounter& operator=(const AXEventCounter&) = delete;
// Returns the number of events of a certain type registered since the
// creation of this AXEventManager object.
int GetCount(ax::mojom::Event event_type);
// views::AXEventObserver
void OnViewEvent(views::View*, ax::mojom::Event event_type) override;
private:
base::flat_map<ax::mojom::Event, int> event_counts_;
ScopedObserver<views::AXEventManager, views::AXEventObserver> tree_observer_{
this};
};
} // namespace test
} // namespace views
#endif // UI_VIEWS_TEST_AX_EVENT_COUNTER_H_
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