Modified: trunk/Source/WebCore/platform/gtk/RenderThemeGadget.cpp (232337 => 232338)
--- trunk/Source/WebCore/platform/gtk/RenderThemeGadget.cpp 2018-05-31 06:19:33 UTC (rev 232337)
+++ trunk/Source/WebCore/platform/gtk/RenderThemeGadget.cpp 2018-05-31 06:41:41 UTC (rev 232338)
@@ -30,6 +30,7 @@
#include "FloatRect.h"
#include "GRefPtrGtk.h"
+#include <mutex>
namespace WebCore {
@@ -72,6 +73,26 @@
gtk_widget_path_iter_add_class(path, -1, className);
}
+static GtkStyleContext* baseStyleContext()
+{
+ // Leaking here on purpose for it not to be destroyed unsafely at exit time.
+ static GtkStyleContext* baseContext;
+ static std::once_flag onceFlag;
+
+ std::call_once(onceFlag, []() {
+ GRefPtr<GtkWidgetPath> path = adoptGRef(gtk_widget_path_new());
+ gtk_widget_path_append_type(path.get(), GTK_TYPE_WINDOW);
+ gtk_widget_path_iter_set_object_name(path.get(), -1, "window");
+ gtk_widget_path_iter_add_class(path.get(), -1, GTK_STYLE_CLASS_BACKGROUND);
+
+ baseContext = gtk_style_context_new();
+ gtk_style_context_set_path(baseContext, path.get());
+ gtk_style_context_set_parent(baseContext, nullptr);
+ });
+
+ return baseContext;
+}
+
RenderThemeGadget::RenderThemeGadget(const RenderThemeGadget::Info& info, RenderThemeGadget* parent, const Vector<RenderThemeGadget::Info> siblings, unsigned position)
{
GRefPtr<GtkWidgetPath> path = parent ? adoptGRef(gtk_widget_path_copy(gtk_style_context_get_path(parent->context()))) : adoptGRef(gtk_widget_path_new());
@@ -82,7 +103,7 @@
gtk_widget_path_append_with_siblings(path.get(), siblingsPath.get(), position);
} else
appendElementToPath(path.get(), info);
- m_context = createStyleContext(path.get(), parent ? parent->context() : nullptr);
+ m_context = createStyleContext(path.get(), parent ? parent->context() : baseStyleContext());
}
RenderThemeGadget::~RenderThemeGadget() = default;
Modified: trunk/Source/WebCore/rendering/RenderThemeGtk.cpp (232337 => 232338)
--- trunk/Source/WebCore/rendering/RenderThemeGtk.cpp 2018-05-31 06:19:33 UTC (rev 232337)
+++ trunk/Source/WebCore/rendering/RenderThemeGtk.cpp 2018-05-31 06:41:41 UTC (rev 232338)
@@ -493,8 +493,53 @@
}
#endif // GTK_CHECK_VERSION(3, 20, 0)
-void RenderThemeGtk::adjustButtonStyle(StyleResolver&, RenderStyle& style, const Element*) const
+enum StyleColorType { StyleColorBackground, StyleColorForeground };
+
+#if GTK_CHECK_VERSION(3, 20, 0)
+static Color styleColor(RenderThemePart themePart, GtkStateFlags state, StyleColorType colorType)
{
+ RenderThemeGadget* gadget = nullptr;
+ switch (themePart) {
+ default:
+ ASSERT_NOT_REACHED();
+ FALLTHROUGH;
+ case Entry:
+ gadget = &static_cast<RenderThemeEntry&>(RenderThemeWidget::getOrCreate(RenderThemeWidget::Type::Entry)).entry();
+ break;
+ case EntrySelection:
+ gadget = static_cast<RenderThemeEntry&>(RenderThemeWidget::getOrCreate(RenderThemeWidget::Type::SelectedEntry)).selection();
+ break;
+ case ListBox:
+ gadget = &static_cast<RenderThemeListView&>(RenderThemeWidget::getOrCreate(RenderThemeWidget::Type::ListView)).treeview();
+ break;
+ case Button:
+ gadget = &static_cast<RenderThemeButton&>(RenderThemeWidget::getOrCreate(RenderThemeWidget::Type::Button)).button();
+ break;
+ }
+
+ ASSERT(gadget);
+ gadget->setState(state);
+ return colorType == StyleColorBackground ? gadget->backgroundColor() : gadget->color();
+}
+#else
+static Color styleColor(RenderThemePart themePart, GtkStateFlags state, StyleColorType colorType)
+{
+ GRefPtr<GtkStyleContext> context = createStyleContext(themePart);
+ gtk_style_context_set_state(context.get(), state);
+
+ GdkRGBA gdkRGBAColor;
+ if (colorType == StyleColorBackground)
+ gtk_style_context_get_background_color(context.get(), state, &gdkRGBAColor);
+ else
+ gtk_style_context_get_color(context.get(), state, &gdkRGBAColor);
+ return gdkRGBAColor;
+}
+#endif // GTK_CHECK_VERSION(3, 20, 0)
+
+void RenderThemeGtk::adjustButtonStyle(StyleResolver&, RenderStyle& style, const Element* element) const
+{
+ if (element)
+ style.setColor(styleColor(Button, element->isDisabledFormControl() ? GTK_STATE_FLAG_INSENSITIVE : GTK_STATE_FLAG_NORMAL, StyleColorForeground));
// Some layout tests check explicitly that buttons ignore line-height.
if (style.appearance() == PushButtonPart)
style.setLineHeight(RenderStyle::initialLineHeight());
@@ -945,6 +990,9 @@
void RenderThemeGtk::adjustTextFieldStyle(StyleResolver&, RenderStyle& style, const Element* element) const
{
+ if (element)
+ style.setColor(styleColor(Entry, element->isDisabledFormControl() ? GTK_STATE_FLAG_INSENSITIVE : GTK_STATE_FLAG_NORMAL, StyleColorForeground));
+
if (!is<HTMLInputElement>(element) || !shouldHaveSpinButton(downcast<HTMLInputElement>(*element)))
return;
@@ -1081,6 +1129,12 @@
}
#endif
+void RenderThemeGtk::adjustTextAreaStyle(StyleResolver&, RenderStyle& style, const Element* element) const
+{
+ if (element)
+ style.setColor(styleColor(Entry, element->isDisabledFormControl() ? GTK_STATE_FLAG_INSENSITIVE : GTK_STATE_FLAG_NORMAL, StyleColorForeground));
+}
+
bool RenderThemeGtk::paintTextArea(const RenderObject& o, const PaintInfo& i, const FloatRect& r)
{
return paintTextField(o, i, r);
@@ -1200,8 +1254,10 @@
}
#endif // GTK_CHECK_VERSION(3, 20, 0)
-void RenderThemeGtk::adjustSearchFieldStyle(StyleResolver&, RenderStyle& style, const Element*) const
+void RenderThemeGtk::adjustSearchFieldStyle(StyleResolver&, RenderStyle& style, const Element* element) const
{
+ if (element)
+ style.setColor(styleColor(Entry, element->isDisabledFormControl() ? GTK_STATE_FLAG_INSENSITIVE : GTK_STATE_FLAG_NORMAL, StyleColorForeground));
// We cannot give a proper rendering when border radius is active, unfortunately.
style.resetBorderRadius();
style.setLineHeight(RenderStyle::initialLineHeight());
@@ -1673,49 +1729,6 @@
return 500_us * time;
}
-enum StyleColorType { StyleColorBackground, StyleColorForeground };
-
-#if GTK_CHECK_VERSION(3, 20, 0)
-static Color styleColor(RenderThemePart themePart, GtkStateFlags state, StyleColorType colorType)
-{
- RenderThemeGadget* gadget = nullptr;
- switch (themePart) {
- default:
- ASSERT_NOT_REACHED();
- FALLTHROUGH;
- case Entry:
- gadget = &static_cast<RenderThemeEntry&>(RenderThemeWidget::getOrCreate(RenderThemeWidget::Type::Entry)).entry();
- break;
- case EntrySelection:
- gadget = static_cast<RenderThemeEntry&>(RenderThemeWidget::getOrCreate(RenderThemeWidget::Type::SelectedEntry)).selection();
- break;
- case ListBox:
- gadget = &static_cast<RenderThemeListView&>(RenderThemeWidget::getOrCreate(RenderThemeWidget::Type::ListView)).treeview();
- break;
- case Button:
- gadget = &static_cast<RenderThemeButton&>(RenderThemeWidget::getOrCreate(RenderThemeWidget::Type::Button)).button();
- break;
- }
-
- ASSERT(gadget);
- gadget->setState(state);
- return colorType == StyleColorBackground ? gadget->backgroundColor() : gadget->color();
-}
-#else
-static Color styleColor(RenderThemePart themePart, GtkStateFlags state, StyleColorType colorType)
-{
- GRefPtr<GtkStyleContext> context = createStyleContext(themePart);
- gtk_style_context_set_state(context.get(), state);
-
- GdkRGBA gdkRGBAColor;
- if (colorType == StyleColorBackground)
- gtk_style_context_get_background_color(context.get(), state, &gdkRGBAColor);
- else
- gtk_style_context_get_color(context.get(), state, &gdkRGBAColor);
- return gdkRGBAColor;
-}
-#endif // GTK_CHECK_VERSION(3, 20, 0)
-
Color RenderThemeGtk::platformActiveSelectionBackgroundColor() const
{
return styleColor(EntrySelection, static_cast<GtkStateFlags>(GTK_STATE_FLAG_SELECTED | GTK_STATE_FLAG_FOCUSED), StyleColorBackground);
Modified: trunk/Source/WebCore/rendering/RenderThemeGtk.h (232337 => 232338)
--- trunk/Source/WebCore/rendering/RenderThemeGtk.h 2018-05-31 06:19:33 UTC (rev 232337)
+++ trunk/Source/WebCore/rendering/RenderThemeGtk.h 2018-05-31 06:41:41 UTC (rev 232338)
@@ -118,6 +118,8 @@
void adjustTextFieldStyle(StyleResolver&, RenderStyle&, const Element*) const override;
bool paintTextField(const RenderObject&, const PaintInfo&, const FloatRect&) override;
+
+ void adjustTextAreaStyle(StyleResolver&, RenderStyle&, const Element*) const override;
bool paintTextArea(const RenderObject&, const PaintInfo&, const FloatRect&) override;
LengthBox popupInternalPaddingBox(const RenderStyle&) const override;