a11y: Fix some GtkATContext reference leaks
authorBarnabás Pőcze <pobrn@protonmail.com>
Fri, 30 Jun 2023 04:27:35 +0000 (06:27 +0200)
committerBarnabás Pőcze <pobrn@protonmail.com>
Sat, 1 Jul 2023 14:40:11 +0000 (16:40 +0200)
`gtk_accessible_get_at_context()` is transfer-full, so the returned
reference needs to be dropped. This was missing in a couple places.

gtk/gtkatcontext.c
gtk/inspector/a11y.c
gtk/inspector/a11yoverlay.c
testsuite/a11y/names.c

index 3ca70f7b73f509aabebcc3036746dd0e601f84ab..1381f9c526ecc215443aaf8a2765ae6792f1b944 100644 (file)
@@ -1333,6 +1333,8 @@ gtk_at_context_get_text_accumulate (GtkATContext          *self,
               GtkATContext *rel_context = gtk_accessible_get_at_context (rel);
 
               gtk_at_context_get_text_accumulate (rel_context, nodes, s, property, relation, FALSE, TRUE);
+
+              g_object_unref (rel_context);
             }
 
            if (s->len > 0)
index 3cb14ffc6a92c149c54f596c8e9701d2dbead7c8..1776ed5b1b61c5f36751311a53322bea8ae047a0 100644 (file)
@@ -243,6 +243,8 @@ update_name (GtkInspectorA11y *sl)
 
   name = gtk_at_context_get_name (context);
   gtk_label_set_label (GTK_LABEL (sl->name), name);
+
+  g_object_unref (context);
 }
 
 static void
@@ -257,6 +259,8 @@ update_description (GtkInspectorA11y *sl)
 
   description = gtk_at_context_get_description (context);
   gtk_label_set_label (GTK_LABEL (sl->description), description);
+
+  g_object_unref (context);
 }
 
 static void
index 25566539eb70b0dde0c600863ceae0dca796aadc..b22137181e33da5ca7c904d4608201924d004abb 100644 (file)
@@ -110,12 +110,11 @@ static struct {
 };
 
 static FixSeverity
-check_accessibility_errors (GtkWidget  *widget,
-                            GArray     *context_elements,
-                            char      **hint)
+check_accessibility_errors (GtkATContext       *context,
+                            GtkAccessibleRole   role,
+                            GArray             *context_elements,
+                            char              **hint)
 {
-  GtkAccessibleRole role;
-  GtkATContext *context;
   gboolean label_set;
   const char *role_name;
   GEnumClass *states;
@@ -124,11 +123,8 @@ check_accessibility_errors (GtkWidget  *widget,
   gboolean has_context;
 
   *hint = NULL;
-
-  role = gtk_accessible_get_accessible_role (GTK_ACCESSIBLE (widget));
   role_name = gtk_accessible_role_to_name (role, NULL);
 
-  context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (widget));
   if (!gtk_at_context_is_realized (context))
     gtk_at_context_realize (context);
 
@@ -314,6 +310,23 @@ check_accessibility_errors (GtkWidget  *widget,
   return SEVERITY_GOOD;
 }
 
+static FixSeverity
+check_widget_accessibility_errors (GtkWidget  *widget,
+                                   GArray     *context_elements,
+                                   char      **hint)
+{
+  GtkAccessibleRole role;
+  GtkATContext *context;
+  FixSeverity ret;
+
+  role = gtk_accessible_get_accessible_role (GTK_ACCESSIBLE (widget));
+  context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (widget));
+  ret = check_accessibility_errors (context, role, context_elements, hint);
+  g_object_unref (context);
+
+  return ret;
+}
+
 static void
 recurse_child_widgets (GtkA11yOverlay *self,
                        GtkWidget      *widget,
@@ -327,7 +340,7 @@ recurse_child_widgets (GtkA11yOverlay *self,
   if (!gtk_widget_get_mapped (widget))
     return;
 
-  severity = check_accessibility_errors (widget, self->context, &hint);
+  severity = check_widget_accessibility_errors (widget, self->context, &hint);
 
   if (severity != SEVERITY_GOOD)
     {
index 2eba20edea387f468b2705834922697630bc5659..6eb07cc20bce89aaebf7569d6909a8cfed8093b2 100644 (file)
@@ -6,6 +6,7 @@ static void
 test_name_content (void)
 {
   GtkWidget *window, *label1, *label2, *box, *button;
+  GtkATContext *context;
   char *name;
 
   label1 = gtk_label_new ("a");
@@ -21,24 +22,32 @@ test_name_content (void)
   gtk_window_set_child (GTK_WINDOW (window), button);
   gtk_window_present (GTK_WINDOW (window));
 
-  name = gtk_at_context_get_name (gtk_accessible_get_at_context (GTK_ACCESSIBLE (label1)));
+  context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (label1));
+  name = gtk_at_context_get_name (context);
   g_assert_cmpstr (name, ==, "a");
   g_free (name);
+  g_object_unref (context);
 
   /* this is because generic doesn't allow naming */
-  name = gtk_at_context_get_name (gtk_accessible_get_at_context (GTK_ACCESSIBLE (box)));
+  context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (box));
+  name = gtk_at_context_get_name (context);
   g_assert_cmpstr (name, ==, "");
   g_free (name);
+  g_object_unref (context);
 
-  name = gtk_at_context_get_name (gtk_accessible_get_at_context (GTK_ACCESSIBLE (button)));
+  context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (button));
+  name = gtk_at_context_get_name (context);
   g_assert_cmpstr (name, ==, "a b");
   g_free (name);
+  g_object_unref (context);
 
   gtk_widget_set_visible (label2, FALSE);
 
-  name = gtk_at_context_get_name (gtk_accessible_get_at_context (GTK_ACCESSIBLE (button)));
+  context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (button));
+  name = gtk_at_context_get_name (context);
   g_assert_cmpstr (name, ==, "a");
   g_free (name);
