diff options
author | Martin Stransky <stransky@redhat.com> | 2016-09-08 13:37:25 +0200 |
---|---|---|
committer | Martin Stransky <stransky@redhat.com> | 2016-09-08 13:37:25 +0200 |
commit | 358c2b48a3d9838d8e3252039586a0ca1abdcb01 (patch) | |
tree | d2d7f6bc6a233d417e0f5fb4bd291e3aaaa35196 | |
parent | Added translations for .desktop file actions (diff) | |
download | librewolf-fedora-ff-358c2b48a3d9838d8e3252039586a0ca1abdcb01.tar.gz librewolf-fedora-ff-358c2b48a3d9838d8e3252039586a0ca1abdcb01.tar.bz2 librewolf-fedora-ff-358c2b48a3d9838d8e3252039586a0ca1abdcb01.zip |
Update to 49.0
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | firefox-gtk3-20.patch | 2333 | ||||
-rw-r--r-- | firefox.spec | 26 | ||||
-rw-r--r-- | mozilla-1225044.patch | 125 | ||||
-rw-r--r-- | mozilla-1245783.patch | 17 | ||||
-rw-r--r-- | mozilla-1270046.patch | 12 | ||||
-rw-r--r-- | mozilla-1272332.patch | 54 | ||||
-rw-r--r-- | mozilla-1282843.patch | 24 | ||||
-rw-r--r-- | mozilla-1291700.patch | 93 | ||||
-rw-r--r-- | mozilla-440908.patch | 51 | ||||
-rw-r--r-- | mozilla-890908-async-nego.patch | 2 | ||||
-rw-r--r-- | sources | 4 |
12 files changed, 42 insertions, 2701 deletions
@@ -204,3 +204,5 @@ firefox-3.6.4.source.tar.bz2 /firefox-langpacks-48.0-20160727.tar.xz /firefox-langpacks-48.0.1-20160819.tar.xz /firefox-48.0.1.source.tar.xz +/firefox-49.0.source.tar.xz +/firefox-langpacks-49.0-20160906.tar.xz diff --git a/firefox-gtk3-20.patch b/firefox-gtk3-20.patch deleted file mode 100644 index eccbc5e..0000000 --- a/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/firefox.spec b/firefox.spec index 358ec5b..0b08533 100644 --- a/firefox.spec +++ b/firefox.spec @@ -85,14 +85,14 @@ Summary: Mozilla Firefox Web browser Name: firefox -Version: 48.0.1 -Release: 2%{?pre_tag}%{?dist} +Version: 49.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}-20160819.tar.xz +Source1: firefox-langpacks-%{version}%{?pre_version}-20160906.tar.xz %endif Source10: firefox-mozconfig Source12: firefox-redhat-default-prefs.js @@ -113,7 +113,6 @@ Patch20: firefox-build-prbool.patch Patch21: firefox-ppc64le.patch Patch24: firefox-debug.patch Patch25: rhbz-1219542-s390-build.patch -Patch26: mozilla-1282843.patch # Fedora specific patches # Unable to install addons from https pages @@ -121,21 +120,14 @@ Patch204: rhbz-966424.patch Patch215: firefox-enable-addons.patch Patch219: rhbz-1173156.patch Patch221: firefox-fedora-ua.patch -Patch222: firefox-gtk3-20.patch Patch223: rhbz-1291190-appchooser-crash.patch Patch224: mozilla-1170092.patch # Upstream patches Patch304: mozilla-1253216.patch Patch402: mozilla-1196777.patch -Patch404: mozilla-1270046.patch -# Remove when mozbz#1269319 lands - Firefox 49 -Patch405: mozilla-1245783.patch Patch406: mozilla-256180.patch Patch407: mozilla-890908-async-nego.patch -Patch408: mozilla-1272332.patch -Patch409: mozilla-1225044.patch -Patch410: mozilla-1291700.patch # Debian patches Patch500: mozilla-440908.patch @@ -256,7 +248,6 @@ cd %{tarballdir} %ifarch s390 %patch25 -p1 -b .rhbz-1219542-s390 %endif -%patch26 -p1 -b .mzbz#1282843 %patch3 -p1 -b .arm @@ -272,15 +263,9 @@ cd %{tarballdir} %endif %patch224 -p1 -b .1170092 %patch304 -p1 -b .1253216 -%patch222 -p1 -b .gtk3-20 %patch402 -p1 -b .1196777 -%patch404 -p1 -b .1270046 -%patch405 -p1 -b .1245783 %patch406 -p1 -b .256180 %patch407 -p1 -b .890908-async-nego -%patch408 -p1 -b .1272332 -%patch409 -p1 -b .1225044 -%patch410 -p1 -b .1291700 # Debian extension patch %patch500 -p1 -b .440908 @@ -732,9 +717,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : %{mozappdir}/browser/components/*.so %{mozappdir}/browser/components/components.manifest %{mozappdir}/browser/defaults/preferences/firefox-redhat-default-prefs.js -%{mozappdir}/browser/features/loop@mozilla.org.xpi %{mozappdir}/browser/features/e10srollout@mozilla.org.xpi %{mozappdir}/browser/features/firefox@getpocket.com.xpi +%{mozappdir}/browser/features/webcompat@mozilla.org.xpi %attr(644, root, root) %{mozappdir}/browser/blocklist.xml %dir %{mozappdir}/browser/extensions %{mozappdir}/browser/extensions/* @@ -783,6 +768,9 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || : #--------------------------------------------------------------------- %changelog +* Tue Sep 6 2016 Martin Stransky <stransky@redhat.com> - 49.0-1 +- Update to Firefox 49 + * Mon Aug 22 2016 Jan Horak <jhorak@redhat.com> - 48.0.1-2 - Added translations for .desktop file actions diff --git a/mozilla-1225044.patch b/mozilla-1225044.patch deleted file mode 100644 index 19b6d90..0000000 --- a/mozilla-1225044.patch +++ /dev/null @@ -1,125 +0,0 @@ -diff -up firefox-48.0/widget/gtk/nsWindow.cpp.1225044 firefox-48.0/widget/gtk/nsWindow.cpp ---- firefox-48.0/widget/gtk/nsWindow.cpp.1225044 2016-08-17 11:49:31.675792661 +0200 -+++ firefox-48.0/widget/gtk/nsWindow.cpp 2016-08-17 11:51:49.773545394 +0200 -@@ -216,6 +216,9 @@ static gboolean window_state_event_cb - static void theme_changed_cb (GtkSettings *settings, - GParamSpec *pspec, - nsWindow *data); -+static void check_resize_cb (GtkContainer* container, -+ gpointer user_data); -+ - #if (MOZ_WIDGET_GTK == 3) - static void scale_changed_cb (GtkWidget* widget, - GParamSpec* aPSpec, -@@ -472,6 +475,8 @@ nsWindow::nsWindow() - #if GTK_CHECK_VERSION(3,4,0) - mLastScrollEventTime = GDK_CURRENT_TIME; - #endif -+ -+ mPendingConfigures = 0; - } - - nsWindow::~nsWindow() -@@ -2413,6 +2418,8 @@ nsWindow::OnConfigureEvent(GtkWidget *aW - LOG(("configure event [%p] %d %d %d %d\n", (void *)this, - aEvent->x, aEvent->y, aEvent->width, aEvent->height)); - -+ mPendingConfigures--; -+ - LayoutDeviceIntRect screenBounds; - GetScreenBounds(screenBounds); - -@@ -3403,6 +3410,12 @@ nsWindow::OnDPIChanged() - } - - void -+nsWindow::OnCheckResize() -+{ -+ mPendingConfigures++; -+} -+ -+void - nsWindow::DispatchDragEvent(EventMessage aMsg, const LayoutDeviceIntPoint& aRefPoint, - guint aTime) - { -@@ -3858,6 +3871,8 @@ nsWindow::Create(nsIWidget* aParent, - G_CALLBACK(delete_event_cb), nullptr); - g_signal_connect(mShell, "window_state_event", - G_CALLBACK(window_state_event_cb), nullptr); -+ g_signal_connect(mShell, "check-resize", -+ G_CALLBACK(check_resize_cb), nullptr); - - GtkSettings* default_settings = gtk_settings_get_default(); - g_signal_connect_after(default_settings, -@@ -4177,7 +4192,31 @@ nsWindow::NativeShow(bool aAction) - } - else { - if (mIsTopLevel) { -- gtk_widget_hide(GTK_WIDGET(mShell)); -+ // Workaround window freezes on GTK versions before 3.21.2 by -+ // ensuring that configure events get dispatched to windows before -+ // they are unmapped. See bug 1225044. -+ if (gtk_check_version(3, 21, 2) != nullptr && mPendingConfigures > 0) { -+ GtkAllocation allocation; -+ gtk_widget_get_allocation(GTK_WIDGET(mShell), &allocation); -+ -+ GdkEventConfigure event; -+ PodZero(&event); -+ event.type = GDK_CONFIGURE; -+ event.window = mGdkWindow; -+ event.send_event = TRUE; -+ event.x = allocation.x; -+ event.y = allocation.y; -+ event.width = allocation.width; -+ event.height = allocation.height; -+ -+ auto shellClass = GTK_WIDGET_GET_CLASS(mShell); -+ for (int i = 0; i < mPendingConfigures; i++) { -+ Unused << shellClass->configure_event(mShell, &event); -+ } -+ mPendingConfigures = 0; -+ } -+ -+ gtk_widget_hide(mShell); - - ClearTransparencyBitmap(); // Release some resources - } -@@ -6028,6 +6067,16 @@ theme_changed_cb (GtkSettings *settings, - window->ThemeChanged(); - } - -+static void -+check_resize_cb (GtkContainer* container, gpointer user_data) -+{ -+ RefPtr<nsWindow> window = get_window_for_gtk_widget(GTK_WIDGET(container)); -+ if (!window) { -+ return; -+ } -+ window->OnCheckResize(); -+} -+ - #if (MOZ_WIDGET_GTK == 3) - static void - scale_changed_cb (GtkWidget* widget, GParamSpec* aPSpec, gpointer aPointer) -diff -up firefox-48.0/widget/gtk/nsWindow.h.1225044 firefox-48.0/widget/gtk/nsWindow.h ---- firefox-48.0/widget/gtk/nsWindow.h.1225044 2016-07-25 22:22:07.000000000 +0200 -+++ firefox-48.0/widget/gtk/nsWindow.h 2016-08-17 11:50:55.274248334 +0200 -@@ -254,6 +254,7 @@ public: - - void ThemeChanged(void); - void OnDPIChanged(void); -+ void OnCheckResize(void); - - #ifdef MOZ_X11 - Window mOldFocusWindow; -@@ -463,6 +464,10 @@ private: - RefPtr<nsShmImage> mBackShmImage; - #endif - -+ // Upper bound on pending ConfigureNotify events to be dispatched to the -+ // window. See bug 1225044. -+ int mPendingConfigures; -+ - #ifdef ACCESSIBILITY - RefPtr<mozilla::a11y::Accessible> mRootAccessible; - diff --git a/mozilla-1245783.patch b/mozilla-1245783.patch deleted file mode 100644 index 3452616..0000000 --- a/mozilla-1245783.patch +++ /dev/null @@ -1,17 +0,0 @@ -# Remove when mozbz#1269319 lands - ---- firefox-45.0.1-orig/js/src/Makefile.in 2016-05-17 14:53:58.753178403 +0200 -+++ firefox-45.0.1/js/src/Makefile.in 2016-05-17 14:53:28.432817862 +0200 -@@ -144,6 +144,11 @@ distclean:: - - CFLAGS += $(MOZ_ZLIB_CFLAGS) - -+# Avoid GNU gcc bug #70526 -+# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70526#c14 -+CFLAGS += -fno-schedule-insns2 -+CXXFLAGS += -fno-schedule-insns2 -+ - # Silence warnings on AIX/HP-UX from non-GNU compilers - ifndef GNU_CC - ifeq ($(OS_ARCH),AIX) - diff --git a/mozilla-1270046.patch b/mozilla-1270046.patch deleted file mode 100644 index 16c6b45..0000000 --- a/mozilla-1270046.patch +++ /dev/null @@ -1,12 +0,0 @@ ---- firefox-46.0.1/extensions/auth/nsAuthSambaNTLM.cpp.rhbz-1173156 2016-05-03 06:31:11.000000000 +0100 -+++ firefox-46.0.1/extensions/auth/nsAuthSambaNTLM.cpp 2016-05-04 10:18:53.157429123 +0100 -@@ -256,7 +256,8 @@ nsAuthSambaNTLM::GetNextToken(const void - nsCString line; - if (!ReadLine(mFromChildFD, line)) - return NS_ERROR_FAILURE; -- if (!StringBeginsWith(line, NS_LITERAL_CSTRING("KK "))) { -+ if (!StringBeginsWith(line, NS_LITERAL_CSTRING("KK ")) && -+ !StringBeginsWith(line, NS_LITERAL_CSTRING("AF "))) { - // Something went wrong. Perhaps no credentials are accessible. - return NS_ERROR_FAILURE; - } diff --git a/mozilla-1272332.patch b/mozilla-1272332.patch deleted file mode 100644 index 7aad4bd..0000000 --- a/mozilla-1272332.patch +++ /dev/null @@ -1,54 +0,0 @@ -diff -up firefox-48.0/modules/libpref/init/all.js.orig firefox-48.0/modules/libpref/init/all.js ---- firefox-48.0/modules/libpref/init/all.js.orig 2016-07-25 22:22:05.000000000 +0200 -+++ firefox-48.0/modules/libpref/init/all.js 2016-07-28 13:14:39.065888837 +0200 -@@ -4497,6 +4497,7 @@ pref("gfx.apitrace.enabled",false); - pref("gfx.content.use-native-pushlayer", true); - #ifdef MOZ_WIDGET_GTK - pref("gfx.xrender.enabled",false); -+pref("widget.allow-gtk-dark-theme", false); - #endif - #endif - -diff -up firefox-48.0/widget/gtk/nsLookAndFeel.cpp.orig firefox-48.0/widget/gtk/nsLookAndFeel.cpp ---- firefox-48.0/widget/gtk/nsLookAndFeel.cpp.orig 2016-06-01 06:11:44.000000000 +0200 -+++ firefox-48.0/widget/gtk/nsLookAndFeel.cpp 2016-07-28 13:58:35.645067880 +0200 -@@ -28,6 +28,7 @@ - #include <dlfcn.h> - - #include "mozilla/gfx/2D.h" -+#include "mozilla/Preferences.h" - - #if MOZ_WIDGET_GTK != 2 - #include <cairo-gobject.h> -@@ -1097,16 +1098,22 @@ 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); - -- if (dark) { -- g_object_set(settings, dark_setting, FALSE, nullptr); -+ bool isContentProcess = XRE_IsContentProcess(); -+ bool allowDarkTheme = mozilla::Preferences::GetBool("widget.allow-gtk-dark-theme", false); -+ -+ if (isContentProcess || !allowDarkTheme) { -+ // 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); -+ -+ if (dark) { -+ g_object_set(settings, dark_setting, FALSE, nullptr); -+ } - } - - GtkWidgetPath *path = gtk_widget_path_new(); diff --git a/mozilla-1282843.patch b/mozilla-1282843.patch deleted file mode 100644 index d30642c..0000000 --- a/mozilla-1282843.patch +++ /dev/null @@ -1,24 +0,0 @@ -Add ability to specify system paths to @old_configure_options - ---- a/build/moz.configure/old.configure 2016-07-04 12:03:37.503301144 -0400 -+++ b/build/moz.configure/old.configure 2016-07-04 12:04:33.443147224 -0400 -@@ -149,16 +149,19 @@ - def all_options(help): - return list(options) - - return depends(prepare_configure, extra_old_configure_args, all_options, - *options) - - - @old_configure_options( -+ '--libdir', -+ '--includedir', -+ '--datadir', - '--cache-file', - '--enable-accessibility', - '--enable-address-sanitizer', - '--enable-alsa', - '--enable-android-omx', - '--enable-android-resource-constrained', - '--enable-approximate-location', - '--enable-b2g-bt', diff --git a/mozilla-1291700.patch b/mozilla-1291700.patch deleted file mode 100644 index 0b0b3ba..0000000 --- a/mozilla-1291700.patch +++ /dev/null @@ -1,93 +0,0 @@ -# HG changeset patch -# User Honza Bambas <honzab.moz@firemni.cz> -# Parent 069612b7e7c93f79394fc40bc24c1e354de7a3e5 -Bug 1291700 - Allow negotiate/ntml to work when in the 'Never remember history' mode, r=jduell - -diff --git a/extensions/auth/nsHttpNegotiateAuth.cpp b/extensions/auth/nsHttpNegotiateAuth.cpp ---- a/extensions/auth/nsHttpNegotiateAuth.cpp -+++ b/extensions/auth/nsHttpNegotiateAuth.cpp -@@ -60,17 +60,37 @@ static const char kNegotiateAuthSSPI[] = - //----------------------------------------------------------------------------- - - // Return false when the channel comes from a Private browsing window. - static bool - TestNotInPBMode(nsIHttpAuthenticableChannel *authChannel) - { - nsCOMPtr<nsIChannel> bareChannel = do_QueryInterface(authChannel); - MOZ_ASSERT(bareChannel); -- return !NS_UsePrivateBrowsing(bareChannel); -+ -+ if (!NS_UsePrivateBrowsing(bareChannel)) { -+ return true; -+ } -+ -+ nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID); -+ if (!prefs) { -+ return true; -+ } -+ -+ // When the "Never remember history" option is set, all channels are -+ // set PB mode flag, but here we want to make an exception, users -+ // want their credentials go out. -+ bool dontRememberHistory; -+ if (NS_SUCCEEDED(prefs->GetBoolPref("browser.privatebrowsing.autostart", -+ &dontRememberHistory)) && -+ dontRememberHistory) { -+ return true; -+ } -+ -+ return false; - } - - NS_IMETHODIMP - nsHttpNegotiateAuth::GetAuthFlags(uint32_t *flags) - { - // - // Negotiate Auth creds should not be reused across multiple requests. - // Only perform the negotiation when it is explicitly requested by the -diff --git a/netwerk/protocol/http/nsHttpNTLMAuth.cpp b/netwerk/protocol/http/nsHttpNTLMAuth.cpp ---- a/netwerk/protocol/http/nsHttpNTLMAuth.cpp -+++ b/netwerk/protocol/http/nsHttpNTLMAuth.cpp -@@ -182,28 +182,38 @@ ForceGenericNTLM() - return flag; - } - - // Check to see if we should use default credentials for this host or proxy. - static bool - CanUseDefaultCredentials(nsIHttpAuthenticableChannel *channel, - bool isProxyAuth) - { -+ nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID); -+ - // Prevent using default credentials for authentication when we are in the - // private browsing mode. It would cause a privacy data leak. - nsCOMPtr<nsIChannel> bareChannel = do_QueryInterface(channel); - MOZ_ASSERT(bareChannel); -+ - if (NS_UsePrivateBrowsing(bareChannel)) { -+ // But allow when in the "Never remember history" mode. -+ bool dontRememberHistory; -+ if (prefs && -+ NS_SUCCEEDED(prefs->GetBoolPref("browser.privatebrowsing.autostart", -+ &dontRememberHistory)) && -+ !dontRememberHistory) { -+ return false; -+ } -+ } -+ -+ if (!prefs) { - return false; - } - -- nsCOMPtr<nsIPrefBranch> prefs = do_GetService(NS_PREFSERVICE_CONTRACTID); -- if (!prefs) -- return false; -- - if (isProxyAuth) { - bool val; - if (NS_FAILED(prefs->GetBoolPref(kAllowProxies, &val))) - val = false; - LOG(("Default credentials allowed for proxy: %d\n", val)); - return val; - } - diff --git a/mozilla-440908.patch b/mozilla-440908.patch index acebd7f..ec41ab3 100644 --- a/mozilla-440908.patch +++ b/mozilla-440908.patch @@ -1,7 +1,7 @@ -diff -up firefox-47.0/modules/libpref/prefapi.cpp.440908 firefox-47.0/modules/libpref/prefapi.cpp ---- firefox-47.0/modules/libpref/prefapi.cpp.440908 2016-06-01 17:17:19.723700226 +0200 -+++ firefox-47.0/modules/libpref/prefapi.cpp 2016-06-01 17:21:05.839971471 +0200 -@@ -947,8 +947,8 @@ void PREF_ReaderCallback(void *clo +diff -up firefox-49.0/modules/libpref/prefapi.cpp.440908 firefox-49.0/modules/libpref/prefapi.cpp +--- firefox-49.0/modules/libpref/prefapi.cpp.440908 2016-07-25 22:22:05.000000000 +0200 ++++ firefox-49.0/modules/libpref/prefapi.cpp 2016-09-08 11:45:51.283206722 +0200 +@@ -971,8 +971,8 @@ void PREF_ReaderCallback(void *clo PrefValue value, PrefType type, bool isDefault, @@ -12,16 +12,16 @@ diff -up firefox-47.0/modules/libpref/prefapi.cpp.440908 firefox-47.0/modules/li { uint32_t flags = 0; if (isDefault) { -@@ -960,4 +960,6 @@ void PREF_ReaderCallback(void *clo +@@ -984,4 +984,6 @@ void PREF_ReaderCallback(void *clo flags |= kPrefForceSet; } pref_HashPref(pref, value, type, flags); + if (isLocked) + PREF_LockPref(pref, true); } -diff -up firefox-47.0/modules/libpref/prefapi.h.440908 firefox-47.0/modules/libpref/prefapi.h ---- firefox-47.0/modules/libpref/prefapi.h.440908 2016-06-01 06:11:44.000000000 +0200 -+++ firefox-47.0/modules/libpref/prefapi.h 2016-06-01 17:17:19.723700226 +0200 +diff -up firefox-49.0/modules/libpref/prefapi.h.440908 firefox-49.0/modules/libpref/prefapi.h +--- firefox-49.0/modules/libpref/prefapi.h.440908 2016-06-01 06:11:44.000000000 +0200 ++++ firefox-49.0/modules/libpref/prefapi.h 2016-09-08 11:45:51.283206722 +0200 @@ -243,7 +243,8 @@ void PREF_ReaderCallback( void *closure, PrefValue value, PrefType type, @@ -32,9 +32,9 @@ diff -up firefox-47.0/modules/libpref/prefapi.h.440908 firefox-47.0/modules/libp #ifdef __cplusplus } -diff -up firefox-47.0/modules/libpref/prefread.cpp.440908 firefox-47.0/modules/libpref/prefread.cpp ---- firefox-47.0/modules/libpref/prefread.cpp.440908 2016-06-01 06:11:44.000000000 +0200 -+++ firefox-47.0/modules/libpref/prefread.cpp 2016-06-01 17:29:47.017596668 +0200 +diff -up firefox-49.0/modules/libpref/prefread.cpp.440908 firefox-49.0/modules/libpref/prefread.cpp +--- firefox-49.0/modules/libpref/prefread.cpp.440908 2016-09-05 22:12:58.000000000 +0200 ++++ firefox-49.0/modules/libpref/prefread.cpp 2016-09-08 11:45:51.284206727 +0200 @@ -43,6 +43,7 @@ enum { #define BITS_PER_HEX_DIGIT 4 @@ -43,7 +43,7 @@ diff -up firefox-47.0/modules/libpref/prefread.cpp.440908 firefox-47.0/modules/l static const char kPref[] = "pref"; static const char kPrefSticky[] = "sticky_pref"; static const char kTrue[] = "true"; -@@ -131,7 +132,7 @@ pref_DoCallback(PrefParseState *ps) +@@ -146,7 +147,7 @@ pref_DoCallback(PrefParseState *ps) break; } (*ps->reader)(ps->closure, ps->lb, value, ps->vtype, ps->fdefault, @@ -52,7 +52,7 @@ diff -up firefox-47.0/modules/libpref/prefread.cpp.440908 firefox-47.0/modules/l return true; } -@@ -191,6 +192,7 @@ PREF_ParseBuf(PrefParseState *ps, const +@@ -215,6 +216,7 @@ PREF_ParseBuf(PrefParseState *ps, const ps->vtype = PrefType::Invalid; ps->fdefault = false; ps->fstickydefault = false; @@ -60,7 +60,7 @@ diff -up firefox-47.0/modules/libpref/prefread.cpp.440908 firefox-47.0/modules/l } switch (c) { case '/': /* begin comment block or line? */ -@@ -201,11 +203,14 @@ PREF_ParseBuf(PrefParseState *ps, const +@@ -225,11 +227,14 @@ PREF_ParseBuf(PrefParseState *ps, const break; case 'u': /* indicating user_pref */ case 's': /* indicating sticky_pref */ @@ -75,7 +75,7 @@ diff -up firefox-47.0/modules/libpref/prefread.cpp.440908 firefox-47.0/modules/l } else { ps->smatch = kPref; } -@@ -252,8 +257,10 @@ PREF_ParseBuf(PrefParseState *ps, const +@@ -277,8 +282,10 @@ PREF_ParseBuf(PrefParseState *ps, const /* name parsing */ case PREF_PARSE_UNTIL_NAME: if (c == '\"' || c == '\'') { @@ -87,9 +87,9 @@ diff -up firefox-47.0/modules/libpref/prefread.cpp.440908 firefox-47.0/modules/l ps->quotechar = c; ps->nextstate = PREF_PARSE_UNTIL_COMMA; /* return here when done */ state = PREF_PARSE_QUOTED_STRING; -diff -up firefox-47.0/modules/libpref/prefread.h.440908 firefox-47.0/modules/libpref/prefread.h ---- firefox-47.0/modules/libpref/prefread.h.440908 2016-06-01 06:11:44.000000000 +0200 -+++ firefox-47.0/modules/libpref/prefread.h 2016-06-01 17:30:32.310651004 +0200 +diff -up firefox-49.0/modules/libpref/prefread.h.440908 firefox-49.0/modules/libpref/prefread.h +--- firefox-49.0/modules/libpref/prefread.h.440908 2016-09-05 22:12:58.000000000 +0200 ++++ firefox-49.0/modules/libpref/prefread.h 2016-09-08 11:57:09.485889976 +0200 @@ -34,7 +34,8 @@ typedef void (*PrefReader)(void *c PrefValue val, PrefType type, @@ -98,9 +98,9 @@ diff -up firefox-47.0/modules/libpref/prefread.h.440908 firefox-47.0/modules/lib + bool stickyPref, + bool lockPref); - /* structure fields are private */ - typedef struct PrefParseState { -@@ -56,6 +57,7 @@ typedef struct PrefParseState { + /** + * Report any errors or warnings we encounter during parsing. +@@ -62,6 +63,7 @@ typedef struct PrefParseState { PrefType vtype; /* PREF_STRING,INT,BOOL */ bool fdefault; /* true if (default) pref */ bool fstickydefault; /* true if (sticky) pref */ @@ -108,3 +108,12 @@ diff -up firefox-47.0/modules/libpref/prefread.h.440908 firefox-47.0/modules/lib } PrefParseState; /** +@@ -90,7 +92,7 @@ void PREF_InitParseState(PrefParseState + * + * @param ps + * PrefParseState instance. +- */ ++ */ + void PREF_FinalizeParseState(PrefParseState *ps); + + /** diff --git a/mozilla-890908-async-nego.patch b/mozilla-890908-async-nego.patch index 9a8ec77..65ec42c 100644 --- a/mozilla-890908-async-nego.patch +++ b/mozilla-890908-async-nego.patch @@ -125,7 +125,7 @@ diff -up firefox-48.0/extensions/auth/nsHttpNegotiateAuth.cpp.890908-async-nego +// This runnable is created by GenerateCredentialsAsync and it runs +// in nsHttpNegotiateAuth::mNegotiateThread and calling GenerateCredentials. +// -+class GetNextTokenRunnable final : public nsRunnable ++class GetNextTokenRunnable final : public mozilla::Runnable +{ + virtual ~GetNextTokenRunnable() {} + public: @@ -1,2 +1,2 @@ -892a534ca51f5d21d658d1d1fc08e8c5 firefox-langpacks-48.0.1-20160819.tar.xz -8c09b6cbf13ce13aa57d87175da997f4 firefox-48.0.1.source.tar.xz +b96eda40533dbd644eb2ae7f3da9f850 firefox-49.0.source.tar.xz +f24eb2f6eb67d5609579a2baac416374 firefox-langpacks-49.0-20160906.tar.xz |