[gtk+] stylecontext: Don't crah when invalidate() is called on saved context



commit edec64cda3d4518b4e87d5ea5d287d4570ba9933
Author: Benjamin Otte <otte redhat com>
Date:   Wed Feb 4 21:08:54 2015 +0100

    stylecontext: Don't crah when invalidate() is called on saved context
    
    We need to invalidate the root node, not the current one.
    Fixes crashes on startup of eclipse.
    
    Testcase included.
    
    https://bugzilla.redhat.com/show_bug.cgi?id=1185828

 gtk/gtkstylecontext.c        |   12 +++++++-----
 testsuite/gtk/stylecontext.c |   19 +++++++++++++++++++
 2 files changed, 26 insertions(+), 5 deletions(-)
---
diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c
index 941410f..959857d 100644
--- a/gtk/gtkstylecontext.c
+++ b/gtk/gtkstylecontext.c
@@ -3108,17 +3108,19 @@ gtk_style_context_invalidate (GtkStyleContext *context)
 {
   GtkBitmask *changes;
   GtkCssStyle *style;
+  GtkCssNode *root;
 
   g_return_if_fail (GTK_IS_STYLE_CONTEXT (context));
 
   gtk_style_context_clear_cache (context);
+  gtk_css_node_set_values (context->priv->cssnode, NULL);
 
-  /* insta-recalculate the new style here */
+  root = gtk_style_context_get_root (context);
   style = build_properties (context,
-                            context->priv->cssnode->decl,
-                            !gtk_style_context_is_saved (context),
-                            gtk_css_node_get_parent_style (context, context->priv->cssnode));
-  gtk_css_node_set_values (context->priv->cssnode, style);
+                            root->decl,
+                            TRUE,
+                            gtk_css_node_get_parent_style (context, root));
+  gtk_css_node_set_values (root, style);
   g_object_unref (style);
 
   if (!gtk_style_context_is_saved (context))
diff --git a/testsuite/gtk/stylecontext.c b/testsuite/gtk/stylecontext.c
index 55bd2c7..9ed3b58 100644
--- a/testsuite/gtk/stylecontext.c
+++ b/testsuite/gtk/stylecontext.c
@@ -289,6 +289,24 @@ test_basic_properties (void)
   g_object_unref (context);
 }
 
+void
+test_invalidate_saved (void)
+{
+  GtkWidget *window;
+  GtkStyleContext *context;
+
+  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+  context = gtk_widget_get_style_context (window);
+  gtk_style_context_save (context);
+G_GNUC_BEGIN_IGNORE_DEPRECATIONS
+  gtk_style_context_invalidate (context);
+G_GNUC_END_IGNORE_DEPRECATIONS
+  gtk_style_context_restore (context);
+
+  gtk_widget_destroy (window);
+}
+
 int
 main (int argc, char *argv[])
 {
@@ -299,6 +317,7 @@ main (int argc, char *argv[])
   g_test_add_func ("/style/path", test_path);
   g_test_add_func ("/style/match", test_match);
   g_test_add_func ("/style/basic", test_basic_properties);
+  g_test_add_func ("/style/invalidate-saved", test_invalidate_saved);
 
   return g_test_run ();
 }


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