diff --git a/gtk/gtkbuilderparser.c b/gtk/gtkbuilderparser.c index da890b42e5..94c5b8b6c1 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 372bb15e1a..9d5fb822f3 100644 --- a/testsuite/gtk/builder.c +++ b/testsuite/gtk/builder.c @@ -670,7 +670,7 @@ test_types (void) ""; const gchar buffer2[] = "" - " " + " " ""; const gchar buffer3[] = "" @@ -678,7 +678,11 @@ test_types (void) ""; const gchar buffer4[] = "" - " " + " " + ""; + const gchar buffer5[] = + "" + " " ""; 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