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