Use the system's link color when system appearance is desired for a WebView.
[WebKit-https.git] / Source / WebCore / rendering / RenderTheme.h
1 /*
2  * Copyright (C) 2005-2017 Apple Inc. All rights reserved.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  *
19  */
20
21 #pragma once
22
23 #include "ControlStates.h"
24 #include "PaintInfo.h"
25 #include "PopupMenuStyle.h"
26 #include "ScrollTypes.h"
27 #include "StyleColor.h"
28 #include "ThemeTypes.h"
29
30 namespace WebCore {
31
32 class BorderData;
33 class Element;
34 class FileList;
35 class FillLayer;
36 class HTMLInputElement;
37 class Icon;
38 class RenderAttachment;
39 class RenderBox;
40 class RenderMeter;
41 class RenderObject;
42 class RenderProgress;
43 class RenderStyle;
44 class StyleResolver;
45
46 class RenderTheme {
47 protected:
48     RenderTheme();
49
50     virtual ~RenderTheme() = default;
51
52 public:
53     // This function is to be implemented in platform-specific theme implementations to hand back the
54     // appropriate platform theme.
55     WEBCORE_EXPORT static RenderTheme& singleton();
56
57     virtual void purgeCaches() { }
58
59     // This method is called whenever style has been computed for an element and the appearance
60     // property has been set to a value other than "none".  The theme should map in all of the appropriate
61     // metrics and defaults given the contents of the style.  This includes sophisticated operations like
62     // selection of control size based off the font, the disabling of appearance when certain other properties like
63     // "border" are set, or if the appearance is not supported by the theme.
64     void adjustStyle(StyleResolver&, RenderStyle&, const Element*,  bool UAHasAppearance, const BorderData&, const FillLayer&, const Color& backgroundColor);
65
66     // This method is called to paint the widget as a background of the RenderObject.  A widget's foreground, e.g., the
67     // text of a button, is always rendered by the engine itself.  The boolean return value indicates
68     // whether the CSS border/background should also be painted.
69     bool paint(const RenderBox&, ControlStates&, const PaintInfo&, const LayoutRect&);
70     bool paintBorderOnly(const RenderBox&, const PaintInfo&, const LayoutRect&);
71     bool paintDecorations(const RenderBox&, const PaintInfo&, const LayoutRect&);
72
73     // The remaining methods should be implemented by the platform-specific portion of the theme, e.g.,
74     // RenderThemeMac.cpp for Mac OS X.
75
76     // These methods return the theme's extra style sheets rules, to let each platform
77     // adjust the default CSS rules in html.css, quirks.css, mediaControls.css, or plugIns.css
78     virtual String extraDefaultStyleSheet() { return String(); }
79     virtual String extraQuirksStyleSheet() { return String(); }
80     virtual String extraPlugInsStyleSheet() { return String(); }
81 #if ENABLE(VIDEO)
82     virtual String mediaControlsStyleSheet() { return String(); }
83     virtual String modernMediaControlsStyleSheet() { return String(); }
84     virtual String extraMediaControlsStyleSheet() { return String(); }
85     virtual String mediaControlsScript() { return String(); }
86     virtual String mediaControlsBase64StringForIconNameAndType(const String&, const String&) { return String(); }
87     virtual String mediaControlsFormattedStringForDuration(double) { return String(); }
88 #endif
89 #if ENABLE(FULLSCREEN_API)
90     virtual String extraFullScreenStyleSheet() { return String(); }
91 #endif
92 #if ENABLE(SERVICE_CONTROLS)
93     virtual String imageControlsStyleSheet() const { return String(); }
94 #endif
95
96     // A method to obtain the baseline position for a "leaf" control.  This will only be used if a baseline
97     // position cannot be determined by examining child content. Checkboxes and radio buttons are examples of
98     // controls that need to do this.
99     virtual int baselinePosition(const RenderBox&) const;
100
101     // A method for asking if a control is a container or not.  Leaf controls have to have some special behavior (like
102     // the baseline position API above).
103     bool isControlContainer(ControlPart) const;
104
105     // A method asking if the control changes its tint when the window has focus or not.
106     virtual bool controlSupportsTints(const RenderObject&) const { return false; }
107
108     // Whether or not the control has been styled enough by the author to disable the native appearance.
109     virtual bool isControlStyled(const RenderStyle&, const BorderData&, const FillLayer&, const Color& backgroundColor) const;
110
111     // A general method asking if any control tinting is supported at all.
112     virtual bool supportsControlTints() const { return false; }
113
114     // Some controls may spill out of their containers (e.g., the check on an OS X checkbox).  When these controls repaint,
115     // the theme needs to communicate this inflated rect to the engine so that it can invalidate the whole control.
116     virtual void adjustRepaintRect(const RenderObject&, FloatRect&);
117
118     // This method is called whenever a relevant state changes on a particular themed object, e.g., the mouse becomes pressed
119     // or a control becomes disabled.
120     virtual bool stateChanged(const RenderObject&, ControlStates::States) const;
121
122     // This method is called whenever the theme changes on the system in order to flush cached resources from the
123     // old theme.
124     virtual void themeChanged() { }
125
126     // A method asking if the theme is able to draw the focus ring.
127     virtual bool supportsFocusRing(const RenderStyle&) const;
128
129     // A method asking if the theme's controls actually care about redrawing when hovered.
130     virtual bool supportsHover(const RenderStyle&) const { return false; }
131
132     // A method asking if the platform is able to show datalist suggestions for a given input type.
133     virtual bool supportsDataListUI(const AtomicString&) const { return false; }
134
135     // Text selection colors.
136     Color activeSelectionBackgroundColor() const;
137     Color inactiveSelectionBackgroundColor() const;
138     Color activeSelectionForegroundColor() const;
139     Color inactiveSelectionForegroundColor() const;
140
141     // List box selection colors
142     Color activeListBoxSelectionBackgroundColor() const;
143     Color activeListBoxSelectionForegroundColor() const;
144     Color inactiveListBoxSelectionBackgroundColor(bool) const;
145     Color inactiveListBoxSelectionForegroundColor() const;
146
147     // Highlighting colors for TextMatches.
148     virtual Color platformActiveTextSearchHighlightColor() const;
149     virtual Color platformInactiveTextSearchHighlightColor() const;
150
151     virtual Color disabledTextColor(const Color& textColor, const Color& backgroundColor) const;
152
153     static Color focusRingColor(OptionSet<StyleColor::Options>);
154     virtual Color platformFocusRingColor(OptionSet<StyleColor::Options>) const { return Color(0, 0, 0); }
155     static void setCustomFocusRingColor(const Color&);
156     static float platformFocusRingWidth() { return 3; }
157     static float platformFocusRingOffset(float outlineWidth) { return std::max<float>(outlineWidth - platformFocusRingWidth(), 0); }
158 #if ENABLE(TOUCH_EVENTS)
159     static Color tapHighlightColor();
160     virtual Color platformTapHighlightColor() const;
161 #endif
162     virtual void platformColorsDidChange();
163
164     virtual Seconds caretBlinkInterval() const { return 500_ms; }
165
166     // System fonts and colors for CSS.
167     void systemFont(CSSValueID, FontCascadeDescription&) const;
168     virtual Color systemColor(CSSValueID, OptionSet<StyleColor::Options>) const;
169
170     virtual int minimumMenuListSize(const RenderStyle&) const { return 0; }
171
172     virtual void adjustSliderThumbSize(RenderStyle&, const Element*) const;
173
174     virtual LengthBox popupInternalPaddingBox(const RenderStyle&) const { return { 0, 0, 0, 0 }; }
175     virtual bool popupOptionSupportsTextIndent() const { return false; }
176     virtual PopupMenuStyle::PopupMenuSize popupMenuSize(const RenderStyle&, IntRect&) const { return PopupMenuStyle::PopupMenuSizeNormal; }
177
178     virtual ScrollbarControlSize scrollbarControlSizeForPart(ControlPart) { return RegularScrollbar; }
179
180     // Returns the repeat interval of the animation for the progress bar.
181     virtual Seconds animationRepeatIntervalForProgressBar(RenderProgress&) const;
182     // Returns the duration of the animation for the progress bar.
183     virtual Seconds animationDurationForProgressBar(RenderProgress&) const;
184     virtual IntRect progressBarRectForBounds(const RenderObject&, const IntRect&) const;
185
186 #if ENABLE(VIDEO)
187     // Media controls
188     virtual bool supportsClosedCaptioning() const { return false; }
189     virtual bool hasOwnDisabledStateHandlingFor(ControlPart) const { return false; }
190     virtual bool usesMediaControlStatusDisplay() { return false; }
191     virtual bool usesMediaControlVolumeSlider() const { return true; }
192     virtual bool usesVerticalVolumeSlider() const { return true; }
193     virtual double mediaControlsFadeInDuration() { return 0.1; }
194     virtual Seconds mediaControlsFadeOutDuration() { return 300_ms; }
195     virtual String formatMediaControlsTime(float time) const;
196     virtual String formatMediaControlsCurrentTime(float currentTime, float duration) const;
197     virtual String formatMediaControlsRemainingTime(float currentTime, float duration) const;
198     
199     // Returns the media volume slider container's offset from the mute button.
200     virtual LayoutPoint volumeSliderOffsetFromMuteButton(const RenderBox&, const LayoutSize&) const;
201 #endif
202
203 #if ENABLE(METER_ELEMENT)
204     virtual IntSize meterSizeForBounds(const RenderMeter&, const IntRect&) const;
205     virtual bool supportsMeter(ControlPart) const;
206 #endif
207
208 #if ENABLE(DATALIST_ELEMENT)
209     // Returns the threshold distance for snapping to a slider tick mark.
210     virtual LayoutUnit sliderTickSnappingThreshold() const;
211     // Returns size of one slider tick mark for a horizontal track.
212     // For vertical tracks we rotate it and use it. i.e. Width is always length along the track.
213     virtual IntSize sliderTickSize() const = 0;
214     // Returns the distance of slider tick origin from the slider track center.
215     virtual int sliderTickOffsetFromTrackCenter() const = 0;
216     void paintSliderTicks(const RenderObject&, const PaintInfo&, const IntRect&);
217 #endif
218
219     virtual bool shouldHaveSpinButton(const HTMLInputElement&) const;
220     virtual bool shouldHaveCapsLockIndicator(const HTMLInputElement&) const;
221
222     // Functions for <select> elements.
223     virtual bool delegatesMenuListRendering() const { return false; }
224     virtual bool popsMenuByArrowKeys() const { return false; }
225     virtual bool popsMenuBySpaceOrReturn() const { return false; }
226
227     virtual String fileListDefaultLabel(bool multipleFilesAllowed) const;
228     virtual String fileListNameForWidth(const FileList*, const FontCascade&, int width, bool multipleFilesAllowed) const;
229
230     enum FileUploadDecorations { SingleFile, MultipleFiles };
231     virtual bool paintFileUploadIconDecorations(const RenderObject& /*inputRenderer*/, const RenderObject& /*buttonRenderer*/, const PaintInfo&, const IntRect&, Icon*, FileUploadDecorations) { return true; }
232
233 #if ENABLE(SERVICE_CONTROLS)
234     virtual IntSize imageControlsButtonSize(const RenderObject&) const { return IntSize(); }
235     virtual IntSize imageControlsButtonPositionOffset() const { return IntSize(); }
236 #endif
237
238 #if ENABLE(ATTACHMENT_ELEMENT)
239     virtual LayoutSize attachmentIntrinsicSize(const RenderAttachment&) const { return LayoutSize(); }
240     virtual int attachmentBaseline(const RenderAttachment&) const { return -1; }
241 #endif
242
243     enum class InnerSpinButtonLayout { Vertical, HorizontalUpLeft, HorizontalUpRight };
244     virtual InnerSpinButtonLayout innerSpinButtonLayout(const RenderObject&) const { return InnerSpinButtonLayout::Vertical; }
245
246     virtual bool shouldMockBoldSystemFontForAccessibility() const { return false; }
247     virtual void setShouldMockBoldSystemFontForAccessibility(bool) { }
248
249 protected:
250     virtual FontCascadeDescription& cachedSystemFontDescription(CSSValueID systemFontID) const;
251     virtual void updateCachedSystemFontDescription(CSSValueID systemFontID, FontCascadeDescription&) const = 0;
252
253     // The platform selection color.
254     virtual Color platformActiveSelectionBackgroundColor() const;
255     virtual Color platformInactiveSelectionBackgroundColor() const;
256     virtual Color platformActiveSelectionForegroundColor() const;
257     virtual Color platformInactiveSelectionForegroundColor() const;
258
259     virtual Color platformActiveListBoxSelectionBackgroundColor() const;
260     virtual Color platformInactiveListBoxSelectionBackgroundColor(bool) const;
261     virtual Color platformActiveListBoxSelectionForegroundColor() const;
262     virtual Color platformInactiveListBoxSelectionForegroundColor() const;
263
264     virtual bool supportsSelectionForegroundColors() const { return true; }
265     virtual bool supportsListBoxSelectionForegroundColors() const { return true; }
266
267 #if !USE(NEW_THEME)
268     // Methods for each appearance value.
269     virtual void adjustCheckboxStyle(StyleResolver&, RenderStyle&, const Element*) const;
270     virtual bool paintCheckbox(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
271     virtual void setCheckboxSize(RenderStyle&) const { }
272
273     virtual void adjustRadioStyle(StyleResolver&, RenderStyle&, const Element*) const;
274     virtual bool paintRadio(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
275     virtual void setRadioSize(RenderStyle&) const { }
276
277     virtual void adjustButtonStyle(StyleResolver&, RenderStyle&, const Element*) const;
278     virtual bool paintButton(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
279     virtual void setButtonSize(RenderStyle&) const { }
280
281     virtual void adjustInnerSpinButtonStyle(StyleResolver&, RenderStyle&, const Element*) const;
282     virtual bool paintInnerSpinButton(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
283 #endif
284
285     virtual bool paintCheckboxDecorations(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
286     virtual bool paintRadioDecorations(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
287     virtual bool paintButtonDecorations(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
288
289     virtual void adjustTextFieldStyle(StyleResolver&, RenderStyle&, const Element*) const;
290     virtual bool paintTextField(const RenderObject&, const PaintInfo&, const FloatRect&) { return true; }
291     virtual bool paintTextFieldDecorations(const RenderObject&, const PaintInfo&, const FloatRect&) { return true; }
292
293     virtual void adjustTextAreaStyle(StyleResolver&, RenderStyle&, const Element*) const;
294     virtual bool paintTextArea(const RenderObject&, const PaintInfo&, const FloatRect&) { return true; }
295     virtual bool paintTextAreaDecorations(const RenderObject&, const PaintInfo&, const FloatRect&) { return true; }
296
297     virtual void adjustMenuListStyle(StyleResolver&, RenderStyle&, const Element*) const;
298     virtual bool paintMenuList(const RenderObject&, const PaintInfo&, const FloatRect&) { return true; }
299     virtual bool paintMenuListDecorations(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
300
301     virtual void adjustMenuListButtonStyle(StyleResolver&, RenderStyle&, const Element*) const;
302     virtual bool paintMenuListButtonDecorations(const RenderBox&, const PaintInfo&, const FloatRect&) { return true; }
303
304     virtual bool paintPushButtonDecorations(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
305     virtual bool paintSquareButtonDecorations(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
306
307 #if ENABLE(METER_ELEMENT)
308     virtual void adjustMeterStyle(StyleResolver&, RenderStyle&, const Element*) const;
309     virtual bool paintMeter(const RenderObject&, const PaintInfo&, const IntRect&);
310 #endif
311
312     virtual void adjustCapsLockIndicatorStyle(StyleResolver&, RenderStyle&, const Element*) const;
313     virtual bool paintCapsLockIndicator(const RenderObject&, const PaintInfo&, const IntRect&);
314
315 #if ENABLE(APPLE_PAY)
316     virtual void adjustApplePayButtonStyle(StyleResolver&, RenderStyle&, const Element*) const { }
317     virtual bool paintApplePayButton(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
318 #endif
319
320 #if ENABLE(ATTACHMENT_ELEMENT)
321     virtual void adjustAttachmentStyle(StyleResolver&, RenderStyle&, const Element*) const;
322     virtual bool paintAttachment(const RenderObject&, const PaintInfo&, const IntRect&);
323 #endif
324
325     virtual void adjustProgressBarStyle(StyleResolver&, RenderStyle&, const Element*) const;
326     virtual bool paintProgressBar(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
327
328     virtual void adjustSliderTrackStyle(StyleResolver&, RenderStyle&, const Element*) const;
329     virtual bool paintSliderTrack(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
330
331     virtual void adjustSliderThumbStyle(StyleResolver&, RenderStyle&, const Element*) const;
332     virtual bool paintSliderThumb(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
333     virtual bool paintSliderThumbDecorations(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
334
335     virtual void adjustSearchFieldStyle(StyleResolver&, RenderStyle&, const Element*) const;
336     virtual bool paintSearchField(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
337     virtual bool paintSearchFieldDecorations(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
338
339     virtual void adjustSearchFieldCancelButtonStyle(StyleResolver&, RenderStyle&, const Element*) const;
340     virtual bool paintSearchFieldCancelButton(const RenderBox&, const PaintInfo&, const IntRect&) { return true; }
341
342     virtual void adjustSearchFieldDecorationPartStyle(StyleResolver&, RenderStyle&, const Element*) const;
343     virtual bool paintSearchFieldDecorationPart(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
344
345     virtual void adjustSearchFieldResultsDecorationPartStyle(StyleResolver&, RenderStyle&, const Element*) const;
346     virtual bool paintSearchFieldResultsDecorationPart(const RenderBox&, const PaintInfo&, const IntRect&) { return true; }
347
348     virtual void adjustSearchFieldResultsButtonStyle(StyleResolver&, RenderStyle&, const Element*) const;
349     virtual bool paintSearchFieldResultsButton(const RenderBox&, const PaintInfo&, const IntRect&) { return true; }
350
351     virtual void adjustMediaControlStyle(StyleResolver&, RenderStyle&, const Element*) const;
352     virtual bool paintMediaFullscreenButton(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
353     virtual bool paintMediaPlayButton(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
354     virtual bool paintMediaOverlayPlayButton(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
355     virtual bool paintMediaMuteButton(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
356     virtual bool paintMediaSeekBackButton(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
357     virtual bool paintMediaSeekForwardButton(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
358     virtual bool paintMediaSliderTrack(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
359     virtual bool paintMediaSliderThumb(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
360     virtual bool paintMediaVolumeSliderContainer(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
361     virtual bool paintMediaVolumeSliderTrack(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
362     virtual bool paintMediaVolumeSliderThumb(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
363     virtual bool paintMediaRewindButton(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
364     virtual bool paintMediaReturnToRealtimeButton(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
365     virtual bool paintMediaToggleClosedCaptionsButton(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
366     virtual bool paintMediaControlsBackground(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
367     virtual bool paintMediaCurrentTime(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
368     virtual bool paintMediaTimeRemaining(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
369     virtual bool paintMediaFullScreenVolumeSliderTrack(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
370     virtual bool paintMediaFullScreenVolumeSliderThumb(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
371
372     virtual bool paintSnapshottedPluginOverlay(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
373
374 #if ENABLE(SERVICE_CONTROLS)
375     virtual bool paintImageControlsButton(const RenderObject&, const PaintInfo&, const IntRect&) { return true; }
376 #endif
377
378 public:
379     void updateControlStatesForRenderer(const RenderBox&, ControlStates&) const;
380     ControlStates::States extractControlStatesForRenderer(const RenderObject&) const;
381     bool isActive(const RenderObject&) const;
382     bool isChecked(const RenderObject&) const;
383     bool isIndeterminate(const RenderObject&) const;
384     bool isEnabled(const RenderObject&) const;
385     bool isFocused(const RenderObject&) const;
386     bool isPressed(const RenderObject&) const;
387     bool isSpinUpButtonPartPressed(const RenderObject&) const;
388     bool isHovered(const RenderObject&) const;
389     bool isSpinUpButtonPartHovered(const RenderObject&) const;
390     bool isReadOnlyControl(const RenderObject&) const;
391     bool isDefault(const RenderObject&) const;
392
393 private:
394     mutable Color m_activeSelectionBackgroundColor;
395     mutable Color m_inactiveSelectionBackgroundColor;
396     mutable Color m_activeSelectionForegroundColor;
397     mutable Color m_inactiveSelectionForegroundColor;
398
399     mutable Color m_activeListBoxSelectionBackgroundColor;
400     mutable Color m_inactiveListBoxSelectionBackgroundColor;
401     mutable Color m_activeListBoxSelectionForegroundColor;
402     mutable Color m_inactiveListBoxSelectionForegroundColor;
403 };
404
405 } // namespace WebCore