Improve use of NeverDestroyed
[WebKit-https.git] / Source / WebCore / rendering / RenderThemeMac.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 #if PLATFORM(MAC)
24
25 #import "RenderThemeCocoa.h"
26 #import <wtf/RetainPtr.h>
27 #import <wtf/HashMap.h>
28
29 #if ENABLE(SERVICE_CONTROLS)
30 OBJC_CLASS NSServicesRolloverButtonCell;
31 #endif
32
33 OBJC_CLASS WebCoreRenderThemeNotificationObserver;
34
35 namespace WebCore {
36
37 class RenderProgress;
38 class RenderStyle;
39
40 struct AttachmentLayout;
41
42 class RenderThemeMac final : public RenderThemeCocoa {
43 public:
44     friend NeverDestroyed<RenderThemeMac>;
45
46     // A method asking if the control changes its tint when the window has focus or not.
47     bool controlSupportsTints(const RenderObject&) const final;
48
49     // A general method asking if any control tinting is supported at all.
50     bool supportsControlTints() const final { return true; }
51
52     void adjustRepaintRect(const RenderObject&, FloatRect&) final;
53
54     bool isControlStyled(const RenderStyle&, const BorderData&, const FillLayer&, const Color& backgroundColor) const final;
55
56     Color platformActiveSelectionBackgroundColor() const final;
57     Color platformInactiveSelectionBackgroundColor() const final;
58     Color platformActiveListBoxSelectionBackgroundColor() const final;
59     Color platformActiveListBoxSelectionForegroundColor() const final;
60     Color platformInactiveListBoxSelectionBackgroundColor() const final;
61     Color platformInactiveListBoxSelectionForegroundColor() const final;
62     Color platformFocusRingColor() const final;
63
64     ScrollbarControlSize scrollbarControlSizeForPart(ControlPart) final { return SmallScrollbar; }
65
66     void platformColorsDidChange() final;
67
68     int minimumMenuListSize(const RenderStyle&) const final;
69
70     void adjustSliderThumbSize(RenderStyle&, const Element*) const final;
71
72 #if ENABLE(DATALIST_ELEMENT)
73     IntSize sliderTickSize() const final;
74     int sliderTickOffsetFromTrackCenter() const final;
75 #endif
76
77     LengthBox popupInternalPaddingBox(const RenderStyle&) const final;
78     PopupMenuStyle::PopupMenuSize popupMenuSize(const RenderStyle&, IntRect&) const final;
79
80     bool popsMenuByArrowKeys() const final { return true; }
81
82 #if ENABLE(METER_ELEMENT)
83     IntSize meterSizeForBounds(const RenderMeter&, const IntRect&) const final;
84     bool paintMeter(const RenderObject&, const PaintInfo&, const IntRect&) final;
85     bool supportsMeter(ControlPart) const final;
86 #endif
87
88     // Returns the repeat interval of the animation for the progress bar.
89     Seconds animationRepeatIntervalForProgressBar(RenderProgress&) const final;
90     // Returns the duration of the animation for the progress bar.
91     double animationDurationForProgressBar(RenderProgress&) const final;
92     IntRect progressBarRectForBounds(const RenderObject&, const IntRect&) const final;
93
94     // Controls color values returned from platformFocusRingColor(). systemColor() will be used when false.
95     bool usesTestModeFocusRingColor() const;
96     // A view associated to the contained document.
97     NSView* documentViewFor(const RenderObject&) const;
98
99 private:
100     RenderThemeMac();
101
102     // System fonts.
103     void updateCachedSystemFontDescription(CSSValueID, FontCascadeDescription&) const final;
104
105 #if ENABLE(VIDEO)
106     // Media controls
107     String mediaControlsStyleSheet() final;
108     String modernMediaControlsStyleSheet() final;
109     String mediaControlsScript() final;
110     String mediaControlsBase64StringForIconNameAndType(const String&, const String&) final;
111 #endif
112
113 #if ENABLE(SERVICE_CONTROLS)
114     String imageControlsStyleSheet() const final;
115 #endif
116
117     bool supportsSelectionForegroundColors() const final { return false; }
118
119     bool paintTextField(const RenderObject&, const PaintInfo&, const FloatRect&) final;
120     void adjustTextFieldStyle(StyleResolver&, RenderStyle&, const Element*) const final;
121
122     bool paintTextArea(const RenderObject&, const PaintInfo&, const FloatRect&) final;
123     void adjustTextAreaStyle(StyleResolver&, RenderStyle&, const Element*) const final;
124
125     bool paintMenuList(const RenderObject&, const PaintInfo&, const FloatRect&) final;
126     void adjustMenuListStyle(StyleResolver&, RenderStyle&, const Element*) const final;
127
128     bool paintMenuListButtonDecorations(const RenderBox&, const PaintInfo&, const FloatRect&) final;
129     void adjustMenuListButtonStyle(StyleResolver&, RenderStyle&, const Element*) const final;
130
131     void adjustProgressBarStyle(StyleResolver&, RenderStyle&, const Element*) const final;
132     bool paintProgressBar(const RenderObject&, const PaintInfo&, const IntRect&) final;
133
134     bool paintSliderTrack(const RenderObject&, const PaintInfo&, const IntRect&) final;
135     void adjustSliderTrackStyle(StyleResolver&, RenderStyle&, const Element*) const final;
136
137     bool paintSliderThumb(const RenderObject&, const PaintInfo&, const IntRect&) final;
138     void adjustSliderThumbStyle(StyleResolver&, RenderStyle&, const Element*) const final;
139
140     bool paintSearchField(const RenderObject&, const PaintInfo&, const IntRect&) final;
141     void adjustSearchFieldStyle(StyleResolver&, RenderStyle&, const Element*) const final;
142
143     void adjustSearchFieldCancelButtonStyle(StyleResolver&, RenderStyle&, const Element*) const final;
144     bool paintSearchFieldCancelButton(const RenderBox&, const PaintInfo&, const IntRect&) final;
145
146     void adjustSearchFieldDecorationPartStyle(StyleResolver&, RenderStyle&, const Element*) const final;
147     bool paintSearchFieldDecorationPart(const RenderObject&, const PaintInfo&, const IntRect&) final;
148
149     void adjustSearchFieldResultsDecorationPartStyle(StyleResolver&, RenderStyle&, const Element*) const final;
150     bool paintSearchFieldResultsDecorationPart(const RenderBox&, const PaintInfo&, const IntRect&) final;
151
152     void adjustSearchFieldResultsButtonStyle(StyleResolver&, RenderStyle&, const Element*) const final;
153     bool paintSearchFieldResultsButton(const RenderBox&, const PaintInfo&, const IntRect&) final;
154
155 #if ENABLE(VIDEO)
156     bool supportsClosedCaptioning() const final { return true; }
157 #endif
158
159     bool shouldHaveCapsLockIndicator(const HTMLInputElement&) const final;
160
161     bool paintSnapshottedPluginOverlay(const RenderObject&, const PaintInfo&, const IntRect&) final;
162
163 #if ENABLE(ATTACHMENT_ELEMENT)
164     LayoutSize attachmentIntrinsicSize(const RenderAttachment&) const final;
165     int attachmentBaseline(const RenderAttachment&) const final;
166     bool paintAttachment(const RenderObject&, const PaintInfo&, const IntRect&) final;
167 #endif
168
169 private:
170     String fileListNameForWidth(const FileList*, const FontCascade&, int width, bool multipleFilesAllowed) const final;
171
172     Color systemColor(CSSValueID) const final;
173
174     void purgeCaches() final;
175
176     // Get the control size based off the font. Used by some of the controls (like buttons).
177     NSControlSize controlSizeForFont(const RenderStyle&) const;
178     NSControlSize controlSizeForSystemFont(const RenderStyle&) const;
179     NSControlSize controlSizeForCell(NSCell*, const IntSize* sizes, const IntSize& minSize, float zoomLevel = 1.0f) const;
180     void setControlSize(NSCell*, const IntSize* sizes, const IntSize& minSize, float zoomLevel = 1.0f);
181     void setSizeFromFont(RenderStyle&, const IntSize* sizes) const;
182     IntSize sizeForFont(const RenderStyle&, const IntSize* sizes) const;
183     IntSize sizeForSystemFont(const RenderStyle&, const IntSize* sizes) const;
184     void setFontFromControlSize(StyleResolver&, RenderStyle&, NSControlSize) const;
185
186     void updateCheckedState(NSCell*, const RenderObject&);
187     void updateEnabledState(NSCell*, const RenderObject&);
188     void updateFocusedState(NSCell*, const RenderObject&);
189     void updatePressedState(NSCell*, const RenderObject&);
190
191     // Helpers for adjusting appearance and for painting
192
193     void paintCellAndSetFocusedElementNeedsRepaintIfNecessary(NSCell*, const RenderObject&, const PaintInfo&, const FloatRect&);
194     void setPopupButtonCellState(const RenderObject&, const IntSize&);
195     const IntSize* popupButtonSizes() const;
196     const int* popupButtonMargins() const;
197     const int* popupButtonPadding(NSControlSize, bool isRTL) const;
198     void paintMenuListButtonGradients(const RenderObject&, const PaintInfo&, const IntRect&);
199     const IntSize* menuListSizes() const;
200
201     const IntSize* searchFieldSizes() const;
202     const IntSize* cancelButtonSizes() const;
203     const IntSize* resultsButtonSizes() const;
204     void setSearchCellState(const RenderObject&, const IntRect&);
205     void setSearchFieldSize(RenderStyle&) const;
206
207     NSPopUpButtonCell *popupButton() const;
208     NSSearchFieldCell *search() const;
209     NSMenu *searchMenuTemplate() const;
210     NSSliderCell *sliderThumbHorizontal() const;
211     NSSliderCell *sliderThumbVertical() const;
212     NSTextFieldCell *textField() const;
213
214 #if ENABLE(METER_ELEMENT)
215     NSLevelIndicatorStyle levelIndicatorStyleFor(ControlPart) const;
216     NSLevelIndicatorCell *levelIndicatorFor(const RenderMeter&) const;
217 #endif
218
219     int minimumProgressBarHeight(const RenderStyle&) const;
220     const IntSize* progressBarSizes() const;
221     const int* progressBarMargins(NSControlSize) const;
222
223 #if ENABLE(SERVICE_CONTROLS)
224     bool paintImageControlsButton(const RenderObject&, const PaintInfo&, const IntRect&) final;
225     IntSize imageControlsButtonSize(const RenderObject&) const final;
226     IntSize imageControlsButtonPositionOffset() const final;
227
228     NSServicesRolloverButtonCell *servicesRolloverButtonCell() const;
229 #endif
230
231     mutable RetainPtr<NSPopUpButtonCell> m_popupButton;
232     mutable RetainPtr<NSSearchFieldCell> m_search;
233     mutable RetainPtr<NSMenu> m_searchMenuTemplate;
234     mutable RetainPtr<NSSliderCell> m_sliderThumbHorizontal;
235     mutable RetainPtr<NSSliderCell> m_sliderThumbVertical;
236     mutable RetainPtr<NSLevelIndicatorCell> m_levelIndicator;
237     mutable RetainPtr<NSTextFieldCell> m_textField;
238 #if ENABLE(SERVICE_CONTROLS)
239     mutable RetainPtr<NSServicesRolloverButtonCell> m_servicesRolloverButton;
240 #endif
241
242     bool m_isSliderThumbHorizontalPressed { false };
243     bool m_isSliderThumbVerticalPressed { false };
244
245     mutable HashMap<int, Color> m_systemColorCache;
246
247     RetainPtr<WebCoreRenderThemeNotificationObserver> m_notificationObserver;
248
249     String m_legacyMediaControlsScript;
250     String m_mediaControlsScript;
251     String m_legacyMediaControlsStyleSheet;
252     String m_mediaControlsStyleSheet;
253 };
254
255 } // namespace WebCore
256
257 #endif // PLATFORM(MAC)