Commit cc2f633c authored by Martin Robinson's avatar Martin Robinson Committed by Commit Bot

Emit ATK text change signals for Views text fields

View text fields need to emit text changed signals when kValueChanged
accessibility events are received. We do this by following the hypertext
generation path for these nodes.

Bug: 1012423
Change-Id: I64684d380c1f3f72d1dd20c044e087c1c237e7cb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1852244Reviewed-by: default avatarJoanmarie Diggs <jdiggs@igalia.com>
Reviewed-by: default avatarSadrul Chowdhury <sadrul@chromium.org>
Commit-Queue: Martin Robinson <mrobinson@igalia.com>
Cr-Commit-Position: refs/heads/master@{#705136}
parent c76cd844
...@@ -3361,6 +3361,14 @@ void AXPlatformNodeAuraLinux::OnDescriptionChanged() { ...@@ -3361,6 +3361,14 @@ void AXPlatformNodeAuraLinux::OnDescriptionChanged() {
} }
void AXPlatformNodeAuraLinux::OnValueChanged() { void AXPlatformNodeAuraLinux::OnValueChanged() {
// If this is a non-web-content text entry, then we need to trigger text
// change signals when the value changes. This is handled by browser
// accessibility for web content.
if (IsPlainTextField() || !GetDelegate()->IsWebContent()) {
UpdateHypertext();
return;
}
if (!IsRangeValueSupported(GetData())) if (!IsRangeValueSupported(GetData()))
return; return;
......
...@@ -1244,6 +1244,12 @@ test("views_unittests") { ...@@ -1244,6 +1244,12 @@ test("views_unittests") {
data_deps += data_deps +=
[ "//testing/buildbot/filters:linux_ozone_views_unittests_filters" ] [ "//testing/buildbot/filters:linux_ozone_views_unittests_filters" ]
} }
if (use_atk) {
sources +=
[ "accessibility/view_ax_platform_node_delegate_auralinux_unittest.cc" ]
configs += [ "//build/config/linux/atk" ]
}
} }
# This target is added as a dependency of browser interactive_ui_tests. It must # This target is added as a dependency of browser interactive_ui_tests. It must
......
// Copyright 2019 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/accessibility/view_ax_platform_node_delegate.h"
#include <atk/atk.h>
#include "ui/views/controls/textfield/textfield.h"
#include "ui/views/test/views_test_base.h"
namespace views {
namespace test {
class ViewAXPlatformNodeDelegateAuraLinuxTest : public ViewsTestBase {
public:
ViewAXPlatformNodeDelegateAuraLinuxTest() = default;
~ViewAXPlatformNodeDelegateAuraLinuxTest() override = default;
};
TEST_F(ViewAXPlatformNodeDelegateAuraLinuxTest, TextfieldAccessibility) {
Widget widget;
Widget::InitParams init_params = CreateParams(Widget::InitParams::TYPE_POPUP);
init_params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET;
widget.Init(std::move(init_params));
View* content = new View;
widget.SetContentsView(content);
Textfield* textfield = new Textfield;
textfield->SetAccessibleName(base::UTF8ToUTF16("Name"));
textfield->SetText(base::UTF8ToUTF16("Value"));
content->AddChildView(textfield);
AtkText* atk_text = ATK_TEXT(textfield->GetNativeViewAccessible());
ASSERT_NE(nullptr, atk_text);
struct TextChangeData {
int position;
int length;
std::string text;
};
std::vector<TextChangeData> text_remove_events;
std::vector<TextChangeData> text_insert_events;
GCallback callback = G_CALLBACK(
+[](AtkText*, int position, int length, char* text, gpointer data) {
auto* events = static_cast<std::vector<TextChangeData>*>(data);
events->push_back(TextChangeData{position, length, text});
});
g_signal_connect(atk_text, "text-insert", callback, &text_insert_events);
g_signal_connect(atk_text, "text-remove", callback, &text_remove_events);
textfield->NotifyAccessibilityEvent(ax::mojom::Event::kValueChanged, true);
ASSERT_EQ(text_remove_events.size(), 0ul);
ASSERT_EQ(text_insert_events.size(), 1ul);
ASSERT_EQ(text_insert_events[0].position, 0);
ASSERT_EQ(text_insert_events[0].length, 5);
ASSERT_EQ(text_insert_events[0].text, "Value");
text_insert_events.clear();
textfield->SetText(base::UTF8ToUTF16("Value A"));
textfield->NotifyAccessibilityEvent(ax::mojom::Event::kValueChanged, true);
ASSERT_EQ(text_remove_events.size(), 0ul);
ASSERT_EQ(text_insert_events.size(), 1ul);
ASSERT_EQ(text_insert_events[0].position, 5);
ASSERT_EQ(text_insert_events[0].length, 2);
ASSERT_EQ(text_insert_events[0].text, " A");
text_insert_events.clear();
textfield->SetText(base::UTF8ToUTF16("Value"));
textfield->NotifyAccessibilityEvent(ax::mojom::Event::kValueChanged, true);
ASSERT_EQ(text_remove_events.size(), 1ul);
ASSERT_EQ(text_insert_events.size(), 0ul);
ASSERT_EQ(text_remove_events[0].position, 5);
ASSERT_EQ(text_remove_events[0].length, 2);
ASSERT_EQ(text_remove_events[0].text, " A");
text_remove_events.clear();
textfield->SetText(base::UTF8ToUTF16("Prefix Value"));
textfield->NotifyAccessibilityEvent(ax::mojom::Event::kValueChanged, true);
ASSERT_EQ(text_remove_events.size(), 0ul);
ASSERT_EQ(text_insert_events.size(), 1ul);
ASSERT_EQ(text_insert_events[0].position, 0);
ASSERT_EQ(text_insert_events[0].length, 7);
ASSERT_EQ(text_insert_events[0].text, "Prefix ");
text_insert_events.clear();
textfield->SetText(base::UTF8ToUTF16("Value"));
textfield->NotifyAccessibilityEvent(ax::mojom::Event::kValueChanged, true);
ASSERT_EQ(text_remove_events.size(), 1ul);
ASSERT_EQ(text_insert_events.size(), 0ul);
ASSERT_EQ(text_remove_events[0].position, 0);
ASSERT_EQ(text_remove_events[0].length, 7);
ASSERT_EQ(text_remove_events[0].text, "Prefix ");
text_insert_events.clear();
}
} // namespace test
} // namespace views
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