Commit ec57c6c1 authored by Benjamin Otte's avatar Benjamin Otte

csspathnode: Handle context going away

Sometimes path nodes can survive longer than the style context that
created them. Don't crash in those cases.

Fixes startup of mutter.

Testcase included.
parent d55c2610
......@@ -156,6 +156,17 @@ gtk_css_path_node_new (GtkStyleContext *context)
return GTK_CSS_NODE (node);
gtk_css_path_node_unset_context (GtkCssPathNode *node)
gtk_internal_return_if_fail (GTK_IS_CSS_PATH_NODE (node));
gtk_internal_return_if_fail (node->context != NULL);
node->context = NULL;
gtk_css_node_invalidate_style_provider (GTK_CSS_NODE (node));
gtk_css_path_node_set_widget_path (GtkCssPathNode *node,
GtkWidgetPath *path)
......@@ -50,6 +50,8 @@ GType gtk_css_path_node_get_type (void) G_GNUC_CONST;
GtkCssNode * gtk_css_path_node_new (GtkStyleContext *context);
void gtk_css_path_node_unset_context (GtkCssPathNode *node);
void gtk_css_path_node_set_widget_path (GtkCssPathNode *node,
GtkWidgetPath *path);
GtkWidgetPath * gtk_css_path_node_get_widget_path (GtkCssPathNode *node);
......@@ -365,12 +365,15 @@ gtk_style_context_finalize (GObject *object)
style_context = GTK_STYLE_CONTEXT (object);
priv = style_context->priv;
while (priv->saved_nodes)
gtk_style_context_pop_style_node (style_context);
if (GTK_IS_CSS_PATH_NODE (priv->cssnode))
gtk_css_path_node_unset_context (GTK_CSS_PATH_NODE (priv->cssnode));
gtk_style_context_clear_parent (style_context);
gtk_style_context_set_cascade (style_context, NULL);
while (priv->saved_nodes)
gtk_style_context_pop_style_node (style_context);
g_object_unref (priv->cssnode);
gtk_style_context_clear_property_cache (style_context);
......@@ -352,6 +352,20 @@ test_set_widget_path_saved (void)
g_object_unref (context);
test_widget_path_parent (void)
GtkStyleContext *parent, *context;
parent = gtk_style_context_new ();
context = gtk_style_context_new ();
gtk_style_context_set_parent (context, parent);
g_object_unref (parent);
g_object_unref (context);
main (int argc, char *argv[])
......@@ -364,6 +378,7 @@ main (int argc, char *argv[])
g_test_add_func ("/style/basic", test_basic_properties);
g_test_add_func ("/style/invalidate-saved", test_invalidate_saved);
g_test_add_func ("/style/set-widget-path-saved", test_set_widget_path_saved);
g_test_add_func ("/style/widget-path-parent", test_widget_path_parent);
return g_test_run ();
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment