a11y: Be safe against state type changes
authorMatthias Clasen <mclasen@redhat.com>
Fri, 9 Sep 2022 20:06:02 +0000 (16:06 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 9 Sep 2022 20:07:24 +0000 (16:07 -0400)
For some of the a11y states, calling gtk_accessible_reset_state
can change the type of the state value from boolean or tristate
to undefined.

Handle that, instead of throwing criticals.

Related: !4910

gtk/a11y/gtkatspicontext.c

index a0086365c441c0aac530f6c6a8787ed3fb857cf7..7b62a1ea81500ab761024f0cc213ceb99cd469c8 100644 (file)
@@ -953,22 +953,30 @@ gtk_at_spi_context_state_change (GtkATContext                *ctx,
     {
       value = gtk_accessible_attribute_set_get_value (states, GTK_ACCESSIBLE_STATE_CHECKED);
 
-      switch (gtk_tristate_accessible_value_get (value))
+      if (value->value_class->type == GTK_ACCESSIBLE_VALUE_TYPE_TRISTATE)
+        {
+          switch (gtk_tristate_accessible_value_get (value))
+            {
+            case GTK_ACCESSIBLE_TRISTATE_TRUE:
+              emit_state_changed (self, "checked", TRUE);
+              emit_state_changed (self, "indeterminate", FALSE);
+              break;
+            case GTK_ACCESSIBLE_TRISTATE_MIXED:
+              emit_state_changed (self, "checked", FALSE);
+              emit_state_changed (self, "indeterminate", TRUE);
+              break;
+            case GTK_ACCESSIBLE_TRISTATE_FALSE:
+              emit_state_changed (self, "checked", FALSE);
+              emit_state_changed (self, "indeterminate", FALSE);
+              break;
+            default:
+              break;
+            }
+        }
+      else
         {
-        case GTK_ACCESSIBLE_TRISTATE_TRUE:
-          emit_state_changed (self, "checked", TRUE);
-          emit_state_changed (self, "indeterminate", FALSE);
-          break;
-        case GTK_ACCESSIBLE_TRISTATE_MIXED:
           emit_state_changed (self, "checked", FALSE);
           emit_state_changed (self, "indeterminate", TRUE);
-          break;
-        case GTK_ACCESSIBLE_TRISTATE_FALSE:
-          emit_state_changed (self, "checked", FALSE);
-          emit_state_changed (self, "indeterminate", FALSE);
-          break;
-        default:
-          break;
         }
     }
 
@@ -1011,22 +1019,31 @@ gtk_at_spi_context_state_change (GtkATContext                *ctx,
   if (changed_states & GTK_ACCESSIBLE_STATE_CHANGE_PRESSED)
     {
       value = gtk_accessible_attribute_set_get_value (states, GTK_ACCESSIBLE_STATE_PRESSED);
-      switch (gtk_tristate_accessible_value_get (value))
+
+      if (value->value_class->type == GTK_ACCESSIBLE_VALUE_TYPE_TRISTATE)
+        {
+          switch (gtk_tristate_accessible_value_get (value))
+            {
+            case GTK_ACCESSIBLE_TRISTATE_TRUE:
+              emit_state_changed (self, "pressed", TRUE);
+              emit_state_changed (self, "indeterminate", FALSE);
+              break;
+            case GTK_ACCESSIBLE_TRISTATE_MIXED:
+              emit_state_changed (self, "pressed", FALSE);
+              emit_state_changed (self, "indeterminate", TRUE);
+              break;
+            case GTK_ACCESSIBLE_TRISTATE_FALSE:
+              emit_state_changed (self, "pressed", FALSE);
+              emit_state_changed (self, "indeterminate", FALSE);
+              break;
+            default:
+              break;
+            }
+        }
+      else
         {
-        case GTK_ACCESSIBLE_TRISTATE_TRUE:
-          emit_state_changed (self, "pressed", TRUE);
-          emit_state_changed (self, "indeterminate", FALSE);
-          break;
-        case GTK_ACCESSIBLE_TRISTATE_MIXED:
           emit_state_changed (self, "pressed", FALSE);
           emit_state_changed (self, "indeterminate", TRUE);
-          break;
-        case GTK_ACCESSIBLE_TRISTATE_FALSE:
-          emit_state_changed (self, "pressed", FALSE);
-          emit_state_changed (self, "indeterminate", FALSE);
-          break;
-        default:
-          break;
         }
     }