a11y: When using rule 2.E for computing accessible name, use it only if appropriate
authorLukáš Tyrychtr <ltyrycht@redhat.com>
Thu, 19 Oct 2023 13:56:38 +0000 (15:56 +0200)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 17 Nov 2023 19:54:21 +0000 (14:54 -0500)
We were using it in all cases, so, we were using it to compute descriptions,
and also for non-embedded controls. That was overriding descriptions
set, for example, in Gnome settings, and was causing the value of spinboxes
to be read multiple times.

gtk/gtkatcontext.c

index 1381f9c526ecc215443aaf8a2765ae6792f1b944..89f559e6b0d5fbe83ece01085603169ac0e4ff6c 100644 (file)
@@ -1290,33 +1290,36 @@ gtk_at_context_get_text_accumulate (GtkATContext          *self,
     }
 
   /* Step 2.E */
-  if (self->accessible_role == GTK_ACCESSIBLE_ROLE_TEXT_BOX)
+  if ((property == GTK_ACCESSIBLE_PROPERTY_LABEL && is_child) || (relation == GTK_ACCESSIBLE_RELATION_LABELLED_BY && is_ref))
     {
-      if (GTK_IS_EDITABLE (self->accessible))
+      if (self->accessible_role == GTK_ACCESSIBLE_ROLE_TEXT_BOX)
         {
-          const char *text = gtk_editable_get_text (GTK_EDITABLE (self->accessible));
-          if (text && not_just_space (text))
-            append_with_space (res, text);
-        }
-      return;
-    }
-  else if (gtk_accessible_role_is_range_subclass (self->accessible_role))
-    {
-      if (gtk_accessible_attribute_set_contains (self->properties, GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT))
-        {
-          value = gtk_accessible_attribute_set_get_value (self->properties, GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT);
-          append_with_space (res, gtk_string_accessible_value_get (value));
-        }
-      else if (gtk_accessible_attribute_set_contains (self->properties, GTK_ACCESSIBLE_PROPERTY_VALUE_NOW))
+          if (GTK_IS_EDITABLE (self->accessible))
+            {
+              const char *text = gtk_editable_get_text (GTK_EDITABLE (self->accessible));
+            if (text && not_just_space (text))
+              append_with_space (res, text);
+          }
+        return;
+      }
+      else if (gtk_accessible_role_is_range_subclass (self->accessible_role))
         {
-          value = gtk_accessible_attribute_set_get_value (self->properties, GTK_ACCESSIBLE_PROPERTY_VALUE_NOW);
-          if (res->len > 0)
-            g_string_append (res, " ");
-          g_string_append_printf (res, "%g", gtk_number_accessible_value_get (value));
-        }
+          if (gtk_accessible_attribute_set_contains (self->properties, GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT))
+            {
+              value = gtk_accessible_attribute_set_get_value (self->properties, GTK_ACCESSIBLE_PROPERTY_VALUE_TEXT);
+              append_with_space (res, gtk_string_accessible_value_get (value));
+            }
+          else if (gtk_accessible_attribute_set_contains (self->properties, GTK_ACCESSIBLE_PROPERTY_VALUE_NOW))
+            {
+              value = gtk_accessible_attribute_set_get_value (self->properties, GTK_ACCESSIBLE_PROPERTY_VALUE_NOW);
+              if (res->len > 0)
+                g_string_append (res, " ");
+              g_string_append_printf (res, "%g", gtk_number_accessible_value_get (value));
+            }
 
-      return;
-    }
+          return;
+        }
+      }
 
   /* Step 2.F */
   if (gtk_accessible_role_supports_name_from_content (self->accessible_role) || is_ref || is_child)