summaryrefslogtreecommitdiff
path: root/gtk/gtkbuilderparser.c
diff options
context:
space:
mode:
authorAlexander Mikhaylenko <alexm@gnome.org>2023-02-28 14:25:42 +0400
committerAlexander Mikhaylenko <alexm@gnome.org>2023-02-28 14:46:14 +0400
commit2bcc3cfb33cdfa73c4f583a2df782db04db4e0e3 (patch)
treef1c3947105a001b95859ef7fc8b5eaa93f8c58dc /gtk/gtkbuilderparser.c
parentdbaaa59758303aad1bfeaddcbe3e86baf8b4b0ba (diff)
downloadgtk+-2bcc3cfb33cdfa73c4f583a2df782db04db4e0e3.tar.gz
builderparser: Don't exit too early on nested custom tags
Currently nested custom tags work only as long as the element names differ from the root one. If it's same, for example: <condition type="any"> <condition type="max-width">600</condition> <condition type="max-height">600</condition> </condition> then it will fail. Meanwhile the same tags wrapped into <conditions> would work. The problem is that custom tag parsing is considered finished as soon as we encounter a closing tag with the same element name. So instead, track the nesting level.
Diffstat (limited to 'gtk/gtkbuilderparser.c')
-rw-r--r--gtk/gtkbuilderparser.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/gtk/gtkbuilderparser.c b/gtk/gtkbuilderparser.c
index 9658ea226e..1d2d0b3d0b 100644
--- a/gtk/gtkbuilderparser.c
+++ b/gtk/gtkbuilderparser.c
@@ -1608,6 +1608,7 @@ create_subparser (GObject *object,
subparser->object = object;
subparser->child = child;
subparser->tagname = g_strdup (element_name);
+ subparser->level = 1;
subparser->start = element_name;
subparser->parser = g_memdup2 (parser, sizeof (GtkBuildableParser));
subparser->data = user_data;
@@ -1638,6 +1639,8 @@ subparser_start (GtkBuildableParseContext *context,
if (subparser->start)
{
+ subparser->level++;
+
if (subparser->parser->start_element)
subparser->parser->start_element (context,
element_name, names, values,
@@ -1653,6 +1656,8 @@ subparser_end (GtkBuildableParseContext *context,
ParserData *data,
GError **error)
{
+ data->subparser->level--;
+
if (data->subparser->parser->end_element)
data->subparser->parser->end_element (context, element_name,
data->subparser->data, error);
@@ -1660,9 +1665,11 @@ subparser_end (GtkBuildableParseContext *context,
if (*error)
return;
- if (strcmp (data->subparser->start, element_name) != 0)
+ if (data->subparser->level > 0)
return;
+ g_assert (strcmp (data->subparser->start, element_name) == 0);
+
gtk_buildable_custom_tag_end (GTK_BUILDABLE (data->subparser->object),
data->builder,
data->subparser->child,