Bug 1464723 part 3 - Have GTK widget support scrollcorner widget. r?karlt
mix-blend-mode-parent-element-overflow-scroll.html is already broken if
the scrollbars are transparent. This patch makes the scrollcorner trans-
parent as well, which leads to failure of it on infra (where scrollbars
are opaque by default). Thus its reference is updated so that it passes
even if scrollbar is transparent.
scrollbar-vertical-rl.html has the same problem, but it seems the only
difference between test file and the reference is the background, so it
makes no sense to update the reference. Also I don't really see what
this test is really trying to check, thus I mark it failing for now.
MozReview-Commit-ID: 2vaWispPwXc
new file mode 100644
--- /dev/null
+++ b/testing/web-platform/meta/css/css-writing-modes/scrollbar-vertical-rl-ref.html.ini
@@ -0,0 +1,2 @@
+[scrollbar-vertical-rl.html]
+ expected: FAIL
--- a/testing/web-platform/tests/css/compositing/mix-blend-mode/reference/mix-blend-mode-parent-element-overflow-scroll-ref.html
+++ b/testing/web-platform/tests/css/compositing/mix-blend-mode/reference/mix-blend-mode-parent-element-overflow-scroll-ref.html
@@ -3,16 +3,17 @@
<head>
<meta charset="utf-8">
<title>CSS Reftest Reference</title>
<link rel="author" title="Mirela Budăeș" href="mailto:mbudaes@adobe.com">
<link rel="author" title="Ion Roșca" href="mailto:rosca@adobe.com">
<link rel="reviewer" title="Mihai Țică" href="mailto:mitica@adobe.com">
<style type="text/css">
.parent {
+ background: yellow;
width: 140px;
height: 140px;
position: relative;
z-index: 1;
overflow:scroll;
}
.blended {
background: lime;
--- a/widget/gtk/gtk3drawing.cpp
+++ b/widget/gtk/gtk3drawing.cpp
@@ -3251,23 +3251,30 @@ moz_gtk_widget_paint(WidgetNodeType widg
break;
case MOZ_GTK_SCROLLBAR_BUTTON:
return moz_gtk_scrollbar_button_paint(cr, rect, state,
(GtkScrollbarButtonFlags) flags,
direction);
break;
case MOZ_GTK_SCROLLBAR_HORIZONTAL:
case MOZ_GTK_SCROLLBAR_VERTICAL:
+ case MOZ_GTK_SCROLLBAR_JUNCTION:
if (flags & MOZ_GTK_TRACK_OPAQUE) {
GtkStyleContext* style =
GetStyleContext(MOZ_GTK_WINDOW, direction);
AutoAddGtkStyleProvider addStyle(style, extra_style);
gtk_render_background(style, cr,
rect->x, rect->y, rect->width, rect->height);
}
+ if (widget == MOZ_GTK_SCROLLBAR_JUNCTION) {
+ // Just draw the window background for junction for now. If we
+ // want to fully simulate what GTK+ does, we should probably
+ // also paint the junction CSS node.
+ return MOZ_GTK_SUCCESS;
+ }
if (gtk_check_version(3,20,0) == nullptr) {
return moz_gtk_scrollbar_paint(widget, cr, rect, state, direction);
} else {
WidgetNodeType trough_widget = (widget == MOZ_GTK_SCROLLBAR_HORIZONTAL) ?
MOZ_GTK_SCROLLBAR_TROUGH_HORIZONTAL : MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL;
return moz_gtk_scrollbar_trough_paint(trough_widget, cr, rect,
state, direction);
}
--- a/widget/gtk/gtkdrawing.h
+++ b/widget/gtk/gtkdrawing.h
@@ -178,16 +178,19 @@ typedef enum {
MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL,
/* Vertical GtkScrollbar counterparts */
MOZ_GTK_SCROLLBAR_VERTICAL,
MOZ_GTK_SCROLLBAR_CONTENTS_VERTICAL,
MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL,
MOZ_GTK_SCROLLBAR_THUMB_VERTICAL,
+ /* Paints the junction (scrollcorner) of a scrolled window. */
+ MOZ_GTK_SCROLLBAR_JUNCTION,
+
/* Paints a GtkScale. */
MOZ_GTK_SCALE_HORIZONTAL,
MOZ_GTK_SCALE_VERTICAL,
/* Paints a GtkScale trough. */
MOZ_GTK_SCALE_CONTENTS_HORIZONTAL,
MOZ_GTK_SCALE_CONTENTS_VERTICAL,
MOZ_GTK_SCALE_TROUGH_HORIZONTAL,
MOZ_GTK_SCALE_TROUGH_VERTICAL,
--- a/widget/gtk/nsNativeThemeGTK.cpp
+++ b/widget/gtk/nsNativeThemeGTK.cpp
@@ -428,16 +428,24 @@ nsNativeThemeGTK::GetGtkWidgetAndState(u
// When the input field of the drop down button has focus, some themes
// should draw focus for the drop down button as well.
if (aWidgetType == NS_THEME_MENULIST_BUTTON && aWidgetFlags) {
*aWidgetFlags = CheckBooleanAttr(aFrame, nsGkAtoms::parentfocused);
}
}
}
+ auto maySetOpaqueFlag = [this, aFrame, aWidgetType, aWidgetFlags]() {
+ if (GetWidgetTransparency(aFrame, aWidgetType) == eOpaque) {
+ *aWidgetFlags = MOZ_GTK_TRACK_OPAQUE;
+ } else {
+ *aWidgetFlags = 0;
+ }
+ };
+
switch (aWidgetType) {
case NS_THEME_BUTTON:
if (aWidgetFlags)
*aWidgetFlags = GTK_RELIEF_NORMAL;
aGtkWidgetType = MOZ_GTK_BUTTON;
break;
case NS_THEME_TOOLBARBUTTON:
case NS_THEME_DUALBUTTON:
@@ -455,40 +463,38 @@ nsNativeThemeGTK::GetGtkWidgetAndState(u
case NS_THEME_SCROLLBARBUTTON_UP:
case NS_THEME_SCROLLBARBUTTON_DOWN:
case NS_THEME_SCROLLBARBUTTON_LEFT:
case NS_THEME_SCROLLBARBUTTON_RIGHT:
aGtkWidgetType = MOZ_GTK_SCROLLBAR_BUTTON;
break;
case NS_THEME_SCROLLBAR_VERTICAL:
aGtkWidgetType = MOZ_GTK_SCROLLBAR_VERTICAL;
- if (GetWidgetTransparency(aFrame, aWidgetType) == eOpaque)
- *aWidgetFlags = MOZ_GTK_TRACK_OPAQUE;
- else
- *aWidgetFlags = 0;
+ maySetOpaqueFlag();
break;
case NS_THEME_SCROLLBAR_HORIZONTAL:
aGtkWidgetType = MOZ_GTK_SCROLLBAR_HORIZONTAL;
- if (GetWidgetTransparency(aFrame, aWidgetType) == eOpaque)
- *aWidgetFlags = MOZ_GTK_TRACK_OPAQUE;
- else
- *aWidgetFlags = 0;
+ maySetOpaqueFlag();
break;
case NS_THEME_SCROLLBARTRACK_HORIZONTAL:
aGtkWidgetType = MOZ_GTK_SCROLLBAR_TROUGH_HORIZONTAL;
break;
case NS_THEME_SCROLLBARTRACK_VERTICAL:
aGtkWidgetType = MOZ_GTK_SCROLLBAR_TROUGH_VERTICAL;
break;
case NS_THEME_SCROLLBARTHUMB_VERTICAL:
aGtkWidgetType = MOZ_GTK_SCROLLBAR_THUMB_VERTICAL;
break;
case NS_THEME_SCROLLBARTHUMB_HORIZONTAL:
aGtkWidgetType = MOZ_GTK_SCROLLBAR_THUMB_HORIZONTAL;
break;
+ case NS_THEME_SCROLLCORNER:
+ aGtkWidgetType = MOZ_GTK_SCROLLBAR_JUNCTION;
+ maySetOpaqueFlag();
+ break;
case NS_THEME_INNER_SPIN_BUTTON:
aGtkWidgetType = MOZ_GTK_INNER_SPIN_BUTTON;
break;
case NS_THEME_SPINNER:
aGtkWidgetType = MOZ_GTK_SPINBUTTON;
break;
case NS_THEME_SPINNER_UPBUTTON:
aGtkWidgetType = MOZ_GTK_SPINBUTTON_UP;
@@ -1971,16 +1977,17 @@ nsNativeThemeGTK::ThemeSupportsWidget(ns
case NS_THEME_SCROLLBARBUTTON_LEFT:
case NS_THEME_SCROLLBARBUTTON_RIGHT:
case NS_THEME_SCROLLBAR_HORIZONTAL:
case NS_THEME_SCROLLBAR_VERTICAL:
case NS_THEME_SCROLLBARTRACK_HORIZONTAL:
case NS_THEME_SCROLLBARTRACK_VERTICAL:
case NS_THEME_SCROLLBARTHUMB_HORIZONTAL:
case NS_THEME_SCROLLBARTHUMB_VERTICAL:
+ case NS_THEME_SCROLLCORNER:
case NS_THEME_NUMBER_INPUT:
case NS_THEME_TEXTFIELD:
case NS_THEME_TEXTFIELD_MULTILINE:
case NS_THEME_RANGE:
case NS_THEME_RANGE_THUMB:
case NS_THEME_SCALE_HORIZONTAL:
case NS_THEME_SCALETHUMB_HORIZONTAL:
case NS_THEME_SCALE_VERTICAL:
@@ -2075,16 +2082,17 @@ nsNativeThemeGTK::GetWidgetTransparency(
switch (aWidgetType) {
// These widgets always draw a default background.
case NS_THEME_MENUPOPUP:
case NS_THEME_WINDOW:
case NS_THEME_DIALOG:
return eOpaque;
case NS_THEME_SCROLLBAR_VERTICAL:
case NS_THEME_SCROLLBAR_HORIZONTAL:
+ case NS_THEME_SCROLLCORNER:
#ifdef MOZ_WIDGET_GTK
// Make scrollbar tracks opaque on the window's scroll frame to prevent
// leaf layers from overlapping. See bug 1179780.
if (!(CheckBooleanAttr(aFrame, nsGkAtoms::root_) &&
aFrame->PresContext()->IsRootContentDocument() &&
IsFrameContentNodeInNamespace(aFrame, kNameSpaceID_XUL)))
return eTransparent;
#endif