From 40d475aa8829c18e344595f10f59e5dbd681cdf7 Mon Sep 17 00:00:00 2001 From: Martin Stransky Date: Tue, 18 Apr 2017 10:36:12 +0200 Subject: Updated to 53.0 --- firefox-build-prbool.patch | 28 +- firefox-debug.patch | 12 - firefox-enable-addons.patch | 12 +- firefox.spec | 18 +- mozilla-1158076-1.patch | 51 -- mozilla-1158076-2.patch | 184 ----- mozilla-1253216.patch | 12 +- mozilla-1348576.patch | 46 -- mozilla-build-arm.patch | 24 - sources | 4 +- widget-rebase.patch | 1747 ++++++++++++++++++------------------------- 11 files changed, 759 insertions(+), 1379 deletions(-) delete mode 100644 firefox-debug.patch delete mode 100644 mozilla-1158076-1.patch delete mode 100644 mozilla-1158076-2.patch delete mode 100644 mozilla-1348576.patch diff --git a/firefox-build-prbool.patch b/firefox-build-prbool.patch index f271631..17725af 100644 --- a/firefox-build-prbool.patch +++ b/firefox-build-prbool.patch @@ -1,6 +1,6 @@ -diff -up firefox-52.0/dom/u2f/U2F.cpp.prbool firefox-52.0/dom/u2f/U2F.cpp ---- firefox-52.0/dom/u2f/U2F.cpp.prbool 2017-03-03 13:42:22.613691228 +0100 -+++ firefox-52.0/dom/u2f/U2F.cpp 2017-03-03 13:48:20.864647727 +0100 +diff -up firefox-53.0/dom/u2f/U2F.cpp.prbool firefox-53.0/dom/u2f/U2F.cpp +--- firefox-53.0/dom/u2f/U2F.cpp.prbool 2017-04-11 06:15:14.000000000 +0200 ++++ firefox-53.0/dom/u2f/U2F.cpp 2017-04-18 09:19:20.524285200 +0200 @@ -4,6 +4,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ @@ -9,20 +9,20 @@ diff -up firefox-52.0/dom/u2f/U2F.cpp.prbool firefox-52.0/dom/u2f/U2F.cpp #include "hasht.h" #include "mozilla/dom/CallbackFunction.h" #include "mozilla/dom/ContentChild.h" -diff -up firefox-52.0/security/certverifier/CTLogVerifier.cpp.prbool firefox-52.0/security/certverifier/CTLogVerifier.cpp ---- firefox-52.0/security/certverifier/CTLogVerifier.cpp.prbool 2017-01-16 17:16:51.000000000 +0100 -+++ firefox-52.0/security/certverifier/CTLogVerifier.cpp 2017-03-03 13:42:22.613691228 +0100 -@@ -7,6 +7,7 @@ - #include "CTLogVerifier.h" +diff -up firefox-53.0/security/certverifier/CTLogVerifier.cpp.prbool firefox-53.0/security/certverifier/CTLogVerifier.cpp +--- firefox-53.0/security/certverifier/CTLogVerifier.cpp.prbool 2017-04-18 09:19:20.524285200 +0200 ++++ firefox-53.0/security/certverifier/CTLogVerifier.cpp 2017-04-18 09:52:34.189402811 +0200 +@@ -9,6 +9,7 @@ + #include #include "CTSerialization.h" +#include "prtypes.h" #include "hasht.h" #include "mozilla/ArrayUtils.h" #include "mozilla/Assertions.h" -diff -up firefox-52.0/security/certverifier/CTObjectsExtractor.cpp.prbool firefox-52.0/security/certverifier/CTObjectsExtractor.cpp ---- firefox-52.0/security/certverifier/CTObjectsExtractor.cpp.prbool 2017-01-16 17:16:51.000000000 +0100 -+++ firefox-52.0/security/certverifier/CTObjectsExtractor.cpp 2017-03-03 13:42:22.613691228 +0100 +diff -up firefox-53.0/security/certverifier/CTObjectsExtractor.cpp.prbool firefox-53.0/security/certverifier/CTObjectsExtractor.cpp +--- firefox-53.0/security/certverifier/CTObjectsExtractor.cpp.prbool 2017-01-16 17:16:51.000000000 +0100 ++++ firefox-53.0/security/certverifier/CTObjectsExtractor.cpp 2017-04-18 09:19:20.525285196 +0200 @@ -6,6 +6,7 @@ #include "CTObjectsExtractor.h" @@ -31,9 +31,9 @@ diff -up firefox-52.0/security/certverifier/CTObjectsExtractor.cpp.prbool firefo #include "hasht.h" #include "mozilla/Assertions.h" #include "mozilla/Casting.h" -diff -up firefox-52.0/security/certverifier/OCSPCache.h.prbool firefox-52.0/security/certverifier/OCSPCache.h ---- firefox-52.0/security/certverifier/OCSPCache.h.prbool 2017-02-27 17:11:06.000000000 +0100 -+++ firefox-52.0/security/certverifier/OCSPCache.h 2017-03-03 13:42:22.613691228 +0100 +diff -up firefox-53.0/security/certverifier/OCSPCache.h.prbool firefox-53.0/security/certverifier/OCSPCache.h +--- firefox-53.0/security/certverifier/OCSPCache.h.prbool 2017-04-11 06:15:19.000000000 +0200 ++++ firefox-53.0/security/certverifier/OCSPCache.h 2017-04-18 09:19:20.525285196 +0200 @@ -25,6 +25,7 @@ #ifndef mozilla_psm_OCSPCache_h #define mozilla_psm_OCSPCache_h diff --git a/firefox-debug.patch b/firefox-debug.patch deleted file mode 100644 index d1da5cb..0000000 --- a/firefox-debug.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -up firefox-42.0/browser/installer/package-manifest.in.debug firefox-42.0/browser/installer/package-manifest.in ---- firefox-42.0/browser/installer/package-manifest.in.debug 2015-10-30 15:35:53.231857572 +0100 -+++ firefox-42.0/browser/installer/package-manifest.in 2015-10-30 15:36:58.975091068 +0100 -@@ -620,7 +620,7 @@ - @RESPATH@/components/MozKeyboard.js - @RESPATH@/components/InputMethod.manifest - --#ifdef MOZ_DEBUG -+#ifdef ENABLE_TESTS - @RESPATH@/components/TestInterfaceJS.js - @RESPATH@/components/TestInterfaceJS.manifest - @RESPATH@/components/TestInterfaceJSMaplike.js diff --git a/firefox-enable-addons.patch b/firefox-enable-addons.patch index 6728420..3653db1 100644 --- a/firefox-enable-addons.patch +++ b/firefox-enable-addons.patch @@ -1,7 +1,7 @@ -diff -up firefox-48.0/browser/app/profile/firefox.js.addons firefox-48.0/browser/app/profile/firefox.js ---- firefox-48.0/browser/app/profile/firefox.js.addons 2016-07-26 10:56:48.598900568 +0200 -+++ firefox-48.0/browser/app/profile/firefox.js 2016-07-26 11:05:45.199789758 +0200 -@@ -94,7 +94,8 @@ pref("extensions.systemAddon.update.url" +diff -up firefox-53.0/browser/app/profile/firefox.js.addons firefox-53.0/browser/app/profile/firefox.js +--- firefox-53.0/browser/app/profile/firefox.js.addons 2017-04-18 10:03:02.300234728 +0200 ++++ firefox-53.0/browser/app/profile/firefox.js 2017-04-18 10:05:38.170676613 +0200 +@@ -63,7 +63,8 @@ pref("extensions.systemAddon.update.url" // Disable add-ons that are not installed by the user in all scopes by default. // See the SCOPE constants in AddonManager.jsm for values to use here. @@ -9,5 +9,5 @@ diff -up firefox-48.0/browser/app/profile/firefox.js.addons firefox-48.0/browser +pref("extensions.autoDisableScopes", 0); +pref("extensions.showMismatchUI", false); - // Add-on content security policies. - pref("extensions.webextensions.base-content-security-policy", "script-src 'self' https://* moz-extension: blob: filesystem: 'unsafe-eval' 'unsafe-inline'; object-src 'self' https://* moz-extension: blob: filesystem:;"); + // Whether or not webextension themes are supported. + pref("extensions.webextensions.themes.enabled", false); diff --git a/firefox.spec b/firefox.spec index 0ff7f33..83f8568 100644 --- a/firefox.spec +++ b/firefox.spec @@ -102,14 +102,14 @@ Summary: Mozilla Firefox Web browser Name: firefox -Version: 52.0.2 -Release: 2%{?pre_tag}%{?dist} +Version: 53.0 +Release: 1%{?pre_tag}%{?dist} URL: https://www.mozilla.org/firefox/ License: MPLv1.1 or GPLv2+ or LGPLv2+ Group: Applications/Internet Source0: https://archive.mozilla.org/pub/firefox/releases/%{version}%{?pre_version}/source/firefox-%{version}%{?pre_version}.source.tar.xz %if %{build_langpacks} -Source1: firefox-langpacks-%{version}%{?pre_version}-20170329.tar.xz +Source1: firefox-langpacks-%{version}%{?pre_version}-20170418.tar.xz %endif Source10: firefox-mozconfig Source12: firefox-redhat-default-prefs.js @@ -127,7 +127,6 @@ Patch18: xulrunner-24.0-jemalloc-ppc.patch # workaround linking issue on s390 (JSContext::updateMallocCounter(size_t) not found) Patch19: xulrunner-24.0-s390-inlines.patch Patch20: firefox-build-prbool.patch -Patch24: firefox-debug.patch Patch25: rhbz-1219542-s390-build.patch Patch26: build-icu-big-endian.patch @@ -153,9 +152,6 @@ Patch406: mozilla-256180.patch # Rebase Gtk3 widget code to latest trunk to # fix various rendering problems Patch407: widget-rebase.patch -Patch410: mozilla-1348576.patch -Patch411: mozilla-1158076-1.patch -Patch412: mozilla-1158076-2.patch # Debian patches Patch500: mozilla-440908.patch @@ -286,7 +282,6 @@ cd %{tarballdir} %patch18 -p1 -b .jemalloc-ppc %patch19 -p2 -b .s390-inlines %patch20 -p1 -b .prbool -%patch24 -p1 -b .debug %ifarch s390 %patch25 -p1 -b .rhbz-1219542-s390 %endif @@ -320,10 +315,6 @@ cd %{tarballdir} # Rebase Gtk3 widget code to latest trunk to # fix various rendering problems %patch407 -p1 -b .widget-rebase -# Disabled due to rhbz#1435964 -%patch410 -p1 -b .1348576 -%patch411 -p1 -b .1158076-1 -%patch412 -p1 -b .1158076-2 # Debian extension patch %patch500 -p1 -b .440908 @@ -843,6 +834,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : #--------------------------------------------------------------------- %changelog +* Thu Apr 18 2017 Martin Stransky - 53.0-1 +- Updated to 53.0 (B6) + * Fri Mar 31 2017 Martin Stransky - 52.0.2-2 - Added patch for mozbz#1348576 - enable e10s by default - Added patch for mozbz#1158076 - enable dark theme by pref diff --git a/mozilla-1158076-1.patch b/mozilla-1158076-1.patch deleted file mode 100644 index e409386..0000000 --- a/mozilla-1158076-1.patch +++ /dev/null @@ -1,51 +0,0 @@ -diff -up firefox-52.0.2/modules/libpref/init/all.js.1158076-1 firefox-52.0.2/modules/libpref/init/all.js ---- firefox-52.0.2/modules/libpref/init/all.js.1158076-1 2017-03-31 09:44:28.377647329 +0200 -+++ firefox-52.0.2/modules/libpref/init/all.js 2017-03-31 09:46:02.847234586 +0200 -@@ -4646,6 +4646,8 @@ pref("gfx.apitrace.enabled",false); - pref("gfx.content.use-native-pushlayer", true); - #ifdef MOZ_WIDGET_GTK - pref("gfx.xrender.enabled",false); -+pref("widget.chrome.allow-gtk-dark-theme", false); -+pref("widget.content.allow-gtk-dark-theme", false); - #endif - #endif - -diff -up firefox-52.0.2/widget/gtk/nsLookAndFeel.cpp.1158076-1 firefox-52.0.2/widget/gtk/nsLookAndFeel.cpp ---- firefox-52.0.2/widget/gtk/nsLookAndFeel.cpp.1158076-1 2017-03-31 09:44:28.374647342 +0200 -+++ firefox-52.0.2/widget/gtk/nsLookAndFeel.cpp 2017-03-31 09:44:35.125617758 +0200 -@@ -1134,16 +1134,27 @@ nsLookAndFeel::Init() - // with wrong color theme, see Bug 972382 - GtkSettings *settings = gtk_settings_get_for_screen(gdk_screen_get_default()); - -- // Disable dark theme because it interacts poorly with widget styling in -- // web content (see bug 1216658). -- // To avoid triggering reload of theme settings unnecessarily, only set the -- // setting when necessary. - const gchar* dark_setting = "gtk-application-prefer-dark-theme"; -- gboolean dark; -- g_object_get(settings, dark_setting, &dark, nullptr); -+ gboolean darkThemeDefault; -+ g_object_get(settings, dark_setting, &darkThemeDefault, nullptr); - -- if (dark && !PR_GetEnv("MOZ_ALLOW_GTK_DARK_THEME")) { -- g_object_set(settings, dark_setting, FALSE, nullptr); -+ // Dark themes interacts poorly with widget styling (see bug 1216658). -+ // We disable dark themes by default for all processes (chrome, web content) -+ // but allow user to overide it by prefs. -+ if (darkThemeDefault) { -+ bool allowDarkTheme; -+ if (XRE_IsContentProcess()) { -+ allowDarkTheme = -+ mozilla::Preferences::GetBool("widget.content.allow-gtk-dark-theme", -+ false); -+ } else { -+ allowDarkTheme = (PR_GetEnv("MOZ_ALLOW_GTK_DARK_THEME") != nullptr) || -+ mozilla::Preferences::GetBool("widget.chrome.allow-gtk-dark-theme", -+ false); -+ } -+ if (!allowDarkTheme) { -+ g_object_set(settings, dark_setting, FALSE, nullptr); -+ } - } - - // Scrollbar colors diff --git a/mozilla-1158076-2.patch b/mozilla-1158076-2.patch deleted file mode 100644 index 16079b3..0000000 --- a/mozilla-1158076-2.patch +++ /dev/null @@ -1,184 +0,0 @@ -diff --git a/widget/gtk/nsLookAndFeel.h b/widget/gtk/nsLookAndFeel.h ---- a/widget/gtk/nsLookAndFeel.h -+++ b/widget/gtk/nsLookAndFeel.h -@@ -76,13 +76,14 @@ protected: - nscolor sTextSelectedBackground; - nscolor sMozScrollbar; - #if (MOZ_WIDGET_GTK == 3) - nscolor sInfoBarText; - #endif - char16_t sInvisibleCharacter; - float sCaretRatio; - bool sMenuSupportsDrag; -+ bool mInitialized; - -- void Init(); -+ void EnsureInit(); - }; - - #endif - -diff --git a/widget/gtk/nsLookAndFeel.cpp b/widget/gtk/nsLookAndFeel.cpp ---- a/widget/gtk/nsLookAndFeel.cpp -+++ b/widget/gtk/nsLookAndFeel.cpp -@@ -45,19 +45,19 @@ using mozilla::LookAndFeel; - (int)((c).blue*255), (int)((c).alpha*255))) - - nsLookAndFeel::nsLookAndFeel() - : nsXPLookAndFeel(), - #if (MOZ_WIDGET_GTK == 2) - mStyle(nullptr), - #endif - mDefaultFontCached(false), mButtonFontCached(false), -- mFieldFontCached(false), mMenuFontCached(false) -+ mFieldFontCached(false), mMenuFontCached(false), -+ mInitialized(false) - { -- Init(); - } - - nsLookAndFeel::~nsLookAndFeel() - { - #if (MOZ_WIDGET_GTK == 2) - g_object_unref(mStyle); - #endif - } -@@ -219,16 +219,18 @@ GetBorderColors(GtkStyleContext* aContex - *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) -@@ -670,16 +672,21 @@ nsLookAndFeel::GetIntImpl(IntID aID, int - break; - } - - res = nsXPLookAndFeel::GetIntImpl(aID, aResult); - if (NS_SUCCEEDED(res)) - return res; - res = NS_OK; - -+ // We use delayed initialization by EnsureInit() here -+ // to make sure mozilla::Preferences is available (Bug 115807). -+ // eIntID_UseAccessibilityTheme is requested before user preferences -+ // are read, and so EnsureInit(), which depends on preference values, -+ // is deliberately delayed until required. - switch (aID) { - case eIntID_CaretBlinkTime: - { - GtkSettings *settings; - gint blink_time; - gboolean blink; - - settings = gtk_settings_get_default (); -@@ -832,16 +839,17 @@ nsLookAndFeel::GetIntImpl(IntID aID, int - case eIntID_IMESelectedRawTextUnderlineStyle: - case eIntID_IMESelectedConvertedTextUnderline: - aResult = NS_STYLE_TEXT_DECORATION_STYLE_NONE; - break; - case eIntID_SpellCheckerUnderlineStyle: - aResult = NS_STYLE_TEXT_DECORATION_STYLE_WAVY; - break; - case eIntID_MenuBarDrag: -+ EnsureInit(); - aResult = sMenuSupportsDrag; - break; - case eIntID_ScrollbarButtonAutoRepeatBehavior: - aResult = 1; - break; - case eIntID_SwipeAnimationEnabled: - aResult = 0; - break; -@@ -872,16 +880,17 @@ nsLookAndFeel::GetFloatImpl(FloatID aID, - switch (aID) { - case eFloatID_IMEUnderlineRelativeSize: - aResult = 1.0f; - break; - case eFloatID_SpellCheckerUnderlineRelativeSize: - aResult = 1.0f; - break; - case eFloatID_CaretAspectRatio: -+ EnsureInit(); - aResult = sCaretRatio; - break; - default: - aResult = -1.0; - res = NS_ERROR_FAILURE; - } - return res; - } -@@ -1052,21 +1061,25 @@ nsLookAndFeel::GetFontImpl(FontID aID, n - } - - aFontName = *cachedFontName; - aFontStyle = *cachedFontStyle; - return true; - } - - void --nsLookAndFeel::Init() -+nsLookAndFeel::EnsureInit() - { - GdkColor colorValue; - GdkColor *colorValuePtr; - -+ if (mInitialized) -+ return; -+ mInitialized = true; -+ - #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 -@@ -1445,16 +1458,17 @@ nsLookAndFeel::Init() - - gtk_widget_destroy(window); - } - - // virtual - char16_t - nsLookAndFeel::GetPasswordCharacterImpl() - { -+ EnsureInit(); - return sInvisibleCharacter; - } - - void - nsLookAndFeel::RefreshImpl() - { - nsXPLookAndFeel::RefreshImpl(); - -@@ -1463,15 +1477,15 @@ nsLookAndFeel::RefreshImpl() - mFieldFontCached = false; - mMenuFontCached = false; - - #if (MOZ_WIDGET_GTK == 2) - g_object_unref(mStyle); - mStyle = nullptr; - #endif - -- Init(); -+ mInitialized = false; - } - - bool - nsLookAndFeel::GetEchoPasswordImpl() { - return false; - } diff --git a/mozilla-1253216.patch b/mozilla-1253216.patch index c9252da..25e9ea0 100644 --- a/mozilla-1253216.patch +++ b/mozilla-1253216.patch @@ -1,9 +1,9 @@ -diff -up firefox-48.0/js/src/jit/AtomicOperations.h.old firefox-48.0/js/src/jit/AtomicOperations.h ---- firefox-48.0/js/src/jit/AtomicOperations.h.old 2016-07-27 09:42:43.148175449 +0200 -+++ firefox-48.0/js/src/jit/AtomicOperations.h 2016-07-27 09:41:13.000000000 +0200 -@@ -340,7 +340,7 @@ AtomicOperations::isLockfree(int32_t siz - # elif defined(__aarch64__) - # include "jit/arm64/AtomicOperations-arm64.h" +diff -up firefox-53.0/js/src/jit/AtomicOperations.h.1253216 firefox-53.0/js/src/jit/AtomicOperations.h +--- firefox-53.0/js/src/jit/AtomicOperations.h.1253216 2017-04-18 10:07:25.939282630 +0200 ++++ firefox-53.0/js/src/jit/AtomicOperations.h 2017-04-18 10:15:50.965436343 +0200 +@@ -348,7 +348,7 @@ AtomicOperations::isLockfree(int32_t siz + #elif defined(__sh__) + # include "jit/none/AtomicOperations-ppc.h" # else -# include "jit/none/AtomicOperations-none.h" // These MOZ_CRASH() always +# include "jit/none/AtomicOperations-ppc.h" diff --git a/mozilla-1348576.patch b/mozilla-1348576.patch deleted file mode 100644 index 1b13847..0000000 --- a/mozilla-1348576.patch +++ /dev/null @@ -1,46 +0,0 @@ -diff -up firefox-52.0.2/browser/extensions/e10srollout/bootstrap.js.1348576 firefox-52.0.2/browser/extensions/e10srollout/bootstrap.js ---- firefox-52.0.2/browser/extensions/e10srollout/bootstrap.js.1348576 2017-03-31 09:36:20.070787199 +0200 -+++ firefox-52.0.2/browser/extensions/e10srollout/bootstrap.js 2017-03-31 09:38:09.211308920 +0200 -@@ -9,6 +9,7 @@ const {classes: Cc, interfaces: Ci, util - Cu.import("resource://gre/modules/Preferences.jsm"); - Cu.import("resource://gre/modules/Services.jsm"); - Cu.import("resource://gre/modules/UpdateUtils.jsm"); -+Cu.import("resource://gre/modules/AppConstants.jsm"); - - // The amount of people to be part of e10s - const TEST_THRESHOLD = { -@@ -23,6 +24,23 @@ const ADDON_ROLLOUT_POLICY = { - "esr" : "esrA", // WebExtensions and Addons with mpc=true - }; - -+if (AppConstants.RELEASE_OR_BETA) { -+ // Bug 1348576 - e10s is never enabled for non-official release builds -+ // This is hacky, but the problem it solves is the following: -+ // the e10s rollout is controlled by the channel name, which -+ // is the only way to distinguish between Beta and Release. -+ // However, non-official release builds (like the ones done by distros -+ // to ship Firefox on their package managers) do not set a value -+ // for the release channel, which gets them to the default value -+ // of.. (drumroll) "default". -+ // But we can't just always configure the same settings for the -+ // "default" channel because that's also the name that a locally -+ // built Firefox gets, and e10s is managed in a different way -+ // there (directly by prefs, on Nightly and Aurora). -+ TEST_THRESHOLD.default = TEST_THRESHOLD.release; -+ ADDON_ROLLOUT_POLICY.default = ADDON_ROLLOUT_POLICY.release; -+} -+ - const PREF_COHORT_SAMPLE = "e10s.rollout.cohortSample"; - const PREF_COHORT_NAME = "e10s.rollout.cohort"; - const PREF_E10S_OPTED_IN = "browser.tabs.remote.autostart"; -diff -up firefox-52.0.2/browser/extensions/e10srollout/install.rdf.in.1348576 firefox-52.0.2/browser/extensions/e10srollout/install.rdf.in ---- firefox-52.0.2/browser/extensions/e10srollout/install.rdf.in.1348576 2017-03-31 09:36:20.070787199 +0200 -+++ firefox-52.0.2/browser/extensions/e10srollout/install.rdf.in 2017-03-31 09:38:45.579149534 +0200 -@@ -11,6 +11,7 @@ - - e10srollout@mozilla.org - 1.9 -+ 1.9.1 - 2 - true - true diff --git a/mozilla-build-arm.patch b/mozilla-build-arm.patch index 1e1e57c..e390a28 100644 --- a/mozilla-build-arm.patch +++ b/mozilla-build-arm.patch @@ -12,27 +12,3 @@ diff -up firefox-52.0/gfx/skia/skia/include/core/SkPreConfig.h.arm firefox-52.0/ ////////////////////////////////////////////////////////////////////// #if !defined(SKIA_IMPLEMENTATION) -diff -up firefox-52.0/media/webrtc/trunk/webrtc/build/common.gypi.arm firefox-52.0/media/webrtc/trunk/webrtc/build/common.gypi ---- firefox-52.0/media/webrtc/trunk/webrtc/build/common.gypi.arm 2016-09-05 22:12:57.000000000 +0200 -+++ firefox-52.0/media/webrtc/trunk/webrtc/build/common.gypi 2017-03-03 13:53:52.480754536 +0100 -@@ -312,20 +312,6 @@ - 'defines': [ - 'WEBRTC_ARCH_ARM', - ], -- 'conditions': [ -- ['arm_version>=7', { -- 'defines': ['WEBRTC_ARCH_ARM_V7', -- 'WEBRTC_BUILD_NEON_LIBS'], -- 'conditions': [ -- ['arm_neon==1', { -- 'defines': ['WEBRTC_ARCH_ARM_NEON',], -- }], -- ['arm_neon==0 and arm_neon_optional==1', { -- 'defines': ['WEBRTC_DETECT_ARM_NEON',], -- }], -- ], -- }], -- ], - }], - ['os_bsd==1', { - 'defines': [ diff --git a/sources b/sources index 0f2e0c2..33c0a6f 100644 --- a/sources +++ b/sources @@ -1,2 +1,2 @@ -SHA512 (firefox-52.0.2.source.tar.xz) = 15668625d212acf874b560d0adf738faf3e0df532c549ab94e1d91944542e13bf16265f08fca1eded42820f9b7ad3f0ff70a8b5bc9adde0a79d11e022bb1158e -SHA512 (firefox-langpacks-52.0.2-20170329.tar.xz) = 4c4b953e5f6aefa754a2a1d15273a46ab1028b14799e2adc949c7ecbd7041d80856221ed90ff179ceb1b39bc387765b1888ce614169ca482096eadf78d04e379 +SHA512 (firefox-53.0.source.tar.xz) = 36ec810bab58e3d99478455a38427a5efbc74d6dd7d4bb93b700fd7429b9b89250efd0abe4609091483991802090c6373c8434dfc9ba64c79a778e51fd2a2886 +SHA512 (firefox-langpacks-53.0-20170418.tar.xz) = 5bb972e22953149b03e135be64664412ee2b2c0791eb6b26c506a170b2aa6ea2e31c77ae6971e393ac3952146855ad423e66c3be53258dcedd17b8932d16982b diff --git a/widget-rebase.patch b/widget-rebase.patch index 45a3b91..59cc4a1 100644 --- a/widget-rebase.patch +++ b/widget-rebase.patch @@ -1,454 +1,297 @@ -diff -up firefox-52.0/widget/gtk/gtk3drawing.cpp.widget-rebase firefox-52.0/widget/gtk/gtk3drawing.cpp ---- firefox-52.0/widget/gtk/gtk3drawing.cpp.widget-rebase 2017-02-27 17:11:05.000000000 +0100 -+++ firefox-52.0/widget/gtk/gtk3drawing.cpp 2017-03-10 12:20:30.232205991 +0100 -@@ -36,6 +36,10 @@ static gboolean is_initialized; - static gint - moz_gtk_get_tab_thickness(GtkStyleContext *style); +diff -up firefox-53.0/widget/gtk/gtk3drawing.cpp.widget-rebase firefox-53.0/widget/gtk/gtk3drawing.cpp +--- firefox-53.0/widget/gtk/gtk3drawing.cpp.widget-rebase 2017-04-11 06:15:20.000000000 +0200 ++++ firefox-53.0/widget/gtk/gtk3drawing.cpp 2017-04-18 10:22:45.332920938 +0200 +@@ -18,11 +18,10 @@ + + #include + +-static style_prop_t style_prop_func; +-static gboolean have_arrow_scaling; + static gboolean checkbox_check_state; + static gboolean notebook_has_tab_gap; +-static gboolean is_initialized; ++ ++static ScrollbarGTKMetrics sScrollbarMetrics[2]; + + #define ARROW_UP 0 + #define ARROW_DOWN G_PI +@@ -40,6 +39,9 @@ static gint + moz_gtk_menu_item_paint(WidgetNodeType widget, cairo_t *cr, GdkRectangle* rect, + GtkWidgetState* state, GtkTextDirection direction); -+static gint -+moz_gtk_menu_item_paint(WidgetNodeType widget, cairo_t *cr, GdkRectangle* rect, -+ GtkWidgetState* state, GtkTextDirection direction); ++static GtkBorder ++GetMarginBorderPadding(GtkStyleContext* aStyle); + // GetStateFlagsFromGtkWidgetState() can be safely used for the specific // GtkWidgets that set both prelight and active flags. For other widgets, // either the GtkStateFlags or Gecko's GtkWidgetState need to be carefully -@@ -167,7 +171,7 @@ moz_gtk_menuitem_get_horizontal_padding( - gint - moz_gtk_checkmenuitem_get_horizontal_padding(gint* horizontal_padding) - { -- GtkStyleContext *style = ClaimStyleContext(MOZ_GTK_CHECKMENUITEM_CONTAINER); -+ GtkStyleContext *style = ClaimStyleContext(MOZ_GTK_CHECKMENUITEM); - gtk_style_context_get_style(style, - "horizontal-padding", horizontal_padding, - nullptr); -@@ -463,7 +467,7 @@ moz_gtk_get_widget_min_size(WidgetNodeTy +@@ -78,27 +80,22 @@ GetStateFlagsFromGtkTabFlags(GtkTabFlags } - static void --moz_gtk_rectangle_inset(GdkRectangle* rect, GtkBorder& aBorder) -+Inset(GdkRectangle* rect, GtkBorder& aBorder) - { - MOZ_ASSERT(rect); - rect->x += aBorder.left; -@@ -472,17 +476,29 @@ moz_gtk_rectangle_inset(GdkRectangle* re - rect->height -= aBorder.top + aBorder.bottom; - } - --/* Subtracting margin is used to inset drawing of element which can have margins, -- * like scrollbar, scrollbar's trough, thumb and scrollbar's button */ -+// Inset a rectangle by the margins specified in a style context. - static void --moz_gtk_subtract_margin(GtkStyleContext* style, GdkRectangle* rect) -+InsetByMargin(GdkRectangle* rect, GtkStyleContext* style) + gint +-moz_gtk_enable_style_props(style_prop_t styleGetProp) +-{ +- style_prop_func = styleGetProp; +- return MOZ_GTK_SUCCESS; +-} +- +-gint + moz_gtk_init() { - MOZ_ASSERT(rect); - GtkBorder margin; - - gtk_style_context_get_margin(style, gtk_style_context_get_state(style), - &margin); -- moz_gtk_rectangle_inset(rect, margin); -+ Inset(rect, margin); +- if (is_initialized) +- return MOZ_GTK_SUCCESS; +- +- is_initialized = TRUE; +- have_arrow_scaling = (gtk_major_version > 2 || +- (gtk_major_version == 2 && gtk_minor_version >= 12)); + if (gtk_major_version > 3 || + (gtk_major_version == 3 && gtk_minor_version >= 14)) + checkbox_check_state = GTK_STATE_FLAG_CHECKED; + else + checkbox_check_state = GTK_STATE_FLAG_ACTIVE; + ++ moz_gtk_refresh(); ++ ++ return MOZ_GTK_SUCCESS; +} + -+// Inset a rectangle by the border and padding specified in a style context. -+static void -+InsetByBorderPadding(GdkRectangle* rect, GtkStyleContext* style) ++void ++moz_gtk_refresh() +{ -+ GtkStateFlags state = gtk_style_context_get_state(style); -+ GtkBorder padding, border; -+ -+ gtk_style_context_get_padding(style, state, &padding); -+ Inset(rect, padding); -+ gtk_style_context_get_border(style, state, &border); -+ Inset(rect, border); - } - - static gint -@@ -528,7 +544,7 @@ moz_gtk_scrollbar_button_paint(cairo_t * - if (gtk_check_version(3,20,0) == nullptr) { - // The "trough-border" is not used since GTK 3.20. The stepper margin - // box occupies the full width of the "contents" gadget content box. -- moz_gtk_subtract_margin(style, &rect); -+ InsetByMargin(&rect, style); - } else { - // Scrollbar button has to be inset by trough_border because its DOM - // element is filling width of vertical scrollbar's track (or height -@@ -601,7 +617,7 @@ moz_gtk_draw_styled_frame(GtkStyleContex - { - GdkRectangle rect = *aRect; - if (gtk_check_version(3, 6, 0) == nullptr) { -- moz_gtk_subtract_margin(style, &rect); -+ InsetByMargin(&rect, style); + if (gtk_check_version(3, 12, 0) == nullptr && + gtk_check_version(3, 20, 0) != nullptr) + { +@@ -112,7 +109,8 @@ moz_gtk_init() + notebook_has_tab_gap = true; } - gtk_render_background(style, cr, rect.x, rect.y, rect.width, rect.height); - gtk_render_frame(style, cr, rect.x, rect.y, rect.width, rect.height); -@@ -664,7 +680,7 @@ moz_gtk_scrollbar_thumb_paint(WidgetNode - - GdkRectangle rect = *aRect; - GtkStyleContext* style = ClaimStyleContext(widget, direction, state_flags); -- moz_gtk_subtract_margin(style, &rect); -+ InsetByMargin(&rect, style); - gtk_render_slider(style, cr, - rect.x, -@@ -865,7 +881,7 @@ moz_gtk_entry_paint(cairo_t *cr, GdkRect +- return MOZ_GTK_SUCCESS; ++ sScrollbarMetrics[GTK_ORIENTATION_HORIZONTAL].initialized = false; ++ sScrollbarMetrics[GTK_ORIENTATION_VERTICAL].initialized = false; } - static gint --moz_gtk_text_view_paint(cairo_t *cr, GdkRectangle* rect, -+moz_gtk_text_view_paint(cairo_t *cr, GdkRectangle* aRect, - GtkWidgetState* state, - GtkTextDirection direction) - { -@@ -882,24 +898,24 @@ moz_gtk_text_view_paint(cairo_t *cr, Gdk - - GtkStyleContext* style_frame = - ClaimStyleContext(MOZ_GTK_SCROLLED_WINDOW, direction, state_flags); -- gtk_render_frame(style_frame, cr, rect->x, rect->y, rect->width, rect->height); -+ gtk_render_frame(style_frame, cr, -+ aRect->x, aRect->y, aRect->width, aRect->height); -+ -+ GdkRectangle rect = *aRect; -+ InsetByBorderPadding(&rect, style_frame); - -- GtkBorder border, padding; -- gtk_style_context_get_border(style_frame, state_flags, &border); -- gtk_style_context_get_padding(style_frame, state_flags, &padding); - ReleaseStyleContext(style_frame); - - GtkStyleContext* style = - ClaimStyleContext(MOZ_GTK_TEXT_VIEW, direction, state_flags); -- -- gint xthickness = border.left + padding.left; -- gint ythickness = border.top + padding.top; -- -- gtk_render_background(style, cr, -- rect->x + xthickness, rect->y + ythickness, -- rect->width - 2 * xthickness, -- rect->height - 2 * ythickness); -- -+ gtk_render_background(style, cr, rect.x, rect.y, rect.width, rect.height); -+ ReleaseStyleContext(style); -+ // There is a separate "text" window, which usually provides the -+ // background behind the text. However, this is transparent in Ambiance -+ // for GTK 3.20, in which case the MOZ_GTK_TEXT_VIEW background is -+ // visible. -+ style = ClaimStyleContext(MOZ_GTK_TEXT_VIEW_TEXT, direction, state_flags); -+ gtk_render_background(style, cr, rect.x, rect.y, rect.width, rect.height); - ReleaseStyleContext(style); - - return MOZ_GTK_SUCCESS; -@@ -1291,6 +1307,7 @@ moz_gtk_tooltip_paint(cairo_t *cr, const - GdkRectangle rect = *aRect; - gtk_render_background(style, cr, rect.x, rect.y, rect.width, rect.height); - gtk_render_frame(style, cr, rect.x, rect.y, rect.width, rect.height); -+ ReleaseStyleContext(style); - - // Horizontal Box drawing - // -@@ -1300,33 +1317,26 @@ moz_gtk_tooltip_paint(cairo_t *cr, const - // 6px margin. - // For drawing Horizontal Box we have to inset drawing area by that 6px - // plus its CSS margin. -- GtkStyleContext* boxStyle = -- CreateStyleForWidget(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0), style); -+ GtkStyleContext* boxStyle = ClaimStyleContext(MOZ_GTK_TOOLTIP_BOX, direction); - - rect.x += 6; - rect.y += 6; - rect.width -= 12; - rect.height -= 12; - -- moz_gtk_subtract_margin(boxStyle, &rect); -+ InsetByMargin(&rect, boxStyle); - gtk_render_background(boxStyle, cr, rect.x, rect.y, rect.width, rect.height); - gtk_render_frame(boxStyle, cr, rect.x, rect.y, rect.width, rect.height); - - // Label drawing -- GtkBorder padding, border; -- gtk_style_context_get_padding(boxStyle, GTK_STATE_FLAG_NORMAL, &padding); -- moz_gtk_rectangle_inset(&rect, padding); -- gtk_style_context_get_border(boxStyle, GTK_STATE_FLAG_NORMAL, &border); -- moz_gtk_rectangle_inset(&rect, border); -+ InsetByBorderPadding(&rect, boxStyle); -+ ReleaseStyleContext(boxStyle); - - GtkStyleContext* labelStyle = -- CreateStyleForWidget(gtk_label_new(nullptr), boxStyle); -+ ClaimStyleContext(MOZ_GTK_TOOLTIP_BOX_LABEL, direction); - moz_gtk_draw_styled_frame(labelStyle, cr, &rect, false); -- g_object_unref(labelStyle); -+ ReleaseStyleContext(labelStyle); - -- g_object_unref(boxStyle); -- -- ReleaseStyleContext(style); + gint +@@ -420,9 +418,8 @@ calculate_arrow_rect(GtkWidget* arrow, G + gfloat mxalign, myalign; + GtkMisc* misc = GTK_MISC(arrow); + +- if (have_arrow_scaling) +- gtk_style_context_get_style(gtk_widget_get_style_context(arrow), +- "arrow_scaling", &arrow_scaling, NULL); ++ gtk_style_context_get_style(gtk_widget_get_style_context(arrow), ++ "arrow_scaling", &arrow_scaling, NULL); + + gtk_misc_get_padding(misc, &mxpad, &mypad); + extent = MIN((rect->width - mxpad * 2), +@@ -443,7 +440,23 @@ calculate_arrow_rect(GtkWidget* arrow, G return MOZ_GTK_SUCCESS; } -@@ -1335,17 +1345,9 @@ moz_gtk_resizer_paint(cairo_t *cr, GdkRe - GtkWidgetState* state, - GtkTextDirection direction) - { -- GtkStyleContext* style; -- -- // gtk_render_handle() draws a background, so use GtkTextView and its -- // GTK_STYLE_CLASS_VIEW to match the background with textarea elements. -- // The resizer is drawn with shaded variants of the background color, and -- // so a transparent background would lead to a transparent resizer. -- style = ClaimStyleContext(MOZ_GTK_TEXT_VIEW, GTK_TEXT_DIR_LTR, -- GetStateFlagsFromGtkWidgetState(state)); -- // TODO - we need to save/restore style when gtk 3.20 CSS node path -- // is used -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_GRIP); -+ GtkStyleContext* style = -+ ClaimStyleContext(MOZ_GTK_RESIZER, GTK_TEXT_DIR_LTR, -+ GetStateFlagsFromGtkWidgetState(state)); - - // Workaround unico not respecting the text direction for resizers. - // See bug 1174248. -@@ -1392,17 +1394,8 @@ moz_gtk_progress_chunk_paint(cairo_t *cr - GtkTextDirection direction, - WidgetNodeType widget) - { -- GtkStyleContext* style; -- -- if (gtk_check_version(3, 20, 0) != nullptr) { -- /* Ask for MOZ_GTK_PROGRESS_TROUGH instead of MOZ_GTK_PROGRESSBAR -- * because ClaimStyleContext() saves/restores that style */ -- style = ClaimStyleContext(MOZ_GTK_PROGRESS_TROUGH, direction); -- gtk_style_context_remove_class(style, GTK_STYLE_CLASS_TROUGH); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_PROGRESSBAR); -- } else { -- style = ClaimStyleContext(MOZ_GTK_PROGRESS_CHUNK, direction); -- } -+ GtkStyleContext* style = -+ ClaimStyleContext(MOZ_GTK_PROGRESS_CHUNK, direction); - - if (widget == MOZ_GTK_PROGRESS_CHUNK_INDETERMINATE || - widget == MOZ_GTK_PROGRESS_CHUNK_VERTICAL_INDETERMINATE) { -@@ -1786,6 +1779,13 @@ static gint - moz_gtk_menu_separator_paint(cairo_t *cr, GdkRectangle* rect, - GtkTextDirection direction) - { -+ GtkWidgetState defaultState = { 0 }; -+ moz_gtk_menu_item_paint(MOZ_GTK_MENUSEPARATOR, cr, rect, -+ &defaultState, direction); -+ -+ if (gtk_get_minor_version() >= 20) -+ return MOZ_GTK_SUCCESS; +-void ++static MozGtkSize ++GetMinContentBox(GtkStyleContext* style) ++{ ++ GtkStateFlags state_flags = gtk_style_context_get_state(style); ++ gint width, height; ++ gtk_style_context_get(style, state_flags, ++ "min-width", &width, ++ "min-height", &height, ++ nullptr); ++ return {width, height}; ++} + - GtkStyleContext* style; - gboolean wide_separators; - gint separator_height; -@@ -1833,36 +1833,39 @@ moz_gtk_menu_item_paint(WidgetNodeType w - GtkWidgetState* state, GtkTextDirection direction) ++/** ++ * Get minimum widget size as sum of margin, padding, border and ++ * min-width/min-height. ++ */ ++static void + moz_gtk_get_widget_min_size(WidgetNodeType aGtkWidgetType, int* width, + int* height) { - gint x, y, w, h; -+ guint minorVersion = gtk_get_minor_version(); -+ GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state); +@@ -466,6 +479,14 @@ moz_gtk_get_widget_min_size(WidgetNodeTy + padding.top + padding.bottom; + } -- if (state->inHover && !state->disabled) { -- GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state); -- GtkStyleContext* style = -- ClaimStyleContext(widget, direction, state_flags); -- -- bool pre_3_6 = gtk_check_version(3, 6, 0) != nullptr; -- if (pre_3_6) { -- // GTK+ 3.4 saves the style context and adds the menubar class to -- // menubar children, but does each of these only when drawing, not -- // during layout. -- gtk_style_context_save(style); -- if (widget == MOZ_GTK_MENUBARITEM) { -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_MENUBAR); -- } -+ // GTK versions prior to 3.8 render the background and frame only when not -+ // a separator and in hover prelight. -+ if (minorVersion < 8 && (widget == MOZ_GTK_MENUSEPARATOR || -+ !(state_flags & GTK_STATE_FLAG_PRELIGHT))) -+ return MOZ_GTK_SUCCESS; -+ -+ GtkStyleContext* style = ClaimStyleContext(widget, direction, state_flags); ++static MozGtkSize ++GetMinMarginBox(WidgetNodeType aNodeType) ++{ ++ gint width, height; ++ moz_gtk_get_widget_min_size(aNodeType, &width, &height); ++ return {width, height}; ++} + -+ if (minorVersion < 6) { -+ // GTK+ 3.4 saves the style context and adds the menubar class to -+ // menubar children, but does each of these only when drawing, not -+ // during layout. -+ gtk_style_context_save(style); -+ if (widget == MOZ_GTK_MENUBARITEM) { -+ gtk_style_context_add_class(style, GTK_STYLE_CLASS_MENUBAR); - } -+ } - -- x = rect->x; -- y = rect->y; -- w = rect->width; -- h = rect->height; -+ x = rect->x; -+ y = rect->y; -+ w = rect->width; -+ h = rect->height; - -- gtk_render_background(style, cr, x, y, w, h); -- gtk_render_frame(style, cr, x, y, w, h); -+ gtk_render_background(style, cr, x, y, w, h); -+ gtk_render_frame(style, cr, x, y, w, h); - -- if (pre_3_6) { -- gtk_style_context_restore(style); -- } -- ReleaseStyleContext(style); -+ if (minorVersion < 6) { -+ gtk_style_context_restore(style); + static void + Inset(GdkRectangle* rect, GtkBorder& aBorder) + { +@@ -546,18 +567,22 @@ moz_gtk_scrollbar_button_paint(cairo_t * + // box occupies the full width of the "contents" gadget content box. + InsetByMargin(&rect, style); + } else { +- // Scrollbar button has to be inset by trough_border because its DOM +- // element is filling width of vertical scrollbar's track (or height +- // in case of horizontal scrollbars). +- MozGtkScrollbarMetrics metrics; +- moz_gtk_get_scrollbar_metrics(&metrics); +- if (flags & MOZ_GTK_STEPPER_VERTICAL) { +- rect.x += metrics.trough_border; +- rect.width = metrics.slider_width; +- } else { +- rect.y += metrics.trough_border; +- rect.height = metrics.slider_width; +- } ++ // Scrollbar button has to be inset by trough_border because its DOM ++ // element is filling width of vertical scrollbar's track (or height ++ // in case of horizontal scrollbars). ++ GtkOrientation orientation = flags & MOZ_GTK_STEPPER_VERTICAL ? ++ GTK_ORIENTATION_VERTICAL : GTK_ORIENTATION_HORIZONTAL; ++ const auto& metrics = sScrollbarMetrics[orientation]; ++ if (!metrics.initialized) { ++ NS_WARNING("Didn't measure before drawing?"); ++ } ++ if (flags & MOZ_GTK_STEPPER_VERTICAL) { ++ rect.x += metrics.border.track.left; ++ rect.width = metrics.size.thumb.width; ++ } else { ++ rect.y += metrics.border.track.top; ++ rect.height = metrics.size.thumb.height; ++ } } -+ ReleaseStyleContext(style); - return MOZ_GTK_SUCCESS; - } -@@ -1882,16 +1885,16 @@ moz_gtk_menu_arrow_paint(cairo_t *cr, Gd - return MOZ_GTK_SUCCESS; - } + gtk_render_background(style, cr, rect.x, rect.y, rect.width, rect.height); +@@ -629,12 +654,37 @@ moz_gtk_draw_styled_frame(GtkStyleContex --// See gtk_real_check_menu_item_draw_indicator() for reference. -+// For reference, see gtk_check_menu_item_size_allocate() in GTK versions after -+// 3.20 and gtk_real_check_menu_item_draw_indicator() in earlier versions. static gint --moz_gtk_check_menu_item_paint(cairo_t *cr, GdkRectangle* rect, -+moz_gtk_check_menu_item_paint(WidgetNodeType widgetType, -+ cairo_t *cr, GdkRectangle* rect, - GtkWidgetState* state, -- gboolean checked, gboolean isradio, -- GtkTextDirection direction) -+ gboolean checked, GtkTextDirection direction) + moz_gtk_scrollbar_trough_paint(WidgetNodeType widget, +- cairo_t *cr, const GdkRectangle* rect, ++ cairo_t *cr, const GdkRectangle* aRect, + GtkWidgetState* state, + GtkTextDirection direction) { - GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state); - GtkStyleContext* style; -- GtkBorder padding; - gint indicator_size, horizontal_padding; - gint x, y; - -@@ -1901,35 +1904,44 @@ moz_gtk_check_menu_item_paint(cairo_t *c - state_flags = static_cast(state_flags|checkbox_check_state); - } - -- style = ClaimStyleContext(isradio ? MOZ_GTK_RADIOMENUITEM_CONTAINER : -- MOZ_GTK_CHECKMENUITEM_CONTAINER, -- direction); -+ bool pre_3_20 = gtk_get_minor_version() < 20; -+ gint offset; -+ style = ClaimStyleContext(widgetType, direction); - gtk_style_context_get_style(style, - "indicator-size", &indicator_size, - "horizontal-padding", &horizontal_padding, - NULL); -+ if (pre_3_20) { -+ GtkBorder padding; -+ gtk_style_context_get_padding(style, state_flags, &padding); -+ offset = horizontal_padding + padding.left + 2; +- GtkStyleContext* style = ClaimStyleContext(widget, direction); +- moz_gtk_draw_styled_frame(style, cr, rect, state->focused); ++ GdkRectangle rect = *aRect; ++ GtkStyleContext* style; ++ ++ if (gtk_get_minor_version() >= 20) { ++ WidgetNodeType thumb = widget == MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL ? ++ MOZ_GTK_SCROLLBAR_THUMB_VERTICAL : ++ MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL; ++ MozGtkSize thumbSize = GetMinMarginBox(thumb); ++ style = ClaimStyleContext(widget, direction); ++ MozGtkSize trackSize = GetMinContentBox(style); ++ trackSize.Include(thumbSize); ++ trackSize += GetMarginBorderPadding(style); ++ // Gecko's trough |aRect| fills available breadth, but GTK's trough is ++ // centered in the contents_gadget. The centering here round left ++ // and up, like gtk_box_gadget_allocate_child(). ++ if (widget == MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL) { ++ rect.x += (rect.width - trackSize.width)/2; ++ rect.width = trackSize.width; ++ } else { ++ rect.y += (rect.height - trackSize.height)/2; ++ rect.height = trackSize.height; ++ } + } else { -+ GdkRectangle r = { 0 }; -+ InsetByMargin(&r, style); -+ InsetByBorderPadding(&r, style); -+ offset = r.x; ++ style = ClaimStyleContext(widget, direction); + } ++ ++ moz_gtk_draw_styled_frame(style, cr, &rect, state->focused); ReleaseStyleContext(style); -- style = ClaimStyleContext(isradio ? MOZ_GTK_RADIOMENUITEM : -- MOZ_GTK_CHECKMENUITEM, -- direction, state_flags); -- gtk_style_context_get_padding(style, state_flags, &padding); -- gint offset = padding.left + 2; -+ bool isRadio = (widgetType == MOZ_GTK_RADIOMENUITEM); -+ WidgetNodeType indicatorType = isRadio ? MOZ_GTK_RADIOMENUITEM_INDICATOR -+ : MOZ_GTK_CHECKMENUITEM_INDICATOR; -+ style = ClaimStyleContext(indicatorType, direction, state_flags); - - if (direction == GTK_TEXT_DIR_RTL) { -- x = rect->width - indicator_size - offset - horizontal_padding; -+ x = rect->width - indicator_size - offset; - } - else { -- x = rect->x + offset + horizontal_padding; -+ x = rect->x + offset; - } - y = rect->y + (rect->height - indicator_size) / 2; - -- if (gtk_check_version(3, 20, 0) == nullptr) { -+ if (!pre_3_20) { - gtk_render_background(style, cr, x, y, indicator_size, indicator_size); - gtk_render_frame(style, cr, x, y, indicator_size, indicator_size); - } - -- if (isradio) { -+ if (isRadio) { - gtk_render_option(style, cr, x, y, indicator_size, indicator_size); - } else { - gtk_render_check(style, cr, x, y, indicator_size, indicator_size); -@@ -2033,9 +2045,6 @@ moz_gtk_get_widget_border(WidgetNodeType - if (widget == MOZ_GTK_TOOLBAR_BUTTON) - gtk_style_context_restore(style); - -- // XXX: Subtract 1 pixel from the border to account for the added -- // -moz-focus-inner border (Bug 1228281). -- *left -= 1; *top -= 1; *right -= 1; *bottom -= 1; - moz_gtk_add_style_border(style, left, top, right, bottom); + return MOZ_GTK_SUCCESS; +@@ -2009,6 +2059,20 @@ static void moz_gtk_add_margin_border_pa + moz_gtk_add_style_padding(style, left, top, right, bottom); + } - ReleaseStyleContext(style); -@@ -2174,12 +2183,15 @@ moz_gtk_get_widget_border(WidgetNodeType - { - // Bug 1274143 for MOZ_GTK_MENUBARITEM - WidgetNodeType type = -- widget == MOZ_GTK_MENUBARITEM || widget == MOZ_GTK_MENUITEM ? -- MOZ_GTK_MENUITEM : MOZ_GTK_CHECKMENUITEM_CONTAINER; -+ widget == MOZ_GTK_MENUBARITEM ? MOZ_GTK_MENUITEM : widget; - style = ClaimStyleContext(type); ++static GtkBorder ++GetMarginBorderPadding(GtkStyleContext* aStyle) ++{ ++ gint left = 0, top = 0, right = 0, bottom = 0; ++ moz_gtk_add_margin_border_padding(aStyle, &left, &top, &right, &bottom); ++ // narrowing conversions to gint16: ++ GtkBorder result; ++ result.left = left; ++ result.right = right; ++ result.top = top; ++ result.bottom = bottom; ++ return result; ++} ++ + gint + moz_gtk_get_widget_border(WidgetNodeType widget, gint* left, gint* top, + gint* right, gint* bottom, GtkTextDirection direction, +@@ -2212,61 +2276,7 @@ moz_gtk_get_widget_border(WidgetNodeType -- moz_gtk_add_style_padding(style, left, top, right, bottom); -- -+ if (gtk_get_minor_version() < 20) { -+ moz_gtk_add_style_padding(style, left, top, right, bottom); -+ } else { -+ moz_gtk_add_margin_border_padding(style, -+ left, top, right, bottom); -+ } - ReleaseStyleContext(style); return MOZ_GTK_SUCCESS; } -@@ -2188,7 +2200,6 @@ moz_gtk_get_widget_border(WidgetNodeType - break; - case MOZ_GTK_TOOLTIP: - { -- style = ClaimStyleContext(MOZ_GTK_TOOLTIP); - // In GTK 3 there are 6 pixels of additional margin around the box. - // See details there: - // https://github.com/GNOME/gtk/blob/5ea69a136bd7e4970b3a800390e20314665aaed2/gtk/ui/gtktooltipwindow.ui#L11 -@@ -2197,21 +2208,16 @@ moz_gtk_get_widget_border(WidgetNodeType - // We also need to add margin/padding/borders from Tooltip content. - // Tooltip contains horizontal box, where icon and label is put. - // We ignore icon as long as we don't have support for it. -- GtkStyleContext* boxStyle = -- CreateStyleForWidget(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0), -- style); -+ GtkStyleContext* boxStyle = ClaimStyleContext(MOZ_GTK_TOOLTIP_BOX); - moz_gtk_add_margin_border_padding(boxStyle, - left, top, right, bottom); -+ ReleaseStyleContext(boxStyle); - -- GtkStyleContext* labelStyle = -- CreateStyleForWidget(gtk_label_new(nullptr), boxStyle); -+ GtkStyleContext* labelStyle = ClaimStyleContext(MOZ_GTK_TOOLTIP_BOX_LABEL); - moz_gtk_add_margin_border_padding(labelStyle, - left, top, right, bottom); -+ ReleaseStyleContext(labelStyle); - -- g_object_unref(labelStyle); -- g_object_unref(boxStyle); +- case MOZ_GTK_SCROLLBAR_VERTICAL: +- case MOZ_GTK_SCROLLBAR_TROUGH_HORIZONTAL: +- { +- if (gtk_check_version(3,20,0) == nullptr) { +- style = ClaimStyleContext(widget); +- moz_gtk_add_margin_border_padding(style, left, top, right, bottom); +- ReleaseStyleContext(style); +- if (widget == MOZ_GTK_SCROLLBAR_VERTICAL) { +- style = ClaimStyleContext(MOZ_GTK_SCROLLBAR_CONTENTS_VERTICAL); +- moz_gtk_add_margin_border_padding(style, left, top, right, bottom); +- ReleaseStyleContext(style); +- } +- } else { +- MozGtkScrollbarMetrics metrics; +- moz_gtk_get_scrollbar_metrics(&metrics); +- /* Top and bottom border for whole vertical scrollbar, top and bottom +- * border for horizontal track - to correctly position thumb element */ +- *top = *bottom = metrics.trough_border; +- } +- return MOZ_GTK_SUCCESS; +- } +- break; + +- case MOZ_GTK_SCROLLBAR_HORIZONTAL: +- case MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL: +- { +- if (gtk_check_version(3,20,0) == nullptr) { +- style = ClaimStyleContext(widget); +- moz_gtk_add_margin_border_padding(style, left, top, right, bottom); +- ReleaseStyleContext(style); +- if (widget == MOZ_GTK_SCROLLBAR_HORIZONTAL) { +- style = ClaimStyleContext(MOZ_GTK_SCROLLBAR_CONTENTS_HORIZONTAL); +- moz_gtk_add_margin_border_padding(style, left, top, right, bottom); +- ReleaseStyleContext(style); +- } +- } else { +- MozGtkScrollbarMetrics metrics; +- moz_gtk_get_scrollbar_metrics(&metrics); +- *left = *right = metrics.trough_border; +- } +- return MOZ_GTK_SUCCESS; +- } +- break; - +- case MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL: +- case MOZ_GTK_SCROLLBAR_THUMB_VERTICAL: +- { +- if (gtk_check_version(3,20,0) == nullptr) { +- style = ClaimStyleContext(widget); +- moz_gtk_add_margin_border_padding(style, left, top, right, bottom); - ReleaseStyleContext(style); - return MOZ_GTK_SUCCESS; - } - case MOZ_GTK_SCROLLBAR_VERTICAL: -@@ -2500,11 +2506,11 @@ void +- } +- return MOZ_GTK_SUCCESS; +- } +- break; + /* These widgets have no borders, since they are not containers. */ + case MOZ_GTK_CHECKBUTTON_LABEL: + case MOZ_GTK_RADIOBUTTON_LABEL: +@@ -2275,6 +2285,8 @@ moz_gtk_get_widget_border(WidgetNodeType + case MOZ_GTK_CHECKBUTTON: + case MOZ_GTK_RADIOBUTTON: + case MOZ_GTK_SCROLLBAR_BUTTON: ++ case MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL: ++ case MOZ_GTK_SCROLLBAR_THUMB_VERTICAL: + case MOZ_GTK_SCALE_THUMB_HORIZONTAL: + case MOZ_GTK_SCALE_THUMB_VERTICAL: + case MOZ_GTK_GRIPPER: +@@ -2498,11 +2510,11 @@ void moz_gtk_get_scale_metrics(GtkOrientation orient, gint* scale_width, gint* scale_height) { @@ -464,7 +307,7 @@ diff -up firefox-52.0/widget/gtk/gtk3drawing.cpp.widget-rebase firefox-52.0/widg gint thumb_length, thumb_height, trough_border; moz_gtk_get_scalethumb_metrics(orient, &thumb_length, &thumb_height); -@@ -2520,12 +2526,10 @@ moz_gtk_get_scale_metrics(GtkOrientation +@@ -2518,12 +2530,10 @@ moz_gtk_get_scale_metrics(GtkOrientation } ReleaseStyleContext(style); } else { @@ -481,7 +324,7 @@ diff -up firefox-52.0/widget/gtk/gtk3drawing.cpp.widget-rebase firefox-52.0/widg } } -@@ -2548,10 +2552,28 @@ moz_gtk_get_scalethumb_metrics(GtkOrient +@@ -2546,33 +2556,176 @@ moz_gtk_get_scalethumb_metrics(GtkOrient MOZ_GTK_SCALE_THUMB_HORIZONTAL: MOZ_GTK_SCALE_THUMB_VERTICAL; GtkStyleContext* style = ClaimStyleContext(widget); @@ -513,647 +356,507 @@ diff -up firefox-52.0/widget/gtk/gtk3drawing.cpp.widget-rebase firefox-52.0/widg ReleaseStyleContext(style); } -@@ -2791,10 +2813,8 @@ moz_gtk_widget_paint(WidgetNodeType widg - break; - case MOZ_GTK_CHECKMENUITEM: - case MOZ_GTK_RADIOMENUITEM: -- return moz_gtk_check_menu_item_paint(cr, rect, state, -- (gboolean) flags, -- (widget == MOZ_GTK_RADIOMENUITEM), -- direction); -+ return moz_gtk_check_menu_item_paint(widget, cr, rect, state, -+ (gboolean) flags, direction); - break; - case MOZ_GTK_SPLITTER_HORIZONTAL: - return moz_gtk_vpaned_paint(cr, rect, state); -diff -up firefox-52.0/widget/gtk/gtkdrawing.h.widget-rebase firefox-52.0/widget/gtk/gtkdrawing.h ---- firefox-52.0/widget/gtk/gtkdrawing.h.widget-rebase 2017-02-27 17:11:05.000000000 +0100 -+++ firefox-52.0/widget/gtk/gtkdrawing.h 2017-03-10 12:20:30.233205986 +0100 -@@ -145,8 +145,11 @@ typedef enum { - MOZ_GTK_ENTRY, - /* Paints a GtkExpander. */ - MOZ_GTK_EXPANDER, -- /* Paints a GtkTextView. */ -+ /* Paints a GtkTextView or gets the style context corresponding to the -+ root node of a GtkTextView. */ - MOZ_GTK_TEXT_VIEW, -+ /* The "text" window or node of a GtkTextView */ -+ MOZ_GTK_TEXT_VIEW_TEXT, - /* Paints a GtkOptionMenu. */ - MOZ_GTK_DROPDOWN, - /* Paints a dropdown arrow (a GtkButton containing a down GtkArrow). */ -@@ -160,11 +163,15 @@ typedef enum { - MOZ_GTK_TOOLBAR_SEPARATOR, - /* Paints a GtkToolTip */ - MOZ_GTK_TOOLTIP, -+ /* Paints a GtkBox from GtkToolTip */ -+ MOZ_GTK_TOOLTIP_BOX, -+ /* Paints a GtkLabel of GtkToolTip */ -+ MOZ_GTK_TOOLTIP_BOX_LABEL, - /* Paints a GtkFrame (e.g. a status bar panel). */ - MOZ_GTK_FRAME, - /* Paints the border of a GtkFrame */ - MOZ_GTK_FRAME_BORDER, -- /* Paints a resize grip for a GtkWindow */ -+ /* Paints a resize grip for a GtkTextView */ - MOZ_GTK_RESIZER, - /* Paints a GtkProgressBar. */ - MOZ_GTK_PROGRESSBAR, -@@ -210,11 +217,13 @@ typedef enum { - MOZ_GTK_MENUBARITEM, - /* Paints items of popup menus. */ - MOZ_GTK_MENUITEM, -- MOZ_GTK_IMAGEMENUITEM, -- MOZ_GTK_CHECKMENUITEM_CONTAINER, -- MOZ_GTK_RADIOMENUITEM_CONTAINER, -+ /* Paints a menuitem with check indicator, or the gets the style context for -+ a menuitem that contains a checkbox. */ - MOZ_GTK_CHECKMENUITEM, -+ /* Gets the style context for a checkbox in a check menuitem. */ -+ MOZ_GTK_CHECKMENUITEM_INDICATOR, - MOZ_GTK_RADIOMENUITEM, -+ MOZ_GTK_RADIOMENUITEM_INDICATOR, - MOZ_GTK_MENUSEPARATOR, - /* GtkVPaned base class */ - MOZ_GTK_SPLITTER_HORIZONTAL, -diff -up firefox-52.0/widget/gtk/mozgtk/mozgtk.c.widget-rebase firefox-52.0/widget/gtk/mozgtk/mozgtk.c ---- firefox-52.0/widget/gtk/mozgtk/mozgtk.c.widget-rebase 2017-02-27 17:11:05.000000000 +0100 -+++ firefox-52.0/widget/gtk/mozgtk/mozgtk.c 2017-03-10 12:20:30.233205986 +0100 -@@ -245,7 +245,6 @@ STUB(gtk_icon_theme_get_icon_sizes) - STUB(gtk_icon_theme_lookup_by_gicon) - STUB(gtk_icon_theme_lookup_icon) - STUB(gtk_image_get_type) --STUB(gtk_image_menu_item_new) - STUB(gtk_image_new) - STUB(gtk_image_new_from_stock) - STUB(gtk_image_set_from_pixbuf) -diff -up firefox-52.0/widget/gtk/nsLookAndFeel.cpp.widget-rebase firefox-52.0/widget/gtk/nsLookAndFeel.cpp ---- firefox-52.0/widget/gtk/nsLookAndFeel.cpp.widget-rebase 2017-02-27 17:11:05.000000000 +0100 -+++ firefox-52.0/widget/gtk/nsLookAndFeel.cpp 2017-03-10 13:54:36.918205357 +0100 -@@ -24,6 +24,7 @@ - #include "nsStyleConsts.h" - #include "gfxFontConstants.h" - #include "WidgetUtils.h" -+#include "nsIXULRuntime.h" - - #include - -@@ -47,9 +48,6 @@ nsLookAndFeel::nsLookAndFeel() - : nsXPLookAndFeel(), - #if (MOZ_WIDGET_GTK == 2) - mStyle(nullptr), --#else -- mBackgroundStyle(nullptr), -- mButtonStyle(nullptr), - #endif - mDefaultFontCached(false), mButtonFontCached(false), - mFieldFontCached(false), mMenuFontCached(false) -@@ -61,13 +59,27 @@ nsLookAndFeel::~nsLookAndFeel() - { - #if (MOZ_WIDGET_GTK == 2) - g_object_unref(mStyle); --#else -- g_object_unref(mBackgroundStyle); -- g_object_unref(mButtonStyle); - #endif + return MOZ_GTK_SUCCESS; } - #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 -+ApplyColorOver(const GdkRGBA& aSource, GdkRGBA* aDest) { -+ gdouble sourceCoef = aSource.alpha; -+ gdouble destCoef = aDest->alpha * (1.0 - sourceCoef); -+ gdouble resultAlpha = sourceCoef + destCoef; -+ if (resultAlpha != 0.0) { // don't divide by zero -+ destCoef /= resultAlpha; -+ sourceCoef /= resultAlpha; -+ aDest->red = sourceCoef * aSource.red + destCoef * aDest->red; -+ aDest->green = sourceCoef * aSource.green + destCoef * aDest->green; -+ aDest->blue = sourceCoef * aSource.blue + destCoef * aDest->blue; -+ aDest->alpha = resultAlpha; -+ } +-gint +-moz_gtk_get_scrollbar_metrics(MozGtkScrollbarMetrics *metrics) ++static MozGtkSize ++SizeFromLengthAndBreadth(GtkOrientation aOrientation, ++ gint aLength, gint aBreadth) + { +- // For Gtk >= 3.20 scrollbar metrics are ignored +- MOZ_ASSERT(gtk_check_version(3, 20, 0) != nullptr); ++ return aOrientation == GTK_ORIENTATION_HORIZONTAL ? ++ MozGtkSize({aLength, aBreadth}) : MozGtkSize({aBreadth, aLength}); +} + - static void - GetLightAndDarkness(const GdkRGBA& aColor, - double* aLightness, double* aDarkness) -@@ -377,30 +389,39 @@ nsLookAndFeel::NativeGetColor(ColorID aI - break; - #else - // css2 http://www.w3.org/TR/REC-CSS2/ui.html#system-colors -- case eColorID_activeborder: -+ case eColorID_activeborder: { - // active window border -- gtk_style_context_get_border_color(mBackgroundStyle, -+ GtkStyleContext *style = ClaimStyleContext(MOZ_GTK_WINDOW); -+ gtk_style_context_get_border_color(style, - GTK_STATE_FLAG_NORMAL, &gdk_color); - aColor = GDK_RGBA_TO_NS_RGBA(gdk_color); -+ ReleaseStyleContext(style); - break; -- case eColorID_inactiveborder: -+ } -+ case eColorID_inactiveborder: { - // inactive window border -- gtk_style_context_get_border_color(mBackgroundStyle, -- GTK_STATE_FLAG_INSENSITIVE, -+ GtkStyleContext *style = ClaimStyleContext(MOZ_GTK_WINDOW); -+ gtk_style_context_get_border_color(style, -+ GTK_STATE_FLAG_INSENSITIVE, - &gdk_color); - aColor = GDK_RGBA_TO_NS_RGBA(gdk_color); ++const ScrollbarGTKMetrics* ++GetScrollbarMetrics(GtkOrientation aOrientation) ++{ ++ auto metrics = &sScrollbarMetrics[aOrientation]; ++ if (metrics->initialized) ++ return metrics; ++ ++ metrics->initialized = true; + +- GtkStyleContext* style = ClaimStyleContext(MOZ_GTK_SCROLLBAR_VERTICAL); ++ WidgetNodeType scrollbar = aOrientation == GTK_ORIENTATION_HORIZONTAL ? ++ MOZ_GTK_SCROLLBAR_HORIZONTAL : MOZ_GTK_SCROLLBAR_VERTICAL; ++ ++ gboolean backward, forward, secondary_backward, secondary_forward; ++ GtkStyleContext* style = ClaimStyleContext(scrollbar); + gtk_style_context_get_style(style, +- "slider_width", &metrics->slider_width, +- "trough_border", &metrics->trough_border, +- "stepper_size", &metrics->stepper_size, +- "stepper_spacing", &metrics->stepper_spacing, +- "min-slider-length", &metrics->min_slider_size, +- nullptr); ++ "has-backward-stepper", &backward, ++ "has-forward-stepper", &forward, ++ "has-secondary-backward-stepper", ++ &secondary_backward, ++ "has-secondary-forward-stepper", ++ &secondary_forward, nullptr); ++ bool hasButtons = ++ backward || forward || secondary_backward || secondary_forward; ++ ++ if (gtk_get_minor_version() < 20) { ++ gint slider_width, trough_border, stepper_size, min_slider_size; ++ ++ gtk_style_context_get_style(style, ++ "slider-width", &slider_width, ++ "trough-border", &trough_border, ++ "stepper-size", &stepper_size, ++ "min-slider-length", &min_slider_size, ++ nullptr); + ReleaseStyleContext(style); - break; ++ ++ metrics->size.thumb = ++ SizeFromLengthAndBreadth(aOrientation, min_slider_size, slider_width); ++ metrics->size.button = ++ SizeFromLengthAndBreadth(aOrientation, stepper_size, slider_width); ++ // overall scrollbar ++ gint breadth = slider_width + 2 * trough_border; ++ // Require room for the slider in the track if we don't have buttons. ++ gint length = hasButtons ? 0 : min_slider_size + 2 * trough_border; ++ metrics->size.scrollbar = ++ SizeFromLengthAndBreadth(aOrientation, length, breadth); ++ ++ // Borders on the major axis are set on the outermost scrollbar ++ // element to correctly position the buttons when ++ // trough-under-steppers is true. ++ // Borders on the minor axis are set on the track element so that it ++ // receives mouse events, as in GTK. ++ // Other borders have been zero-initialized. ++ if (aOrientation == GTK_ORIENTATION_HORIZONTAL) { ++ metrics->border.scrollbar.left = ++ metrics->border.scrollbar.right = ++ metrics->border.track.top = ++ metrics->border.track.bottom = trough_border; ++ } else { ++ metrics->border.scrollbar.top = ++ metrics->border.scrollbar.bottom = ++ metrics->border.track.left = ++ metrics->border.track.right = trough_border; ++ } ++ ++ return metrics; + } - case eColorID_graytext: // disabled text in windows, menus, etc. - case eColorID_inactivecaptiontext: // text in inactive window caption - aColor = sMenuTextInactive; - break; -- case eColorID_inactivecaption: -+ case eColorID_inactivecaption: { - // inactive window caption -- gtk_style_context_get_background_color(mBackgroundStyle, -+ GtkStyleContext *style = ClaimStyleContext(MOZ_GTK_WINDOW); -+ gtk_style_context_get_background_color(style, - GTK_STATE_FLAG_INSENSITIVE, - &gdk_color); - aColor = GDK_RGBA_TO_NS_RGBA(gdk_color); -+ ReleaseStyleContext(style); - break; ++ ++ // GTK version > 3.20 ++ // scrollbar ++ metrics->border.scrollbar = GetMarginBorderPadding(style); + ReleaseStyleContext(style); + +- return MOZ_GTK_SUCCESS; ++ WidgetNodeType contents, track, thumb; ++ if (aOrientation == GTK_ORIENTATION_HORIZONTAL) { ++ contents = MOZ_GTK_SCROLLBAR_CONTENTS_HORIZONTAL; ++ track = MOZ_GTK_SCROLLBAR_TROUGH_HORIZONTAL; ++ thumb = MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL; ++ } else { ++ contents = MOZ_GTK_SCROLLBAR_CONTENTS_VERTICAL; ++ track = MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL; ++ thumb = MOZ_GTK_SCROLLBAR_THUMB_VERTICAL; + } - #endif - case eColorID_infobackground: - // tooltip background color -@@ -521,18 +542,24 @@ nsLookAndFeel::NativeGetColor(ColorID aI - case eColorID__moz_fieldtext: - aColor = sMozFieldText; - break; -- case eColorID__moz_buttondefault: -- // default button border color -- gtk_style_context_get_border_color(mButtonStyle, -+ case eColorID__moz_buttondefault: { -+ // default button border color -+ GtkStyleContext *style = ClaimStyleContext(MOZ_GTK_BUTTON); -+ gtk_style_context_get_border_color(style, - GTK_STATE_FLAG_NORMAL, &gdk_color); - aColor = GDK_RGBA_TO_NS_RGBA(gdk_color); -+ ReleaseStyleContext(style); - break; -- case eColorID__moz_buttonhoverface: -- gtk_style_context_get_background_color(mButtonStyle, ++ // thumb ++ metrics->size.thumb = GetMinMarginBox(thumb); ++ // track ++ style = ClaimStyleContext(track); ++ metrics->border.track = GetMarginBorderPadding(style); ++ MozGtkSize trackMinSize = GetMinContentBox(style) + metrics->border.track; ++ ReleaseStyleContext(style); ++ MozGtkSize trackSizeForThumb = metrics->size.thumb + metrics->border.track; ++ // button ++ if (hasButtons) { ++ metrics->size.button = GetMinMarginBox(MOZ_GTK_SCROLLBAR_BUTTON); ++ } else { ++ metrics->size.button = {0, 0}; + } -+ case eColorID__moz_buttonhoverface: { -+ GtkStyleContext *style = ClaimStyleContext(MOZ_GTK_BUTTON); -+ gtk_style_context_get_background_color(style, - GTK_STATE_FLAG_PRELIGHT, - &gdk_color); - aColor = GDK_RGBA_TO_NS_RGBA(gdk_color); -+ ReleaseStyleContext(style); - break; ++ if (aOrientation == GTK_ORIENTATION_HORIZONTAL) { ++ metrics->size.button.Rotate(); ++ // If the track is wider than necessary for the thumb, including when ++ // the buttons will cause Gecko to expand the track to fill ++ // available breadth, then add to the track border to prevent Gecko ++ // from expanding the thumb to fill available breadth. ++ gint extra = ++ std::max(trackMinSize.height, ++ metrics->size.button.height) - trackSizeForThumb.height; ++ if (extra > 0) { ++ // If extra is odd, then the thumb is 0.5 pixels above ++ // center as in gtk_range_compute_slider_position(). ++ metrics->border.track.top += extra / 2; ++ metrics->border.track.bottom += extra - extra / 2; ++ // Update size for change in border. ++ trackSizeForThumb.height += extra; ++ } ++ } else { ++ gint extra = ++ std::max(trackMinSize.width, ++ metrics->size.button.width) - trackSizeForThumb.width; ++ if (extra > 0) { ++ // If extra is odd, then the thumb is 0.5 pixels to the left ++ // of center as in gtk_range_compute_slider_position(). ++ metrics->border.track.left += extra / 2; ++ metrics->border.track.right += extra - extra / 2; ++ trackSizeForThumb.width += extra; ++ } + } - case eColorID__moz_buttonhovertext: - aColor = sButtonHoverText; - break; -@@ -1029,16 +1056,6 @@ nsLookAndFeel::GetFontImpl(FontID aID, n - return true; ++ ++ style = ClaimStyleContext(contents); ++ GtkBorder contentsBorder = GetMarginBorderPadding(style); ++ ReleaseStyleContext(style); ++ ++ metrics->size.scrollbar = ++ trackSizeForThumb + contentsBorder + metrics->border.scrollbar; ++ ++ return metrics; + } + + /* cairo_t *cr argument has to be a system-cairo. */ +@@ -2814,34 +2967,11 @@ moz_gtk_widget_paint(WidgetNodeType widg + return MOZ_GTK_UNKNOWN_WIDGET; } --#if (MOZ_WIDGET_GTK == 3) --static GtkStyleContext* --create_context(GtkWidgetPath *path) +-GtkWidget* moz_gtk_get_scrollbar_widget(void) -{ -- GtkStyleContext *style = gtk_style_context_new(); -- gtk_style_context_set_path(style, path); -- return(style); +- return GetWidget(MOZ_GTK_SCROLLBAR_HORIZONTAL); -} --#endif - - void - nsLookAndFeel::Init() +-gboolean moz_gtk_has_scrollbar_buttons(void) +-{ +- gboolean backward, forward, secondary_backward, secondary_forward; +- MOZ_ASSERT(is_initialized, "Forgot to call moz_gtk_init()"); +- GtkStyleContext* style = ClaimStyleContext(MOZ_GTK_SCROLLBAR_VERTICAL); +- gtk_style_context_get_style(style, +- "has-backward-stepper", &backward, +- "has-forward-stepper", &forward, +- "has-secondary-backward-stepper", &secondary_backward, +- "has-secondary-forward-stepper", &secondary_forward, +- NULL); +- ReleaseStyleContext(style); +- +- return backward | forward | secondary_forward | secondary_forward; +-} +- + gint + moz_gtk_shutdown() { -@@ -1129,78 +1146,54 @@ nsLookAndFeel::Init() - g_object_set(settings, dark_setting, FALSE, nullptr); - } + /* This will destroy all of our widgets */ + ResetWidgetCache(); -- GtkWidgetPath *path = gtk_widget_path_new(); -- gtk_widget_path_append_type(path, GTK_TYPE_WINDOW); +- is_initialized = FALSE; - -- mBackgroundStyle = create_context(path); -- gtk_style_context_add_class(mBackgroundStyle, GTK_STYLE_CLASS_BACKGROUND); + return MOZ_GTK_SUCCESS; + } +diff -up firefox-53.0/widget/gtk/gtkdrawing.h.widget-rebase firefox-53.0/widget/gtk/gtkdrawing.h +--- firefox-53.0/widget/gtk/gtkdrawing.h.widget-rebase 2017-04-18 10:24:37.950508591 +0200 ++++ firefox-53.0/widget/gtk/gtkdrawing.h 2017-04-18 10:22:45.412920645 +0200 +@@ -39,13 +39,49 @@ typedef struct { + gint32 maxpos; + } GtkWidgetState; + ++/** ++ * A size in the same GTK pixel units as GtkBorder and GdkRectangle. ++ */ ++struct MozGtkSize { ++ gint width; ++ gint height; ++ ++ MozGtkSize& operator+=(const GtkBorder& aBorder) ++ { ++ width += aBorder.left + aBorder.right; ++ height += aBorder.top + aBorder.bottom; ++ return *this; ++ } ++ MozGtkSize operator+(const GtkBorder& aBorder) const ++ { ++ MozGtkSize result = *this; ++ return result += aBorder; ++ } ++ void Include(MozGtkSize aOther) ++ { ++ width = std::max(width, aOther.width); ++ height = std::max(height, aOther.height); ++ } ++ void Rotate() ++ { ++ gint tmp = width; ++ width = height; ++ height = tmp; ++ } ++}; ++ + typedef struct { +- gint slider_width; +- gint trough_border; +- gint stepper_size; +- gint stepper_spacing; +- gint min_slider_size; +-} MozGtkScrollbarMetrics; ++ bool initialized; ++ struct { ++ MozGtkSize scrollbar; ++ MozGtkSize thumb; ++ MozGtkSize button; ++ } size; ++ struct { ++ GtkBorder scrollbar; ++ GtkBorder track; ++ } border; ++} ScrollbarGTKMetrics; + + typedef enum { + MOZ_GTK_STEPPER_DOWN = 1 << 0, +@@ -67,9 +103,6 @@ typedef enum { + MOZ_GTK_TAB_SELECTED = 1 << 10 + } GtkTabFlags; + +-/* function type for moz_gtk_enable_style_props */ +-typedef gint (*style_prop_t)(GtkStyle*, const gchar*, gint); - -- mButtonStyle = create_context(path); -- gtk_style_context_add_class(mButtonStyle, GTK_STYLE_CLASS_BUTTON); + /*** result/error codes ***/ + #define MOZ_GTK_SUCCESS 0 + #define MOZ_GTK_UNKNOWN_WIDGET -1 +@@ -272,13 +305,9 @@ typedef enum { + gint moz_gtk_init(); + + /** +- * Enable GTK+ 1.2.9+ theme enhancements. You must provide a pointer +- * to the GTK+ 1.2.9+ function "gtk_style_get_prop_experimental". +- * styleGetProp: pointer to gtk_style_get_prop_experimental +- * +- * returns: MOZ_GTK_SUCCESS if there was no error, an error code otherwise ++ * Updates the drawing library when the theme changes. + */ +-gint moz_gtk_enable_style_props(style_prop_t styleGetProp); ++void moz_gtk_refresh(); + + /** + * Perform cleanup of the drawing library. You should call this function +@@ -432,13 +461,10 @@ gint + moz_gtk_get_scalethumb_metrics(GtkOrientation orient, gint* thumb_length, gint* thumb_height); + + /** +- * Get the desired metrics for a GtkScrollbar +- * metrics: [IN] struct which will contain the metrics +- * +- * returns: MOZ_GTK_SUCCESS if there was no error, an error code otherwise ++ * Get the metrics in GTK pixels for a scrollbar. + */ +-gint +-moz_gtk_get_scrollbar_metrics(MozGtkScrollbarMetrics* metrics); ++const ScrollbarGTKMetrics* ++GetScrollbarMetrics(GtkOrientation aOrientation); + + /** + * Get the desired size of a dropdown arrow button +@@ -518,30 +544,11 @@ gint moz_gtk_get_menu_separator_height(g + gint moz_gtk_splitter_get_metrics(gint orientation, gint* size); + + /** +- * Retrieve an actual GTK scrollbar widget for style analysis. It will not +- * be modified. +- */ +-GtkWidget* moz_gtk_get_scrollbar_widget(void); - - // Scrollbar colors -- style = create_context(path); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_SCROLLBAR); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_TROUGH); -+ style = ClaimStyleContext(MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL); - gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); - sMozScrollbar = GDK_RGBA_TO_NS_RGBA(color); -- g_object_unref(style); -+ ReleaseStyleContext(style); - - // Window colors -- style = create_context(path); -- gtk_style_context_save(style); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_BACKGROUND); -+ style = ClaimStyleContext(MOZ_GTK_WINDOW); - gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); - sMozWindowBackground = GDK_RGBA_TO_NS_RGBA(color); - gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); - sMozWindowText = GDK_RGBA_TO_NS_RGBA(color); -- gtk_style_context_restore(style); -- g_object_unref(style); -+ ReleaseStyleContext(style); - - // tooltip foreground and background - style = ClaimStyleContext(MOZ_GTK_TOOLTIP); - gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); - sInfoBackground = GDK_RGBA_TO_NS_RGBA(color); -- { -- GtkStyleContext* boxStyle = -- CreateStyleForWidget(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0), -- style); -- GtkStyleContext* labelStyle = -- CreateStyleForWidget(gtk_label_new(nullptr), boxStyle); -- gtk_style_context_get_color(labelStyle, GTK_STATE_FLAG_NORMAL, &color); -- g_object_unref(labelStyle); -- g_object_unref(boxStyle); -- } -- sInfoText = GDK_RGBA_TO_NS_RGBA(color); - ReleaseStyleContext(style); +-/** + * Get the YTHICKNESS of a tab (notebook extension). + */ + gint + moz_gtk_get_tab_thickness(WidgetNodeType aNodeType); -- // 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); +-/** +- * Get a boolean which indicates whether the theme draws scrollbar buttons. +- * If TRUE, draw scrollbar buttons. +- */ +-gboolean moz_gtk_has_scrollbar_buttons(void); - -- gtk_container_add(GTK_CONTAINER(menuitem), accel_label); -- gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem); +-/** +- * Get minimum widget size as sum of margin, padding, border and min-width, +- * min-height. +- */ +-void moz_gtk_get_widget_min_size(WidgetNodeType aGtkWidgetType, int* width, +- int* height); - -- style = gtk_widget_get_style_context(accel_label); -+ style = ClaimStyleContext(MOZ_GTK_TOOLTIP_BOX_LABEL); - gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); -- sMenuText = GDK_RGBA_TO_NS_RGBA(color); -- gtk_style_context_get_color(style, GTK_STATE_FLAG_INSENSITIVE, &color); -- sMenuTextInactive = GDK_RGBA_TO_NS_RGBA(color); -+ sInfoText = GDK_RGBA_TO_NS_RGBA(color); -+ ReleaseStyleContext(style); + #if (MOZ_WIDGET_GTK == 2) + #ifdef __cplusplus + } +diff -up firefox-53.0/widget/gtk/mozgtk/mozgtk.c.widget-rebase firefox-53.0/widget/gtk/mozgtk/mozgtk.c +diff -up firefox-53.0/widget/gtk/nsLookAndFeel.cpp.widget-rebase firefox-53.0/widget/gtk/nsLookAndFeel.cpp +--- firefox-53.0/widget/gtk/nsLookAndFeel.cpp.widget-rebase 2017-04-11 06:15:20.000000000 +0200 ++++ firefox-53.0/widget/gtk/nsLookAndFeel.cpp 2017-04-18 10:22:45.333920935 +0200 +@@ -18,7 +18,7 @@ + + #include + #include "gfxPlatformGtk.h" +-#include "nsScreenGtk.h" ++#include "ScreenHelperGTK.h" + + #include "gtkdrawing.h" + #include "nsStyleConsts.h" +@@ -49,9 +49,9 @@ nsLookAndFeel::nsLookAndFeel() + mStyle(nullptr), + #endif + mDefaultFontCached(false), mButtonFontCached(false), +- mFieldFontCached(false), mMenuFontCached(false) ++ mFieldFontCached(false), mMenuFontCached(false), ++ mInitialized(false) + { +- Init(); + } -- style = gtk_widget_get_style_context(menu); -+ style = ClaimStyleContext(MOZ_GTK_MENUITEM); -+ { -+ GtkStyleContext* accelStyle = -+ CreateStyleForWidget(gtk_accel_label_new("M"), style); -+ 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); -+ sMenuTextInactive = GDK_RGBA_TO_NS_RGBA(color); -+ g_object_unref(accelStyle); -+ } -+ ReleaseStyleContext(style); + nsLookAndFeel::~nsLookAndFeel() +@@ -223,6 +223,8 @@ GetBorderColors(GtkStyleContext* aContex + nsresult + nsLookAndFeel::NativeGetColor(ColorID aID, nscolor& aColor) + { ++ EnsureInit(); + -+ style = ClaimStyleContext(MOZ_GTK_MENUPOPUP); - gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); - sMenuBackground = GDK_RGBA_TO_NS_RGBA(color); -+ ReleaseStyleContext(style); - -- style = gtk_widget_get_style_context(menuitem); -+ style = ClaimStyleContext(MOZ_GTK_MENUITEM); - gtk_style_context_get_background_color(style, GTK_STATE_FLAG_PRELIGHT, &color); - sMenuHover = GDK_RGBA_TO_NS_RGBA(color); - gtk_style_context_get_color(style, GTK_STATE_FLAG_PRELIGHT, &color); - sMenuHoverText = GDK_RGBA_TO_NS_RGBA(color); -- -- g_object_unref(menu); -+ ReleaseStyleContext(style); + #if (MOZ_WIDGET_GTK == 3) + GdkRGBA gdk_color; #endif +@@ -674,6 +676,11 @@ nsLookAndFeel::GetIntImpl(IntID aID, int + return res; + res = NS_OK; + ++ // We use delayed initialization by EnsureInit() here ++ // to make sure mozilla::Preferences is available (Bug 115807). ++ // eIntID_UseAccessibilityTheme is requested before user preferences ++ // are read, and so EnsureInit(), which depends on preference values, ++ // is deliberately delayed until required. + switch (aID) { + case eIntID_CaretBlinkTime: + { +@@ -777,11 +784,11 @@ nsLookAndFeel::GetIntImpl(IntID aID, int + aResult = threshold; + } + break; +- case eIntID_ScrollArrowStyle: +- moz_gtk_init(); +- aResult = +- ConvertGTKStepperStyleToMozillaScrollArrowStyle(moz_gtk_get_scrollbar_widget()); ++ case eIntID_ScrollArrowStyle: { ++ GtkWidget* scrollbar = GetWidget(MOZ_GTK_SCROLLBAR_HORIZONTAL); ++ aResult = ConvertGTKStepperStyleToMozillaScrollArrowStyle(scrollbar); + break; ++ } + case eIntID_ScrollSliderStyle: + aResult = eScrollThumbStyle_Proportional; + break; +@@ -836,6 +843,7 @@ nsLookAndFeel::GetIntImpl(IntID aID, int + aResult = NS_STYLE_TEXT_DECORATION_STYLE_WAVY; + break; + case eIntID_MenuBarDrag: ++ EnsureInit(); + aResult = sMenuSupportsDrag; + break; + case eIntID_ScrollbarButtonAutoRepeatBehavior: +@@ -876,6 +884,7 @@ nsLookAndFeel::GetFloatImpl(FloatID aID, + aResult = 1.0f; + break; + case eFloatID_CaretAspectRatio: ++ EnsureInit(); + aResult = sCaretRatio; + break; + default: +@@ -925,7 +934,7 @@ GetSystemFontInfo(GtkWidget *aWidget, + // Scale fonts up on HiDPI displays. + // This would be done automatically with cairo, but we manually manage + // the display scale for platform consistency. +- size *= nsScreenGtk::GetGtkMonitorScaleFactor(); ++ size *= ScreenHelperGTK::GetGTKMonitorScaleFactor(); - // button styles -@@ -1211,9 +1204,6 @@ nsLookAndFeel::Init() - GtkWidget *combobox = gtk_combo_box_new(); - GtkWidget *comboboxLabel = gtk_label_new("M"); - gtk_container_add(GTK_CONTAINER(combobox), comboboxLabel); --#else -- GtkWidget *combobox = gtk_combo_box_new_with_entry(); -- GtkWidget *comboboxLabel = gtk_bin_get_child(GTK_BIN(combobox)); - #endif - GtkWidget *window = gtk_window_new(GTK_WINDOW_POPUP); - GtkWidget *treeView = gtk_tree_view_new(); -@@ -1227,7 +1217,9 @@ nsLookAndFeel::Init() - 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); -@@ -1310,11 +1302,19 @@ nsLookAndFeel::Init() - } - #else - // Text colors -- style = gtk_widget_get_style_context(textView); -- gtk_style_context_save(style); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_VIEW); -- gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); -- sMozFieldBackground = GDK_RGBA_TO_NS_RGBA(color); -+ GdkRGBA bgColor; -+ // If the text window background is translucent, then the background of -+ // the textview root node is visible. -+ style = ClaimStyleContext(MOZ_GTK_TEXT_VIEW); -+ gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, -+ &bgColor); -+ ReleaseStyleContext(style); -+ -+ style = ClaimStyleContext(MOZ_GTK_TEXT_VIEW_TEXT); -+ gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, -+ &color); -+ ApplyColorOver(color, &bgColor); -+ sMozFieldBackground = GDK_RGBA_TO_NS_RGBA(bgColor); - gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); - sMozFieldText = GDK_RGBA_TO_NS_RGBA(color); + // |size| is now pixels -@@ -1327,26 +1327,34 @@ nsLookAndFeel::Init() - static_cast(GTK_STATE_FLAG_FOCUSED|GTK_STATE_FLAG_SELECTED), - &color); - sTextSelectedText = GDK_RGBA_TO_NS_RGBA(color); -- gtk_style_context_restore(style); -+ ReleaseStyleContext(style); +@@ -1056,11 +1065,15 @@ nsLookAndFeel::GetFontImpl(FontID aID, n + } -- // Button text, background, border -- style = gtk_widget_get_style_context(label); -- gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); -- sButtonText = GDK_RGBA_TO_NS_RGBA(color); -- gtk_style_context_get_color(style, GTK_STATE_FLAG_PRELIGHT, &color); -- sButtonHoverText = GDK_RGBA_TO_NS_RGBA(color); -+ // Button text color -+ style = ClaimStyleContext(MOZ_GTK_BUTTON); -+ { -+ GtkStyleContext* labelStyle = -+ CreateStyleForWidget(gtk_label_new("M"), style); -+ 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); -+ sButtonHoverText = GDK_RGBA_TO_NS_RGBA(color); -+ g_object_unref(labelStyle); -+ } -+ ReleaseStyleContext(style); + void +-nsLookAndFeel::Init() ++nsLookAndFeel::EnsureInit() + { + GdkColor colorValue; + GdkColor *colorValuePtr; - // Combobox text color -- style = gtk_widget_get_style_context(comboboxLabel); -+ style = ClaimStyleContext(MOZ_GTK_COMBOBOX_ENTRY_TEXTAREA); - gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); - sComboBoxText = GDK_RGBA_TO_NS_RGBA(color); -+ ReleaseStyleContext(style); ++ if (mInitialized) ++ return; ++ mInitialized = true; ++ + #if (MOZ_WIDGET_GTK == 2) + NS_ASSERTION(!mStyle, "already initialized"); + // GtkInvisibles come with a refcount that is not floating +@@ -1133,16 +1146,39 @@ nsLookAndFeel::Init() + // with wrong color theme, see Bug 972382 + GtkSettings *settings = gtk_settings_get_for_screen(gdk_screen_get_default()); + +- // Disable dark theme because it interacts poorly with widget styling in +- // web content (see bug 1216658). ++ // Dark themes interacts poorly with widget styling (see bug 1216658). ++ // We disable dark themes by default for all processes (chrome, web content) ++ // but allow user to overide it by prefs. ++ const gchar* dark_setting = "gtk-application-prefer-dark-theme"; ++ gboolean darkThemeDefault; ++ g_object_get(settings, dark_setting, &darkThemeDefault, nullptr); ++ + // To avoid triggering reload of theme settings unnecessarily, only set the + // setting when necessary. +- const gchar* dark_setting = "gtk-application-prefer-dark-theme"; +- gboolean dark; +- g_object_get(settings, dark_setting, &dark, nullptr); ++ if (darkThemeDefault) { ++ bool allowDarkTheme; ++ if (XRE_IsContentProcess()) { ++ allowDarkTheme = ++ mozilla::Preferences::GetBool("widget.content.allow-gtk-dark-theme", ++ false); ++ } else { ++ allowDarkTheme = (PR_GetEnv("MOZ_ALLOW_GTK_DARK_THEME") != nullptr) || ++ mozilla::Preferences::GetBool("widget.chrome.allow-gtk-dark-theme", ++ false); ++ } ++ if (!allowDarkTheme) { ++ g_object_set(settings, dark_setting, FALSE, nullptr); ++ } ++ } - // Menubar text and hover text colors -- style = gtk_widget_get_style_context(menuBarItem); -+ style = ClaimStyleContext(MOZ_GTK_MENUBARITEM); - gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &color); - sMenuBarText = GDK_RGBA_TO_NS_RGBA(color); - gtk_style_context_get_color(style, GTK_STATE_FLAG_PRELIGHT, &color); - sMenuBarHoverText = GDK_RGBA_TO_NS_RGBA(color); -+ ReleaseStyleContext(style); +- if (dark && !PR_GetEnv("MOZ_ALLOW_GTK_DARK_THEME")) { +- g_object_set(settings, dark_setting, FALSE, nullptr); ++ // Allow content Gtk theme override by pref, it's useful when styled Gtk+ ++ // widgets break web content. ++ if (XRE_IsContentProcess()) { ++ auto contentThemeName = ++ mozilla::Preferences::GetCString("widget.content.gtk-theme-override"); ++ if (!contentThemeName.IsEmpty()) { ++ g_object_set(settings, "gtk-theme-name", contentThemeName.get(), nullptr); ++ } + } - // GTK's guide to fancy odd row background colors: - // 1) Check if a theme explicitly defines an odd row color -@@ -1354,7 +1362,7 @@ nsLookAndFeel::Init() - // slightly by a hardcoded value (gtkstyle.c) - // 3) If neither are defined, take the base background color and - // darken that by a hardcoded value -- style = gtk_widget_get_style_context(treeView); -+ style = ClaimStyleContext(MOZ_GTK_TREEVIEW); + // Scrollbar colors +@@ -1438,6 +1474,7 @@ nsLookAndFeel::Init() + char16_t + nsLookAndFeel::GetPasswordCharacterImpl() + { ++ EnsureInit(); + return sInvisibleCharacter; + } - // Get odd row background color - gtk_style_context_save(style); -@@ -1362,8 +1370,7 @@ nsLookAndFeel::Init() - gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, &color); - sOddCellBackground = GDK_RGBA_TO_NS_RGBA(color); - gtk_style_context_restore(style); -- -- gtk_widget_path_free(path); -+ ReleaseStyleContext(style); +@@ -1445,6 +1482,7 @@ void + nsLookAndFeel::RefreshImpl() + { + nsXPLookAndFeel::RefreshImpl(); ++ moz_gtk_refresh(); - // GtkFrame has a "border" subnode on which Adwaita draws the border. - // Some themes do not draw on this node but draw a border on the widget -@@ -1448,12 +1455,6 @@ nsLookAndFeel::RefreshImpl() - #if (MOZ_WIDGET_GTK == 2) - g_object_unref(mStyle); + mDefaultFontCached = false; + mButtonFontCached = false; +@@ -1456,7 +1494,7 @@ nsLookAndFeel::RefreshImpl() mStyle = nullptr; --#else -- g_object_unref(mBackgroundStyle); -- g_object_unref(mButtonStyle); -- -- mBackgroundStyle = nullptr; -- mButtonStyle = nullptr; #endif - Init(); -diff -up firefox-52.0/widget/gtk/WidgetStyleCache.cpp.widget-rebase firefox-52.0/widget/gtk/WidgetStyleCache.cpp ---- firefox-52.0/widget/gtk/WidgetStyleCache.cpp.widget-rebase 2017-02-27 17:11:05.000000000 +0100 -+++ firefox-52.0/widget/gtk/WidgetStyleCache.cpp 2017-03-10 12:20:30.235205976 +0100 -@@ -434,15 +434,6 @@ CreateScrolledWindowWidget() +- Init(); ++ mInitialized = false; } - static GtkWidget* --CreateTextViewWidget() --{ -- GtkWidget* widget = gtk_text_view_new(); -- gtk_container_add(GTK_CONTAINER(GetWidget(MOZ_GTK_SCROLLED_WINDOW)), -- widget); -- return widget; --} -- --static GtkWidget* - CreateMenuSeparatorWidget() - { - GtkWidget* widget = gtk_separator_menu_item_new(); -@@ -591,8 +582,6 @@ CreateWidget(WidgetNodeType aWidgetType) - return CreateEntryWidget(); - case MOZ_GTK_SCROLLED_WINDOW: - return CreateScrolledWindowWidget(); -- case MOZ_GTK_TEXT_VIEW: -- return CreateTextViewWidget(); - case MOZ_GTK_TREEVIEW: - return CreateTreeViewWidget(); - case MOZ_GTK_TREE_HEADER_CELL: -@@ -744,16 +733,38 @@ GetWidgetRootStyle(WidgetNodeType aNodeT - case MOZ_GTK_MENUITEM: - style = CreateStyleForWidget(gtk_menu_item_new(), MOZ_GTK_MENUPOPUP); - break; -- case MOZ_GTK_IMAGEMENUITEM: -- style = CreateStyleForWidget(gtk_image_menu_item_new(), MOZ_GTK_MENUPOPUP); -- break; -- case MOZ_GTK_CHECKMENUITEM_CONTAINER: -+ case MOZ_GTK_CHECKMENUITEM: - style = CreateStyleForWidget(gtk_check_menu_item_new(), MOZ_GTK_MENUPOPUP); - break; -- case MOZ_GTK_RADIOMENUITEM_CONTAINER: -+ case MOZ_GTK_RADIOMENUITEM: - style = CreateStyleForWidget(gtk_radio_menu_item_new(nullptr), - MOZ_GTK_MENUPOPUP); - break; -+ case MOZ_GTK_TEXT_VIEW: -+ style = CreateStyleForWidget(gtk_text_view_new(), -+ MOZ_GTK_SCROLLED_WINDOW); -+ break; -+ case MOZ_GTK_TOOLTIP: -+ if (gtk_check_version(3, 20, 0) != nullptr) { -+ // The tooltip style class is added first in CreateTooltipWidget() -+ // and transfered to style in CreateStyleForWidget(). -+ GtkWidget* tooltipWindow = CreateTooltipWidget(); -+ style = CreateStyleForWidget(tooltipWindow, nullptr); -+ gtk_widget_destroy(tooltipWindow); // Release GtkWindow self-reference. -+ } else { -+ // We create this from the path because GtkTooltipWindow is not public. -+ style = CreateCSSNode("tooltip", nullptr, GTK_TYPE_TOOLTIP); -+ gtk_style_context_add_class(style, GTK_STYLE_CLASS_BACKGROUND); -+ } -+ break; -+ case MOZ_GTK_TOOLTIP_BOX: -+ style = CreateStyleForWidget(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0), -+ MOZ_GTK_TOOLTIP); -+ break; -+ case MOZ_GTK_TOOLTIP_BOX_LABEL: -+ style = CreateStyleForWidget(gtk_label_new(nullptr), -+ MOZ_GTK_TOOLTIP_BOX); -+ break; - default: - GtkWidget* widget = GetWidget(aNodeType); - MOZ_ASSERT(widget); -@@ -827,13 +838,13 @@ GetCssNodeStyleInternal(WidgetNodeType a - style = CreateChildCSSNode(GTK_STYLE_CLASS_CHECK, - MOZ_GTK_CHECKBUTTON_CONTAINER); - break; -- case MOZ_GTK_RADIOMENUITEM: -+ case MOZ_GTK_RADIOMENUITEM_INDICATOR: - style = CreateChildCSSNode(GTK_STYLE_CLASS_RADIO, -- MOZ_GTK_RADIOMENUITEM_CONTAINER); -+ MOZ_GTK_RADIOMENUITEM); - break; -- case MOZ_GTK_CHECKMENUITEM: -+ case MOZ_GTK_CHECKMENUITEM_INDICATOR: - style = CreateChildCSSNode(GTK_STYLE_CLASS_CHECK, -- MOZ_GTK_CHECKMENUITEM_CONTAINER); -+ MOZ_GTK_CHECKMENUITEM); - break; - case MOZ_GTK_PROGRESS_TROUGH: - /* Progress bar background (trough) */ -@@ -844,11 +855,6 @@ GetCssNodeStyleInternal(WidgetNodeType a - style = CreateChildCSSNode("progress", - MOZ_GTK_PROGRESS_TROUGH); - break; -- case MOZ_GTK_TOOLTIP: -- // We create this from the path because GtkTooltipWindow is not public. -- style = CreateCSSNode("tooltip", nullptr, GTK_TYPE_TOOLTIP); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_BACKGROUND); -- break; - case MOZ_GTK_GRIPPER: - // TODO - create from CSS node - return GetWidgetStyleWithClass(MOZ_GTK_GRIPPER, -@@ -865,10 +871,28 @@ GetCssNodeStyleInternal(WidgetNodeType a - // TODO - create from CSS node - return GetWidgetStyleWithClass(MOZ_GTK_SCROLLED_WINDOW, - GTK_STYLE_CLASS_FRAME); -- case MOZ_GTK_TEXT_VIEW: -- // TODO - create from CSS node -- return GetWidgetStyleWithClass(MOZ_GTK_TEXT_VIEW, -- GTK_STYLE_CLASS_VIEW); -+ case MOZ_GTK_TEXT_VIEW_TEXT: -+ case MOZ_GTK_RESIZER: -+ style = CreateChildCSSNode("text", MOZ_GTK_TEXT_VIEW); -+ if (aNodeType == MOZ_GTK_RESIZER) { -+ // The "grip" class provides the correct builtin icon from -+ // gtk_render_handle(). The icon is drawn with shaded variants of -+ // the background color, and so a transparent background would lead to -+ // a transparent resizer. gtk_render_handle() also uses the -+ // background color to draw a background, and so this style otherwise -+ // matches what is used in GtkTextView to match the background with -+ // textarea elements. -+ GdkRGBA color; -+ gtk_style_context_get_background_color(style, GTK_STATE_FLAG_NORMAL, -+ &color); -+ if (color.alpha == 0.0) { -+ g_object_unref(style); -+ style = CreateStyleForWidget(gtk_text_view_new(), -+ MOZ_GTK_SCROLLED_WINDOW); -+ } -+ gtk_style_context_add_class(style, GTK_STYLE_CLASS_GRIP); -+ } -+ break; - case MOZ_GTK_FRAME_BORDER: - style = CreateChildCSSNode("border", MOZ_GTK_FRAME); - break; -@@ -971,27 +995,20 @@ GetWidgetStyleInternal(WidgetNodeType aN - case MOZ_GTK_CHECKBUTTON: - return GetWidgetStyleWithClass(MOZ_GTK_CHECKBUTTON_CONTAINER, - GTK_STYLE_CLASS_CHECK); -- case MOZ_GTK_RADIOMENUITEM: -- return GetWidgetStyleWithClass(MOZ_GTK_RADIOMENUITEM_CONTAINER, -+ case MOZ_GTK_RADIOMENUITEM_INDICATOR: -+ return GetWidgetStyleWithClass(MOZ_GTK_RADIOMENUITEM, - GTK_STYLE_CLASS_RADIO); -- case MOZ_GTK_CHECKMENUITEM: -- return GetWidgetStyleWithClass(MOZ_GTK_CHECKMENUITEM_CONTAINER, -+ case MOZ_GTK_CHECKMENUITEM_INDICATOR: -+ return GetWidgetStyleWithClass(MOZ_GTK_CHECKMENUITEM, - GTK_STYLE_CLASS_CHECK); - case MOZ_GTK_PROGRESS_TROUGH: - return GetWidgetStyleWithClass(MOZ_GTK_PROGRESSBAR, - GTK_STYLE_CLASS_TROUGH); -- case MOZ_GTK_TOOLTIP: { -- GtkStyleContext* style = sStyleStorage[aNodeType]; -- if (style) -- return style; -- -- // The tooltip style class is added first in CreateTooltipWidget() so -- // that gtk_widget_path_append_for_widget() in CreateStyleForWidget() -- // will find it. -- GtkWidget* tooltipWindow = CreateTooltipWidget(); -- style = CreateStyleForWidget(tooltipWindow, nullptr); -- gtk_widget_destroy(tooltipWindow); // Release GtkWindow self-reference. -- sStyleStorage[aNodeType] = style; -+ case MOZ_GTK_PROGRESS_CHUNK: { -+ GtkStyleContext* style = -+ GetWidgetStyleWithClass(MOZ_GTK_PROGRESSBAR, -+ GTK_STYLE_CLASS_PROGRESSBAR); -+ gtk_style_context_remove_class(style, GTK_STYLE_CLASS_TROUGH); - return style; - } - case MOZ_GTK_GRIPPER: -@@ -1006,9 +1023,25 @@ GetWidgetStyleInternal(WidgetNodeType aN - case MOZ_GTK_SCROLLED_WINDOW: - return GetWidgetStyleWithClass(MOZ_GTK_SCROLLED_WINDOW, - GTK_STYLE_CLASS_FRAME); -- case MOZ_GTK_TEXT_VIEW: -- return GetWidgetStyleWithClass(MOZ_GTK_TEXT_VIEW, -- GTK_STYLE_CLASS_VIEW); -+ case MOZ_GTK_TEXT_VIEW_TEXT: -+ case MOZ_GTK_RESIZER: { -+ // GTK versions prior to 3.20 do not have the view class on the root -+ // node, but add this to determine the background for the text window. -+ GtkStyleContext* style = -+ GetWidgetStyleWithClass(MOZ_GTK_TEXT_VIEW, GTK_STYLE_CLASS_VIEW); -+ if (aNodeType == MOZ_GTK_RESIZER) { -+ // The "grip" class provides the correct builtin icon from -+ // gtk_render_handle(). The icon is drawn with shaded variants of -+ // the background color, and so a transparent background would lead to -+ // a transparent resizer. gtk_render_handle() also uses the -+ // background color to draw a background, and so this style otherwise -+ // matches MOZ_GTK_TEXT_VIEW_TEXT to match the background with -+ // textarea elements. GtkTextView creates a separate text window and -+ // so the background should not be transparent. -+ gtk_style_context_add_class(style, GTK_STYLE_CLASS_GRIP); -+ } -+ return style; -+ } - case MOZ_GTK_FRAME_BORDER: - return GetWidgetRootStyle(MOZ_GTK_FRAME); - case MOZ_GTK_TREEVIEW_VIEW: + bool -- cgit