+  g_object_unref (context);
 
   gtk_window_destroy (GTK_WINDOW (window));
 }
@@ -47,6 +56,7 @@ static void
 test_name_tooltip (void)
 {
   GtkWidget *window, *image;
+  GtkATContext *context;
   char *name;
 
   image = gtk_image_new ();
@@ -57,10 +67,14 @@ test_name_tooltip (void)
 
   gtk_widget_set_tooltip_text (image, "tooltip");
 
-  name = gtk_at_context_get_name (gtk_accessible_get_at_context (GTK_ACCESSIBLE (image)));
+  context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (image));
+
+  name = gtk_at_context_get_name (context);
   g_assert_cmpstr (name, ==, "tooltip");
   g_free (name);
 
+  g_object_unref (context);
+
   gtk_window_destroy (GTK_WINDOW (window));
 }
 
@@ -68,6 +82,7 @@ static void
 test_name_menubutton (void)
 {
   GtkWidget *window, *widget;
+  GtkATContext *context;
   char *name;
 
   widget = gtk_menu_button_new ();
@@ -79,10 +94,14 @@ test_name_menubutton (void)
 
   gtk_widget_set_tooltip_text (widget, "tooltip");
 
-  name = gtk_at_context_get_name (gtk_accessible_get_at_context (GTK_ACCESSIBLE (widget)));
+  context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (widget));
+
+  name = gtk_at_context_get_name (context);
   g_assert_cmpstr (name, ==, "tooltip");
   g_free (name);
 
+  g_object_unref (context);
+
   gtk_window_destroy (GTK_WINDOW (window));
 }
 
@@ -90,6 +109,7 @@ static void
 test_name_label (void)
 {
   GtkWidget *window, *image;
+  GtkATContext *context;
   char *name;
   char *desc;
 
@@ -108,8 +128,10 @@ test_name_label (void)
                                   GTK_ACCESSIBLE_PROPERTY_LABEL, "label",
                                   -1);
 
-  name = gtk_at_context_get_name (gtk_accessible_get_at_context (GTK_ACCESSIBLE (image)));
-  desc = gtk_at_context_get_description (gtk_accessible_get_at_context (GTK_ACCESSIBLE (image)));
+  context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (image));
+
+  name = gtk_at_context_get_name (context);
+  desc = gtk_at_context_get_description (context);
 
   g_assert_cmpstr (name, ==, "label");
   g_assert_cmpstr (desc, ==, "tooltip");
@@ -117,6 +139,8 @@ test_name_label (void)
   g_free (name);
   g_free (desc);
 
+  g_object_unref (context);
+
   gtk_window_destroy (GTK_WINDOW (window));
 }
 
@@ -124,6 +148,7 @@ static void
 test_name_prohibited (void)
 {
   GtkWidget *window, *widget;
+  GtkATContext *context;
   char *name;
   char *desc;
 
@@ -136,8 +161,10 @@ test_name_prohibited (void)
   gtk_window_set_child (GTK_WINDOW (window), widget);
   gtk_window_present (GTK_WINDOW (window));
 
-  name = gtk_at_context_get_name (gtk_accessible_get_at_context (GTK_ACCESSIBLE (widget)));
-  desc = gtk_at_context_get_description (gtk_accessible_get_at_context (GTK_ACCESSIBLE (widget)));
+  context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (widget));
+
+  name = gtk_at_context_get_name (context);
+  desc = gtk_at_context_get_description (context);
 
   g_assert_cmpstr (name, ==, "");
   g_assert_cmpstr (desc, ==, "");
@@ -145,6 +172,8 @@ test_name_prohibited (void)
   g_free (name);
   g_free (desc);
 
+  g_object_unref (context);
+
   gtk_window_destroy (GTK_WINDOW (window));
 }
 
@@ -152,6 +181,7 @@ static void
 test_name_range (void)
 {
   GtkWidget *window, *scale;
+  GtkATContext *context;
   char *name;
 
   scale = gtk_scale_new_with_range (GTK_ORIENTATION_HORIZONTAL, 0, 100, 10);
@@ -160,16 +190,20 @@ test_name_range (void)
   gtk_window_set_child (GTK_WINDOW (window), scale);
   gtk_window_present (GTK_WINDOW (window));
 
+  context = gtk_accessible_get_at_context (GTK_ACCESSIBLE (scale));
+
   g_assert_true (gtk_accessible_get_accessible_role (GTK_ACCESSIBLE (scale)) == GTK_ACCESSIBLE_ROLE_SLIDER);
-  g_assert_true (gtk_at_context_get_accessible_role (gtk_accessible_get_at_context (GTK_ACCESSIBLE (scale))) == GTK_ACCESSIBLE_ROLE_SLIDER);
+  g_assert_true (gtk_at_context_get_accessible_role (context) == GTK_ACCESSIBLE_ROLE_SLIDER);
 
   gtk_range_set_value (GTK_RANGE (scale), 50);
 
-  name = gtk_at_context_get_name (gtk_accessible_get_at_context (GTK_ACCESSIBLE (scale)));
+  name = gtk_at_context_get_name (context);
   g_assert_cmpstr (name, ==, "50");
 
   g_free (name);
 
+  g_object_unref (context);
+
   gtk_window_destroy (GTK_WINDOW (window));
 }