18f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian/*
28f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Copyright (C) 2007 Apple Inc.
38f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Copyright (C) 2007 Alp Toker <alp@atoker.com>
48f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Copyright (C) 2008 Collabora Ltd.
58f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Copyright (C) 2008, 2009 Google Inc.
60bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch * Copyright (C) 2009 Kenneth Rohde Christiansen
78f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *
88f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * This library is free software; you can redistribute it and/or
98f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * modify it under the terms of the GNU Library General Public
108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * License as published by the Free Software Foundation; either
118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * version 2 of the License, or (at your option) any later version.
128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *
138f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * This library is distributed in the hope that it will be useful,
148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * but WITHOUT ANY WARRANTY; without even the implied warranty of
158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Library General Public License for more details.
178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *
188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * You should have received a copy of the GNU Library General Public License
198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * along with this library; see the file COPYING.LIB.  If not, write to
208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Boston, MA 02110-1301, USA.
228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian *
238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian */
248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "config.h"
268f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "RenderThemeChromiumLinux.h"
278f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
288f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "CSSValueKeywords.h"
295e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block#include "Color.h"
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "PaintInfo.h"
31ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "PlatformBridge.h"
328f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "RenderObject.h"
33ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "RenderProgress.h"
34ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#include "RenderSlider.h"
35967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#include "ScrollbarTheme.h"
368f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "UserAgentStyleSheets.h"
378f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
388f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qiannamespace WebCore {
398f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
40d0825bca7fe65beaee391d30da42e937db621564Steve Blockunsigned RenderThemeChromiumLinux::m_activeSelectionBackgroundColor =
41d0825bca7fe65beaee391d30da42e937db621564Steve Block    0xff1e90ff;
42d0825bca7fe65beaee391d30da42e937db621564Steve Blockunsigned RenderThemeChromiumLinux::m_activeSelectionForegroundColor =
43d0825bca7fe65beaee391d30da42e937db621564Steve Block    Color::black;
44d0825bca7fe65beaee391d30da42e937db621564Steve Blockunsigned RenderThemeChromiumLinux::m_inactiveSelectionBackgroundColor =
45d0825bca7fe65beaee391d30da42e937db621564Steve Block    0xffc8c8c8;
46d0825bca7fe65beaee391d30da42e937db621564Steve Blockunsigned RenderThemeChromiumLinux::m_inactiveSelectionForegroundColor =
47d0825bca7fe65beaee391d30da42e937db621564Steve Block    0xff323232;
48643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
495e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Blockdouble RenderThemeChromiumLinux::m_caretBlinkInterval;
505e2bc6953fe6923165b8a5d7679939693a1d58d6Steve Block
51ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochstatic const unsigned defaultButtonBackgroundColor = 0xffdddddd;
52ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
53ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochstatic PlatformBridge::ThemePaintState getWebThemeState(const RenderTheme* theme, const RenderObject* o)
54ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
55ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (!theme->isEnabled(o))
56ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return PlatformBridge::StateDisabled;
57ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (theme->isPressed(o))
58ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return PlatformBridge::StatePressed;
59ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (theme->isHovered(o))
60ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return PlatformBridge::StateHover;
61ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
62ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return PlatformBridge::StateNormal;
63ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
64ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
65ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<RenderTheme> RenderThemeChromiumLinux::create()
678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return adoptRef(new RenderThemeChromiumLinux());
698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochPassRefPtr<RenderTheme> RenderTheme::themeForPage(Page* page)
728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    static RenderTheme* rt = RenderThemeChromiumLinux::create().releaseRef();
740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return rt;
758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
768f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochRenderThemeChromiumLinux::RenderThemeChromiumLinux()
788f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
79231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_caretBlinkInterval = RenderTheme::caretBlinkInterval();
808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben MurdochRenderThemeChromiumLinux::~RenderThemeChromiumLinux()
838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
865f1ab04193ad0130ca8204aadaceae083aca9881Feng QianColor RenderThemeChromiumLinux::systemColor(int cssValueId) const
875f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian{
885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    static const Color linuxButtonGrayColor(0xffdddddd);
895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    if (cssValueId == CSSValueButtonface)
915f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        return linuxButtonGrayColor;
925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return RenderTheme::systemColor(cssValueId);
935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian}
945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
958f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianString RenderThemeChromiumLinux::extraDefaultStyleSheet()
968f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return RenderThemeChromiumSkia::extraDefaultStyleSheet() +
985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian           String(themeChromiumLinuxUserAgentStyleSheet, sizeof(themeChromiumLinuxUserAgentStyleSheet));
998f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
1008f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1018f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianbool RenderThemeChromiumLinux::controlSupportsTints(const RenderObject* o) const
1028f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
1038f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return isEnabled(o);
1048f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
1058f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1068f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianColor RenderThemeChromiumLinux::activeListBoxSelectionBackgroundColor() const
1078f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
1088f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return Color(0x28, 0x28, 0x28);
1098f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
1108f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1118f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianColor RenderThemeChromiumLinux::activeListBoxSelectionForegroundColor() const
1128f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
1135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    return Color::black;
1148f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
1158f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianColor RenderThemeChromiumLinux::inactiveListBoxSelectionBackgroundColor() const
1178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
1188f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return Color(0xc8, 0xc8, 0xc8);
1198f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
1208f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
1218f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng QianColor RenderThemeChromiumLinux::inactiveListBoxSelectionForegroundColor() const
1228f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
1238f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    return Color(0x32, 0x32, 0x32);
1248f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
1258f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
126d0825bca7fe65beaee391d30da42e937db621564Steve BlockColor RenderThemeChromiumLinux::platformActiveSelectionBackgroundColor() const
127d0825bca7fe65beaee391d30da42e937db621564Steve Block{
128d0825bca7fe65beaee391d30da42e937db621564Steve Block    return m_activeSelectionBackgroundColor;
129d0825bca7fe65beaee391d30da42e937db621564Steve Block}
130d0825bca7fe65beaee391d30da42e937db621564Steve Block
131d0825bca7fe65beaee391d30da42e937db621564Steve BlockColor RenderThemeChromiumLinux::platformInactiveSelectionBackgroundColor() const
132d0825bca7fe65beaee391d30da42e937db621564Steve Block{
133d0825bca7fe65beaee391d30da42e937db621564Steve Block    return m_inactiveSelectionBackgroundColor;
134d0825bca7fe65beaee391d30da42e937db621564Steve Block}
135d0825bca7fe65beaee391d30da42e937db621564Steve Block
136d0825bca7fe65beaee391d30da42e937db621564Steve BlockColor RenderThemeChromiumLinux::platformActiveSelectionForegroundColor() const
137d0825bca7fe65beaee391d30da42e937db621564Steve Block{
138d0825bca7fe65beaee391d30da42e937db621564Steve Block    return m_activeSelectionForegroundColor;
139d0825bca7fe65beaee391d30da42e937db621564Steve Block}
140d0825bca7fe65beaee391d30da42e937db621564Steve Block
141d0825bca7fe65beaee391d30da42e937db621564Steve BlockColor RenderThemeChromiumLinux::platformInactiveSelectionForegroundColor() const
142d0825bca7fe65beaee391d30da42e937db621564Steve Block{
143d0825bca7fe65beaee391d30da42e937db621564Steve Block    return m_inactiveSelectionForegroundColor;
144d0825bca7fe65beaee391d30da42e937db621564Steve Block}
145d0825bca7fe65beaee391d30da42e937db621564Steve Block
146231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid RenderThemeChromiumLinux::adjustSliderThumbSize(RenderObject* o) const
147231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
148ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    IntSize size = PlatformBridge::getThemePartSize(PlatformBridge::PartSliderThumb);
149ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
150231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    if (o->style()->appearance() == SliderThumbHorizontalPart) {
151ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        o->style()->setWidth(Length(size.width(), Fixed));
152ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        o->style()->setHeight(Length(size.height(), Fixed));
153231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    } else if (o->style()->appearance() == SliderThumbVerticalPart) {
154ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        o->style()->setWidth(Length(size.height(), Fixed));
155ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        o->style()->setHeight(Length(size.width(), Fixed));
156231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    } else
157231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        RenderThemeChromiumSkia::adjustSliderThumbSize(o);
158231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
159231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
1600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochbool RenderThemeChromiumLinux::supportsControlTints() const
1618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{
1620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return true;
1638f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian}
1648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
165231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockvoid RenderThemeChromiumLinux::setCaretBlinkInterval(double interval)
166231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
167231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    m_caretBlinkInterval = interval;
168231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
169231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
170231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Blockdouble RenderThemeChromiumLinux::caretBlinkIntervalInternal() const
171231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block{
172231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    return m_caretBlinkInterval;
173231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block}
174231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
175d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid RenderThemeChromiumLinux::setSelectionColors(
176d0825bca7fe65beaee391d30da42e937db621564Steve Block    unsigned activeBackgroundColor,
177d0825bca7fe65beaee391d30da42e937db621564Steve Block    unsigned activeForegroundColor,
178d0825bca7fe65beaee391d30da42e937db621564Steve Block    unsigned inactiveBackgroundColor,
179d0825bca7fe65beaee391d30da42e937db621564Steve Block    unsigned inactiveForegroundColor)
180d0825bca7fe65beaee391d30da42e937db621564Steve Block{
181d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_activeSelectionBackgroundColor = activeBackgroundColor;
182d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_activeSelectionForegroundColor = activeForegroundColor;
183d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_inactiveSelectionBackgroundColor = inactiveBackgroundColor;
184d0825bca7fe65beaee391d30da42e937db621564Steve Block    m_inactiveSelectionForegroundColor = inactiveForegroundColor;
185d0825bca7fe65beaee391d30da42e937db621564Steve Block}
186d0825bca7fe65beaee391d30da42e937db621564Steve Block
187ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochbool RenderThemeChromiumLinux::paintCheckbox(RenderObject* o, const PaintInfo& i, const IntRect& rect)
188ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
189ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::ThemePaintExtraParams extraParams;
190ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    extraParams.button.checked = isChecked(o);
191ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    extraParams.button.indeterminate = isIndeterminate(o);
192ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
193ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::paintThemePart(i.context, PlatformBridge::PartCheckbox, getWebThemeState(this, o), rect, &extraParams);
194ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return false;
195ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
196ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
197ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid RenderThemeChromiumLinux::setCheckboxSize(RenderStyle* style) const
198ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
199ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // If the width and height are both specified, then we have nothing to do.
200ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (!style->width().isIntrinsicOrAuto() && !style->height().isAuto())
201ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return;
202ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
203ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    IntSize size = PlatformBridge::getThemePartSize(PlatformBridge::PartCheckbox);
204ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    setSizeIfAuto(style, size);
205ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
206ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
207ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochbool RenderThemeChromiumLinux::paintRadio(RenderObject* o, const PaintInfo& i, const IntRect& rect)
208ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
209ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::ThemePaintExtraParams extraParams;
210ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    extraParams.button.checked = isChecked(o);
211ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
212ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::paintThemePart(i.context, PlatformBridge::PartRadio, getWebThemeState(this, o), rect, &extraParams);
213ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return false;
214ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
215ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
216ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochvoid RenderThemeChromiumLinux::setRadioSize(RenderStyle* style) const
217ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
218ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // If the width and height are both specified, then we have nothing to do.
219ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (!style->width().isIntrinsicOrAuto() && !style->height().isAuto())
220ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return;
221ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
222ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    IntSize size = PlatformBridge::getThemePartSize(PlatformBridge::PartRadio);
223ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    setSizeIfAuto(style, size);
224ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
225ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
226ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochbool RenderThemeChromiumLinux::paintButton(RenderObject* o, const PaintInfo& i, const IntRect& rect)
227ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
228ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::ThemePaintExtraParams extraParams;
229ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    extraParams.button.isDefault = isDefault(o);
23081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    extraParams.button.hasBorder = true;
231ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    extraParams.button.backgroundColor = defaultButtonBackgroundColor;
232ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (o->hasBackground())
233ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        extraParams.button.backgroundColor = o->style()->visitedDependentColor(CSSPropertyBackgroundColor).rgb();
234ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
235ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::paintThemePart(i.context, PlatformBridge::PartButton, getWebThemeState(this, o), rect, &extraParams);
236ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return false;
237ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
238ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
239ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochbool RenderThemeChromiumLinux::paintTextField(RenderObject* o, const PaintInfo& i, const IntRect& rect)
240ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
241ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // WebThemeEngine does not handle border rounded corner and background image
242ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // so return true to draw CSS border and background.
243ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (o->style()->hasBorderRadius() || o->style()->hasBackgroundImage())
244ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return true;
245ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
246ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    ControlPart part = o->style()->appearance();
247ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
248ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::ThemePaintExtraParams extraParams;
249ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    extraParams.textField.isTextArea = part == TextAreaPart;
250ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    extraParams.textField.isListbox = part == ListboxPart;
251ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
252ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    // Fallback to white if the specified color object is invalid.
253ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    Color backgroundColor(Color::white);
254ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (o->style()->visitedDependentColor(CSSPropertyBackgroundColor).isValid())
255ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        backgroundColor = o->style()->visitedDependentColor(CSSPropertyBackgroundColor);
256ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    extraParams.textField.backgroundColor = backgroundColor.rgb();
257ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
258ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::paintThemePart(i.context, PlatformBridge::PartTextField, getWebThemeState(this, o), rect, &extraParams);
259ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return false;
260ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
261ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
262ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochbool RenderThemeChromiumLinux::paintMenuList(RenderObject* o, const PaintInfo& i, const IntRect& rect)
263ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
26481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    if (!o->isBox())
26581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        return false;
26681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
267ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    const int right = rect.x() + rect.width();
268ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    const int middle = rect.y() + rect.height() / 2;
269ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
270ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::ThemePaintExtraParams extraParams;
271ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    extraParams.menuList.arrowX = (o->style()->direction() == RTL) ? rect.x() + 7 : right - 13;
272ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    extraParams.menuList.arrowY = middle;
27381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    const RenderBox* box = toRenderBox(o);
27481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    // Match Chromium Win behaviour of showing all borders if any are shown.
27581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    extraParams.menuList.hasBorder = box->borderRight() || box->borderLeft() || box->borderTop() || box->borderBottom();
27681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    extraParams.menuList.hasBorderRadius = o->style()->hasBorderRadius();
2772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    // Fallback to transparent if the specified color object is invalid.
2782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    extraParams.menuList.backgroundColor = Color::transparent;
279ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (o->hasBackground())
280ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        extraParams.menuList.backgroundColor = o->style()->visitedDependentColor(CSSPropertyBackgroundColor).rgb();
281ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
282ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::paintThemePart(i.context, PlatformBridge::PartMenuList, getWebThemeState(this, o), rect, &extraParams);
283ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return false;
284ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
285ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
286ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochbool RenderThemeChromiumLinux::paintSliderTrack(RenderObject* o, const PaintInfo& i, const IntRect& rect)
287ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
288ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::ThemePaintExtraParams extraParams;
289ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    extraParams.slider.vertical = o->style()->appearance() == SliderVerticalPart;
290ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
291ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::paintThemePart(i.context, PlatformBridge::PartSliderTrack, getWebThemeState(this, o), rect, &extraParams);
292ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return false;
293ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
294ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
295ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochbool RenderThemeChromiumLinux::paintSliderThumb(RenderObject* o, const PaintInfo& i, const IntRect& rect)
296ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
297ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::ThemePaintExtraParams extraParams;
298ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    extraParams.slider.vertical = o->style()->appearance() == SliderThumbVerticalPart;
299ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    extraParams.slider.inDrag = toRenderSlider(o->parent())->inDragMode();
300ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
301ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::paintThemePart(i.context, PlatformBridge::PartSliderThumb, getWebThemeState(this, o), rect, &extraParams);
302ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return false;
303ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
304ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
305967717af5423377c967781471ee106e2bb4e11c8Ben Murdochvoid RenderThemeChromiumLinux::adjustInnerSpinButtonStyle(CSSStyleSelector*, RenderStyle* style, Element*) const
306643ca7872b450ea4efacab6188849e5aac2ba161Steve Block{
307ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    IntSize size = PlatformBridge::getThemePartSize(PlatformBridge::PartInnerSpinButton);
308ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
309ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    style->setWidth(Length(size.width(), Fixed));
310ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    style->setMinWidth(Length(size.width(), Fixed));
311967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
312967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
313ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochbool RenderThemeChromiumLinux::paintInnerSpinButton(RenderObject* o, const PaintInfo& i, const IntRect& rect)
314967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
315ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::ThemePaintExtraParams extraParams;
316ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    extraParams.innerSpin.spinUp = (controlStatesForRenderer(o) & SpinUpState);
317ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    extraParams.innerSpin.readOnly = isReadOnlyControl(o);
318967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
319ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::paintThemePart(i.context, PlatformBridge::PartInnerSpinButton, getWebThemeState(this, o), rect, &extraParams);
320ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    return false;
321ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch}
322ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
323ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#if ENABLE(PROGRESS_TAG)
324ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
325ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdochbool RenderThemeChromiumLinux::paintProgressBar(RenderObject* o, const PaintInfo& i, const IntRect& rect)
326ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch{
327ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    if (!o->isProgress())
328ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch        return true;
329967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
330ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    RenderProgress* renderProgress = toRenderProgress(o);
331ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    IntRect valueRect = progressValueRectFor(renderProgress, rect);
332ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
333ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::ThemePaintExtraParams extraParams;
334ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    extraParams.progressBar.determinate = renderProgress->isDeterminate();
335ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    extraParams.progressBar.valueRectX = valueRect.x();
336ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    extraParams.progressBar.valueRectY = valueRect.y();
337ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    extraParams.progressBar.valueRectWidth = valueRect.width();
338ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    extraParams.progressBar.valueRectHeight = valueRect.height();
339ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
340ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch    PlatformBridge::paintThemePart(i.context, PlatformBridge::PartProgressBar, getWebThemeState(this, o), rect, &extraParams);
341967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    return false;
342643ca7872b450ea4efacab6188849e5aac2ba161Steve Block}
343643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
344ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch#endif
345ab9e7a118cf1ea2e3a93dce683b2ded3e7291ddbBen Murdoch
3460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} // namespace WebCore
347