diff options
Diffstat (limited to 'testing/firefox')
-rw-r--r-- | testing/firefox/APKBUILD | 36 | ||||
-rw-r--r-- | testing/firefox/firefox-gtk3-20.patch | 2333 | ||||
-rw-r--r-- | testing/firefox/fix-arm-atomics-grsec.patch | 36 | ||||
-rw-r--r-- | testing/firefox/fix-arm-version-detect.patch | 13 | ||||
-rw-r--r-- | testing/firefox/fix-tools.patch | 16 | ||||
-rw-r--r-- | testing/firefox/musl-pthread-setname.patch | 14 |
6 files changed, 47 insertions, 2401 deletions
diff --git a/testing/firefox/APKBUILD b/testing/firefox/APKBUILD index cc9f5180cc..0cbb87e884 100644 --- a/testing/firefox/APKBUILD +++ b/testing/firefox/APKBUILD @@ -1,10 +1,10 @@ # Contributor: William Pitcock <nenolod@dereferenced.org> # Maintainer: Natanael Copa <ncopa@alpinelinux.org> pkgname=firefox -pkgver=48.0.2 +pkgver=49.0 _pkgver=$pkgver _xulver=$pkgver -pkgrel=1 +pkgrel=0 pkgdesc="Firefox web browser" url="http://www.firefox.com" arch="all !aarch64" @@ -60,12 +60,13 @@ source="https://ftp.mozilla.org/pub/firefox/releases/$pkgver/source/firefox-$pkg fix-toolkit.patch fix-tools.patch mallinfo.patch + musl-pthread-setname.patch fix-fortify-system-wrappers.patch fix-arm-atomics-grsec.patch + fix-arm-version-detect.patch mozilla-build-arm.patch disable-moz-stackwalk.patch - firefox-gtk3-20.patch firefox.desktop firefox-safe.desktop" @@ -98,7 +99,7 @@ build() { export MOZILLA_OFFICIAL=1 export USE_SHORT_LIBNAME=1 # gcc 6 - export CXXFLAGS="-fno-delete-null-pointer-checks -fno-lifetime-dse -fno-schedule-insns2" + export CXXFLAGS="-fno-delete-null-pointer-checks -fno-schedule-insns2" # set rpath so linker finds the libs export LDFLAGS="$LDFLAGS -Wl,-rpath,${_mozappdir}" @@ -218,51 +219,54 @@ dev() { default_dev } -md5sums="bd6410592a8c608c0f771c056351493c firefox-48.0.2.source.tar.xz +md5sums="24f497ae93db299958771ccc93de1a47 firefox-49.0.source.tar.xz 4383d038b8d8411ea46f4a109197c19e stab.h 6ab77b80c8c7d6fd07ab53c54561f4df 0002-Use-C99-math-isfinite.patch f29e0036edc7b3a4158a82fa97bde500 fix-fortify-inline.patch 16b597e346d2172b4dea7b47382017f4 disable-hunspell_hooks.patch aed3b88014fbfbe73db79851e52ca7fa fix-seccomp-bpf.patch d46da3e75dfc3abd38d6191d26fea3f1 fix-toolkit.patch -4ee6ff4b8961315a1b18932abb75a12d fix-tools.patch +bc81fa31947912c661c6a9c592ff1e46 fix-tools.patch 0db0cce8350d59a91ae2c4f0400f7146 mallinfo.patch +44b6255ed6a0bffb8848e549afa642f3 musl-pthread-setname.patch 9aba3811121f113fe547947591802d2b fix-fortify-system-wrappers.patch -b18bd948aae828e5c8f5f63e440c96d6 fix-arm-atomics-grsec.patch +61bd5cee35cb0c0395f43fcf599d0749 fix-arm-atomics-grsec.patch +d209d8fc7c4f06d94e4bda097c0178bf fix-arm-version-detect.patch 308ba5b54116a035fe68d0d5c3974857 mozilla-build-arm.patch 4c7a5a634e53c05d8cc67cbd40a3174e disable-moz-stackwalk.patch -dd5ebfe5142855540bbd2b9164767a9b firefox-gtk3-20.patch ba96924ece1d77453e462429037a2ce5 firefox.desktop 6f38a5899034b7786cb1f75ad42032b8 firefox-safe.desktop" -sha256sums="6efbe0cc8dd120f16ff6d9394d96ea1b13bf6b4163d3b25d4210e06d23ea44b3 firefox-48.0.2.source.tar.xz +sha256sums="6f7069fa94688f9fb5aa3bbb2ffa78456825067dd984afa714d74b3f0c6eaf63 firefox-49.0.source.tar.xz 960d82bbfdc88c95f5cb4f2e1c1bf23dae7519b3b7203914d7b3ddbff1ba4c28 stab.h 080a55182b865471a86fa4b70a66ed9495f1e536f7fdc4060cb8c675b4749c6e 0002-Use-C99-math-isfinite.patch ecf808ef1bc2920f6f7a4786fafb46c74e8a2c3bc628f28f10d6e8e1a265e609 fix-fortify-inline.patch 3325749c2554aa24bb376358153fa2f6ca28809e9db2fa5308620e3689aa24b2 disable-hunspell_hooks.patch 517d95225b3323c373c11da6ab867deb76ffdb0b50c1762bdd893abd9b39d4c9 fix-seccomp-bpf.patch 485297df325002728c15a87077ef6f762fa057265ca8d977c13fa0ffdc4028dd fix-toolkit.patch -6162d1508ab0afa52684ae955fb8a18b14ae9501d32167c9faa75af249e27935 fix-tools.patch +b4caebb908f91f08fc7f23f1326165ede10a0a769290c0898b1b8a5b3a8f88e1 fix-tools.patch 2f564fa5f347f3c7f20d589ef273f000ca9c9aeca2c6ad0fb5b15bfc715d8b81 mallinfo.patch +e0e85f0448fda03e1d29fbf71e094824f2a0ce538c6bf44e09545402f81e7f96 musl-pthread-setname.patch cd19195cb4c316ad9f7d377cd8581218c888863b1bc4d112c97f48a4425fb946 fix-fortify-system-wrappers.patch -ff7cb3c9c4712e0517a6f11e3bf08e9b0d13dbe6384930bdc7f55b1ceed039b5 fix-arm-atomics-grsec.patch +190113423b892b881c9ab044d16087b34f512b636eb759e0f6fec1356836596b fix-arm-atomics-grsec.patch +1c1ca7a60bcb571f3d2894a9b6ced9c57705f7b737e1e64a9cd451f91c2d3705 fix-arm-version-detect.patch 6f5f5e4d2a17182b72b248e896450235ccdaf63252fdb89a8deb55da8adc9be3 mozilla-build-arm.patch d87bbd011ec499f93119223360cd79afc628e5f0d020c4e8f0039627c85017e7 disable-moz-stackwalk.patch -c984c8bda3c173349d98f3fa71ec8ff8e8b74e6ca20a3f39f33596dbb4c4d1e8 firefox-gtk3-20.patch b571c4a49884a3c98806246c9cc3e60c73d5a8f4aeb7f96217db0be1d6210eda firefox.desktop 4b6de45753856a890f4482055666e77f9b01bdfb7e0df08bafaa3a4d9937eed3 firefox-safe.desktop" -sha512sums="d5addb0cd01e2aeb0fd9387800e82e385f3986716887840322d261d772a442f6fdb1d910cd53f2373f0fb82ed0b2a45356ac83f3ef230e14a2b9db8999ad8a4e firefox-48.0.2.source.tar.xz +sha512sums="9431f86dec5587131699ae57ae428be168e4d6c7d1d48df643c10540e8e18bc5eadfcd08bb204950be611c87d35d8a40aa8ece454b7dfa3992239639c2d688a9 firefox-49.0.source.tar.xz 0b3f1e4b9fdc868e4738b5c81fd6c6128ce8885b260affcb9a65ff9d164d7232626ce1291aaea70132b3e3124f5e13fef4d39326b8e7173e362a823722a85127 stab.h 7e123144bc2b1efed149dfb41b255c447d43ea93a63ebe114d01945e6a6d69edc2f2a3c36980a93279106c1842355851b8b6c1d96679ee6be7b9b30513e0b1a8 0002-Use-C99-math-isfinite.patch 09bc32cf9ee81b9cc6bb58ddbc66e6cc5c344badff8de3435cde5848e5a451e0172153231db85c2385ff05b5d9c20760cb18e4138dfc99060a9e960de2befbd5 fix-fortify-inline.patch 0fcc647af53a3ce21c2bc36e5631eb0935e7243ebb3ab59b5719542cc54a6ac023a4a857b43b75756efb9ed80c0aecaa94dc5679a3b3792f82e87bf2c1af82e1 disable-hunspell_hooks.patch 70863b985427b9653ce5e28d6064f078fb6d4ccf43dd1b68e72f97f44868fc0ce063161c39a4e77a0a1a207b7365d5dc7a7ca5e68c726825eba814f2b93e2f5d fix-seccomp-bpf.patch a2925045154f4fd34e5fc056656f4f9da100341529e5d4104d249154db0c7863384083f421ce6e47e0f20566a8b20787fa35444c7933c03cd03f96f06dcd4532 fix-toolkit.patch -bc112a134618ffb8173af6a5c7d8e99500fd70e5773c780fac8175a5859bb0247cfb13fe01d02e0c89a6c272385b85a6139b6c597888752b7bdef1ba5e79b7f9 fix-tools.patch +7d7531a0dbb1b3c2f4cbf155168e750f274dbf19cd767d6395d479ef1626a651e714b41e353465d9d58239dc15256d83eeb1bf06c6adf47c521a0db5ee88bb50 fix-tools.patch bdcd1b402d2ec94957ba5d08cbad7b1a7f59c251c311be9095208491a05abb05a956c79f27908e1f26b54a3679387b2f33a51e945b650671ad85c0a2d59a5a29 mallinfo.patch +3f535b1e4e9a5a0506ef6f6d9427a84fae1efa3c8e8d6b25b21046d2d04c132bde1a7a98e415067e5c542f699d89249b8cc3d925e0be4e96db498037429691ef musl-pthread-setname.patch 2a967e4619fd89a046bd40be7fdcef646fcb1eba5e47afc96aa1d59c25bcc8747cb07baee6c11f3b803db0981aced181534b806778e4d21e74958f5f4d74c784 fix-fortify-system-wrappers.patch -4311464ae52b6d2e2b02c789c6d5fca9b3c211888a983aa609a62c2f2554516fea735ea90673387c69b38a30aa8453ed79faa44b5163df4293880d40df676b2d fix-arm-atomics-grsec.patch +ed0d344c66fc8e1cc83a11e9858b32c42e841cbeedd9eb9438811e9fcc3593dc824a8336d00058d55836cedc970aeadd6a82c6dcd7bc0fb746e564d8b478cc6c fix-arm-atomics-grsec.patch +015e1ff6dbf920033982b5df95d869a0b7bf56c6964e45e50649ddf46d1ce09563458e45240c3ecb92808662b1300b67507f7af272ba184835d91068a9e7d5b0 fix-arm-version-detect.patch e61664bc93eadce5016a06a4d0684b34a05074f1815e88ef2613380d7b369c6fd305fb34f83b5eb18b9e3138273ea8ddcfdcb1084fdcaa922a1e5b30146a3b18 mozilla-build-arm.patch c69cdb2d6c66180d6a67c386b862a5ed953aab4db434b054c9e1e6702bcc56ba219a4cb22747d9c891040a286388168e0cf5ca28a503389cd9708012fddf6c2b disable-moz-stackwalk.patch -161a1151b817d82e14923c8aa0cf31a7c36379f0c2c6b5a8407b804db9fe78d86142911b00e6d232d7ca3b241d6ad6a451d67823484ba9d011cc96ce821c3ce0 firefox-gtk3-20.patch f3b7c3e804ce04731012a46cb9e9a6b0769e3772aef9c0a4a8c7520b030fdf6cd703d5e9ff49275f14b7d738fe82a0a4fde3bc3219dff7225d5db0e274987454 firefox.desktop 5dcb6288d0444a8a471d669bbaf61cdb1433663eff38b72ee5e980843f5fc07d0d60c91627a2c1159215d0ad77ae3f115dcc5fdfe87e64ca704b641aceaa44ed firefox-safe.desktop" diff --git a/testing/firefox/firefox-gtk3-20.patch b/testing/firefox/firefox-gtk3-20.patch deleted file mode 100644 index eccbc5e8d7..0000000000 --- a/testing/firefox/firefox-gtk3-20.patch +++ /dev/null @@ -1,2333 +0,0 @@ -diff -up firefox-48.0/widget/gtk/gtk3drawing.cpp.gtk3-20 firefox-48.0/widget/gtk/gtk3drawing.cpp ---- firefox-48.0/widget/gtk/gtk3drawing.cpp.gtk3-20 2016-07-25 22:22:07.000000000 +0200 -+++ firefox-48.0/widget/gtk/gtk3drawing.cpp 2016-07-29 09:15:11.822285857 +0200 -@@ -18,15 +18,9 @@ - - #include <math.h> - --static GtkWidget* gProtoWindow; - static GtkWidget* gProtoLayout; --static GtkWidget* gButtonWidget; --static GtkWidget* gToggleButtonWidget; --static GtkWidget* gButtonArrowWidget; --static GtkWidget* gSpinWidget; - static GtkWidget* gHScaleWidget; - static GtkWidget* gVScaleWidget; --static GtkWidget* gEntryWidget; - static GtkWidget* gComboBoxWidget; - static GtkWidget* gComboBoxButtonWidget; - static GtkWidget* gComboBoxArrowWidget; -@@ -35,30 +29,15 @@ static GtkWidget* gComboBoxEntryWidget; - static GtkWidget* gComboBoxEntryTextareaWidget; - static GtkWidget* gComboBoxEntryButtonWidget; - static GtkWidget* gComboBoxEntryArrowWidget; --static GtkWidget* gHandleBoxWidget; --static GtkWidget* gToolbarWidget; --static GtkWidget* gFrameWidget; --static GtkWidget* gProgressWidget; - static GtkWidget* gTabWidget; --static GtkWidget* gTextViewWidget; --static GtkWidget* gTooltipWidget; --static GtkWidget* gMenuBarWidget; --static GtkWidget* gMenuBarItemWidget; --static GtkWidget* gMenuPopupWidget; --static GtkWidget* gMenuItemWidget; - static GtkWidget* gImageMenuItemWidget; - static GtkWidget* gCheckMenuItemWidget; - static GtkWidget* gTreeViewWidget; - static GtkTreeViewColumn* gMiddleTreeViewColumn; - static GtkWidget* gTreeHeaderCellWidget; - static GtkWidget* gTreeHeaderSortArrowWidget; --static GtkWidget* gExpanderWidget; --static GtkWidget* gToolbarSeparatorWidget; --static GtkWidget* gMenuSeparatorWidget; - static GtkWidget* gHPanedWidget; - static GtkWidget* gVPanedWidget; --static GtkWidget* gScrolledWindowWidget; --static GtkWidget* gInfoBar; - - static style_prop_t style_prop_func; - static gboolean have_arrow_scaling; -@@ -94,15 +73,6 @@ GetStateFlagsFromGtkWidgetState(GtkWidge - return stateFlags; - } - --/* Because we have such an unconventional way of drawing widgets, signal to the GTK theme engine -- that they are drawing for Mozilla instead of a conventional GTK app so they can do any specific -- things they may want to do. */ --static void --moz_gtk_set_widget_name(GtkWidget* widget) --{ -- gtk_widget_set_name(widget, "MozillaGtkWidget"); --} -- - gint - moz_gtk_enable_style_props(style_prop_t styleGetProp) - { -@@ -111,15 +81,6 @@ moz_gtk_enable_style_props(style_prop_t - } - - static gint --ensure_window_widget() --{ -- if (!gProtoWindow) { -- gProtoWindow = GetWidget(MOZ_GTK_WINDOW); -- } -- return MOZ_GTK_SUCCESS; --} -- --static gint - setup_widget_prototype(GtkWidget* widget) - { - if (!gProtoLayout) { -@@ -130,16 +91,6 @@ setup_widget_prototype(GtkWidget* widget - } - - static gint --ensure_button_widget() --{ -- if (!gButtonWidget) { -- gButtonWidget = gtk_button_new_with_label("M"); -- setup_widget_prototype(gButtonWidget); -- } -- return MOZ_GTK_SUCCESS; --} -- --static gint - ensure_hpaned_widget() - { - if (!gHPanedWidget) { -@@ -160,40 +111,6 @@ ensure_vpaned_widget() - } - - static gint --ensure_toggle_button_widget() --{ -- if (!gToggleButtonWidget) { -- gToggleButtonWidget = gtk_toggle_button_new(); -- setup_widget_prototype(gToggleButtonWidget); -- } -- return MOZ_GTK_SUCCESS; --} -- --static gint --ensure_button_arrow_widget() --{ -- if (!gButtonArrowWidget) { -- ensure_toggle_button_widget(); -- -- gButtonArrowWidget = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_OUT); -- gtk_container_add(GTK_CONTAINER(gToggleButtonWidget), gButtonArrowWidget); -- gtk_widget_realize(gButtonArrowWidget); -- gtk_widget_show(gButtonArrowWidget); -- } -- return MOZ_GTK_SUCCESS; --} -- --static gint --ensure_spin_widget() --{ -- if (!gSpinWidget) { -- gSpinWidget = gtk_spin_button_new(NULL, 1, 0); -- setup_widget_prototype(gSpinWidget); -- } -- return MOZ_GTK_SUCCESS; --} -- --static gint - ensure_scale_widget() - { - if (!gHScaleWidget) { -@@ -207,16 +124,6 @@ ensure_scale_widget() - return MOZ_GTK_SUCCESS; - } - --static gint --ensure_entry_widget() --{ -- if (!gEntryWidget) { -- gEntryWidget = gtk_entry_new(); -- setup_widget_prototype(gEntryWidget); -- } -- return MOZ_GTK_SUCCESS; --} -- - /* We need to have pointers to the inner widgets (button, separator, arrow) - * of the ComboBox to get the correct rendering from theme engines which - * special cases their look. Since the inner layout can change, we ask GTK -@@ -225,7 +132,7 @@ ensure_entry_widget() - * g_object_add_weak_pointer(). - * Note that if we don't find the inner widgets (which shouldn't happen), we - * fallback to use generic "non-inner" widgets, and they don't need that kind -- * of weak pointer since they are explicit children of gProtoWindow and as -+ * of weak pointer since they are explicit children of gProtoLayout and as - * such GTK holds a strong reference to them. */ - static void - moz_gtk_get_combo_box_inner_button(GtkWidget *widget, gpointer client_data) -@@ -297,16 +204,14 @@ ensure_combo_box_widgets() - /* Shouldn't be reached with current internal gtk implementation; we - * use a generic toggle button as last resort fallback to avoid - * crashing. */ -- ensure_toggle_button_widget(); -- gComboBoxButtonWidget = gToggleButtonWidget; -+ gComboBoxButtonWidget = GetWidget(MOZ_GTK_TOGGLE_BUTTON); - } - - if (!gComboBoxArrowWidget) { - /* Shouldn't be reached with current internal gtk implementation; - * we gButtonArrowWidget as last resort fallback to avoid - * crashing. */ -- ensure_button_arrow_widget(); -- gComboBoxArrowWidget = gButtonArrowWidget; -+ gComboBoxArrowWidget = GetWidget(MOZ_GTK_BUTTON_ARROW); - } - - /* We don't test the validity of gComboBoxSeparatorWidget since there -@@ -316,15 +221,6 @@ ensure_combo_box_widgets() - return MOZ_GTK_SUCCESS; - } - --static void --ensure_info_bar() --{ -- if (!gInfoBar) { -- gInfoBar = gtk_info_bar_new(); -- setup_widget_prototype(gInfoBar); -- } --} -- - /* We need to have pointers to the inner widgets (entry, button, arrow) of - * the ComboBoxEntry to get the correct rendering from theme engines which - * special cases their look. Since the inner layout can change, we ask GTK -@@ -333,7 +229,7 @@ ensure_info_bar() - * g_object_add_weak_pointer(). - * Note that if we don't find the inner widgets (which shouldn't happen), we - * fallback to use generic "non-inner" widgets, and they don't need that kind -- * of weak pointer since they are explicit children of gProtoWindow and as -+ * of weak pointer since they are explicit children of gProtoLayout and as - * such GTK holds a strong reference to them. */ - static void - moz_gtk_get_combo_box_entry_inner_widgets(GtkWidget *widget, -@@ -385,8 +281,7 @@ ensure_combo_box_entry_widgets() - NULL); - - if (!gComboBoxEntryTextareaWidget) { -- ensure_entry_widget(); -- gComboBoxEntryTextareaWidget = gEntryWidget; -+ gComboBoxEntryTextareaWidget = GetWidget(MOZ_GTK_ENTRY); - } - - if (gComboBoxEntryButtonWidget) { -@@ -412,68 +307,19 @@ ensure_combo_box_entry_widgets() - /* Shouldn't be reached with current internal gtk implementation; - * we use a generic toggle button as last resort fallback to avoid - * crashing. */ -- ensure_toggle_button_widget(); -- gComboBoxEntryButtonWidget = gToggleButtonWidget; -+ gComboBoxEntryButtonWidget = GetWidget(MOZ_GTK_TOGGLE_BUTTON); - } - - if (!gComboBoxEntryArrowWidget) { - /* Shouldn't be reached with current internal gtk implementation; - * we gButtonArrowWidget as last resort fallback to avoid - * crashing. */ -- ensure_button_arrow_widget(); -- gComboBoxEntryArrowWidget = gButtonArrowWidget; -+ gComboBoxEntryArrowWidget = GetWidget(MOZ_GTK_BUTTON_ARROW); - } - - return MOZ_GTK_SUCCESS; - } - -- --static gint --ensure_handlebox_widget() --{ -- if (!gHandleBoxWidget) { -- gHandleBoxWidget = gtk_handle_box_new(); -- setup_widget_prototype(gHandleBoxWidget); -- } -- return MOZ_GTK_SUCCESS; --} -- --static gint --ensure_toolbar_widget() --{ -- if (!gToolbarWidget) { -- ensure_handlebox_widget(); -- gToolbarWidget = gtk_toolbar_new(); -- gtk_container_add(GTK_CONTAINER(gHandleBoxWidget), gToolbarWidget); -- gtk_widget_realize(gToolbarWidget); -- } -- return MOZ_GTK_SUCCESS; --} -- --static gint --ensure_toolbar_separator_widget() --{ -- if (!gToolbarSeparatorWidget) { -- ensure_toolbar_widget(); -- gToolbarSeparatorWidget = GTK_WIDGET(gtk_separator_tool_item_new()); -- setup_widget_prototype(gToolbarSeparatorWidget); -- } -- return MOZ_GTK_SUCCESS; --} -- --static gint --ensure_tooltip_widget() --{ -- if (!gTooltipWidget) { -- gTooltipWidget = gtk_window_new(GTK_WINDOW_POPUP); -- GtkStyleContext* style = gtk_widget_get_style_context(gTooltipWidget); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_TOOLTIP); -- gtk_widget_realize(gTooltipWidget); -- moz_gtk_set_widget_name(gTooltipWidget); -- } -- return MOZ_GTK_SUCCESS; --} -- - static gint - ensure_tab_widget() - { -@@ -485,81 +331,11 @@ ensure_tab_widget() - } - - static gint --ensure_progress_widget() --{ -- if (!gProgressWidget) { -- gProgressWidget = gtk_progress_bar_new(); -- setup_widget_prototype(gProgressWidget); -- } -- return MOZ_GTK_SUCCESS; --} -- --static gint --ensure_frame_widget() --{ -- if (!gFrameWidget) { -- gFrameWidget = gtk_frame_new(NULL); -- setup_widget_prototype(gFrameWidget); -- } -- return MOZ_GTK_SUCCESS; --} -- --static gint --ensure_menu_bar_widget() --{ -- if (!gMenuBarWidget) { -- gMenuBarWidget = gtk_menu_bar_new(); -- setup_widget_prototype(gMenuBarWidget); -- } -- return MOZ_GTK_SUCCESS; --} -- --static gint --ensure_menu_bar_item_widget() --{ -- if (!gMenuBarItemWidget) { -- ensure_menu_bar_widget(); -- gMenuBarItemWidget = gtk_menu_item_new(); -- gtk_menu_shell_append(GTK_MENU_SHELL(gMenuBarWidget), -- gMenuBarItemWidget); -- gtk_widget_realize(gMenuBarItemWidget); -- } -- return MOZ_GTK_SUCCESS; --} -- --static gint --ensure_menu_popup_widget() --{ -- if (!gMenuPopupWidget) { -- ensure_window_widget(); -- gMenuPopupWidget = gtk_menu_new(); -- gtk_menu_attach_to_widget(GTK_MENU(gMenuPopupWidget), gProtoWindow, -- NULL); -- gtk_widget_realize(gMenuPopupWidget); -- } -- return MOZ_GTK_SUCCESS; --} -- --static gint --ensure_menu_item_widget() --{ -- if (!gMenuItemWidget) { -- ensure_menu_popup_widget(); -- gMenuItemWidget = gtk_menu_item_new_with_label("M"); -- gtk_menu_shell_append(GTK_MENU_SHELL(gMenuPopupWidget), -- gMenuItemWidget); -- gtk_widget_realize(gMenuItemWidget); -- } -- return MOZ_GTK_SUCCESS; --} -- --static gint - ensure_image_menu_item_widget() - { - if (!gImageMenuItemWidget) { -- ensure_menu_popup_widget(); - gImageMenuItemWidget = gtk_image_menu_item_new(); -- gtk_menu_shell_append(GTK_MENU_SHELL(gMenuPopupWidget), -+ gtk_menu_shell_append(GTK_MENU_SHELL(GetWidget(MOZ_GTK_MENUPOPUP)), - gImageMenuItemWidget); - gtk_widget_realize(gImageMenuItemWidget); - } -@@ -567,25 +343,11 @@ ensure_image_menu_item_widget() - } - - static gint --ensure_menu_separator_widget() --{ -- if (!gMenuSeparatorWidget) { -- ensure_menu_popup_widget(); -- gMenuSeparatorWidget = gtk_separator_menu_item_new(); -- gtk_menu_shell_append(GTK_MENU_SHELL(gMenuPopupWidget), -- gMenuSeparatorWidget); -- gtk_widget_realize(gMenuSeparatorWidget); -- } -- return MOZ_GTK_SUCCESS; --} -- --static gint - ensure_check_menu_item_widget() - { - if (!gCheckMenuItemWidget) { -- ensure_menu_popup_widget(); -- gCheckMenuItemWidget = gtk_check_menu_item_new_with_label("M"); -- gtk_menu_shell_append(GTK_MENU_SHELL(gMenuPopupWidget), -+ gCheckMenuItemWidget = gtk_check_menu_item_new(); -+ gtk_menu_shell_append(GTK_MENU_SHELL(GetWidget(MOZ_GTK_MENUPOPUP)), - gCheckMenuItemWidget); - gtk_widget_realize(gCheckMenuItemWidget); - } -@@ -646,37 +408,6 @@ ensure_tree_header_cell_widget() - return MOZ_GTK_SUCCESS; - } - --static gint --ensure_expander_widget() --{ -- if (!gExpanderWidget) { -- gExpanderWidget = gtk_expander_new("M"); -- setup_widget_prototype(gExpanderWidget); -- } -- return MOZ_GTK_SUCCESS; --} -- --static gint --ensure_scrolled_window_widget() --{ -- if (!gScrolledWindowWidget) { -- gScrolledWindowWidget = gtk_scrolled_window_new(NULL, NULL); -- setup_widget_prototype(gScrolledWindowWidget); -- } -- return MOZ_GTK_SUCCESS; --} -- --static void --ensure_text_view_widget() --{ -- if (gTextViewWidget) -- return; -- -- gTextViewWidget = gtk_text_view_new(); -- ensure_scrolled_window_widget(); -- gtk_container_add(GTK_CONTAINER(gScrolledWindowWidget), gTextViewWidget); --} -- - gint - moz_gtk_init() - { -@@ -729,26 +460,21 @@ moz_gtk_get_focus_outline_size(gint* foc - { - GtkBorder border; - GtkBorder padding; -- GtkStyleContext *style; -- -- ensure_entry_widget(); -- style = gtk_widget_get_style_context(gEntryWidget); -- -+ GtkStyleContext *style = ClaimStyleContext(MOZ_GTK_ENTRY); - gtk_style_context_get_border(style, GTK_STATE_FLAG_NORMAL, &border); - gtk_style_context_get_padding(style, GTK_STATE_FLAG_NORMAL, &padding); - *focus_h_width = border.left + padding.left; - *focus_v_width = border.top + padding.top; -+ ReleaseStyleContext(style); - return MOZ_GTK_SUCCESS; - } - - gint - moz_gtk_menuitem_get_horizontal_padding(gint* horizontal_padding) - { -- ensure_menu_item_widget(); -- -- gtk_style_context_get_style(gtk_widget_get_style_context(gMenuItemWidget), -- "horizontal-padding", horizontal_padding, -- NULL); -+ gtk_widget_style_get(GetWidget(MOZ_GTK_MENUITEM), -+ "horizontal-padding", horizontal_padding, -+ nullptr); - - return MOZ_GTK_SUCCESS; - } -@@ -771,10 +497,11 @@ moz_gtk_button_get_default_overflow(gint - { - GtkBorder* default_outside_border; - -- ensure_button_widget(); -- gtk_style_context_get_style(gtk_widget_get_style_context(gButtonWidget), -+ GtkStyleContext *style = ClaimStyleContext(MOZ_GTK_BUTTON); -+ gtk_style_context_get_style(style, - "default-outside-border", &default_outside_border, - NULL); -+ ReleaseStyleContext(style); - - if (default_outside_border) { - *border_top = default_outside_border->top; -@@ -794,10 +521,11 @@ moz_gtk_button_get_default_border(gint* - { - GtkBorder* default_border; - -- ensure_button_widget(); -- gtk_style_context_get_style(gtk_widget_get_style_context(gButtonWidget), -+ GtkStyleContext *style = ClaimStyleContext(MOZ_GTK_BUTTON); -+ gtk_style_context_get_style(style, - "default-border", &default_border, - NULL); -+ ReleaseStyleContext(style); - - if (default_border) { - *border_top = default_border->top; -@@ -831,17 +559,15 @@ static gint - moz_gtk_window_paint(cairo_t *cr, GdkRectangle* rect, - GtkTextDirection direction) - { -- GtkStyleContext* style; -- -- ensure_window_widget(); -- gtk_widget_set_direction(gProtoWindow, direction); -+ GtkStyleContext* style = ClaimStyleContext(MOZ_GTK_WINDOW, direction); - -- style = gtk_widget_get_style_context(gProtoWindow); - gtk_style_context_save(style); - gtk_style_context_add_class(style, GTK_STYLE_CLASS_BACKGROUND); - gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height); - gtk_style_context_restore(style); - -+ ReleaseStyleContext(style); -+ - return MOZ_GTK_SUCCESS; - } - -@@ -1118,6 +844,36 @@ moz_gtk_scrollbar_button_paint(cairo_t * - return MOZ_GTK_SUCCESS; - } - -+static void -+moz_gtk_update_scrollbar_style(GtkStyleContext* style, -+ WidgetNodeType widget, -+ GtkTextDirection direction) -+{ -+ if (widget == MOZ_GTK_SCROLLBAR_HORIZONTAL) { -+ gtk_style_context_add_class(style, GTK_STYLE_CLASS_BOTTOM); -+ } else { -+ if (direction == GTK_TEXT_DIR_LTR) { -+ gtk_style_context_add_class(style, GTK_STYLE_CLASS_RIGHT); -+ gtk_style_context_remove_class(style, GTK_STYLE_CLASS_LEFT); -+ } else { -+ gtk_style_context_add_class(style, GTK_STYLE_CLASS_LEFT); -+ gtk_style_context_remove_class(style, GTK_STYLE_CLASS_RIGHT); -+ } -+ } -+} -+ -+static void -+moz_gtk_draw_styled_frame(GtkStyleContext* style, cairo_t *cr, -+ GdkRectangle* rect, bool drawFocus) -+{ -+ 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); -+ if (drawFocus) { -+ gtk_render_focus(style, cr, -+ rect->x, rect->y, rect->width, rect->height); -+ } -+} -+ - static gint - moz_gtk_scrollbar_trough_paint(WidgetNodeType widget, - cairo_t *cr, GdkRectangle* rect, -@@ -1126,26 +882,34 @@ moz_gtk_scrollbar_trough_paint(WidgetNod - GtkTextDirection direction) - { - if (flags & MOZ_GTK_TRACK_OPAQUE) { -- GtkStyleContext* style = -- gtk_widget_get_style_context(GTK_WIDGET(gProtoWindow)); -- gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height); -+ GtkStyleContext* style = ClaimStyleContext(MOZ_GTK_WINDOW, direction); -+ gtk_render_background(style, cr, -+ rect->x, rect->y, rect->width, rect->height); -+ ReleaseStyleContext(style); - } - -- GtkStyleContext* style = -- ClaimStyleContext(widget == MOZ_GTK_SCROLLBAR_HORIZONTAL ? -- MOZ_GTK_SCROLLBAR_TROUGH_HORIZONTAL : -- MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL, -- direction); -- // TODO - integate with ClaimStyleContext()? -- gtk_style_context_set_direction(style, direction); -+ bool isHorizontal = (widget == MOZ_GTK_SCROLLBAR_HORIZONTAL); -+ GtkStyleContext* style; - -- 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); -+ // Draw all child CSS Nodes for Gtk >= 3.20 -+ if (gtk_check_version(3, 20, 0) == nullptr) { -+ style = ClaimStyleContext(widget, direction); -+ moz_gtk_update_scrollbar_style(style, widget, direction); -+ moz_gtk_draw_styled_frame(style, cr, rect, state->focused); -+ ReleaseStyleContext(style); - -- if (state->focused) { -- gtk_render_focus(style, cr, -- rect->x, rect->y, rect->width, rect->height); -+ style = ClaimStyleContext(isHorizontal ? -+ MOZ_GTK_SCROLLBAR_CONTENTS_HORIZONTAL : -+ MOZ_GTK_SCROLLBAR_CONTENTS_VERTICAL, -+ direction); -+ moz_gtk_draw_styled_frame(style, cr, rect, state->focused); -+ ReleaseStyleContext(style); - } -+ style = ClaimStyleContext(isHorizontal ? -+ MOZ_GTK_SCROLLBAR_TROUGH_HORIZONTAL : -+ MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL, -+ direction); -+ moz_gtk_draw_styled_frame(style, cr, rect, state->focused); - ReleaseStyleContext(style); - - return MOZ_GTK_SUCCESS; -@@ -1160,12 +924,7 @@ moz_gtk_scrollbar_thumb_paint(WidgetNode - GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state); - GtkBorder margin; - -- GtkStyleContext* style = ClaimStyleContext(widget, direction); -- -- // TODO - integate those with ClaimStyleContext()? -- gtk_style_context_set_state(style, state_flags); -- gtk_style_context_set_direction(style, direction); -- -+ GtkStyleContext* style = ClaimStyleContext(widget, direction, state_flags); - gtk_style_context_get_margin (style, state_flags, &margin); - - gtk_render_slider(style, cr, -@@ -1185,17 +944,10 @@ static gint - moz_gtk_spin_paint(cairo_t *cr, GdkRectangle* rect, - GtkTextDirection direction) - { -- GtkStyleContext* style; -- -- ensure_spin_widget(); -- gtk_widget_set_direction(gSpinWidget, direction); -- style = gtk_widget_get_style_context(gSpinWidget); -- gtk_style_context_save(style); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_SPINBUTTON); -+ GtkStyleContext* style = ClaimStyleContext(MOZ_GTK_SPINBUTTON, direction); - 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); -- gtk_style_context_restore(style); -- -+ ReleaseStyleContext(style); - return MOZ_GTK_SUCCESS; - } - -@@ -1204,21 +956,14 @@ moz_gtk_spin_updown_paint(cairo_t *cr, G - gboolean isDown, GtkWidgetState* state, - GtkTextDirection direction) - { -- GdkRectangle arrow_rect; -- GtkStyleContext* style; -- -- ensure_spin_widget(); -- style = gtk_widget_get_style_context(gSpinWidget); -- gtk_style_context_save(style); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_SPINBUTTON); -- gtk_style_context_set_state(style, GetStateFlagsFromGtkWidgetState(state)); -- gtk_widget_set_direction(gSpinWidget, direction); -+ GtkStyleContext* style = ClaimStyleContext(MOZ_GTK_SPINBUTTON, direction, -+ GetStateFlagsFromGtkWidgetState(state)); - - 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); - -- - /* hard code these values */ -+ GdkRectangle arrow_rect; - arrow_rect.width = 6; - arrow_rect.height = 6; - arrow_rect.x = rect->x + (rect->width - arrow_rect.width) / 2; -@@ -1229,7 +974,8 @@ moz_gtk_spin_updown_paint(cairo_t *cr, G - isDown ? ARROW_DOWN : ARROW_UP, - arrow_rect.x, arrow_rect.y, - arrow_rect.width); -- gtk_style_context_restore(style); -+ -+ ReleaseStyleContext(style); - return MOZ_GTK_SUCCESS; - } - -@@ -1295,8 +1041,8 @@ moz_gtk_scale_thumb_paint(cairo_t *cr, G - gtk_widget_set_direction(widget, direction); - - style = gtk_widget_get_style_context(widget); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_SLIDER); - gtk_style_context_save(style); -+ gtk_style_context_add_class(style, GTK_STYLE_CLASS_SLIDER); - gtk_style_context_set_state(style, state_flags); - /* determine the thumb size, and position the thumb in the center in the opposite axis - */ -@@ -1321,20 +1067,12 @@ moz_gtk_gripper_paint(cairo_t *cr, GdkRe - GtkWidgetState* state, - GtkTextDirection direction) - { -- GtkStyleContext* style; -- -- ensure_handlebox_widget(); -- gtk_widget_set_direction(gHandleBoxWidget, direction); -- -- style = gtk_widget_get_style_context(gHandleBoxWidget); -- gtk_style_context_save(style); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_GRIP); -- gtk_style_context_set_state(style, GetStateFlagsFromGtkWidgetState(state)); -- -+ GtkStyleContext* style = -+ ClaimStyleContext(MOZ_GTK_GRIPPER, direction, -+ GetStateFlagsFromGtkWidgetState(state)); - 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); -- gtk_style_context_restore(style); -- -+ ReleaseStyleContext(style); - return MOZ_GTK_SUCCESS; - } - -@@ -1435,6 +1173,38 @@ moz_gtk_entry_paint(cairo_t *cr, GdkRect - return MOZ_GTK_SUCCESS; - } - -+static gint -+moz_gtk_text_view_paint(cairo_t *cr, GdkRectangle* rect, -+ GtkWidgetState* state, -+ GtkTextDirection direction) -+{ -+ GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state); -+ -+ 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); -+ -+ 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); -+ -+ ReleaseStyleContext(style); -+ -+ return MOZ_GTK_SUCCESS; -+} -+ - static gint - moz_gtk_treeview_paint(cairo_t *cr, GdkRectangle* rect, - GtkWidgetState* state, -@@ -1447,18 +1217,13 @@ moz_gtk_treeview_paint(cairo_t *cr, GdkR - GtkBorder border; - - ensure_tree_view_widget(); -- ensure_scrolled_window_widget(); -- - gtk_widget_set_direction(gTreeViewWidget, direction); -- gtk_widget_set_direction(gScrolledWindowWidget, direction); - - /* only handle disabled and normal states, otherwise the whole background - * area will be painted differently with other states */ - state_flags = state->disabled ? GTK_STATE_FLAG_INSENSITIVE : GTK_STATE_FLAG_NORMAL; - -- style = gtk_widget_get_style_context(gScrolledWindowWidget); -- gtk_style_context_save(style); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_FRAME); -+ style = ClaimStyleContext(MOZ_GTK_SCROLLED_WINDOW, direction); - gtk_style_context_get_border(style, state_flags, &border); - xthickness = border.left; - ythickness = border.top; -@@ -1473,7 +1238,7 @@ moz_gtk_treeview_paint(cairo_t *cr, GdkR - rect->height - 2 * ythickness); - gtk_render_frame(style, cr, - rect->x, rect->y, rect->width, rect->height); -- gtk_style_context_restore(style); -+ ReleaseStyleContext(style); - gtk_style_context_restore(style_tree); - return MOZ_GTK_SUCCESS; - } -@@ -1648,20 +1413,9 @@ moz_gtk_arrow_paint(cairo_t *cr, GdkRect - GtkWidgetState* state, - GtkArrowType arrow_type, GtkTextDirection direction) - { -- GtkStyleContext* style; -- GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state); - GdkRectangle arrow_rect; - gdouble arrow_angle; - -- ensure_button_arrow_widget(); -- style = gtk_widget_get_style_context(gButtonArrowWidget); -- gtk_style_context_save(style); -- gtk_style_context_set_state(style, state_flags); -- gtk_widget_set_direction(gButtonArrowWidget, direction); -- -- calculate_arrow_rect(gButtonArrowWidget, rect, &arrow_rect, -- direction); -- - if (direction == GTK_TEXT_DIR_RTL) { - arrow_type = (arrow_type == GTK_ARROW_LEFT) ? - GTK_ARROW_RIGHT : GTK_ARROW_LEFT; -@@ -1680,10 +1434,17 @@ moz_gtk_arrow_paint(cairo_t *cr, GdkRect - arrow_angle = ARROW_UP; - break; - } -- if (arrow_type != GTK_ARROW_NONE) -- gtk_render_arrow(style, cr, arrow_angle, -- arrow_rect.x, arrow_rect.y, arrow_rect.width); -- gtk_style_context_restore(style); -+ if (arrow_type == GTK_ARROW_NONE) -+ return MOZ_GTK_SUCCESS; -+ -+ calculate_arrow_rect(GetWidget(MOZ_GTK_BUTTON_ARROW), rect, &arrow_rect, -+ direction); -+ GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state); -+ GtkStyleContext* style = ClaimStyleContext(MOZ_GTK_BUTTON_ARROW, -+ direction, state_flags); -+ gtk_render_arrow(style, cr, arrow_angle, -+ arrow_rect.x, arrow_rect.y, arrow_rect.width); -+ ReleaseStyleContext(style); - return MOZ_GTK_SUCCESS; - } - -@@ -1776,19 +1537,10 @@ static gint - moz_gtk_toolbar_paint(cairo_t *cr, GdkRectangle* rect, - GtkTextDirection direction) - { -- GtkStyleContext* style; -- -- ensure_toolbar_widget(); -- gtk_widget_set_direction(gToolbarWidget, direction); -- -- style = gtk_widget_get_style_context(gToolbarWidget); -- gtk_style_context_save(style); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_TOOLBAR); -- -+ GtkStyleContext* style = ClaimStyleContext(MOZ_GTK_TOOLBAR, direction); - 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); -- gtk_style_context_restore(style); -- -+ ReleaseStyleContext(style); - return MOZ_GTK_SUCCESS; - } - -@@ -1798,7 +1550,6 @@ static gint - moz_gtk_toolbar_separator_paint(cairo_t *cr, GdkRectangle* rect, - GtkTextDirection direction) - { -- GtkStyleContext* style; - gint separator_width; - gint paint_width; - gboolean wide_separators; -@@ -1807,16 +1558,14 @@ moz_gtk_toolbar_separator_paint(cairo_t - const double start_fraction = 0.2; - const double end_fraction = 0.8; - -- ensure_toolbar_separator_widget(); -- gtk_widget_set_direction(gToolbarSeparatorWidget, direction); -- -- style = gtk_widget_get_style_context(gToolbarSeparatorWidget); -- -- gtk_style_context_get_style(gtk_widget_get_style_context(gToolbarWidget), -+ GtkStyleContext* style = ClaimStyleContext(MOZ_GTK_TOOLBAR); -+ gtk_style_context_get_style(style, - "wide-separators", &wide_separators, - "separator-width", &separator_width, - NULL); -+ ReleaseStyleContext(style); - -+ style = ClaimStyleContext(MOZ_GTK_TOOLBAR_SEPARATOR, direction); - if (wide_separators) { - if (separator_width > rect->width) - separator_width = rect->width; -@@ -1840,7 +1589,7 @@ moz_gtk_toolbar_separator_paint(cairo_t - rect->x + (rect->width - paint_width) / 2, - rect->y + rect->height * end_fraction); - } -- -+ ReleaseStyleContext(style); - return MOZ_GTK_SUCCESS; - } - -@@ -1848,14 +1597,10 @@ static gint - moz_gtk_tooltip_paint(cairo_t *cr, GdkRectangle* rect, - GtkTextDirection direction) - { -- GtkStyleContext* style; -- -- ensure_tooltip_widget(); -- gtk_widget_set_direction(gTooltipWidget, direction); -- -- style = gtk_widget_get_style_context(gTooltipWidget); -+ GtkStyleContext* style = ClaimStyleContext(MOZ_GTK_TOOLTIP, direction); - 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); - return MOZ_GTK_SUCCESS; - } - -@@ -1870,14 +1615,11 @@ moz_gtk_resizer_paint(cairo_t *cr, GdkRe - // 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. -- ensure_text_view_widget(); -- gtk_widget_set_direction(gTextViewWidget, GTK_TEXT_DIR_LTR); -- -- style = gtk_widget_get_style_context(gTextViewWidget); -- gtk_style_context_save(style); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_VIEW); -+ 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); -- gtk_style_context_set_state(style, GetStateFlagsFromGtkWidgetState(state)); - - // Workaround unico not respecting the text direction for resizers. - // See bug 1174248. -@@ -1891,7 +1633,7 @@ moz_gtk_resizer_paint(cairo_t *cr, GdkRe - - gtk_render_handle(style, cr, rect->x, rect->y, rect->width, rect->height); - cairo_restore(cr); -- gtk_style_context_restore(style); -+ ReleaseStyleContext(style); - - return MOZ_GTK_SUCCESS; - } -@@ -1900,16 +1642,9 @@ static gint - moz_gtk_frame_paint(cairo_t *cr, GdkRectangle* rect, - GtkTextDirection direction) - { -- GtkStyleContext* style; -- -- ensure_frame_widget(); -- gtk_widget_set_direction(gFrameWidget, direction); -- style = gtk_widget_get_style_context(gFrameWidget); -- gtk_style_context_save(style); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_FRAME); -- -+ GtkStyleContext* style = ClaimStyleContext(MOZ_GTK_FRAME, direction); - gtk_render_frame(style, cr, rect->x, rect->y, rect->width, rect->height); -- gtk_style_context_restore(style); -+ ReleaseStyleContext(style); - return MOZ_GTK_SUCCESS; - } - -@@ -1917,18 +1652,11 @@ static gint - moz_gtk_progressbar_paint(cairo_t *cr, GdkRectangle* rect, - GtkTextDirection direction) - { -- GtkStyleContext* style; -- -- ensure_progress_widget(); -- gtk_widget_set_direction(gProgressWidget, direction); -- -- style = gtk_widget_get_style_context(gProgressWidget); -- gtk_style_context_save(style); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_TROUGH); -- -+ GtkStyleContext* style = ClaimStyleContext(MOZ_GTK_PROGRESS_TROUGH, -+ direction); - 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); -- gtk_style_context_restore(style); -+ ReleaseStyleContext(style); - - return MOZ_GTK_SUCCESS; - } -@@ -1940,13 +1668,15 @@ moz_gtk_progress_chunk_paint(cairo_t *cr - { - GtkStyleContext* style; - -- ensure_progress_widget(); -- gtk_widget_set_direction(gProgressWidget, direction); -- -- style = gtk_widget_get_style_context(gProgressWidget); -- gtk_style_context_save(style); -- gtk_style_context_remove_class(style, GTK_STYLE_CLASS_TROUGH); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_PROGRESSBAR); -+ 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); -+ } - - if (widget == MOZ_GTK_PROGRESS_CHUNK_INDETERMINATE || - widget == MOZ_GTK_PROGRESS_CHUNK_VERTICAL_INDETERMINATE) { -@@ -1990,7 +1720,7 @@ moz_gtk_progress_chunk_paint(cairo_t *cr - } else { - gtk_render_activity(style, cr, rect->x, rect->y, rect->width, rect->height); - } -- gtk_style_context_restore(style); -+ ReleaseStyleContext(style); - - return MOZ_GTK_SUCCESS; - } -@@ -2324,10 +2054,10 @@ moz_gtk_menu_bar_paint(cairo_t *cr, GdkR - { - GtkStyleContext* style; - -- ensure_menu_bar_widget(); -- gtk_widget_set_direction(gMenuBarWidget, direction); -+ GtkWidget* widget = GetWidget(MOZ_GTK_MENUBAR); -+ gtk_widget_set_direction(widget, direction); - -- style = gtk_widget_get_style_context(gMenuBarWidget); -+ style = gtk_widget_get_style_context(widget); - gtk_style_context_save(style); - gtk_style_context_add_class(style, GTK_STYLE_CLASS_MENUBAR); - gtk_render_background(style, cr, rect->x, rect->y, rect->width, rect->height); -@@ -2343,14 +2073,14 @@ moz_gtk_menu_popup_paint(cairo_t *cr, Gd - { - GtkStyleContext* style; - -- ensure_menu_popup_widget(); -- gtk_widget_set_direction(gMenuPopupWidget, direction); -+ GtkWidget* widget = GetWidget(MOZ_GTK_MENUPOPUP); -+ gtk_widget_set_direction(widget, direction); - - // Draw a backing toplevel. This fixes themes that don't provide a menu - // background, and depend on the GtkMenu's implementation window to provide it. - moz_gtk_window_paint(cr, rect, direction); - -- style = gtk_widget_get_style_context(gMenuPopupWidget); -+ style = gtk_widget_get_style_context(widget); - gtk_style_context_save(style); - gtk_style_context_add_class(style, GTK_STYLE_CLASS_MENU); - -@@ -2373,12 +2103,10 @@ moz_gtk_menu_separator_paint(cairo_t *cr - gint x, y, w; - GtkBorder padding; - -- ensure_menu_separator_widget(); -- gtk_widget_set_direction(gMenuSeparatorWidget, direction); -- -- border_width = gtk_container_get_border_width(GTK_CONTAINER(gMenuSeparatorWidget)); -- -- style = gtk_widget_get_style_context(gMenuSeparatorWidget); -+ border_width = -+ gtk_container_get_border_width(GTK_CONTAINER( -+ GetWidget(MOZ_GTK_MENUSEPARATOR))); -+ style = ClaimStyleContext(MOZ_GTK_MENUSEPARATOR, direction); - gtk_style_context_get_padding(style, GTK_STATE_FLAG_NORMAL, &padding); - - x = rect->x + border_width; -@@ -2408,42 +2136,36 @@ moz_gtk_menu_separator_paint(cairo_t *cr - } - - gtk_style_context_restore(style); -+ ReleaseStyleContext(style); - - return MOZ_GTK_SUCCESS; - } - - // See gtk_menu_item_draw() for reference. - static gint --moz_gtk_menu_item_paint(cairo_t *cr, GdkRectangle* rect, -- GtkWidgetState* state, -- gint flags, GtkTextDirection direction) -+moz_gtk_menu_item_paint(WidgetNodeType widget, cairo_t *cr, GdkRectangle* rect, -+ GtkWidgetState* state, GtkTextDirection direction) - { -- GtkStyleContext* style; -- GtkWidget* item_widget; -- guint border_width; - gint x, y, w, h; - - if (state->inHover && !state->disabled) { -- if (flags & MOZ_TOPLEVEL_MENU_ITEM) { -- ensure_menu_bar_item_widget(); -- item_widget = gMenuBarItemWidget; -- } else { -- ensure_menu_item_widget(); -- item_widget = gMenuItemWidget; -- } -- style = gtk_widget_get_style_context(item_widget); -- gtk_style_context_save(style); -+ guint border_width = -+ gtk_container_get_border_width(GTK_CONTAINER(GetWidget(widget))); -+ GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state); -+ GtkStyleContext* style = -+ ClaimStyleContext(widget, direction, state_flags); - -- if (flags & MOZ_TOPLEVEL_MENU_ITEM) { -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_MENUBAR); -+ 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_widget_set_direction(item_widget, direction); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_MENUITEM); -- gtk_style_context_set_state(style, GetStateFlagsFromGtkWidgetState(state)); -- -- border_width = gtk_container_get_border_width(GTK_CONTAINER(item_widget)); -- - x = rect->x + border_width; - y = rect->y + border_width; - w = rect->width - border_width * 2; -@@ -2451,7 +2173,11 @@ moz_gtk_menu_item_paint(cairo_t *cr, Gdk - - gtk_render_background(style, cr, x, y, w, h); - gtk_render_frame(style, cr, x, y, w, h); -- gtk_style_context_restore(style); -+ -+ if (pre_3_6) { -+ gtk_style_context_restore(style); -+ } -+ ReleaseStyleContext(style); - } - - return MOZ_GTK_SUCCESS; -@@ -2462,21 +2188,13 @@ moz_gtk_menu_arrow_paint(cairo_t *cr, Gd - GtkWidgetState* state, - GtkTextDirection direction) - { -- GtkStyleContext* style; - GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state); -- -- ensure_menu_item_widget(); -- gtk_widget_set_direction(gMenuItemWidget, direction); -- -- style = gtk_widget_get_style_context(gMenuItemWidget); -- gtk_style_context_save(style); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_MENUITEM); -- gtk_style_context_set_state(style, state_flags); -+ GtkStyleContext* style = ClaimStyleContext(MOZ_GTK_MENUITEM, -+ direction, state_flags); - gtk_render_arrow(style, cr, - (direction == GTK_TEXT_DIR_LTR) ? ARROW_RIGHT : ARROW_LEFT, - rect->x, rect->y, rect->width); -- gtk_style_context_restore(style); -- -+ ReleaseStyleContext(style); - return MOZ_GTK_SUCCESS; - } - -@@ -2494,7 +2212,7 @@ moz_gtk_check_menu_item_paint(cairo_t *c - gint indicator_size, horizontal_padding; - gint x, y; - -- moz_gtk_menu_item_paint(cr, rect, state, FALSE, direction); -+ moz_gtk_menu_item_paint(MOZ_GTK_MENUITEM, cr, rect, state, direction); - - ensure_check_menu_item_widget(); - gtk_widget_set_direction(gCheckMenuItemWidget, direction); -@@ -2545,21 +2263,13 @@ static gint - moz_gtk_info_bar_paint(cairo_t *cr, GdkRectangle* rect, - GtkWidgetState* state) - { -- GtkStateFlags state_flags = GetStateFlagsFromGtkWidgetState(state); -- GtkStyleContext *style; -- ensure_info_bar(); -- -- style = gtk_widget_get_style_context(gInfoBar); -- gtk_style_context_save(style); -- -- gtk_style_context_set_state(style, state_flags); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_INFO); -- -+ GtkStyleContext *style = -+ ClaimStyleContext(MOZ_GTK_INFO_BAR, GTK_TEXT_DIR_LTR, -+ GetStateFlagsFromGtkWidgetState(state)); - 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); -- -- gtk_style_context_restore(style); -+ ReleaseStyleContext(style); - - return MOZ_GTK_SUCCESS; - } -@@ -2605,18 +2315,18 @@ moz_gtk_get_widget_border(WidgetNodeType - case MOZ_GTK_BUTTON: - case MOZ_GTK_TOOLBAR_BUTTON: - { -- ensure_button_widget(); -- style = gtk_widget_get_style_context(gButtonWidget); -+ style = ClaimStyleContext(MOZ_GTK_BUTTON); - -- *left = *top = *right = *bottom = gtk_container_get_border_width(GTK_CONTAINER(gButtonWidget)); -+ *left = *top = *right = *bottom = -+ gtk_container_get_border_width(GTK_CONTAINER(GetWidget(MOZ_GTK_BUTTON))); - - if (widget == MOZ_GTK_TOOLBAR_BUTTON) { - gtk_style_context_save(style); - gtk_style_context_add_class(style, "image-button"); - } -- -+ - moz_gtk_add_style_padding(style, left, top, right, bottom); -- -+ - if (widget == MOZ_GTK_TOOLBAR_BUTTON) - gtk_style_context_restore(style); - -@@ -2624,12 +2334,13 @@ moz_gtk_get_widget_border(WidgetNodeType - // -moz-focus-inner border (Bug 1228281). - *left -= 1; *top -= 1; *right -= 1; *bottom -= 1; - moz_gtk_add_style_border(style, left, top, right, bottom); -+ -+ ReleaseStyleContext(style); - return MOZ_GTK_SUCCESS; - } - case MOZ_GTK_ENTRY: - { -- ensure_entry_widget(); -- style = gtk_widget_get_style_context(gEntryWidget); -+ style = ClaimStyleContext(MOZ_GTK_ENTRY); - - // XXX: Subtract 1 pixel from the padding to account for the default - // padding in forms.css. See bug 1187385. -@@ -2637,16 +2348,15 @@ moz_gtk_get_widget_border(WidgetNodeType - moz_gtk_add_style_padding(style, left, top, right, bottom); - moz_gtk_add_style_border(style, left, top, right, bottom); - -+ ReleaseStyleContext(style); - return MOZ_GTK_SUCCESS; - } -+ case MOZ_GTK_TEXT_VIEW: - case MOZ_GTK_TREEVIEW: - { -- ensure_scrolled_window_widget(); -- style = gtk_widget_get_style_context(gScrolledWindowWidget); -- gtk_style_context_save(style); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_FRAME); -+ style = ClaimStyleContext(MOZ_GTK_SCROLLED_WINDOW); - moz_gtk_add_style_border(style, left, top, right, bottom); -- gtk_style_context_restore(style); -+ ReleaseStyleContext(style); - return MOZ_GTK_SUCCESS; - } - case MOZ_GTK_TREE_HEADER_CELL: -@@ -2726,14 +2436,12 @@ moz_gtk_get_widget_border(WidgetNodeType - w = gTabWidget; - break; - case MOZ_GTK_PROGRESSBAR: -- ensure_progress_widget(); -- w = gProgressWidget; -+ w = GetWidget(MOZ_GTK_PROGRESSBAR); - break; - case MOZ_GTK_SPINBUTTON_ENTRY: - case MOZ_GTK_SPINBUTTON_UP: - case MOZ_GTK_SPINBUTTON_DOWN: -- ensure_spin_widget(); -- w = gSpinWidget; -+ w = GetWidget(MOZ_GTK_SPINBUTTON); - break; - case MOZ_GTK_SCALE_HORIZONTAL: - ensure_scale_widget(); -@@ -2744,8 +2452,7 @@ moz_gtk_get_widget_border(WidgetNodeType - w = gVScaleWidget; - break; - case MOZ_GTK_FRAME: -- ensure_frame_widget(); -- w = gFrameWidget; -+ w = GetWidget(MOZ_GTK_FRAME); - break; - case MOZ_GTK_CHECKBUTTON_CONTAINER: - case MOZ_GTK_RADIOBUTTON_CONTAINER: -@@ -2761,19 +2468,17 @@ moz_gtk_get_widget_border(WidgetNodeType - return MOZ_GTK_SUCCESS; - } - case MOZ_GTK_MENUPOPUP: -- ensure_menu_popup_widget(); -- w = gMenuPopupWidget; -+ w = GetWidget(MOZ_GTK_MENUPOPUP); - break; -+ case MOZ_GTK_MENUBARITEM: - case MOZ_GTK_MENUITEM: - case MOZ_GTK_CHECKMENUITEM: - case MOZ_GTK_RADIOMENUITEM: - { -- if (widget == MOZ_GTK_MENUITEM) { -- ensure_menu_item_widget(); -- ensure_menu_bar_item_widget(); -- w = gMenuItemWidget; -- } -- else { -+ if (widget == MOZ_GTK_MENUBARITEM || widget == MOZ_GTK_MENUITEM) { -+ // Bug 1274143 for MOZ_GTK_MENUBARITEM -+ w = GetWidget(MOZ_GTK_MENUITEM); -+ } else { - ensure_check_menu_item_widget(); - w = gCheckMenuItemWidget; - } -@@ -2784,9 +2489,16 @@ moz_gtk_get_widget_border(WidgetNodeType - return MOZ_GTK_SUCCESS; - } - case MOZ_GTK_INFO_BAR: -- ensure_info_bar(); -- w = gInfoBar; -+ w = GetWidget(MOZ_GTK_INFO_BAR); - break; -+ case MOZ_GTK_TOOLTIP: -+ { -+ style = ClaimStyleContext(MOZ_GTK_TOOLTIP); -+ moz_gtk_add_style_border(style, left, top, right, bottom); -+ moz_gtk_add_style_padding(style, left, top, right, bottom); -+ ReleaseStyleContext(style); -+ return MOZ_GTK_SUCCESS; -+ } - /* These widgets have no borders, since they are not containers. */ - case MOZ_GTK_CHECKBUTTON_LABEL: - case MOZ_GTK_RADIOBUTTON_LABEL: -@@ -2810,7 +2522,6 @@ moz_gtk_get_widget_border(WidgetNodeType - case MOZ_GTK_MENUSEPARATOR: - /* These widgets have no borders.*/ - case MOZ_GTK_SPINBUTTON: -- case MOZ_GTK_TOOLTIP: - case MOZ_GTK_WINDOW: - case MOZ_GTK_RESIZER: - case MOZ_GTK_MENUARROW: -@@ -2908,8 +2619,7 @@ moz_gtk_get_arrow_size(WidgetNodeType wi - widget = gComboBoxArrowWidget; - break; - default: -- ensure_button_arrow_widget(); -- widget = gButtonArrowWidget; -+ widget = GetWidget(MOZ_GTK_BUTTON_ARROW); - break; - } - -@@ -2924,11 +2634,9 @@ moz_gtk_get_toolbar_separator_width(gint - { - gboolean wide_separators; - gint separator_width; -- GtkStyleContext* style; - GtkBorder border; - -- ensure_toolbar_widget(); -- style = gtk_widget_get_style_context(gToolbarWidget); -+ GtkStyleContext* style = ClaimStyleContext(MOZ_GTK_TOOLBAR); - gtk_style_context_get_style(style, - "space-size", size, - "wide-separators", &wide_separators, -@@ -2937,17 +2645,18 @@ moz_gtk_get_toolbar_separator_width(gint - /* Just in case... */ - gtk_style_context_get_border(style, GTK_STATE_FLAG_NORMAL, &border); - *size = MAX(*size, (wide_separators ? separator_width : border.left)); -+ ReleaseStyleContext(style); - return MOZ_GTK_SUCCESS; - } - - gint - moz_gtk_get_expander_size(gint* size) - { -- ensure_expander_widget(); -- gtk_style_context_get_style(gtk_widget_get_style_context(gExpanderWidget), -+ GtkStyleContext* style = ClaimStyleContext(MOZ_GTK_EXPANDER); -+ gtk_style_context_get_style(style, - "expander-size", size, - NULL); -- -+ ReleaseStyleContext(style); - return MOZ_GTK_SUCCESS; - } - -@@ -2972,11 +2681,11 @@ moz_gtk_get_menu_separator_height(gint * - GtkStyleContext* style; - guint border_width; - -- ensure_menu_separator_widget(); -- -- border_width = gtk_container_get_border_width(GTK_CONTAINER(gMenuSeparatorWidget)); -+ border_width = -+ gtk_container_get_border_width(GTK_CONTAINER( -+ GetWidget(MOZ_GTK_MENUSEPARATOR))); - -- style = gtk_widget_get_style_context(gMenuSeparatorWidget); -+ style = ClaimStyleContext(MOZ_GTK_MENUSEPARATOR); - gtk_style_context_get_padding(style, GTK_STATE_FLAG_NORMAL, &padding); - - gtk_style_context_save(style); -@@ -2988,6 +2697,7 @@ moz_gtk_get_menu_separator_height(gint * - NULL); - - gtk_style_context_restore(style); -+ ReleaseStyleContext(style); - - *size = padding.top + padding.bottom + border_width*2; - *size += (wide_separators) ? separator_height : 1; -@@ -2998,8 +2708,7 @@ moz_gtk_get_menu_separator_height(gint * - void - moz_gtk_get_entry_min_height(gint* height) - { -- ensure_entry_widget(); -- GtkStyleContext* style = gtk_widget_get_style_context(gEntryWidget); -+ GtkStyleContext* style = ClaimStyleContext(MOZ_GTK_ENTRY); - if (!gtk_check_version(3, 20, 0)) { - gtk_style_context_get(style, gtk_style_context_get_state(style), - "min-height", height, -@@ -3014,6 +2723,7 @@ moz_gtk_get_entry_min_height(gint* heigh - gtk_style_context_get_padding(style, GTK_STATE_FLAG_NORMAL, &padding); - - *height += (border.top + border.bottom + padding.top + padding.bottom); -+ ReleaseStyleContext(style); - } - - void -@@ -3094,8 +2804,7 @@ moz_gtk_images_in_buttons() - gboolean result; - GtkSettings* settings; - -- ensure_button_widget(); -- settings = gtk_widget_get_settings(gButtonWidget); -+ settings = gtk_widget_get_settings(GetWidget(MOZ_GTK_BUTTON)); - - g_object_get(settings, "gtk-button-images", &result, NULL); - return result; -@@ -3116,14 +2825,14 @@ moz_gtk_widget_paint(WidgetNodeType widg - case MOZ_GTK_BUTTON: - case MOZ_GTK_TOOLBAR_BUTTON: - if (state->depressed) { -- ensure_toggle_button_widget(); - return moz_gtk_button_paint(cr, rect, state, - (GtkReliefStyle) flags, -- gToggleButtonWidget, direction); -+ GetWidget(MOZ_GTK_TOGGLE_BUTTON), -+ direction); - } -- ensure_button_widget(); - return moz_gtk_button_paint(cr, rect, state, -- (GtkReliefStyle) flags, gButtonWidget, -+ (GtkReliefStyle) flags, -+ GetWidget(MOZ_GTK_BUTTON), - direction); - break; - case MOZ_GTK_CHECKBUTTON: -@@ -3171,9 +2880,9 @@ moz_gtk_widget_paint(WidgetNodeType widg - state, direction); - break; - case MOZ_GTK_SPINBUTTON_ENTRY: -- ensure_spin_widget(); -+ // TODO - use MOZ_GTK_SPINBUTTON_ENTRY style directly - return moz_gtk_entry_paint(cr, rect, state, -- gSpinWidget, direction); -+ GetWidget(MOZ_GTK_SPINBUTTON), direction); - break; - case MOZ_GTK_GRIPPER: - return moz_gtk_gripper_paint(cr, rect, state, -@@ -3198,9 +2907,11 @@ moz_gtk_widget_paint(WidgetNodeType widg - (GtkExpanderStyle) flags, direction); - break; - case MOZ_GTK_ENTRY: -- ensure_entry_widget(); -- return moz_gtk_entry_paint(cr, rect, state, -- gEntryWidget, direction); -+ return moz_gtk_entry_paint(cr, rect, state, GetWidget(MOZ_GTK_ENTRY), -+ direction); -+ break; -+ case MOZ_GTK_TEXT_VIEW: -+ return moz_gtk_text_view_paint(cr, rect, state, direction); - break; - case MOZ_GTK_DROPDOWN: - return moz_gtk_combo_box_paint(cr, rect, state, direction); -@@ -3271,9 +2982,9 @@ moz_gtk_widget_paint(WidgetNodeType widg - return moz_gtk_menu_separator_paint(cr, rect, - direction); - break; -+ case MOZ_GTK_MENUBARITEM: - case MOZ_GTK_MENUITEM: -- return moz_gtk_menu_item_paint(cr, rect, state, flags, -- direction); -+ return moz_gtk_menu_item_paint(widget, cr, rect, state, direction); - break; - case MOZ_GTK_MENUARROW: - return moz_gtk_menu_arrow_paint(cr, rect, state, -@@ -3333,25 +3044,16 @@ gboolean moz_gtk_has_scrollbar_buttons(v - gint - moz_gtk_shutdown() - { -- if (gTooltipWidget) -- gtk_widget_destroy(gTooltipWidget); - /* This will destroy all of our widgets */ -- - ResetWidgetCache(); - - /* TODO - replace it with appropriate widget */ - if (gTreeHeaderSortArrowWidget) - gtk_widget_destroy(gTreeHeaderSortArrowWidget); - -- gProtoWindow = NULL; - gProtoLayout = NULL; -- gButtonWidget = NULL; -- gToggleButtonWidget = NULL; -- gButtonArrowWidget = NULL; -- gSpinWidget = NULL; - gHScaleWidget = NULL; - gVScaleWidget = NULL; -- gEntryWidget = NULL; - gComboBoxWidget = NULL; - gComboBoxButtonWidget = NULL; - gComboBoxSeparatorWidget = NULL; -@@ -3360,29 +3062,15 @@ moz_gtk_shutdown() - gComboBoxEntryButtonWidget = NULL; - gComboBoxEntryArrowWidget = NULL; - gComboBoxEntryTextareaWidget = NULL; -- gHandleBoxWidget = NULL; -- gToolbarWidget = NULL; -- gFrameWidget = NULL; -- gProgressWidget = NULL; - gTabWidget = NULL; -- gTextViewWidget = nullptr; -- gTooltipWidget = NULL; -- gMenuBarWidget = NULL; -- gMenuBarItemWidget = NULL; -- gMenuPopupWidget = NULL; -- gMenuItemWidget = NULL; - gImageMenuItemWidget = NULL; - gCheckMenuItemWidget = NULL; - gTreeViewWidget = NULL; - gMiddleTreeViewColumn = NULL; - gTreeHeaderCellWidget = NULL; - gTreeHeaderSortArrowWidget = NULL; -- gExpanderWidget = NULL; -- gToolbarSeparatorWidget = NULL; -- gMenuSeparatorWidget = NULL; - gHPanedWidget = NULL; - gVPanedWidget = NULL; -- gScrolledWindowWidget = NULL; - - is_initialized = FALSE; - -diff -up firefox-48.0/widget/gtk/gtkdrawing.h.gtk3-20 firefox-48.0/widget/gtk/gtkdrawing.h ---- firefox-48.0/widget/gtk/gtkdrawing.h.gtk3-20 2016-07-25 22:22:07.000000000 +0200 -+++ firefox-48.0/widget/gtk/gtkdrawing.h 2016-07-29 09:15:11.822285857 +0200 -@@ -69,12 +69,6 @@ typedef enum { - MOZ_GTK_TAB_SELECTED = 1 << 10 - } GtkTabFlags; - --/** flags for menuitems **/ --typedef enum { -- /* menuitem is part of the menubar */ -- MOZ_TOPLEVEL_MENU_ITEM = 1 << 0 --} GtkMenuItemFlags; -- - /* function type for moz_gtk_enable_style_props */ - typedef gint (*style_prop_t)(GtkStyle*, const gchar*, gint); - -@@ -93,6 +87,10 @@ typedef enum { - MOZ_GTK_BUTTON, - /* Paints a button with image and no text */ - MOZ_GTK_TOOLBAR_BUTTON, -+ /* Paints a toggle button */ -+ MOZ_GTK_TOGGLE_BUTTON, -+ /* Paints a button arrow */ -+ MOZ_GTK_BUTTON_ARROW, - - /* Paints the container part of a GtkCheckButton. */ - MOZ_GTK_CHECKBUTTON_CONTAINER, -@@ -115,6 +113,7 @@ typedef enum { - - /* Horizontal GtkScrollbar counterparts */ - MOZ_GTK_SCROLLBAR_HORIZONTAL, -+ MOZ_GTK_SCROLLBAR_CONTENTS_HORIZONTAL, - /* Paints the trough (track) of a GtkScrollbar. */ - MOZ_GTK_SCROLLBAR_TROUGH_HORIZONTAL, - /* Paints the slider (thumb) of a GtkScrollbar. */ -@@ -122,6 +121,7 @@ typedef enum { - - /* Vertical GtkScrollbar counterparts */ - MOZ_GTK_SCROLLBAR_VERTICAL, -+ MOZ_GTK_SCROLLBAR_CONTENTS_VERTICAL, - MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL, - MOZ_GTK_SCROLLBAR_THUMB_VERTICAL, - -@@ -140,6 +140,10 @@ typedef enum { - MOZ_GTK_GRIPPER, - /* Paints a GtkEntry. */ - MOZ_GTK_ENTRY, -+ /* Paints a GtkExpander. */ -+ MOZ_GTK_EXPANDER, -+ /* Paints a GtkTextView. */ -+ MOZ_GTK_TEXT_VIEW, - /* Paints a GtkOptionMenu. */ - MOZ_GTK_DROPDOWN, - /* Paints a dropdown arrow (a GtkButton containing a down GtkArrow). */ -@@ -159,6 +163,8 @@ typedef enum { - MOZ_GTK_RESIZER, - /* Paints a GtkProgressBar. */ - MOZ_GTK_PROGRESSBAR, -+ /* Paints a trough (track) of a GtkProgressBar */ -+ MOZ_GTK_PROGRESS_TROUGH, - /* Paints a progress chunk of a GtkProgressBar. */ - MOZ_GTK_PROGRESS_CHUNK, - /* Paints a progress chunk of an indeterminated GtkProgressBar. */ -@@ -187,7 +193,9 @@ typedef enum { - MOZ_GTK_MENUARROW, - /* Paints an arrow in a toolbar button. flags is a GtkArrowType. */ - MOZ_GTK_TOOLBARBUTTON_ARROW, -- /* Paints items of menubar and popups. */ -+ /* Paints items of menubar. */ -+ MOZ_GTK_MENUBARITEM, -+ /* Paints items of popup menus. */ - MOZ_GTK_MENUITEM, - MOZ_GTK_CHECKMENUITEM, - MOZ_GTK_RADIOMENUITEM, -@@ -202,6 +210,8 @@ typedef enum { - MOZ_GTK_WINDOW_CONTAINER, - /* Paints a GtkInfoBar, for notifications. */ - MOZ_GTK_INFO_BAR, -+ /* Used for scrolled window shell. */ -+ MOZ_GTK_SCROLLED_WINDOW, - - MOZ_GTK_WIDGET_NODE_COUNT - } WidgetNodeType; -diff -up firefox-48.0/widget/gtk/mozgtk/mozgtk.c.gtk3-20 firefox-48.0/widget/gtk/mozgtk/mozgtk.c ---- firefox-48.0/widget/gtk/mozgtk/mozgtk.c.gtk3-20 2016-07-25 22:22:07.000000000 +0200 -+++ firefox-48.0/widget/gtk/mozgtk/mozgtk.c 2016-07-29 09:15:11.823285862 +0200 -@@ -517,6 +517,7 @@ STUB(gdk_event_get_source_device) - STUB(gdk_window_get_type) - STUB(gdk_x11_window_get_xid) - STUB(gdk_x11_display_get_type) -+STUB(gtk_box_new) - STUB(gtk_cairo_should_draw_window) - STUB(gtk_cairo_transform_to_window) - STUB(gtk_combo_box_text_append) -@@ -570,6 +571,7 @@ STUB(gtk_tree_view_column_get_button) - STUB(gtk_widget_get_preferred_size) - STUB(gtk_widget_get_state_flags) - STUB(gtk_widget_get_style_context) -+STUB(gtk_widget_path_append_for_widget) - STUB(gtk_widget_path_append_type) - STUB(gtk_widget_path_copy) - STUB(gtk_widget_path_free) -@@ -587,6 +589,10 @@ STUB(gtk_color_chooser_get_type) - STUB(gtk_color_chooser_set_rgba) - STUB(gtk_color_chooser_get_rgba) - STUB(gtk_color_chooser_set_use_alpha) -+STUB(gtk_check_menu_item_new) -+STUB(gtk_style_context_get_direction) -+STUB(gtk_style_context_invalidate) -+STUB(gtk_tooltip_get_type) - #endif - - #ifdef GTK2_SYMBOLS -diff -up firefox-48.0/widget/gtk/nsLookAndFeel.cpp.gtk3-20 firefox-48.0/widget/gtk/nsLookAndFeel.cpp ---- firefox-48.0/widget/gtk/nsLookAndFeel.cpp.gtk3-20 2016-06-01 06:11:44.000000000 +0200 -+++ firefox-48.0/widget/gtk/nsLookAndFeel.cpp 2016-07-29 09:15:54.943459700 +0200 -@@ -31,6 +31,7 @@ - - #if MOZ_WIDGET_GTK != 2 - #include <cairo-gobject.h> -+#include "WidgetStyleCache.h" - #endif - - using mozilla::LookAndFeel; -@@ -1135,15 +1136,24 @@ nsLookAndFeel::Init() - 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); - - // tooltip foreground and background -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_TOOLTIP); -- gtk_style_context_add_class(style, GTK_STYLE_CLASS_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); -- gtk_style_context_get_color(style, GTK_STATE_FLAG_NORMAL, &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); -- g_object_unref(style); -+ ReleaseStyleContext(style); - - // menu foreground & menu background - GtkWidget *accel_label = gtk_accel_label_new("M"); -diff -up firefox-48.0/widget/gtk/nsNativeThemeGTK.cpp.gtk3-20 firefox-48.0/widget/gtk/nsNativeThemeGTK.cpp ---- firefox-48.0/widget/gtk/nsNativeThemeGTK.cpp.gtk3-20 2016-07-25 22:22:07.000000000 +0200 -+++ firefox-48.0/widget/gtk/nsNativeThemeGTK.cpp 2016-07-29 09:15:11.824285865 +0200 -@@ -354,10 +354,8 @@ nsNativeThemeGTK::GetGtkWidgetAndState(u - - if (isTopLevel) { - aState->inHover = menuFrame->IsOpen(); -- *aWidgetFlags |= MOZ_TOPLEVEL_MENU_ITEM; - } else { - aState->inHover = CheckBooleanAttr(aFrame, nsGkAtoms::menuactive); -- *aWidgetFlags &= ~MOZ_TOPLEVEL_MENU_ITEM; - } - - aState->active = FALSE; -@@ -510,8 +508,14 @@ nsNativeThemeGTK::GetGtkWidgetAndState(u - break; - case NS_THEME_NUMBER_INPUT: - case NS_THEME_TEXTFIELD: -+ aGtkWidgetType = MOZ_GTK_ENTRY; -+ break; - case NS_THEME_TEXTFIELD_MULTILINE: -+#if (MOZ_WIDGET_GTK == 3) -+ aGtkWidgetType = MOZ_GTK_TEXT_VIEW; -+#else - aGtkWidgetType = MOZ_GTK_ENTRY; -+#endif - break; - case NS_THEME_LISTBOX: - case NS_THEME_TREEVIEW: -@@ -673,6 +677,13 @@ nsNativeThemeGTK::GetGtkWidgetAndState(u - aGtkWidgetType = MOZ_GTK_MENUPOPUP; - break; - case NS_THEME_MENUITEM: -+ { -+ nsMenuFrame *menuFrame = do_QueryFrame(aFrame); -+ if (menuFrame && menuFrame->IsOnMenuBar()) { -+ aGtkWidgetType = MOZ_GTK_MENUBARITEM; -+ break; -+ } -+ } - aGtkWidgetType = MOZ_GTK_MENUITEM; - break; - case NS_THEME_MENUSEPARATOR: -diff -up firefox-48.0/widget/gtk/WidgetStyleCache.cpp.gtk3-20 firefox-48.0/widget/gtk/WidgetStyleCache.cpp ---- firefox-48.0/widget/gtk/WidgetStyleCache.cpp.gtk3-20 2016-07-25 22:22:07.000000000 +0200 -+++ firefox-48.0/widget/gtk/WidgetStyleCache.cpp 2016-07-29 09:15:11.825285869 +0200 -@@ -22,7 +22,7 @@ static bool sStyleContextNeedsRestore; - static GtkStyleContext* sCurrentStyleContext; - #endif - static GtkStyleContext* --GetStyleInternal(WidgetNodeType aNodeType); -+GetCssNodeStyleInternal(WidgetNodeType aNodeType); - - static GtkWidget* - CreateWindowWidget() -@@ -67,12 +67,175 @@ CreateCheckboxWidget() - static GtkWidget* - CreateRadiobuttonWidget() - { -- GtkWidget* widget = gtk_radio_button_new_with_label(NULL, "M"); -+ GtkWidget* widget = gtk_radio_button_new_with_label(nullptr, "M"); - AddToWindowContainer(widget); - return widget; - } - - static GtkWidget* -+CreateMenuBarWidget() -+{ -+ GtkWidget* widget = gtk_menu_bar_new(); -+ AddToWindowContainer(widget); -+ return widget; -+} -+ -+static GtkWidget* -+CreateMenuPopupWidget() -+{ -+ GtkWidget* widget = gtk_menu_new(); -+ gtk_menu_attach_to_widget(GTK_MENU(widget), GetWidget(MOZ_GTK_WINDOW), -+ nullptr); -+ return widget; -+} -+ -+static GtkWidget* -+CreateMenuItemWidget(WidgetNodeType aShellType) -+{ -+ GtkWidget* widget = gtk_menu_item_new(); -+ gtk_menu_shell_append(GTK_MENU_SHELL(GetWidget(aShellType)), widget); -+ return widget; -+} -+ -+static GtkWidget* -+CreateProgressWidget() -+{ -+ GtkWidget* widget = gtk_progress_bar_new(); -+ AddToWindowContainer(widget); -+ return widget; -+} -+ -+static GtkWidget* -+CreateTooltipWidget() -+{ -+ MOZ_ASSERT(gtk_check_version(3, 20, 0) != nullptr, -+ "CreateTooltipWidget should be used for Gtk < 3.20 only."); -+ GtkWidget* widget = CreateWindowWidget(); -+ GtkStyleContext* style = gtk_widget_get_style_context(widget); -+ gtk_style_context_add_class(style, GTK_STYLE_CLASS_TOOLTIP); -+ return widget; -+} -+ -+static GtkWidget* -+CreateExpanderWidget() -+{ -+ GtkWidget* widget = gtk_expander_new("M"); -+ AddToWindowContainer(widget); -+ return widget; -+} -+ -+static GtkWidget* -+CreateFrameWidget() -+{ -+ GtkWidget* widget = gtk_frame_new(nullptr); -+ AddToWindowContainer(widget); -+ return widget; -+} -+ -+static GtkWidget* -+CreateGripperWidget() -+{ -+ GtkWidget* widget = gtk_handle_box_new(); -+ AddToWindowContainer(widget); -+ return widget; -+} -+ -+static GtkWidget* -+CreateToolbarWidget() -+{ -+ GtkWidget* widget = gtk_toolbar_new(); -+ gtk_container_add(GTK_CONTAINER(GetWidget(MOZ_GTK_GRIPPER)), widget); -+ gtk_widget_realize(widget); -+ return widget; -+} -+ -+static GtkWidget* -+CreateToolbarSeparatorWidget() -+{ -+ GtkWidget* widget = GTK_WIDGET(gtk_separator_tool_item_new()); -+ AddToWindowContainer(widget); -+ return widget; -+} -+ -+static GtkWidget* -+CreateInfoBarWidget() -+{ -+ GtkWidget* widget = gtk_info_bar_new(); -+ AddToWindowContainer(widget); -+ return widget; -+} -+ -+static GtkWidget* -+CreateButtonWidget() -+{ -+ GtkWidget* widget = gtk_button_new_with_label("M"); -+ AddToWindowContainer(widget); -+ return widget; -+} -+ -+static GtkWidget* -+CreateToggleButtonWidget() -+{ -+ GtkWidget* widget = gtk_toggle_button_new(); -+ AddToWindowContainer(widget); -+ return widget; -+} -+ -+static GtkWidget* -+CreateButtonArrowWidget() -+{ -+ GtkWidget* widget = gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_OUT); -+ gtk_container_add(GTK_CONTAINER(GetWidget(MOZ_GTK_TOGGLE_BUTTON)), widget); -+ gtk_widget_realize(widget); -+ gtk_widget_show(widget); -+ return widget; -+} -+ -+static GtkWidget* -+CreateSpinWidget() -+{ -+ GtkWidget* widget = gtk_spin_button_new(nullptr, 1, 0); -+ AddToWindowContainer(widget); -+ return widget; -+} -+ -+static GtkWidget* -+CreateEntryWidget() -+{ -+ GtkWidget* widget = gtk_entry_new(); -+ AddToWindowContainer(widget); -+ return widget; -+} -+ -+static GtkWidget* -+CreateScrolledWindowWidget() -+{ -+ GtkWidget* widget = gtk_scrolled_window_new(nullptr, nullptr); -+ AddToWindowContainer(widget); -+ return widget; -+} -+ -+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(); -+ gtk_menu_shell_append(GTK_MENU_SHELL(GetWidget(MOZ_GTK_MENUPOPUP)), -+ widget); -+ gtk_widget_realize(widget); -+ return widget; -+} -+ -+ -+static GtkWidget* - CreateWidget(WidgetNodeType aWidgetType) - { - switch (aWidgetType) { -@@ -80,16 +243,54 @@ CreateWidget(WidgetNodeType aWidgetType) - return CreateWindowWidget(); - case MOZ_GTK_WINDOW_CONTAINER: - return CreateWindowContainerWidget(); -+ case MOZ_GTK_CHECKBUTTON_CONTAINER: -+ return CreateCheckboxWidget(); -+ case MOZ_GTK_PROGRESSBAR: -+ return CreateProgressWidget(); -+ case MOZ_GTK_RADIOBUTTON_CONTAINER: -+ return CreateRadiobuttonWidget(); - case MOZ_GTK_SCROLLBAR_HORIZONTAL: - return CreateScrollbarWidget(aWidgetType, - GTK_ORIENTATION_HORIZONTAL); - case MOZ_GTK_SCROLLBAR_VERTICAL: - return CreateScrollbarWidget(aWidgetType, - GTK_ORIENTATION_VERTICAL); -- case MOZ_GTK_CHECKBUTTON_CONTAINER: -- return CreateCheckboxWidget(); -- case MOZ_GTK_RADIOBUTTON_CONTAINER: -- return CreateRadiobuttonWidget(); -+ case MOZ_GTK_MENUBAR: -+ return CreateMenuBarWidget(); -+ case MOZ_GTK_MENUPOPUP: -+ return CreateMenuPopupWidget(); -+ case MOZ_GTK_MENUBARITEM: -+ return CreateMenuItemWidget(MOZ_GTK_MENUBAR); -+ case MOZ_GTK_MENUITEM: -+ return CreateMenuItemWidget(MOZ_GTK_MENUPOPUP); -+ case MOZ_GTK_MENUSEPARATOR: -+ return CreateMenuSeparatorWidget(); -+ case MOZ_GTK_EXPANDER: -+ return CreateExpanderWidget(); -+ case MOZ_GTK_FRAME: -+ return CreateFrameWidget(); -+ case MOZ_GTK_GRIPPER: -+ return CreateGripperWidget(); -+ case MOZ_GTK_TOOLBAR: -+ return CreateToolbarWidget(); -+ case MOZ_GTK_TOOLBAR_SEPARATOR: -+ return CreateToolbarSeparatorWidget(); -+ case MOZ_GTK_INFO_BAR: -+ return CreateInfoBarWidget(); -+ case MOZ_GTK_SPINBUTTON: -+ return CreateSpinWidget(); -+ case MOZ_GTK_BUTTON: -+ return CreateButtonWidget(); -+ case MOZ_GTK_TOGGLE_BUTTON: -+ return CreateToggleButtonWidget(); -+ case MOZ_GTK_BUTTON_ARROW: -+ return CreateButtonArrowWidget(); -+ case MOZ_GTK_ENTRY: -+ return CreateEntryWidget(); -+ case MOZ_GTK_SCROLLED_WINDOW: -+ return CreateScrolledWindowWidget(); -+ case MOZ_GTK_TEXT_VIEW: -+ return CreateTextViewWidget(); - default: - /* Not implemented */ - return nullptr; -@@ -107,17 +308,42 @@ GetWidget(WidgetNodeType aWidgetType) - return widget; - } - --static GtkStyleContext* --CreateCSSNode(const char* aName, GtkStyleContext *aParentStyle) -+GtkStyleContext* -+CreateStyleForWidget(GtkWidget* aWidget, GtkStyleContext* aParentStyle) -+{ -+ GtkWidgetPath* path = aParentStyle ? -+ gtk_widget_path_copy(gtk_style_context_get_path(aParentStyle)) : -+ gtk_widget_path_new(); -+ -+ // Work around https://bugzilla.gnome.org/show_bug.cgi?id=767312 -+ // which exists in GTK+ 3.20. -+ gtk_widget_get_style_context(aWidget); -+ -+ gtk_widget_path_append_for_widget(path, aWidget); -+ // Release any floating reference on aWidget. -+ g_object_ref_sink(aWidget); -+ g_object_unref(aWidget); -+ -+ GtkStyleContext *context = gtk_style_context_new(); -+ gtk_style_context_set_path(context, path); -+ gtk_style_context_set_parent(context, aParentStyle); -+ gtk_widget_path_unref(path); -+ -+ return context; -+} -+ -+GtkStyleContext* -+CreateCSSNode(const char* aName, GtkStyleContext* aParentStyle, GType aType) - { - static auto sGtkWidgetPathIterSetObjectName = - reinterpret_cast<void (*)(GtkWidgetPath *, gint, const char *)> - (dlsym(RTLD_DEFAULT, "gtk_widget_path_iter_set_object_name")); - -- GtkWidgetPath* path = -- gtk_widget_path_copy(gtk_style_context_get_path(aParentStyle)); -+ GtkWidgetPath* path = aParentStyle ? -+ gtk_widget_path_copy(gtk_style_context_get_path(aParentStyle)) : -+ gtk_widget_path_new(); - -- gtk_widget_path_append_type(path, G_TYPE_NONE); -+ gtk_widget_path_append_type(path, aType); - - (*sGtkWidgetPathIterSetObjectName)(path, -1, aName); - -@@ -130,95 +356,168 @@ CreateCSSNode(const char* aName, GtkStyl - } - - static GtkStyleContext* --GetChildNodeStyle(WidgetNodeType aStyleType, -- WidgetNodeType aWidgetType, -- const gchar* aStyleClass, -- WidgetNodeType aParentNodeType) -+CreateChildCSSNode(const char* aName, WidgetNodeType aParentNodeType) - { -- GtkStyleContext* style; -- -- if (gtk_check_version(3, 20, 0) != nullptr) { -- style = gtk_widget_get_style_context(sWidgetStorage[aWidgetType]); -- -- gtk_style_context_save(style); -- MOZ_ASSERT(!sStyleContextNeedsRestore); -- sStyleContextNeedsRestore = true; -- -- gtk_style_context_add_class(style, aStyleClass); -- } -- else { -- style = sStyleStorage[aStyleType]; -- if (!style) { -- style = CreateCSSNode(aStyleClass, GetStyleInternal(aParentNodeType)); -- MOZ_ASSERT(!sStyleContextNeedsRestore); -- sStyleStorage[aStyleType] = style; -- } -- } -+ return CreateCSSNode(aName, GetCssNodeStyleInternal(aParentNodeType)); -+} - -+static GtkStyleContext* -+GetWidgetStyleWithClass(WidgetNodeType aWidgetType, const gchar* aStyleClass) -+{ -+ GtkStyleContext* style = gtk_widget_get_style_context(GetWidget(aWidgetType)); -+ gtk_style_context_save(style); -+ MOZ_ASSERT(!sStyleContextNeedsRestore); -+ sStyleContextNeedsRestore = true; -+ gtk_style_context_add_class(style, aStyleClass); - return style; - } - -+/* GetCssNodeStyleInternal is used by Gtk >= 3.20 */ - static GtkStyleContext* --GetStyleInternal(WidgetNodeType aNodeType) -+GetCssNodeStyleInternal(WidgetNodeType aNodeType) - { -+ GtkStyleContext* style = sStyleStorage[aNodeType]; -+ if (style) -+ return style; -+ - switch (aNodeType) { -- case MOZ_GTK_SCROLLBAR_HORIZONTAL: -- /* Root CSS node / widget for scrollbars */ -+ case MOZ_GTK_SCROLLBAR_CONTENTS_HORIZONTAL: -+ style = CreateChildCSSNode("contents", -+ MOZ_GTK_SCROLLBAR_HORIZONTAL); - break; - case MOZ_GTK_SCROLLBAR_TROUGH_HORIZONTAL: -- return GetChildNodeStyle(aNodeType, -- MOZ_GTK_SCROLLBAR_HORIZONTAL, -- GTK_STYLE_CLASS_TROUGH, -- MOZ_GTK_SCROLLBAR_HORIZONTAL); -- -+ style = CreateChildCSSNode(GTK_STYLE_CLASS_TROUGH, -+ MOZ_GTK_SCROLLBAR_CONTENTS_HORIZONTAL); -+ break; - case MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL: -- return GetChildNodeStyle(aNodeType, -- MOZ_GTK_SCROLLBAR_HORIZONTAL, -- GTK_STYLE_CLASS_SLIDER, -- MOZ_GTK_SCROLLBAR_TROUGH_HORIZONTAL); -- -- case MOZ_GTK_SCROLLBAR_VERTICAL: -- /* Root CSS node / widget for scrollbars */ -+ style = CreateChildCSSNode(GTK_STYLE_CLASS_SLIDER, -+ MOZ_GTK_SCROLLBAR_TROUGH_HORIZONTAL); -+ break; -+ case MOZ_GTK_SCROLLBAR_CONTENTS_VERTICAL: -+ style = CreateChildCSSNode("contents", -+ MOZ_GTK_SCROLLBAR_VERTICAL); - break; - case MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL: -- return GetChildNodeStyle(aNodeType, -- MOZ_GTK_SCROLLBAR_VERTICAL, -- GTK_STYLE_CLASS_TROUGH, -- MOZ_GTK_SCROLLBAR_VERTICAL); -- -+ style = CreateChildCSSNode(GTK_STYLE_CLASS_TROUGH, -+ MOZ_GTK_SCROLLBAR_CONTENTS_VERTICAL); -+ break; - case MOZ_GTK_SCROLLBAR_THUMB_VERTICAL: -- return GetChildNodeStyle(aNodeType, -- MOZ_GTK_SCROLLBAR_VERTICAL, -- GTK_STYLE_CLASS_SLIDER, -- MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL); -- -- case MOZ_GTK_RADIOBUTTON_CONTAINER: -- /* Root CSS node / widget for checkboxes */ -+ style = CreateChildCSSNode(GTK_STYLE_CLASS_SLIDER, -+ MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL); - break; - case MOZ_GTK_RADIOBUTTON: -- return GetChildNodeStyle(aNodeType, -- MOZ_GTK_RADIOBUTTON_CONTAINER, -- GTK_STYLE_CLASS_RADIO, -- MOZ_GTK_RADIOBUTTON_CONTAINER); -- case MOZ_GTK_CHECKBUTTON_CONTAINER: -- /* Root CSS node / widget for radiobuttons */ -+ style = CreateChildCSSNode(GTK_STYLE_CLASS_RADIO, -+ MOZ_GTK_RADIOBUTTON_CONTAINER); - break; - case MOZ_GTK_CHECKBUTTON: -- return GetChildNodeStyle(aNodeType, -- MOZ_GTK_CHECKBUTTON_CONTAINER, -- GTK_STYLE_CLASS_CHECK, -- MOZ_GTK_CHECKBUTTON_CONTAINER); -- default: -+ style = CreateChildCSSNode(GTK_STYLE_CLASS_CHECK, -+ MOZ_GTK_CHECKBUTTON_CONTAINER); -+ break; -+ case MOZ_GTK_PROGRESS_TROUGH: -+ /* Progress bar background (trough) */ -+ style = CreateChildCSSNode(GTK_STYLE_CLASS_TROUGH, -+ MOZ_GTK_PROGRESSBAR); -+ break; -+ case MOZ_GTK_PROGRESS_CHUNK: -+ 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, -+ GTK_STYLE_CLASS_GRIP); -+ case MOZ_GTK_INFO_BAR: -+ // TODO - create from CSS node -+ return GetWidgetStyleWithClass(MOZ_GTK_INFO_BAR, -+ GTK_STYLE_CLASS_INFO); -+ case MOZ_GTK_SPINBUTTON_ENTRY: -+ // TODO - create from CSS node -+ return GetWidgetStyleWithClass(MOZ_GTK_SPINBUTTON, -+ GTK_STYLE_CLASS_ENTRY); -+ case MOZ_GTK_SCROLLED_WINDOW: -+ // 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); -+ default: -+ // TODO - create style from style path -+ GtkWidget* widget = GetWidget(aNodeType); -+ return gtk_widget_get_style_context(widget); - } - -- GtkWidget* widget = GetWidget(aNodeType); -- if (widget) { -- return gtk_widget_get_style_context(widget); -- } -+ MOZ_ASSERT(style, "missing style context for node type"); -+ sStyleStorage[aNodeType] = style; -+ return style; -+} - -- MOZ_ASSERT_UNREACHABLE("missing style context for node type"); -- return nullptr; -+/* GetWidgetStyleInternal is used by Gtk < 3.20 */ -+static GtkStyleContext* -+GetWidgetStyleInternal(WidgetNodeType aNodeType) -+{ -+ switch (aNodeType) { -+ case MOZ_GTK_SCROLLBAR_TROUGH_HORIZONTAL: -+ return GetWidgetStyleWithClass(MOZ_GTK_SCROLLBAR_HORIZONTAL, -+ GTK_STYLE_CLASS_TROUGH); -+ case MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL: -+ return GetWidgetStyleWithClass(MOZ_GTK_SCROLLBAR_HORIZONTAL, -+ GTK_STYLE_CLASS_SLIDER); -+ case MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL: -+ return GetWidgetStyleWithClass(MOZ_GTK_SCROLLBAR_VERTICAL, -+ GTK_STYLE_CLASS_TROUGH); -+ case MOZ_GTK_SCROLLBAR_THUMB_VERTICAL: -+ return GetWidgetStyleWithClass(MOZ_GTK_SCROLLBAR_VERTICAL, -+ GTK_STYLE_CLASS_SLIDER); -+ case MOZ_GTK_RADIOBUTTON: -+ return GetWidgetStyleWithClass(MOZ_GTK_RADIOBUTTON_CONTAINER, -+ GTK_STYLE_CLASS_RADIO); -+ case MOZ_GTK_CHECKBUTTON: -+ return GetWidgetStyleWithClass(MOZ_GTK_CHECKBUTTON_CONTAINER, -+ 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; -+ return style; -+ } -+ case MOZ_GTK_GRIPPER: -+ return GetWidgetStyleWithClass(MOZ_GTK_GRIPPER, -+ GTK_STYLE_CLASS_GRIP); -+ case MOZ_GTK_INFO_BAR: -+ return GetWidgetStyleWithClass(MOZ_GTK_INFO_BAR, -+ GTK_STYLE_CLASS_INFO); -+ case MOZ_GTK_SPINBUTTON_ENTRY: -+ return GetWidgetStyleWithClass(MOZ_GTK_SPINBUTTON, -+ GTK_STYLE_CLASS_ENTRY); -+ 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); -+ default: -+ GtkWidget* widget = GetWidget(aNodeType); -+ MOZ_ASSERT(widget); -+ return gtk_widget_get_style_context(widget); -+ } - } - - void -@@ -245,13 +544,39 @@ ResetWidgetCache(void) - - GtkStyleContext* - ClaimStyleContext(WidgetNodeType aNodeType, GtkTextDirection aDirection, -- StyleFlags aFlags) -+ GtkStateFlags aStateFlags, StyleFlags aFlags) - { -- GtkStyleContext* style = GetStyleInternal(aNodeType); -+ MOZ_ASSERT(!sStyleContextNeedsRestore); -+ GtkStyleContext* style; -+ if (gtk_check_version(3, 20, 0) != nullptr) { -+ style = GetWidgetStyleInternal(aNodeType); -+ } else { -+ style = GetCssNodeStyleInternal(aNodeType); -+ } - #ifdef DEBUG - MOZ_ASSERT(!sCurrentStyleContext); - sCurrentStyleContext = style; - #endif -+ GtkStateFlags oldState = gtk_style_context_get_state(style); -+ GtkTextDirection oldDirection = gtk_style_context_get_direction(style); -+ if (oldState != aStateFlags || oldDirection != aDirection) { -+ // From GTK 3.8, set_state() will overwrite the direction, so set -+ // direction after state. -+ gtk_style_context_set_state(style, aStateFlags); -+ gtk_style_context_set_direction(style, aDirection); -+ -+ // This invalidate is necessary for unsaved style contexts from GtkWidgets -+ // in pre-3.18 GTK, because automatic invalidation of such contexts -+ // was delayed until a resize event runs. -+ // -+ // https://bugzilla.mozilla.org/show_bug.cgi?id=1272194#c7 -+ // -+ // Avoid calling invalidate on saved contexts to avoid performing -+ // build_properties() (in 3.16 stylecontext.c) unnecessarily early. -+ if (!sStyleContextNeedsRestore) { -+ gtk_style_context_invalidate(style); -+ } -+ } - return style; - } - -diff -up firefox-48.0/widget/gtk/WidgetStyleCache.h.gtk3-20 firefox-48.0/widget/gtk/WidgetStyleCache.h ---- firefox-48.0/widget/gtk/WidgetStyleCache.h.gtk3-20 2016-07-25 22:22:07.000000000 +0200 -+++ firefox-48.0/widget/gtk/WidgetStyleCache.h 2016-07-29 09:15:11.825285869 +0200 -@@ -21,10 +21,24 @@ enum : StyleFlags { - GtkWidget* - GetWidget(WidgetNodeType aNodeType); - -+/* -+ * Return a new style context based on aWidget, as a child of aParentStyle. -+ * If aWidget still has a floating reference, then it is sunk and released. -+ */ -+GtkStyleContext* -+CreateStyleForWidget(GtkWidget* aWidget, GtkStyleContext* aParentStyle); -+ -+// CreateCSSNode is implemented for gtk >= 3.20 only. -+GtkStyleContext* -+CreateCSSNode(const char* aName, -+ GtkStyleContext* aParentStyle, -+ GType aType = G_TYPE_NONE); -+ - // Callers must call ReleaseStyleContext() on the returned context. - GtkStyleContext* - ClaimStyleContext(WidgetNodeType aNodeType, - GtkTextDirection aDirection = GTK_TEXT_DIR_LTR, -+ GtkStateFlags aStateFlags = GTK_STATE_FLAG_NORMAL, - StyleFlags aFlags = NO_STYLE_FLAGS); - void - ReleaseStyleContext(GtkStyleContext* style); diff --git a/testing/firefox/fix-arm-atomics-grsec.patch b/testing/firefox/fix-arm-atomics-grsec.patch index 5524b2aa73..0eb58f093f 100644 --- a/testing/firefox/fix-arm-atomics-grsec.patch +++ b/testing/firefox/fix-arm-atomics-grsec.patch @@ -1,41 +1,5 @@ --- mozilla-release/ipc/chromium/src/base/atomicops_internals_arm_gcc.h.orig +++ mozilla-release/ipc/chromium/src/base/atomicops_internals_arm_gcc.h -@@ -1,8 +1,31 @@ --// Copyright (c) 2009 The Chromium Authors. All rights reserved. --// Use of this source code is governed by a BSD-style license that can be --// found in the LICENSE file. -+// Copyright 2010 the V8 project authors. All rights reserved. -+// Redistribution and use in source and binary forms, with or without -+// modification, are permitted provided that the following conditions are -+// met: -+// -+// * Redistributions of source code must retain the above copyright -+// notice, this list of conditions and the following disclaimer. -+// * Redistributions in binary form must reproduce the above -+// copyright notice, this list of conditions and the following -+// disclaimer in the documentation and/or other materials provided -+// with the distribution. -+// * Neither the name of Google Inc. nor the names of its -+// contributors may be used to endorse or promote products derived -+// from this software without specific prior written permission. -+// -+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - --// This file is an internal atomic implementation, use base/atomicops.h instead. -+// This file is an internal atomic implementation, use atomicops.h instead. - // - // LinuxKernelCmpxchg and Barrier_AtomicIncrement are from Google Gears. - @@ -12,43 +35,194 @@ namespace base { namespace subtle { diff --git a/testing/firefox/fix-arm-version-detect.patch b/testing/firefox/fix-arm-version-detect.patch new file mode 100644 index 0000000000..c0c2a2e830 --- /dev/null +++ b/testing/firefox/fix-arm-version-detect.patch @@ -0,0 +1,13 @@ +diff --git a/build/autoconf/arch.m4 b/build/autoconf/arch.m4 +index b62ea71..53179a7 100644 +--- a/build/autoconf/arch.m4 ++++ b/build/autoconf/arch.m4 +@@ -215,7 +215,7 @@ if test "$CPU_ARCH" = "arm"; then + + AC_MSG_CHECKING(ARM version support in compiler) + dnl Determine the target ARM architecture (5 for ARMv5, v5T, v5E, etc.; 6 for ARMv6, v6K, etc.) +- ARM_ARCH=`${CC-cc} ${CFLAGS} -dM -E - < /dev/null | sed -n 's/.*__ARM_ARCH_\([[0-9]][[0-9]]*\).*/\1/p'` ++ ARM_ARCH=`${CC-cc} ${CFLAGS} -dM -E - < /dev/null | sed -n 's/.*__ARM_ARCH_\([[0-9]][[0-9]]*\).*/\1/p' | head -n 1` + AC_MSG_RESULT("$ARM_ARCH") + + AC_MSG_CHECKING(for ARM NEON support in compiler) diff --git a/testing/firefox/fix-tools.patch b/testing/firefox/fix-tools.patch index 522d7e1a27..ea5a2cd785 100644 --- a/testing/firefox/fix-tools.patch +++ b/testing/firefox/fix-tools.patch @@ -1,19 +1,3 @@ -diff --git a/media/libav/config_unix.h b/media/libav/config_unix.h -index 3921293..df8b855 100644 ---- a/media/libav/config_unix.h -+++ b/media/libav/config_unix.h -@@ -219,7 +219,11 @@ - #define HAVE_STRERROR_R 1 - #define HAVE_STRPTIME 1 - #define HAVE_SYSCONF 1 -+#if !defined(__linux__) || defined(__GLIBC__) - #define HAVE_SYSCTL 1 -+#else -+#define HAVE_SYSCTL 0 -+#endif - #define HAVE_USLEEP 1 - #define HAVE_VIRTUALALLOC 0 - #define HAVE_PTHREADS 0 diff --git a/tools/profiler/core/platform-linux.cc b/tools/profiler/core/platform-linux.cc index 0df1e8f..d868895 100644 --- a/tools/profiler/core/platform-linux.cc diff --git a/testing/firefox/musl-pthread-setname.patch b/testing/firefox/musl-pthread-setname.patch new file mode 100644 index 0000000000..3bf620219b --- /dev/null +++ b/testing/firefox/musl-pthread-setname.patch @@ -0,0 +1,14 @@ +--- a/js/src/threading/posix/Thread.cpp.orig 2016-09-20 22:19:46.368622126 +0200 ++++ b/js/src/threading/posix/Thread.cpp 2016-09-20 22:23:35.495823534 +0200 +@@ -153,8 +153,10 @@ + rv = 0; + #elif defined(__NetBSD__) + rv = pthread_setname_np(pthread_self(), "%s", (void*)name); +-#else ++#elif defined(__GLIBC__) + rv = pthread_setname_np(pthread_self(), name); ++#else ++ rv = 0; + #endif + MOZ_RELEASE_ASSERT(!rv); + } |