aboutsummaryrefslogtreecommitdiffstats
path: root/www/firefox
diff options
context:
space:
mode:
authorjbeich <jbeich@FreeBSD.org>2017-11-06 14:41:55 +0800
committerjbeich <jbeich@FreeBSD.org>2017-11-06 14:41:55 +0800
commit8f089220d5f9cb135adb883de05626c850a11c07 (patch)
tree05d9086b5511c7ee70b2c1230682e107e1bb96a8 /www/firefox
parentbf8d274aec7302e62e1020afa39e87a888c79c38 (diff)
downloadfreebsd-ports-gnome-8f089220d5f9cb135adb883de05626c850a11c07.tar.gz
freebsd-ports-gnome-8f089220d5f9cb135adb883de05626c850a11c07.tar.zst
freebsd-ports-gnome-8f089220d5f9cb135adb883de05626c850a11c07.zip
www/firefox: gracefully handle errors from Gtk font settings
PR: 1400817 Obtained from: upstream (Firefox 57) MFH: 2017Q4
Diffstat (limited to 'www/firefox')
-rw-r--r--www/firefox/Makefile2
-rw-r--r--www/firefox/files/patch-bug1384701796
2 files changed, 797 insertions, 1 deletions
diff --git a/www/firefox/Makefile b/www/firefox/Makefile
index c5227eb47606..23bdc2bbb0be 100644
--- a/www/firefox/Makefile
+++ b/www/firefox/Makefile
@@ -4,7 +4,7 @@
PORTNAME= firefox
DISTVERSION= 56.0.2
DISTVERSIONSUFFIX=.source
-PORTREVISION= 6
+PORTREVISION= 7
PORTEPOCH= 1
CATEGORIES= www ipv6
MASTER_SITES= MOZILLA/${PORTNAME}/releases/${DISTVERSION}/source \
diff --git a/www/firefox/files/patch-bug1384701 b/www/firefox/files/patch-bug1384701
new file mode 100644
index 000000000000..142d5430d266
--- /dev/null
+++ b/www/firefox/files/patch-bug1384701
@@ -0,0 +1,796 @@
+diff --git widget/gtk/nsLookAndFeel.cpp widget/gtk/nsLookAndFeel.cpp
+index 6bb3e27c6653..f4c35d82200a 100644
+--- widget/gtk/nsLookAndFeel.cpp
++++ widget/gtk/nsLookAndFeel.cpp
+@@ -29,11 +29,9 @@
+
+ #include "mozilla/gfx/2D.h"
+
+-#if MOZ_WIDGET_GTK != 2
+ #include <cairo-gobject.h>
+ #include "WidgetStyleCache.h"
+ #include "prenv.h"
+-#endif
+
+ using mozilla::LookAndFeel;
+
+@@ -49,9 +47,6 @@ using mozilla::LookAndFeel;
+
+ nsLookAndFeel::nsLookAndFeel()
+ : nsXPLookAndFeel(),
+-#if (MOZ_WIDGET_GTK == 2)
+- mStyle(nullptr),
+-#endif
+ mDefaultFontCached(false), mButtonFontCached(false),
+ mFieldFontCached(false), mMenuFontCached(false),
+ mInitialized(false)
+@@ -66,12 +61,8 @@ nsLookAndFeel::NativeInit()
+
+ nsLookAndFeel::~nsLookAndFeel()
+ {
+-#if (MOZ_WIDGET_GTK == 2)
+- g_object_unref(mStyle);
+-#endif
+ }
+
+-#if MOZ_WIDGET_GTK != 2
+ // Modifies color |*aDest| as if a pattern of color |aSource| was painted with
+ // CAIRO_OPERATOR_OVER to a surface with color |*aDest|.
+ static void
+@@ -228,42 +219,19 @@ GetBorderColors(GtkStyleContext* aContext,
+ *aDarkColor = GDK_RGBA_TO_NS_RGBA(darkColor);
+ return ret;
+ }
+-#endif
+
+ nsresult
+ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
+ {
+ EnsureInit();
+
+-#if (MOZ_WIDGET_GTK == 3)
+ GdkRGBA gdk_color;
+-#endif
+ nsresult res = NS_OK;
+
+ switch (aID) {
+ // These colors don't seem to be used for anything anymore in Mozilla
+ // (except here at least TextSelectBackground and TextSelectForeground)
+ // The CSS2 colors below are used.
+-#if (MOZ_WIDGET_GTK == 2)
+- case eColorID_WindowBackground:
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_NORMAL]);
+- break;
+- case eColorID_WindowForeground:
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_NORMAL]);
+- break;
+- case eColorID_WidgetBackground:
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]);
+- break;
+- case eColorID_WidgetForeground:
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_NORMAL]);
+- break;
+- case eColorID_WidgetSelectBackground:
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_SELECTED]);
+- break;
+- case eColorID_WidgetSelectForeground:
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_SELECTED]);
+- break;
+-#else
+ case eColorID_WindowBackground:
+ case eColorID_WidgetBackground:
+ case eColorID_TextBackground:
+@@ -303,35 +271,12 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
+ case eColorID__moz_html_cellhighlighttext:
+ aColor = sTextSelectedText;
+ break;
+-#endif
+ case eColorID_Widget3DHighlight:
+ aColor = NS_RGB(0xa0,0xa0,0xa0);
+ break;
+ case eColorID_Widget3DShadow:
+ aColor = NS_RGB(0x40,0x40,0x40);
+ break;
+-#if (MOZ_WIDGET_GTK == 2)
+- case eColorID_TextBackground:
+- // not used?
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_NORMAL]);
+- break;
+- case eColorID_TextForeground:
+- // not used?
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_NORMAL]);
+- break;
+- case eColorID_TextSelectBackground:
+- case eColorID_IMESelectedRawTextBackground:
+- case eColorID_IMESelectedConvertedTextBackground:
+- // still used
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_SELECTED]);
+- break;
+- case eColorID_TextSelectForeground:
+- case eColorID_IMESelectedRawTextForeground:
+- case eColorID_IMESelectedConvertedTextForeground:
+- // still used
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_SELECTED]);
+- break;
+-#endif
+ case eColorID_IMERawInputBackground:
+ case eColorID_IMEConvertedTextBackground:
+ aColor = NS_TRANSPARENT;
+@@ -352,53 +297,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
+ aColor = NS_RGB(0xff, 0, 0);
+ break;
+
+-#if (MOZ_WIDGET_GTK == 2)
+- // css2 http://www.w3.org/TR/REC-CSS2/ui.html#system-colors
+- case eColorID_activeborder:
+- // active window border
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]);
+- break;
+- case eColorID_activecaption:
+- // active window caption background
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]);
+- break;
+- case eColorID_appworkspace:
+- // MDI background color
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]);
+- break;
+- case eColorID_background:
+- // desktop background
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]);
+- break;
+- case eColorID_captiontext:
+- // text in active window caption, size box, and scrollbar arrow box (!)
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_NORMAL]);
+- break;
+- case eColorID_graytext:
+- // disabled text in windows, menus, etc.
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_INSENSITIVE]);
+- break;
+- case eColorID_highlight:
+- // background of selected item
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_SELECTED]);
+- break;
+- case eColorID_highlighttext:
+- // text of selected item
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_SELECTED]);
+- break;
+- case eColorID_inactiveborder:
+- // inactive window border
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]);
+- break;
+- case eColorID_inactivecaption:
+- // inactive window caption
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_INSENSITIVE]);
+- break;
+- case eColorID_inactivecaptiontext:
+- // text in inactive window caption
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_INSENSITIVE]);
+- break;
+-#else
+ // css2 http://www.w3.org/TR/REC-CSS2/ui.html#system-colors
+ case eColorID_activeborder: {
+ // active window border
+@@ -433,7 +331,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
+ ReleaseStyleContext(style);
+ break;
+ }
+-#endif
+ case eColorID_infobackground:
+ // tooltip background color
+ aColor = sInfoBackground;
+@@ -452,11 +349,7 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
+ break;
+ case eColorID_scrollbar:
+ // scrollbar gray area
+-#if (MOZ_WIDGET_GTK == 2)
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_ACTIVE]);
+-#else
+ aColor = sMozScrollbar;
+-#endif
+ break;
+
+ case eColorID_threedlightshadow:
+@@ -465,11 +358,7 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
+ case eColorID_threedface:
+ case eColorID_buttonface:
+ // 3-D face color
+-#if (MOZ_WIDGET_GTK == 3)
+ aColor = sMozWindowBackground;
+-#else
+- aColor = sButtonBackground;
+-#endif
+ break;
+
+ case eColorID_buttontext:
+@@ -491,56 +380,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
+ aColor = sFrameInnerDarkBorder;
+ break;
+
+-#if (MOZ_WIDGET_GTK == 2)
+- case eColorID_threeddarkshadow:
+- // 3-D shadow outer edge color
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->black);
+- break;
+-
+- case eColorID_window:
+- case eColorID_windowframe:
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]);
+- break;
+-
+- case eColorID_windowtext:
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_NORMAL]);
+- break;
+-
+- case eColorID__moz_eventreerow:
+- case eColorID__moz_field:
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_NORMAL]);
+- break;
+- case eColorID__moz_fieldtext:
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_NORMAL]);
+- break;
+- case eColorID__moz_dialog:
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_NORMAL]);
+- break;
+- case eColorID__moz_dialogtext:
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_NORMAL]);
+- break;
+- case eColorID__moz_dragtargetzone:
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_SELECTED]);
+- break;
+- case eColorID__moz_buttondefault:
+- // default button border color
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->black);
+- break;
+- case eColorID__moz_buttonhoverface:
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->bg[GTK_STATE_PRELIGHT]);
+- break;
+- case eColorID__moz_buttonhovertext:
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->fg[GTK_STATE_PRELIGHT]);
+- break;
+- case eColorID__moz_cellhighlight:
+- case eColorID__moz_html_cellhighlight:
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->base[GTK_STATE_ACTIVE]);
+- break;
+- case eColorID__moz_cellhighlighttext:
+- case eColorID__moz_html_cellhighlighttext:
+- aColor = GDK_COLOR_TO_NS_RGB(mStyle->text[GTK_STATE_ACTIVE]);
+- break;
+-#else
+ case eColorID_threeddarkshadow:
+ // Hardcode to black
+ aColor = NS_RGB(0x00,0x00,0x00);
+@@ -574,7 +413,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
+ case eColorID__moz_buttonhovertext:
+ aColor = sButtonHoverText;
+ break;
+-#endif
+ case eColorID__moz_menuhover:
+ aColor = sMenuHover;
+ break;
+@@ -590,11 +428,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
+ case eColorID__moz_comboboxtext:
+ aColor = sComboBoxText;
+ break;
+-#if (MOZ_WIDGET_GTK == 2)
+- case eColorID__moz_combobox:
+- aColor = sComboBoxBackground;
+- break;
+-#endif
+ case eColorID__moz_menubartext:
+ aColor = sMenuBarText;
+ break;
+@@ -602,11 +435,7 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
+ aColor = sMenuBarHoverText;
+ break;
+ case eColorID__moz_gtk_info_bar_text:
+-#if (MOZ_WIDGET_GTK == 3)
+ aColor = sInfoBarText;
+-#else
+- aColor = sInfoText;
+-#endif
+ break;
+ default:
+ /* default color is BLACK */
+@@ -618,27 +447,6 @@ nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor)
+ return res;
+ }
+
+-#if (MOZ_WIDGET_GTK == 2)
+-static void darken_gdk_color(GdkColor *src, GdkColor *dest)
+-{
+- gdouble red;
+- gdouble green;
+- gdouble blue;
+-
+- red = (gdouble) src->red / 65535.0;
+- green = (gdouble) src->green / 65535.0;
+- blue = (gdouble) src->blue / 65535.0;
+-
+- red *= 0.93;
+- green *= 0.93;
+- blue *= 0.93;
+-
+- dest->red = red * 65535.0;
+- dest->green = green * 65535.0;
+- dest->blue = blue * 65535.0;
+-}
+-#endif
+-
+ static int32_t CheckWidgetStyle(GtkWidget* aWidget, const char* aStyle, int32_t aResult) {
+ gboolean value = FALSE;
+ gtk_widget_style_get(aWidget, aStyle, &value, nullptr);
+@@ -826,14 +634,8 @@ nsLookAndFeel::GetIntImpl(IntID aID, int32_t &aResult)
+ res = NS_ERROR_NOT_IMPLEMENTED;
+ break;
+ case eIntID_TouchEnabled:
+-#if MOZ_WIDGET_GTK == 3
+ aResult = mozilla::widget::WidgetUtils::IsTouchDeviceSupportPresent();
+ break;
+-#else
+- aResult = 0;
+- res = NS_ERROR_NOT_IMPLEMENTED;
+-#endif
+- break;
+ case eIntID_MacGraphiteTheme:
+ aResult = 0;
+ res = NS_ERROR_NOT_IMPLEMENTED;
+@@ -905,24 +707,20 @@ nsLookAndFeel::GetFloatImpl(FloatID aID, float &aResult)
+ }
+
+ static void
+-GetSystemFontInfo(GtkWidget *aWidget,
++GetSystemFontInfo(GtkStyleContext *aStyle,
+ nsString *aFontName,
+ gfxFontStyle *aFontStyle)
+ {
+- GtkSettings *settings = gtk_widget_get_settings(aWidget);
+-
+ aFontStyle->style = NS_FONT_STYLE_NORMAL;
+
+- gchar *fontname;
+- g_object_get(settings, "gtk-font-name", &fontname, nullptr);
+-
++ // As in
++ // https://git.gnome.org/browse/gtk+/tree/gtk/gtkwidget.c?h=3.22.19#n10333
+ PangoFontDescription *desc;
+- desc = pango_font_description_from_string(fontname);
++ gtk_style_context_get(aStyle, gtk_style_context_get_state(aStyle),
++ "font", &desc, nullptr);
+
+ aFontStyle->systemFont = true;
+
+- g_free(fontname);
+-
+ NS_NAMED_LITERAL_STRING(quote, "\"");
+ NS_ConvertUTF8toUTF16 family(pango_font_description_get_family(desc));
+ *aFontName = quote + family + quote;
+@@ -953,96 +751,28 @@ GetSystemFontInfo(GtkWidget *aWidget,
+ pango_font_description_free(desc);
+ }
+
+-static void
+-GetSystemFontInfo(LookAndFeel::FontID aID,
+- nsString *aFontName,
+- gfxFontStyle *aFontStyle)
+-{
+- if (aID == LookAndFeel::eFont_Widget) {
+- GtkWidget *label = gtk_label_new("M");
+- GtkWidget *parent = gtk_fixed_new();
+- GtkWidget *window = gtk_window_new(GTK_WINDOW_POPUP);
+-
+- gtk_container_add(GTK_CONTAINER(parent), label);
+- gtk_container_add(GTK_CONTAINER(window), parent);
+-
+- gtk_widget_ensure_style(label);
+- GetSystemFontInfo(label, aFontName, aFontStyle);
+- gtk_widget_destroy(window); // no unref, windows are different
+-
+- } else if (aID == LookAndFeel::eFont_Button) {
+- GtkWidget *label = gtk_label_new("M");
+- GtkWidget *parent = gtk_fixed_new();
+- GtkWidget *button = gtk_button_new();
+- GtkWidget *window = gtk_window_new(GTK_WINDOW_POPUP);
+-
+- gtk_container_add(GTK_CONTAINER(button), label);
+- gtk_container_add(GTK_CONTAINER(parent), button);
+- gtk_container_add(GTK_CONTAINER(window), parent);
+-
+- gtk_widget_ensure_style(label);
+- GetSystemFontInfo(label, aFontName, aFontStyle);
+- gtk_widget_destroy(window); // no unref, windows are different
+-
+- } else if (aID == LookAndFeel::eFont_Field) {
+- GtkWidget *entry = gtk_entry_new();
+- GtkWidget *parent = gtk_fixed_new();
+- GtkWidget *window = gtk_window_new(GTK_WINDOW_POPUP);
+-
+- gtk_container_add(GTK_CONTAINER(parent), entry);
+- gtk_container_add(GTK_CONTAINER(window), parent);
+-
+- gtk_widget_ensure_style(entry);
+- GetSystemFontInfo(entry, aFontName, aFontStyle);
+- gtk_widget_destroy(window); // no unref, windows are different
+-
+- } else {
+- MOZ_ASSERT(aID == LookAndFeel::eFont_Menu, "unexpected font ID");
+- GtkWidget *accel_label = gtk_accel_label_new("M");
+- GtkWidget *menuitem = gtk_menu_item_new();
+- GtkWidget *menu = gtk_menu_new();
+- g_object_ref_sink(menu);
+-
+- gtk_container_add(GTK_CONTAINER(menuitem), accel_label);
+- gtk_menu_shell_append((GtkMenuShell *)GTK_MENU(menu), menuitem);
+-
+- gtk_widget_ensure_style(accel_label);
+- GetSystemFontInfo(accel_label, aFontName, aFontStyle);
+- g_object_unref(menu);
+- }
+-}
+-
+ bool
+ nsLookAndFeel::GetFontImpl(FontID aID, nsString& aFontName,
+ gfxFontStyle& aFontStyle,
+ float aDevPixPerCSSPixel)
+ {
+- nsString *cachedFontName = nullptr;
+- gfxFontStyle *cachedFontStyle = nullptr;
+- bool *isCached = nullptr;
+-
+ switch (aID) {
+ case eFont_Menu: // css2
+ case eFont_PullDownMenu: // css3
+- cachedFontName = &mMenuFontName;
+- cachedFontStyle = &mMenuFontStyle;
+- isCached = &mMenuFontCached;
+- aID = eFont_Menu;
+- break;
++ aFontName = mMenuFontName;
++ aFontStyle = mMenuFontStyle;
++ return true;
+
+ case eFont_Field: // css3
+ case eFont_List: // css3
+- cachedFontName = &mFieldFontName;
+- cachedFontStyle = &mFieldFontStyle;
+- isCached = &mFieldFontCached;
+- aID = eFont_Field;
+- break;
++ aFontName = mFieldFontName;
++ aFontStyle = mFieldFontStyle;
++ return true;
+
+ case eFont_Button: // css3
+- cachedFontName = &mButtonFontName;
+- cachedFontStyle = &mButtonFontStyle;
+- isCached = &mButtonFontCached;
+- break;
++ aFontName = mButtonFontName;
++ aFontStyle = mButtonFontStyle;
++ return true;
+
+ case eFont_Caption: // css2
+ case eFont_Icon: // css2
+@@ -1057,21 +787,11 @@ nsLookAndFeel::GetFontImpl(FontID aID, nsString& aFontName,
+ case eFont_Dialog: // css3
+ case eFont_Tooltips: // moz
+ case eFont_Widget: // moz
+- cachedFontName = &mDefaultFontName;
+- cachedFontStyle = &mDefaultFontStyle;
+- isCached = &mDefaultFontCached;
+- aID = eFont_Widget;
+- break;
+- }
+-
+- if (!*isCached) {
+- GetSystemFontInfo(aID, cachedFontName, cachedFontStyle);
+- *isCached = true;
++ default:
++ aFontName = mDefaultFontName;
++ aFontStyle = mDefaultFontStyle;
++ return true;
+ }
+-
+- aFontName = *cachedFontName;
+- aFontStyle = *cachedFontStyle;
+- return true;
+ }
+
+ void
+@@ -1087,70 +807,6 @@ nsLookAndFeel::EnsureInit()
+ // gtk does non threadsafe refcounting
+ MOZ_ASSERT(NS_IsMainThread());
+
+-#if (MOZ_WIDGET_GTK == 2)
+- NS_ASSERTION(!mStyle, "already initialized");
+- // GtkInvisibles come with a refcount that is not floating
+- // (since their initialization code calls g_object_ref_sink) and
+- // their destroy code releases that reference (which means they
+- // have to be explicitly destroyed, since calling unref enough
+- // to cause destruction would lead to *another* unref).
+- // However, this combination means that it's actually still ok
+- // to use the normal pattern, which is to g_object_ref_sink
+- // after construction, and then destroy *and* unref when we're
+- // done. (Though we could skip the g_object_ref_sink and the
+- // corresponding g_object_unref, but that's particular to
+- // GtkInvisibles and GtkWindows.)
+- GtkWidget *widget = gtk_invisible_new();
+- g_object_ref_sink(widget); // effectively g_object_ref (see above)
+-
+- gtk_widget_ensure_style(widget);
+- mStyle = gtk_style_copy(gtk_widget_get_style(widget));
+-
+- gtk_widget_destroy(widget);
+- g_object_unref(widget);
+-
+- // tooltip foreground and background
+- GtkStyle *style = gtk_rc_get_style_by_paths(gtk_settings_get_default(),
+- "gtk-tooltips", "GtkWindow",
+- GTK_TYPE_WINDOW);
+- if (style) {
+- sInfoBackground = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]);
+- sInfoText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]);
+- }
+-
+- // menu foreground & menu background
+- GtkWidget *accel_label = gtk_accel_label_new("M");
+- GtkWidget *menuitem = gtk_menu_item_new();
+- GtkWidget *menu = gtk_menu_new();
+-
+- g_object_ref_sink(menu);
+-
+- gtk_container_add(GTK_CONTAINER(menuitem), accel_label);
+- gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+-
+- gtk_widget_set_style(accel_label, nullptr);
+- gtk_widget_set_style(menu, nullptr);
+- gtk_widget_realize(menu);
+- gtk_widget_realize(accel_label);
+-
+- style = gtk_widget_get_style(accel_label);
+- if (style) {
+- sMenuText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]);
+- }
+-
+- style = gtk_widget_get_style(menu);
+- if (style) {
+- sMenuBackground = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]);
+- }
+-
+- style = gtk_widget_get_style(menuitem);
+- if (style) {
+- sMenuHover = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_PRELIGHT]);
+- sMenuHoverText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_PRELIGHT]);
+- }
+-
+- g_object_unref(menu);
+-#else
+ GdkRGBA color;
+ GtkStyleContext *style;
+
+@@ -1195,6 +851,12 @@ nsLookAndFeel::EnsureInit()
+ }
+ }
+
++ // The label is not added to a parent widget, but shared for constructing
++ // different style contexts. The node hierarchy is constructed only on
++ // the label style context.
++ GtkWidget *labelWidget = gtk_label_new("M");
++ g_object_ref_sink(labelWidget);
++
+ // Scrollbar colors
+ style = ClaimStyleContext(MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL);
+ gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color);
+@@ -1208,6 +870,13 @@ nsLookAndFeel::EnsureInit()
+ gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color);
+ sMozWindowText = GDK_RGBA_TO_NS_RGBA(color);
+ ReleaseStyleContext(style);
++ style = ClaimStyleContext(MOZ_GTK_WINDOW_CONTAINER);
++ {
++ GtkStyleContext* labelStyle = CreateStyleForWidget(labelWidget, style);
++ GetSystemFontInfo(labelStyle, &mDefaultFontName, &mDefaultFontStyle);
++ g_object_unref(labelStyle);
++ }
++ ReleaseStyleContext(style);
+
+ // tooltip foreground and background
+ style = ClaimStyleContext(MOZ_GTK_TOOLTIP);
+@@ -1224,6 +893,9 @@ nsLookAndFeel::EnsureInit()
+ {
+ GtkStyleContext* accelStyle =
+ CreateStyleForWidget(gtk_accel_label_new("M"), style);
++
++ GetSystemFontInfo(accelStyle, &mMenuFontName, &mMenuFontStyle);
++
+ gtk_style_context_get_color(accelStyle, GTK_STATE_FLAG_NORMAL, &color);
+ sMenuText = GDK_RGBA_TO_NS_RGBA(color);
+ gtk_style_context_get_color(accelStyle, GTK_STATE_FLAG_INSENSITIVE, &color);
+@@ -1243,17 +915,8 @@ nsLookAndFeel::EnsureInit()
+ gtk_style_context_get_color(style, GTK_STATE_FLAG_PRELIGHT, &color);
+ sMenuHoverText = GDK_RGBA_TO_NS_RGBA(color);
+ ReleaseStyleContext(style);
+-#endif
+
+- // button styles
+ GtkWidget *parent = gtk_fixed_new();
+- GtkWidget *button = gtk_button_new();
+- GtkWidget *label = gtk_label_new("M");
+-#if (MOZ_WIDGET_GTK == 2)
+- GtkWidget *combobox = gtk_combo_box_new();
+- GtkWidget *comboboxLabel = gtk_label_new("M");
+- gtk_container_add(GTK_CONTAINER(combobox), comboboxLabel);
+-#endif
+ GtkWidget *window = gtk_window_new(GTK_WINDOW_POPUP);
+ GtkWidget *treeView = gtk_tree_view_new();
+ GtkWidget *linkButton = gtk_link_button_new("http://example.com/");
+@@ -1262,94 +925,14 @@ nsLookAndFeel::EnsureInit()
+ GtkWidget *entry = gtk_entry_new();
+ GtkWidget *textView = gtk_text_view_new();
+
+- gtk_container_add(GTK_CONTAINER(button), label);
+- gtk_container_add(GTK_CONTAINER(parent), button);
+ gtk_container_add(GTK_CONTAINER(parent), treeView);
+ gtk_container_add(GTK_CONTAINER(parent), linkButton);
+-#if (MOZ_WIDGET_GTK == 2)
+- gtk_container_add(GTK_CONTAINER(parent), combobox);
+-#endif
+ gtk_container_add(GTK_CONTAINER(parent), menuBar);
+ gtk_menu_shell_append(GTK_MENU_SHELL(menuBar), menuBarItem);
+ gtk_container_add(GTK_CONTAINER(window), parent);
+ gtk_container_add(GTK_CONTAINER(parent), entry);
+ gtk_container_add(GTK_CONTAINER(parent), textView);
+
+-#if (MOZ_WIDGET_GTK == 2)
+- gtk_widget_set_style(button, nullptr);
+- gtk_widget_set_style(label, nullptr);
+- gtk_widget_set_style(treeView, nullptr);
+- gtk_widget_set_style(linkButton, nullptr);
+- gtk_widget_set_style(combobox, nullptr);
+- gtk_widget_set_style(comboboxLabel, nullptr);
+- gtk_widget_set_style(menuBar, nullptr);
+- gtk_widget_set_style(entry, nullptr);
+-
+- gtk_widget_realize(button);
+- gtk_widget_realize(label);
+- gtk_widget_realize(treeView);
+- gtk_widget_realize(linkButton);
+- gtk_widget_realize(combobox);
+- gtk_widget_realize(comboboxLabel);
+- gtk_widget_realize(menuBar);
+- gtk_widget_realize(entry);
+-
+- style = gtk_widget_get_style(label);
+- if (style) {
+- sButtonText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]);
+- }
+-
+- style = gtk_widget_get_style(comboboxLabel);
+- if (style) {
+- sComboBoxText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]);
+- }
+- style = gtk_widget_get_style(combobox);
+- if (style) {
+- sComboBoxBackground = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]);
+- }
+-
+- style = gtk_widget_get_style(menuBar);
+- if (style) {
+- sMenuBarText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_NORMAL]);
+- sMenuBarHoverText = GDK_COLOR_TO_NS_RGB(style->fg[GTK_STATE_SELECTED]);
+- }
+-
+- // GTK's guide to fancy odd row background colors:
+- // 1) Check if a theme explicitly defines an odd row color
+- // 2) If not, check if it defines an even row color, and darken it
+- // slightly by a hardcoded value (gtkstyle.c)
+- // 3) If neither are defined, take the base background color and
+- // darken that by a hardcoded value
+- colorValuePtr = nullptr;
+- gtk_widget_style_get(treeView,
+- "odd-row-color", &colorValuePtr,
+- nullptr);
+-
+- if (colorValuePtr) {
+- colorValue = *colorValuePtr;
+- } else {
+- gtk_widget_style_get(treeView,
+- "even-row-color", &colorValuePtr,
+- nullptr);
+- if (colorValuePtr)
+- darken_gdk_color(colorValuePtr, &colorValue);
+- else
+- darken_gdk_color(&treeView->style->base[GTK_STATE_NORMAL], &colorValue);
+- }
+-
+- sOddCellBackground = GDK_COLOR_TO_NS_RGB(colorValue);
+- if (colorValuePtr)
+- gdk_color_free(colorValuePtr);
+-
+- style = gtk_widget_get_style(button);
+- if (style) {
+- sButtonBackground = GDK_COLOR_TO_NS_RGB(style->bg[GTK_STATE_NORMAL]);
+- sFrameOuterLightBorder =
+- GDK_COLOR_TO_NS_RGB(style->light[GTK_STATE_NORMAL]);
+- sFrameInnerDarkBorder =
+- GDK_COLOR_TO_NS_RGB(style->dark[GTK_STATE_NORMAL]);
+- }
+-#else
+ // Text colors
+ GdkRGBA bgColor;
+ // If the text window background is translucent, then the background of
+@@ -1381,8 +964,10 @@ nsLookAndFeel::EnsureInit()
+ // Button text color
+ style = ClaimStyleContext(MOZ_GTK_BUTTON);
+ {
+- GtkStyleContext* labelStyle =
+- CreateStyleForWidget(gtk_label_new("M"), style);
++ GtkStyleContext* labelStyle = CreateStyleForWidget(labelWidget, style);
++
++ GetSystemFontInfo(labelStyle, &mButtonFontName, &mButtonFontStyle);
++
+ gtk_style_context_get_color(labelStyle, GTK_STATE_FLAG_NORMAL, &color);
+ sButtonText = GDK_RGBA_TO_NS_RGBA(color);
+ gtk_style_context_get_color(labelStyle, GTK_STATE_FLAG_PRELIGHT, &color);
+@@ -1446,7 +1031,6 @@ nsLookAndFeel::EnsureInit()
+ gtk_style_context_add_class(style, GTK_STYLE_CLASS_INFO);
+ gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color);
+ sInfoBarText = GDK_RGBA_TO_NS_RGBA(color);
+-#endif
+ // Some themes have a unified menu bar, and support window dragging on it
+ gboolean supports_menubar_drag = FALSE;
+ GParamSpec *param_spec =
+@@ -1493,7 +1074,11 @@ nsLookAndFeel::EnsureInit()
+ "cursor-aspect-ratio", &sCaretRatio,
+ nullptr);
+
++ GetSystemFontInfo(gtk_widget_get_style_context(entry),
++ &mFieldFontName, &mFieldFontStyle);
++
+ gtk_widget_destroy(window);
++ g_object_unref(labelWidget);
+ }
+
+ // virtual
+@@ -1515,11 +1100,6 @@ nsLookAndFeel::RefreshImpl()
+ mFieldFontCached = false;
+ mMenuFontCached = false;
+
+-#if (MOZ_WIDGET_GTK == 2)
+- g_object_unref(mStyle);
+- mStyle = nullptr;
+-#endif
+-
+ mInitialized = false;
+ }
+
+diff --git widget/gtk/nsLookAndFeel.h widget/gtk/nsLookAndFeel.h
+index 9a4015e95415..38cd51c056d6 100644
+--- widget/gtk/nsLookAndFeel.h
++++ widget/gtk/nsLookAndFeel.h
+@@ -33,9 +33,6 @@ public:
+ virtual bool GetEchoPasswordImpl();
+
+ protected:
+-#if (MOZ_WIDGET_GTK == 2)
+- struct _GtkStyle *mStyle;
+-#endif
+
+ // Cached fonts
+ bool mDefaultFontCached;
+@@ -63,7 +60,6 @@ protected:
+ nscolor sMenuHoverText;
+ nscolor sButtonText;
+ nscolor sButtonHoverText;
+- nscolor sButtonBackground;
+ nscolor sFrameOuterLightBorder;
+ nscolor sFrameInnerDarkBorder;
+ nscolor sOddCellBackground;
+@@ -77,9 +73,7 @@ protected:
+ nscolor sTextSelectedText;
+ nscolor sTextSelectedBackground;
+ nscolor sMozScrollbar;
+-#if (MOZ_WIDGET_GTK == 3)
+ nscolor sInfoBarText;
+-#endif
+ char16_t sInvisibleCharacter;
+ float sCaretRatio;
+ bool sMenuSupportsDrag;