bug 1365556 invalidate widget style contexts after their ancestors are set r?stransky draft
authorKarl Tomlinson <karlt+@karlt.net>
Tue, 01 Aug 2017 09:17:46 +1200
changeset 618936 f90aa5139f3e2804a08d47b3a30efc9b44a6a35a
parent 618576 87824406b9feb420a3150720707b424d7cee5915
child 640239 eab1642714b9a6ccc404cefec06ee58021975157
push id71513
push userktomlinson@mozilla.com
push dateTue, 01 Aug 2017 09:27:02 +0000
reviewersstransky
bugs1365556
milestone56.0a1
bug 1365556 invalidate widget style contexts after their ancestors are set r?stransky Although this is only known to affect buttons with builtin child widgets, it is difficult to audit all GTK widgets for similar situations, and so the same defense is applied to all widgets. MozReview-Commit-ID: LMVXX3UYqR9
widget/gtk/WidgetStyleCache.cpp
--- a/widget/gtk/WidgetStyleCache.cpp
+++ b/widget/gtk/WidgetStyleCache.cpp
@@ -617,16 +617,30 @@ CreateWidget(WidgetNodeType aWidgetType)
 }
 
 GtkWidget*
 GetWidget(WidgetNodeType aWidgetType)
 {
   GtkWidget* widget = sWidgetStorage[aWidgetType];
   if (!widget) {
     widget = CreateWidget(aWidgetType);
+    // In GTK versions prior to 3.18, automatic invalidation of style contexts
+    // for widgets was delayed until the next resize event.  Gecko however,
+    // typically uses the style context before the resize event runs and so an
+    // explicit invalidation may be required.  This is necessary if a style
+    // property was retrieved before all changes were made to the style
+    // context.  One such situation is where gtk_button_construct_child()
+    // retrieves the style property "image-spacing" during construction of the
+    // GtkButton, before its parent is set to provide inheritance of ancestor
+    // properties.  More recent GTK versions do not need this, but do not
+    // re-resolve until required and so invalidation does not trigger
+    // unnecessary resolution in general.
+    GtkStyleContext* style = gtk_widget_get_style_context(widget);
+    gtk_style_context_invalidate(style);
+
     sWidgetStorage[aWidgetType] = widget;
   }
   return widget;
 }
 
 static void
 AddStyleClassesFromStyle(GtkStyleContext* aDest, GtkStyleContext* aSrc)
 {