From 1755e07af73690cb4d9033798b1ee6b70a041978 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Tue, 28 Jul 2020 18:23:57 -0400 Subject: [PATCH] a11y: Set an accessible role for GtkPasswordEntry Use the text-box accessible role for GtkPasswordEntry. And set properties as appropriate. Update the documentation and add a test. --- docs/reference/gtk/section-accessibility.md | 2 +- gtk/gtkpasswordentry.c | 22 ++++++++++- testsuite/a11y/meson.build | 1 + testsuite/a11y/passwordentry.c | 41 +++++++++++++++++++++ 4 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 testsuite/a11y/passwordentry.c diff --git a/docs/reference/gtk/section-accessibility.md b/docs/reference/gtk/section-accessibility.md index 30c6f9e42b..1885b928f8 100644 --- a/docs/reference/gtk/section-accessibility.md +++ b/docs/reference/gtk/section-accessibility.md @@ -60,7 +60,7 @@ Each role name is part of the #GtkAccessibleRole enumeration. | `SEPARATOR` | A divider that separates sections of content or groups of items | #GtkSeparator | | `SPIN_BUTTON` | A range control that allows seelcting among discrete choices | #GtkSpinButton | | `SWITCH` | A control that represents on/off values | #GtkSwitch | -| `TEXT_BOX` | A type of input that allows free-form text as its value. | #GtkEntry | +| `TEXT_BOX` | A type of input that allows free-form text as its value. | #GtkEntry, #GtkPasswordEntry | | `WINDOW` | An application window | #GtkWindow | | `...` | … | diff --git a/gtk/gtkpasswordentry.c b/gtk/gtkpasswordentry.c index 93d560e49e..252b8be0f2 100644 --- a/gtk/gtkpasswordentry.c +++ b/gtk/gtkpasswordentry.c @@ -61,6 +61,10 @@ * a .passwordstyle class. The text Css node below it has a child with * name image and style class .caps-lock-indicator for the Caps Lock * icon, and possibly other children. + * + * # Accessibility + * + * GtkPasswordEntry uses the #GTK_ACCESSIBLE_ROLE_TEXT_BOX role. */ typedef struct { @@ -222,14 +226,27 @@ gtk_password_entry_set_property (GObject *object, { GtkPasswordEntry *entry = GTK_PASSWORD_ENTRY (object); GtkPasswordEntryPrivate *priv = gtk_password_entry_get_instance_private (entry); + const char *text; if (gtk_editable_delegate_set_property (object, prop_id, value, pspec)) - return; + { + if (prop_id == NUM_PROPERTIES + GTK_EDITABLE_PROP_EDITABLE) + { + gtk_accessible_update_property (GTK_ACCESSIBLE (entry), + GTK_ACCESSIBLE_PROPERTY_READ_ONLY, !g_value_get_boolean (value), + -1); + } + return; + } switch (prop_id) { case PROP_PLACEHOLDER_TEXT: - gtk_text_set_placeholder_text (GTK_TEXT (priv->entry), g_value_get_string (value)); + text = g_value_get_string (value); + gtk_text_set_placeholder_text (GTK_TEXT (priv->entry), text); + gtk_accessible_update_property (GTK_ACCESSIBLE (entry), + GTK_ACCESSIBLE_PROPERTY_PLACEHOLDER, text, + -1); break; case PROP_ACTIVATES_DEFAULT: @@ -424,6 +441,7 @@ gtk_password_entry_class_init (GtkPasswordEntryClass *klass) gtk_editable_install_properties (object_class, NUM_PROPERTIES); gtk_widget_class_set_css_name (widget_class, I_("entry")); + gtk_widget_class_set_accessible_role (widget_class, GTK_ACCESSIBLE_ROLE_TEXT_BOX); } static GtkEditable * diff --git a/testsuite/a11y/meson.build b/testsuite/a11y/meson.build index 8358d7b2c5..2d828e36bd 100644 --- a/testsuite/a11y/meson.build +++ b/testsuite/a11y/meson.build @@ -17,6 +17,7 @@ tests = [ { 'name': 'entry' }, { 'name': 'image' }, { 'name': 'label' }, + { 'name': 'passwordentry' }, { 'name': 'progressbar' }, { 'name': 'scrollbar' }, { 'name': 'searchentry' }, diff --git a/testsuite/a11y/passwordentry.c b/testsuite/a11y/passwordentry.c new file mode 100644 index 0000000000..4c1b794c32 --- /dev/null +++ b/testsuite/a11y/passwordentry.c @@ -0,0 +1,41 @@ +#include + +static void +password_entry_role (void) +{ + GtkWidget *widget = gtk_password_entry_new (); + g_object_ref_sink (widget); + + gtk_test_accessible_assert_role (widget, GTK_ACCESSIBLE_ROLE_TEXT_BOX); + + g_object_unref (widget); +} + +static void +password_entry_properties (void) +{ + GtkWidget *widget = gtk_password_entry_new (); + g_object_ref_sink (widget); + + gtk_test_accessible_assert_property (widget, GTK_ACCESSIBLE_PROPERTY_PLACEHOLDER, NULL); + gtk_test_accessible_assert_property (widget, GTK_ACCESSIBLE_PROPERTY_READ_ONLY, FALSE); + + g_object_set (widget, "placeholder-text", "Hello", NULL); + gtk_editable_set_editable (GTK_EDITABLE (widget), FALSE); + + gtk_test_accessible_assert_property (widget, GTK_ACCESSIBLE_PROPERTY_PLACEHOLDER, "Hello"); + gtk_test_accessible_assert_property (widget, GTK_ACCESSIBLE_PROPERTY_READ_ONLY, TRUE); + + g_object_unref (widget); +} + +int +main (int argc, char *argv[]) +{ + gtk_test_init (&argc, &argv, NULL); + + g_test_add_func ("/a11y/passwordentry/role", password_entry_role); + g_test_add_func ("/a11y/passwordentry/properties", password_entry_properties); + + return g_test_run (); +}