Commit 2ecafa1c authored by armenk's avatar armenk Committed by Commit Bot

View controls should notify a11y event on tooltiptext changes

When tooltiptext is changed, view controls should call
NotifyAccessibilityEvent(). Combobox, Button, TextField, and
ImageView controls are affected by this change.
BUG=chromium:1113063
TEST=views_unittests

Change-Id: Id372136e5bd49057a87e02d5382a0912773b20fb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2355406
Commit-Queue: Armen Keshishian <armenk@google.com>
Reviewed-by: default avatarMichael Wasserman <msw@chromium.org>
Reviewed-by: default avatarMitsuru Oshima <oshima@chromium.org>
Cr-Commit-Position: refs/heads/master@{#799795}
parent 5c2b903d
......@@ -901,6 +901,8 @@ source_set("test_support") {
"test/scoped_views_test_helper.h",
"test/slider_test_api.cc",
"test/slider_test_api.h",
"test/test_ax_event_observer.cc",
"test/test_ax_event_observer.h",
"test/test_layout_manager.cc",
"test/test_layout_manager.h",
"test/test_layout_provider.cc",
......
......@@ -140,6 +140,7 @@ void Button::SetTooltipText(const base::string16& tooltip_text) {
tooltip_text_ = tooltip_text;
OnSetTooltipText(tooltip_text);
TooltipTextChanged();
NotifyAccessibilityEvent(ax::mojom::Event::kTextChanged, true);
}
void Button::SetAccessibleName(const base::string16& name) {
......
......@@ -5,6 +5,7 @@
#include "ui/views/controls/button/button.h"
#include <memory>
#include <string>
#include <utility>
#include "base/bind.h"
......@@ -14,6 +15,8 @@
#include "base/run_loop.h"
#include "build/build_config.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/base/layout.h"
#include "ui/display/screen.h"
#include "ui/events/event_utils.h"
......@@ -34,6 +37,7 @@
#include "ui/views/controls/link.h"
#include "ui/views/controls/textfield/textfield.h"
#include "ui/views/style/platform_style.h"
#include "ui/views/test/test_ax_event_observer.h"
#include "ui/views/test/view_metadata_test_utils.h"
#include "ui/views/test/views_test_base.h"
#include "ui/views/widget/widget_utils.h"
......@@ -250,7 +254,6 @@ class ButtonTest : public ViewsTestBase {
TestButton* button_;
std::unique_ptr<TestButtonObserver> button_observer_;
std::unique_ptr<ui::test::EventGenerator> event_generator_;
DISALLOW_COPY_AND_ASSIGN(ButtonTest);
};
......@@ -956,4 +959,19 @@ TEST_F(ButtonTest, SetStateNotifiesObserver) {
EXPECT_EQ(Button::STATE_NORMAL, button()->GetState());
}
// Verifies setting the tooltip text will call NotifyAccessibilityEvent.
TEST_F(ButtonTest, SetTooltipTextNotifiesAccessibilityEvent) {
base::string16 test_tooltip_text = base::ASCIIToUTF16("Test Tooltip Text");
test::TestAXEventObserver observer;
EXPECT_EQ(0, observer.text_changed_event_count());
button()->SetTooltipText(test_tooltip_text);
EXPECT_EQ(1, observer.text_changed_event_count());
EXPECT_EQ(test_tooltip_text, button()->GetTooltipText(gfx::Point()));
ui::AXNodeData data;
button()->GetAccessibleNodeData(&data);
const std::string& name =
data.GetStringAttribute(ax::mojom::StringAttribute::kName);
EXPECT_EQ(test_tooltip_text, base::ASCIIToUTF16(name));
}
} // namespace views
......@@ -16,6 +16,7 @@
#include "build/build_config.h"
#include "ui/accessibility/ax_action_data.h"
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/base/ime/input_method.h"
#include "ui/base/ime/text_input_client.h"
#include "ui/base/models/combobox_model.h"
......@@ -31,6 +32,7 @@
#include "ui/views/controls/combobox/combobox_listener.h"
#include "ui/views/style/platform_style.h"
#include "ui/views/test/combobox_test_api.h"
#include "ui/views/test/test_ax_event_observer.h"
#include "ui/views/test/view_metadata_test_utils.h"
#include "ui/views/test/views_test_base.h"
#include "ui/views/widget/unique_widget_ptr.h"
......@@ -824,6 +826,22 @@ TEST_F(ComboboxTest, MenuModel) {
EXPECT_TRUE(menu_model->IsVisibleAt(0));
}
// Verifies setting the tooltip text will call NotifyAccessibilityEvent.
TEST_F(ComboboxTest, SetTooltipTextNotifiesAccessibilityEvent) {
InitCombobox(nullptr);
base::string16 test_tooltip_text = ASCIIToUTF16("Test Tooltip Text");
test::TestAXEventObserver observer;
EXPECT_EQ(0, observer.text_changed_event_count());
combobox_->SetTooltipText(test_tooltip_text);
EXPECT_EQ(1, observer.text_changed_event_count());
EXPECT_EQ(test_tooltip_text, combobox_->GetAccessibleName());
ui::AXNodeData data;
combobox_->GetAccessibleNodeData(&data);
const std::string& name =
data.GetStringAttribute(ax::mojom::StringAttribute::kName);
EXPECT_EQ(test_tooltip_text, ASCIIToUTF16(name));
}
namespace {
using ComboboxDefaultTest = ViewsTestBase;
......
......@@ -99,6 +99,7 @@ void ImageView::SetAccessibleName(const base::string16& accessible_name) {
accessible_name_ = accessible_name;
OnPropertyChanged(&accessible_name_, kPropertyEffectsNone);
NotifyAccessibilityEvent(ax::mojom::Event::kTextChanged, true);
}
const base::string16& ImageView::GetAccessibleName() const {
......
......@@ -5,18 +5,22 @@
#include "ui/views/controls/image_view.h"
#include <memory>
#include <string>
#include <utility>
#include "base/i18n/rtl.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkBitmap.h"
#include "third_party/skia/include/core/SkColor.h"
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/accessibility/ax_node_data.h"
#include "ui/gfx/geometry/insets.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/image/image_skia.h"
#include "ui/views/border.h"
#include "ui/views/layout/box_layout.h"
#include "ui/views/test/test_ax_event_observer.h"
#include "ui/views/test/views_test_base.h"
#include "ui/views/widget/widget.h"
......@@ -144,6 +148,21 @@ TEST_P(ImageViewTest, ImageOriginForCustomViewBounds) {
EXPECT_EQ(image_view_bounds, image_view()->bounds());
}
// Verifies setting the accessible name will be call NotifyAccessibilityEvent.
TEST_P(ImageViewTest, SetAccessibleNameNotifiesAccessibilityEvent) {
base::string16 test_tooltip_text = base::ASCIIToUTF16("Test Tooltip Text");
test::TestAXEventObserver observer;
EXPECT_EQ(0, observer.text_changed_event_count());
image_view()->SetAccessibleName(test_tooltip_text);
EXPECT_EQ(1, observer.text_changed_event_count());
EXPECT_EQ(test_tooltip_text, image_view()->GetAccessibleName());
ui::AXNodeData data;
image_view()->GetAccessibleNodeData(&data);
const std::string& name =
data.GetStringAttribute(ax::mojom::StringAttribute::kName);
EXPECT_EQ(test_tooltip_text, base::ASCIIToUTF16(name));
}
INSTANTIATE_TEST_SUITE_P(All,
ImageViewTest,
::testing::Values(Axis::kHorizontal, Axis::kVertical));
......
......@@ -689,6 +689,7 @@ void Textfield::SetAccessibleName(const base::string16& name) {
accessible_name_ = name;
OnPropertyChanged(&accessible_name_, kPropertyEffectsNone);
NotifyAccessibilityEvent(ax::mojom::Event::kTextChanged, true);
}
void Textfield::SetObscuredGlyphSpacing(int spacing) {
......
......@@ -51,6 +51,7 @@
#include "ui/views/controls/textfield/textfield_test_api.h"
#include "ui/views/focus/focus_manager.h"
#include "ui/views/style/platform_style.h"
#include "ui/views/test/test_ax_event_observer.h"
#include "ui/views/test/test_views_delegate.h"
#include "ui/views/test/views_test_base.h"
#include "ui/views/test/widget_test.h"
......@@ -3476,6 +3477,22 @@ TEST_F(TextfieldTest, CursorBlinkRestartsOnInsertOrReplace) {
EXPECT_TRUE(test_api_->IsCursorBlinkTimerRunning());
}
// Verifies setting the accessible name will call NotifyAccessibilityEvent.
TEST_F(TextfieldTest, SetAccessibleNameNotifiesAccessibilityEvent) {
InitTextfield();
base::string16 test_tooltip_text = ASCIIToUTF16("Test Accessible Name");
test::TestAXEventObserver observer;
EXPECT_EQ(0, observer.text_changed_event_count());
textfield_->SetAccessibleName(test_tooltip_text);
EXPECT_EQ(1, observer.text_changed_event_count());
EXPECT_EQ(test_tooltip_text, textfield_->GetAccessibleName());
ui::AXNodeData data;
textfield_->GetAccessibleNodeData(&data);
const std::string& name =
data.GetStringAttribute(ax::mojom::StringAttribute::kName);
EXPECT_EQ(test_tooltip_text, ASCIIToUTF16(name));
}
#if defined(OS_CHROMEOS)
// Check that when accessibility virtual keyboard is enabled, windows are
// shifted up when focused and restored when focus is lost.
......
// 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/test_ax_event_observer.h"
#include "ui/accessibility/ax_enums.mojom.h"
#include "ui/views/accessibility/ax_event_manager.h"
#include "ui/views/accessibility/ax_event_observer.h"
namespace views {
namespace test {
TestAXEventObserver::TestAXEventObserver() {
AXEventManager::Get()->AddObserver(this);
}
TestAXEventObserver::~TestAXEventObserver() {
AXEventManager::Get()->RemoveObserver(this);
}
void TestAXEventObserver::OnViewEvent(View* view, ax::mojom::Event event_type) {
if (event_type == ax::mojom::Event::kTextChanged)
++text_changed_event_count_;
}
} // 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_TEST_AX_EVENT_OBSERVER_H_
#define UI_VIEWS_TEST_TEST_AX_EVENT_OBSERVER_H_
#include "ui/views/accessibility/ax_event_observer.h"
namespace views {
namespace test {
// Observes all Views accessibility events for tests.
class TestAXEventObserver : public AXEventObserver {
public:
TestAXEventObserver();
TestAXEventObserver(const TestAXEventObserver&) = delete;
TestAXEventObserver& operator=(const TestAXEventObserver&) = delete;
~TestAXEventObserver() override;
// AXEventObserver:
void OnViewEvent(View* view, ax::mojom::Event event_type) override;
int text_changed_event_count() const { return text_changed_event_count_; }
private:
int text_changed_event_count_ = 0;
};
} // namespace test
} // namespace views
#endif // UI_VIEWS_TEST_TEST_AX_EVENT_OBSERVER_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