[gtk+] GtkBuilder: Enforce "class" as a mandatory attribute for <object>



commit 60cee7339f42a7d56eee19c76f12e56bf5a2943a
Author: Debarshi Ray <debarshir gnome org>
Date:   Mon Sep 18 18:28:55 2017 +0200

    GtkBuilder: Enforce "class" as a mandatory attribute for <object>
    
    https://bugzilla.gnome.org/show_bug.cgi?id=786931

 gtk/gtkbuilderparser.c  |   21 +++++++++++++++------
 testsuite/gtk/builder.c |   15 +++++++++++++--
 2 files changed, 28 insertions(+), 8 deletions(-)
---
diff --git a/gtk/gtkbuilderparser.c b/gtk/gtkbuilderparser.c
index da890b4..94c5b8b 100644
--- a/gtk/gtkbuilderparser.c
+++ b/gtk/gtkbuilderparser.c
@@ -268,6 +268,12 @@ parse_object (GMarkupParseContext  *context,
       return;
     }
 
+  /* Even though 'class' is a mandatory attribute, we don't flag its
+   * absence here because it's supposed to throw
+   * GTK_BUILDER_ERROR_MISSING_ATTRIBUTE, not
+   * G_MARKUP_ERROR_MISSING_ATTRIBUTE. It's handled immediately
+   * afterwards.
+   */
   if (!g_markup_collect_attributes (element_name, names, values, error,
                                     G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "class", 
&object_class,
                                     G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "constructor", 
&constructor,
@@ -279,6 +285,12 @@ parse_object (GMarkupParseContext  *context,
       return;
     }
 
+  if (!object_class)
+    {
+      error_missing_attribute (data, element_name, "class", error);
+      return;
+    }
+
   if (type_func)
     {
       /* Call the GType function, and return the GType, it's guaranteed afterwards
@@ -295,8 +307,10 @@ parse_object (GMarkupParseContext  *context,
           return;
         }
     }
-  else if (object_class)
+  else
     {
+      g_assert_nonnull (object_class);
+
       object_type = gtk_builder_get_type_from_name (data->builder, object_class);
       if (object_type == G_TYPE_INVALID)
         {
@@ -308,11 +322,6 @@ parse_object (GMarkupParseContext  *context,
           return;
        }
     }
-  else
-    {
-      error_missing_attribute (data, element_name, "class", error);
-      return;
-    }
 
   if (!object_id)
     {
diff --git a/testsuite/gtk/builder.c b/testsuite/gtk/builder.c
index 372bb15..9d5fb82 100644
--- a/testsuite/gtk/builder.c
+++ b/testsuite/gtk/builder.c
@@ -670,7 +670,7 @@ test_types (void)
     "</interface>";
   const gchar buffer2[] = 
     "<interface>"
-    "  <object type-func=\"gtk_window_get_type\" id=\"window\"/>"
+    "  <object class=\"GtkWindow\" type-func=\"gtk_window_get_type\" id=\"window\"/>"
     "</interface>";
   const gchar buffer3[] = 
     "<interface>"
@@ -678,7 +678,11 @@ test_types (void)
     "</interface>";
   const gchar buffer4[] =
     "<interface>"
-    "  <object type-func=\"xxx_invalid_get_type_function\" id=\"window\"/>"
+    "  <object class=\"GtkWindow\" type-func=\"xxx_invalid_get_type_function\" id=\"window\"/>"
+    "</interface>";
+  const gchar buffer5[] =
+    "<interface>"
+    "  <object type-func=\"gtk_window_get_type\" id=\"window\"/>"
     "</interface>";
   GtkBuilder *builder;
   GObject *window;
@@ -707,6 +711,13 @@ test_types (void)
   g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_TYPE_FUNCTION);
   g_error_free (error);
   g_object_unref (builder);
+
+  error = NULL;
+  builder = gtk_builder_new ();
+  gtk_builder_add_from_string (builder, buffer5, -1, &error);
+  g_assert_error (error, GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_MISSING_ATTRIBUTE);
+  g_error_free (error);
+  g_object_unref (builder);
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]