6afd9d1f254cb7662173a1f284966905f163ec9f
[WebKit-https.git] / Source / WebCore / rendering / RenderThemeChromiumMac.mm
1 /*
2  * Copyright (C) 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
3  * Copyright (C) 2008, 2009 Google, Inc.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20
21 #import "config.h"
22 #import "LocalCurrentGraphicsContext.h"
23 #import "RenderThemeChromiumMac.h"
24 #import "PaintInfo.h"
25 #import "PlatformSupport.h"
26 #import "RenderMediaControlsChromium.h"
27 #import "WebCoreSystemInterface.h"
28 #import "UserAgentStyleSheets.h"
29 #import <Carbon/Carbon.h>
30 #import <Cocoa/Cocoa.h>
31 #import <wtf/RetainPtr.h>
32 #import <wtf/StdLibExtras.h>
33 #import <math.h>
34
35 @interface RTCMFlippedView : NSView
36 {}
37
38 - (BOOL)isFlipped;
39 - (NSText *)currentEditor;
40
41 @end
42
43 @implementation RTCMFlippedView
44
45 - (BOOL)isFlipped {
46     return [[NSGraphicsContext currentContext] isFlipped];
47 }
48
49 - (NSText *)currentEditor {
50     return nil;
51 }
52
53 @end
54
55 namespace WebCore {
56
57 NSView* FlippedView()
58 {
59     static NSView* view = [[RTCMFlippedView alloc] init];
60     return view;
61 }
62
63 PassRefPtr<RenderTheme> RenderTheme::themeForPage(Page*)
64 {
65     static RenderTheme* rt = RenderThemeChromiumMac::create().leakRef();
66     return rt;
67 }
68
69 PassRefPtr<RenderTheme> RenderThemeChromiumMac::create()
70 {
71     return adoptRef(new RenderThemeChromiumMac);
72 }
73
74 bool RenderThemeChromiumMac::supportsDataListUI(const AtomicString& type) const
75 {
76     return RenderThemeChromiumCommon::supportsDataListUI(type);
77 }
78
79 bool RenderThemeChromiumMac::usesTestModeFocusRingColor() const
80 {
81     return PlatformSupport::layoutTestMode();
82 }
83
84 NSView* RenderThemeChromiumMac::documentViewFor(RenderObject*) const
85 {
86     return FlippedView();
87 }
88
89 const int autofillPopupHorizontalPadding = 4;
90
91 // These functions are called with MenuListPart or MenulistButtonPart appearance by RenderMenuList, or with TextFieldPart appearance by AutofillPopupMenuClient.
92 // We assume only AutofillPopupMenuClient gives TexfieldPart appearance here.
93 // We want to change only Autofill padding.
94 // In the future, we have to separate Autofill popup window logic from WebKit to Chromium.
95 int RenderThemeChromiumMac::popupInternalPaddingLeft(RenderStyle* style) const
96 {
97     if (style->appearance() == TextFieldPart)
98         return autofillPopupHorizontalPadding;
99
100     return RenderThemeMac::popupInternalPaddingLeft(style);
101 }
102
103 int RenderThemeChromiumMac::popupInternalPaddingRight(RenderStyle* style) const
104 {
105     if (style->appearance() == TextFieldPart)
106         return autofillPopupHorizontalPadding;
107
108     return RenderThemeMac::popupInternalPaddingRight(style);
109 }
110
111 // Updates the control tint (a.k.a. active state) of |cell| (from |o|).
112 // In the Chromium port, the renderer runs as a background process and controls'
113 // NSCell(s) lack a parent NSView. Therefore controls don't have their tint
114 // color updated correctly when the application is activated/deactivated.
115 // FocusController's setActive() is called when the application is
116 // activated/deactivated, which causes a repaint at which time this code is
117 // called.
118 // This function should be called before drawing any NSCell-derived controls,
119 // unless you're sure it isn't needed.
120 void RenderThemeChromiumMac::updateActiveState(NSCell* cell, const RenderObject* o)
121 {
122     NSControlTint oldTint = [cell controlTint];
123     NSControlTint tint = isActive(o) ? [NSColor currentControlTint] :
124                                        static_cast<NSControlTint>(NSClearControlTint);
125
126     if (tint != oldTint)
127         [cell setControlTint:tint];
128 }
129
130 bool RenderThemeChromiumMac::shouldShowPlaceholderWhenFocused() const
131 {
132     return true;
133 }
134
135 bool RenderThemeChromiumMac::paintTextField(RenderObject* o, const PaintInfo& paintInfo, const IntRect& r)
136 {
137     // Using the Cocoa code to paint the text field as RenderThemeMac does runs
138     // into a bug when building against the 10.5 SDK, so we are forced here to
139     // use the SPI. This override of paintTextField should be able to be removed
140     // when 10.6 is the minimum required system and Chromium is built against
141     // the 10.6 SDK.
142     //
143     // https://bugs.webkit.org/show_bug.cgi?id=75860
144     // http://code.google.com/p/chromium/issues/detail?id=109567
145
146     LocalCurrentGraphicsContext localContext(paintInfo.context);
147     wkDrawBezeledTextFieldCell(r, isEnabled(o) && !isReadOnlyControl(o));
148
149     return false;
150 }
151
152 #if ENABLE(VIDEO)
153
154 void RenderThemeChromiumMac::adjustMediaSliderThumbSize(RenderStyle* style) const
155 {
156     RenderMediaControlsChromium::adjustMediaSliderThumbSize(style);
157 }
158
159 bool RenderThemeChromiumMac::paintMediaPlayButton(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
160 {
161     return RenderMediaControlsChromium::paintMediaControlsPart(MediaPlayButton, object, paintInfo, rect);
162 }
163
164 bool RenderThemeChromiumMac::paintMediaMuteButton(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
165 {
166     return RenderMediaControlsChromium::paintMediaControlsPart(MediaMuteButton, object, paintInfo, rect);
167 }
168
169 bool RenderThemeChromiumMac::paintMediaSliderTrack(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
170 {
171     return RenderMediaControlsChromium::paintMediaControlsPart(MediaSlider, object, paintInfo, rect);
172 }
173
174 bool RenderThemeChromiumMac::paintMediaControlsBackground(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
175 {
176     return RenderMediaControlsChromium::paintMediaControlsPart(MediaTimelineContainer, object, paintInfo, rect);
177 }
178
179 String RenderThemeChromiumMac::extraMediaControlsStyleSheet()
180 {
181     return String(mediaControlsChromiumUserAgentStyleSheet, sizeof(mediaControlsChromiumUserAgentStyleSheet));
182 }
183
184 #if ENABLE(FULLSCREEN_API)
185 String RenderThemeChromiumMac::extraFullScreenStyleSheet()
186 {
187     // FIXME: Chromium may wish to style its default media controls differently in fullscreen.
188     return String();
189 }
190 #endif
191
192 String RenderThemeChromiumMac::extraDefaultStyleSheet()
193 {
194     return RenderThemeMac::extraDefaultStyleSheet() +
195            String(themeChromiumUserAgentStyleSheet, sizeof(themeChromiumUserAgentStyleSheet));
196 }
197
198
199 bool RenderThemeChromiumMac::paintMediaVolumeSliderContainer(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
200 {
201     return true;
202 }
203
204 bool RenderThemeChromiumMac::paintMediaVolumeSliderTrack(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
205 {
206     return RenderMediaControlsChromium::paintMediaControlsPart(MediaVolumeSlider, object, paintInfo, rect);
207 }
208
209 bool RenderThemeChromiumMac::paintMediaVolumeSliderThumb(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
210 {
211     return RenderMediaControlsChromium::paintMediaControlsPart(MediaVolumeSliderThumb, object, paintInfo, rect);
212 }
213
214 bool RenderThemeChromiumMac::paintMediaSliderThumb(RenderObject* object, const PaintInfo& paintInfo, const IntRect& rect)
215 {
216     return RenderMediaControlsChromium::paintMediaControlsPart(MediaSliderThumb, object, paintInfo, rect);
217 }
218
219 IntPoint RenderThemeChromiumMac::volumeSliderOffsetFromMuteButton(RenderBox* muteButtonBox, const IntSize& size) const
220 {
221     return RenderTheme::volumeSliderOffsetFromMuteButton(muteButtonBox, size);
222 }
223 #endif
224
225 } // namespace WebCore