diff --git a/widget/gtk/WidgetStyleCache.cpp b/widget/gtk/WidgetStyleCache.cpp index adc64e78f9d7..7e92266b5eb5 100644 --- a/widget/gtk/WidgetStyleCache.cpp +++ b/widget/gtk/WidgetStyleCache.cpp @@ -280,13 +280,32 @@ GtkStyleContext* ClaimStyleContext(WidgetNodeType aNodeType, GtkTextDirection aDirection, GtkStateFlags aStateFlags, StyleFlags aFlags) { + MOZ_ASSERT(!sStyleContextNeedsRestore); GtkStyleContext* style = GetStyleInternal(aNodeType); #ifdef DEBUG MOZ_ASSERT(!sCurrentStyleContext); sCurrentStyleContext = style; #endif - gtk_style_context_set_state(style, aStateFlags); - gtk_style_context_set_direction(style, aDirection); + GtkStateFlags oldState = gtk_style_context_get_state(style); + GtkTextDirection oldDirection = gtk_style_context_get_direction(style); + if (oldState != aStateFlags || oldDirection != aDirection) { + // From GTK 3.8, set_state() will overwrite the direction, so set + // direction after state. + gtk_style_context_set_state(style, aStateFlags); + gtk_style_context_set_direction(style, aDirection); + + // This invalidate is necessary for unsaved style contexts from GtkWidgets + // in pre-3.18 GTK, because automatic invalidation of such contexts + // was delayed until a resize event runs. + // + // https://bugzilla.mozilla.org/show_bug.cgi?id=1272194#c7 + // + // Avoid calling invalidate on saved contexts to avoid performing + // build_properties() (in 3.16 stylecontext.c) unnecessarily early. + if (!sStyleContextNeedsRestore) { + gtk_style_context_invalidate(style); + } + } return style; } diff --git a/widget/gtk/mozgtk/mozgtk.c b/widget/gtk/mozgtk/mozgtk.c index 7caaddee3575..05a02c9ad037 100644 --- a/widget/gtk/mozgtk/mozgtk.c +++ b/widget/gtk/mozgtk/mozgtk.c @@ -548,6 +548,7 @@ STUB(gtk_style_context_get_background_color) STUB(gtk_style_context_get_border) STUB(gtk_style_context_get_border_color) STUB(gtk_style_context_get_color) +STUB(gtk_style_context_get_direction) STUB(gtk_style_context_get_margin) STUB(gtk_style_context_get_padding) STUB(gtk_style_context_get_path) @@ -555,6 +556,7 @@ STUB(gtk_style_context_get_property) STUB(gtk_style_context_get_state) STUB(gtk_style_context_get_style) STUB(gtk_style_context_has_class) +STUB(gtk_style_context_invalidate) STUB(gtk_style_context_new) STUB(gtk_style_context_remove_class) STUB(gtk_style_context_remove_region)