[gtk+] GtkBuilder: Enforce "class" as a mandatory attribute for <object>
- From: Debarshi Ray <debarshir src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] GtkBuilder: Enforce "class" as a mandatory attribute for <object>
- Date: Mon, 25 Sep 2017 13:27:28 +0000 (UTC)
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]