15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007 Apple Inc.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007 Alp Toker <alp@atoker.com>
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008 Collabora Ltd.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2008, 2009 Google Inc.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Kenneth Rohde Christiansen
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderThemeChromiumDefault.h"
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
285d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/CSSValueKeywords.h"
295d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/UserAgentStyleSheets.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/PaintInfo.h"
3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderObject.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderProgress.h"
3351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/LayoutTestSupport.h"
34f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "platform/graphics/Color.h"
35a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsContext.h"
36a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsContextStateSaver.h"
375267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/Platform.h"
385267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebRect.h"
3909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "public/platform/WebThemeEngine.h"
4051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "wtf/StdLibExtras.h"
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)static bool useMockTheme()
4551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
46197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return LayoutTestSupport::isRunningLayoutTest();
4751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
4851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
49926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)unsigned RenderThemeChromiumDefault::m_activeSelectionBackgroundColor =
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    0xff1e90ff;
51926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)unsigned RenderThemeChromiumDefault::m_activeSelectionForegroundColor =
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color::black;
53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)unsigned RenderThemeChromiumDefault::m_inactiveSelectionBackgroundColor =
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    0xffc8c8c8;
55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)unsigned RenderThemeChromiumDefault::m_inactiveSelectionForegroundColor =
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    0xff323232;
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
58926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)double RenderThemeChromiumDefault::m_caretBlinkInterval;
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const unsigned defaultButtonBackgroundColor = 0xffdddddd;
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
62e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)static WebThemeEngine::State getWebThemeState(const RenderTheme* theme, const RenderObject* o)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!theme->isEnabled(o))
65e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return WebThemeEngine::StateDisabled;
6651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (useMockTheme() && theme->isReadOnlyControl(o))
67e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return WebThemeEngine::StateReadonly;
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (theme->isPressed(o))
69e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return WebThemeEngine::StatePressed;
7051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (useMockTheme() && theme->isFocused(o))
71e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return WebThemeEngine::StateFocused;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (theme->isHovered(o))
73e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        return WebThemeEngine::StateHover;
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
75e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    return WebThemeEngine::StateNormal;
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)PassRefPtr<RenderTheme> RenderThemeChromiumDefault::create()
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
80926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return adoptRef(new RenderThemeChromiumDefault());
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
83c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)// RenderTheme::theme for Android is defined in RenderThemeChromiumAndroid.cpp.
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#if !OS(ANDROID)
85c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)RenderTheme& RenderTheme::theme()
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
8751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    DEFINE_STATIC_REF(RenderTheme, renderTheme, (RenderThemeChromiumDefault::create()));
88c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)    return *renderTheme;
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
92926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)RenderThemeChromiumDefault::RenderThemeChromiumDefault()
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_caretBlinkInterval = RenderTheme::caretBlinkInterval();
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
97926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)RenderThemeChromiumDefault::~RenderThemeChromiumDefault()
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
10151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool RenderThemeChromiumDefault::supportsFocusRing(const RenderStyle* style) const
10251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
10351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (useMockTheme()) {
10451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        // Don't use focus rings for buttons when mocking controls.
10551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return style->appearance() == ButtonPart
10651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            || style->appearance() == PushButtonPart
10751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            || style->appearance() == SquareButtonPart;
10851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
10951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
11051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return RenderThemeChromiumSkia::supportsFocusRing(style);
11151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
11251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
1135267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)Color RenderThemeChromiumDefault::systemColor(CSSValueID cssValueId) const
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
115926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    static const Color defaultButtonGrayColor(0xffdddddd);
116926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    static const Color defaultMenuColor(0xfff7f7f7);
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
11851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (cssValueId == CSSValueButtonface) {
11951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (useMockTheme())
12051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            return Color(0xc0, 0xc0, 0xc0);
121926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return defaultButtonGrayColor;
12251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
123926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (cssValueId == CSSValueMenu)
124926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return defaultMenuColor;
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return RenderTheme::systemColor(cssValueId);
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
128926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)String RenderThemeChromiumDefault::extraDefaultStyleSheet()
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
130197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // FIXME: We should not have OS() branches here.
131197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // We should have something like RenderThemeWin, RenderThemeLinux, or
132197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // should concatenate UA stylesheets on build time.
1338abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if !OS(WIN)
134197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return RenderThemeChromiumSkia::extraDefaultStyleSheet() +
135197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if !OS(ANDROID)
136197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        String(themeInputMultipleFieldsCss, sizeof(themeInputMultipleFieldsCss)) +
137197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#endif
138197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        String(themeChromiumLinuxCss, sizeof(themeChromiumLinuxCss));
139926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#else
140197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return RenderThemeChromiumSkia::extraDefaultStyleSheet() +
141197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        String(themeInputMultipleFieldsCss, sizeof(themeInputMultipleFieldsCss));
142926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)#endif
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
145926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Color RenderThemeChromiumDefault::activeListBoxSelectionBackgroundColor() const
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Color(0x28, 0x28, 0x28);
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Color RenderThemeChromiumDefault::activeListBoxSelectionForegroundColor() const
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Color::black;
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Color RenderThemeChromiumDefault::inactiveListBoxSelectionBackgroundColor() const
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Color(0xc8, 0xc8, 0xc8);
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
160926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Color RenderThemeChromiumDefault::inactiveListBoxSelectionForegroundColor() const
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Color(0x32, 0x32, 0x32);
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
165926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Color RenderThemeChromiumDefault::platformActiveSelectionBackgroundColor() const
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
16751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (useMockTheme())
16851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return Color(0x00, 0x00, 0xff); // Royal blue.
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_activeSelectionBackgroundColor;
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
172926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Color RenderThemeChromiumDefault::platformInactiveSelectionBackgroundColor() const
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (useMockTheme())
17551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return Color(0x99, 0x99, 0x99); // Medium gray.
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inactiveSelectionBackgroundColor;
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
179926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Color RenderThemeChromiumDefault::platformActiveSelectionForegroundColor() const
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (useMockTheme())
18251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return Color(0xff, 0xff, 0xcc); // Pale yellow.
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_activeSelectionForegroundColor;
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
186926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Color RenderThemeChromiumDefault::platformInactiveSelectionForegroundColor() const
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
18851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (useMockTheme())
18951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return Color::white;
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_inactiveSelectionForegroundColor;
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)IntSize RenderThemeChromiumDefault::sliderTickSize() const
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
19551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (useMockTheme())
19651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return IntSize(1, 3);
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return IntSize(1, 6);
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
200926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)int RenderThemeChromiumDefault::sliderTickOffsetFromTrackCenter() const
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (useMockTheme())
20351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        return 11;
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return -16;
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
207926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderThemeChromiumDefault::adjustSliderThumbSize(RenderStyle* style, Element* element) const
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
209e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    IntSize size = Platform::current()->themeEngine()->getSize(WebThemeEngine::PartSliderThumb);
21051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
21151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // FIXME: Mock theme doesn't handle zoomed sliders.
21251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    float zoomLevel = useMockTheme() ? 1 : style->effectiveZoom();
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (style->appearance() == SliderThumbHorizontalPart) {
21481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        style->setWidth(Length(size.width() * zoomLevel, Fixed));
21581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        style->setHeight(Length(size.height() * zoomLevel, Fixed));
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else if (style->appearance() == SliderThumbVerticalPart) {
21781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        style->setWidth(Length(size.height() * zoomLevel, Fixed));
21881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        style->setHeight(Length(size.width() * zoomLevel, Fixed));
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderThemeChromiumSkia::adjustSliderThumbSize(style, element);
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
223926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderThemeChromiumDefault::setCaretBlinkInterval(double interval)
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_caretBlinkInterval = interval;
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
228926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)double RenderThemeChromiumDefault::caretBlinkIntervalInternal() const
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_caretBlinkInterval;
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
233926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderThemeChromiumDefault::setSelectionColors(
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned activeBackgroundColor,
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned activeForegroundColor,
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned inactiveBackgroundColor,
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned inactiveForegroundColor)
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_activeSelectionBackgroundColor = activeBackgroundColor;
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_activeSelectionForegroundColor = activeForegroundColor;
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_inactiveSelectionBackgroundColor = inactiveBackgroundColor;
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_inactiveSelectionForegroundColor = inactiveForegroundColor;
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
245926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RenderThemeChromiumDefault::paintCheckbox(RenderObject* o, const PaintInfo& i, const IntRect& rect)
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
247e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebThemeEngine::ExtraParams extraParams;
248e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebCanvas* canvas = i.context->canvas();
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extraParams.button.checked = isChecked(o);
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extraParams.button.indeterminate = isIndeterminate(o);
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
25281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    float zoomLevel = o->style()->effectiveZoom();
25309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    GraphicsContextStateSaver stateSaver(*i.context, false);
25481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    IntRect unzoomedRect = rect;
25581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (zoomLevel != 1) {
25609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        stateSaver.save();
25781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        unzoomedRect.setWidth(unzoomedRect.width() / zoomLevel);
25881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        unzoomedRect.setHeight(unzoomedRect.height() / zoomLevel);
25981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        i.context->translate(unzoomedRect.x(), unzoomedRect.y());
2605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        i.context->scale(zoomLevel, zoomLevel);
26181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        i.context->translate(-unzoomedRect.x(), -unzoomedRect.y());
26281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    }
26381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
264e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Platform::current()->themeEngine()->paint(canvas, WebThemeEngine::PartCheckbox, getWebThemeState(this, o), WebRect(unzoomedRect), &extraParams);
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
268926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderThemeChromiumDefault::setCheckboxSize(RenderStyle* style) const
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the width and height are both specified, then we have nothing to do.
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!style->width().isIntrinsicOrAuto() && !style->height().isAuto())
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
274e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    IntSize size = Platform::current()->themeEngine()->getSize(WebThemeEngine::PartCheckbox);
27581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    float zoomLevel = style->effectiveZoom();
27681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    size.setWidth(size.width() * zoomLevel);
27781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    size.setHeight(size.height() * zoomLevel);
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setSizeIfAuto(style, size);
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
281926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RenderThemeChromiumDefault::paintRadio(RenderObject* o, const PaintInfo& i, const IntRect& rect)
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
283e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebThemeEngine::ExtraParams extraParams;
284e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebCanvas* canvas = i.context->canvas();
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extraParams.button.checked = isChecked(o);
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
287e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Platform::current()->themeEngine()->paint(canvas, WebThemeEngine::PartRadio, getWebThemeState(this, o), WebRect(rect), &extraParams);
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
291926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)void RenderThemeChromiumDefault::setRadioSize(RenderStyle* style) const
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If the width and height are both specified, then we have nothing to do.
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!style->width().isIntrinsicOrAuto() && !style->height().isAuto())
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
297e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    IntSize size = Platform::current()->themeEngine()->getSize(WebThemeEngine::PartRadio);
29881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    float zoomLevel = style->effectiveZoom();
29981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    size.setWidth(size.width() * zoomLevel);
30081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    size.setHeight(size.height() * zoomLevel);
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    setSizeIfAuto(style, size);
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
304926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RenderThemeChromiumDefault::paintButton(RenderObject* o, const PaintInfo& i, const IntRect& rect)
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
306e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebThemeEngine::ExtraParams extraParams;
307e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebCanvas* canvas = i.context->canvas();
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extraParams.button.hasBorder = true;
30951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    extraParams.button.backgroundColor = useMockTheme() ? 0xffc0c0c0 : defaultButtonBackgroundColor;
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (o->hasBackground())
3117757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch        extraParams.button.backgroundColor = o->resolveColor(CSSPropertyBackgroundColor).rgb();
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
313e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Platform::current()->themeEngine()->paint(canvas, WebThemeEngine::PartButton, getWebThemeState(this, o), WebRect(rect), &extraParams);
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
317926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RenderThemeChromiumDefault::paintTextField(RenderObject* o, const PaintInfo& i, const IntRect& rect)
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // WebThemeEngine does not handle border rounded corner and background image
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // so return true to draw CSS border and background.
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (o->style()->hasBorderRadius() || o->style()->hasBackgroundImage())
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ControlPart part = o->style()->appearance();
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
326e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebThemeEngine::ExtraParams extraParams;
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extraParams.textField.isTextArea = part == TextAreaPart;
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extraParams.textField.isListbox = part == ListboxPart;
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
330e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebCanvas* canvas = i.context->canvas();
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Color backgroundColor = o->resolveColor(CSSPropertyBackgroundColor);
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extraParams.textField.backgroundColor = backgroundColor.rgb();
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
335e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Platform::current()->themeEngine()->paint(canvas, WebThemeEngine::PartTextField, getWebThemeState(this, o), WebRect(rect), &extraParams);
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
339926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RenderThemeChromiumDefault::paintMenuList(RenderObject* o, const PaintInfo& i, const IntRect& rect)
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
341e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!o->isBox())
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const int right = rect.x() + rect.width();
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const int middle = rect.y() + rect.height() / 2;
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
347e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebThemeEngine::ExtraParams extraParams;
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extraParams.menuList.arrowY = middle;
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const RenderBox* box = toRenderBox(o);
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Match Chromium Win behaviour of showing all borders if any are shown.
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extraParams.menuList.hasBorder = box->borderRight() || box->borderLeft() || box->borderTop() || box->borderBottom();
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extraParams.menuList.hasBorderRadius = o->style()->hasBorderRadius();
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Fallback to transparent if the specified color object is invalid.
35451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    Color backgroundColor(Color::transparent);
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (o->hasBackground())
35651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        backgroundColor = o->resolveColor(CSSPropertyBackgroundColor);
35751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    extraParams.menuList.backgroundColor = backgroundColor.rgb();
35851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
35951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // If we have a background image, don't fill the content area to expose the
36051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // parent's background. Also, we shouldn't fill the content area if the
36151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // alpha of the color is 0. The API of Windows GDI ignores the alpha.
36251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // FIXME: the normal Aura theme doesn't care about this, so we should
36351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // investigate if we really need fillContentArea.
36451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    extraParams.menuList.fillContentArea = !o->style()->hasBackgroundImage() && backgroundColor.alpha();
36551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
36651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (useMockTheme()) {
36751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        // The size and position of the drop-down button is different between
36851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        // the mock theme and the regular aura theme.
36951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        int spacingTop = box->borderTop() + box->paddingTop();
37051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        int spacingBottom = box->borderBottom() + box->paddingBottom();
37151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        int spacingRight = box->borderRight() + box->paddingRight();
37251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        extraParams.menuList.arrowX = (o->style()->direction() == RTL) ? rect.x() + 4 + spacingRight: right - 13 - spacingRight;
37351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        extraParams.menuList.arrowHeight = rect.height() - spacingBottom - spacingTop;
37451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    } else {
37551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        extraParams.menuList.arrowX = (o->style()->direction() == RTL) ? rect.x() + 7 : right - 13;
37651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
378e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebCanvas* canvas = i.context->canvas();
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
380e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Platform::current()->themeEngine()->paint(canvas, WebThemeEngine::PartMenuList, getWebThemeState(this, o), WebRect(rect), &extraParams);
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
38409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool RenderThemeChromiumDefault::paintMenuListButton(RenderObject* o, const PaintInfo& i, const IntRect& rect)
38509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
386e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    if (!o->isBox())
38709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return false;
38809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
38909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    const int right = rect.x() + rect.width();
39009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    const int middle = rect.y() + rect.height() / 2;
39109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
392e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebThemeEngine::ExtraParams extraParams;
39309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    extraParams.menuList.arrowY = middle;
39409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    extraParams.menuList.hasBorder = false;
39509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    extraParams.menuList.hasBorderRadius = o->style()->hasBorderRadius();
39609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    extraParams.menuList.backgroundColor = Color::transparent;
39709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    extraParams.menuList.fillContentArea = false;
39809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
39909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (useMockTheme()) {
40009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        const RenderBox* box = toRenderBox(o);
40109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // The size and position of the drop-down button is different between
40209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // the mock theme and the regular aura theme.
40309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        int spacingTop = box->borderTop() + box->paddingTop();
40409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        int spacingBottom = box->borderBottom() + box->paddingBottom();
40509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        int spacingRight = box->borderRight() + box->paddingRight();
40609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        extraParams.menuList.arrowX = (o->style()->direction() == RTL) ? rect.x() + 4 + spacingRight: right - 13 - spacingRight;
40709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        extraParams.menuList.arrowHeight = rect.height() - spacingBottom - spacingTop;
40809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    } else {
40909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        extraParams.menuList.arrowX = (o->style()->direction() == RTL) ? rect.x() + 7 : right - 13;
41009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
41109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
412e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebCanvas* canvas = i.context->canvas();
41309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
414e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Platform::current()->themeEngine()->paint(canvas, WebThemeEngine::PartMenuList, getWebThemeState(this, o), WebRect(rect), &extraParams);
41509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return false;
41609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
41709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
418926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RenderThemeChromiumDefault::paintSliderTrack(RenderObject* o, const PaintInfo& i, const IntRect& rect)
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
420e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebThemeEngine::ExtraParams extraParams;
421e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebCanvas* canvas = i.context->canvas();
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extraParams.slider.vertical = o->style()->appearance() == SliderVerticalPart;
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    paintSliderTicks(o, i, rect);
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
42651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // FIXME: Mock theme doesn't handle zoomed sliders.
42751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    float zoomLevel = useMockTheme() ? 1 : o->style()->effectiveZoom();
42809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    GraphicsContextStateSaver stateSaver(*i.context, false);
42981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    IntRect unzoomedRect = rect;
43081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (zoomLevel != 1) {
43109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        stateSaver.save();
43281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        unzoomedRect.setWidth(unzoomedRect.width() / zoomLevel);
43381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        unzoomedRect.setHeight(unzoomedRect.height() / zoomLevel);
43481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        i.context->translate(unzoomedRect.x(), unzoomedRect.y());
4355d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        i.context->scale(zoomLevel, zoomLevel);
43681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        i.context->translate(-unzoomedRect.x(), -unzoomedRect.y());
43781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    }
43881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
439e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Platform::current()->themeEngine()->paint(canvas, WebThemeEngine::PartSliderTrack, getWebThemeState(this, o), WebRect(unzoomedRect), &extraParams);
44081a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
444926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RenderThemeChromiumDefault::paintSliderThumb(RenderObject* o, const PaintInfo& i, const IntRect& rect)
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
446e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebThemeEngine::ExtraParams extraParams;
447e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebCanvas* canvas = i.context->canvas();
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extraParams.slider.vertical = o->style()->appearance() == SliderThumbVerticalPart;
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extraParams.slider.inDrag = isPressed(o);
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
45151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    // FIXME: Mock theme doesn't handle zoomed sliders.
45251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    float zoomLevel = useMockTheme() ? 1 : o->style()->effectiveZoom();
45309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    GraphicsContextStateSaver stateSaver(*i.context, false);
45481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    IntRect unzoomedRect = rect;
45581a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    if (zoomLevel != 1) {
45609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        stateSaver.save();
45781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        unzoomedRect.setWidth(unzoomedRect.width() / zoomLevel);
45881a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        unzoomedRect.setHeight(unzoomedRect.height() / zoomLevel);
45981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        i.context->translate(unzoomedRect.x(), unzoomedRect.y());
4605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        i.context->scale(zoomLevel, zoomLevel);
46181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        i.context->translate(-unzoomedRect.x(), -unzoomedRect.y());
46281a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    }
46381a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)
464e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Platform::current()->themeEngine()->paint(canvas, WebThemeEngine::PartSliderThumb, getWebThemeState(this, o), WebRect(unzoomedRect), &extraParams);
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4685267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void RenderThemeChromiumDefault::adjustInnerSpinButtonStyle(RenderStyle* style, Element*) const
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
470e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    IntSize size = Platform::current()->themeEngine()->getSize(WebThemeEngine::PartInnerSpinButton);
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    style->setWidth(Length(size.width(), Fixed));
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    style->setMinWidth(Length(size.width(), Fixed));
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
476926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RenderThemeChromiumDefault::paintInnerSpinButton(RenderObject* o, const PaintInfo& i, const IntRect& rect)
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
478e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebThemeEngine::ExtraParams extraParams;
479e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebCanvas* canvas = i.context->canvas();
480d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    extraParams.innerSpin.spinUp = (controlStatesForRenderer(o) & SpinUpControlState);
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extraParams.innerSpin.readOnly = isReadOnlyControl(o);
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
483e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Platform::current()->themeEngine()->paint(canvas, WebThemeEngine::PartInnerSpinButton, getWebThemeState(this, o), WebRect(rect), &extraParams);
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
487926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RenderThemeChromiumDefault::paintProgressBar(RenderObject* o, const PaintInfo& i, const IntRect& rect)
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!o->isProgress())
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderProgress* renderProgress = toRenderProgress(o);
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect valueRect = progressValueRectFor(renderProgress, rect);
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
495e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebThemeEngine::ExtraParams extraParams;
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extraParams.progressBar.determinate = renderProgress->isDeterminate();
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extraParams.progressBar.valueRectX = valueRect.x();
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extraParams.progressBar.valueRectY = valueRect.y();
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extraParams.progressBar.valueRectWidth = valueRect.width();
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    extraParams.progressBar.valueRectHeight = valueRect.height();
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DirectionFlippingScope scope(o, i, rect);
503e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    WebCanvas* canvas = i.context->canvas();
504e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Platform::current()->themeEngine()->paint(canvas, WebThemeEngine::PartProgressBar, getWebThemeState(this, o), WebRect(rect), &extraParams);
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
508926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)bool RenderThemeChromiumDefault::shouldOpenPickerWithF4Key() const
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
51351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool RenderThemeChromiumDefault::shouldUseFallbackTheme(RenderStyle* style) const
51451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){
51551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (useMockTheme()) {
51651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        // The mock theme can't handle zoomed controls, so we fall back to the "fallback" theme.
51751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        ControlPart part = style->appearance();
51851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        if (part == CheckboxPart || part == RadioPart)
51951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)            return style->effectiveZoom() != 1;
52051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    }
52151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return RenderTheme::shouldUseFallbackTheme(style);
52251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)}
52351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)
524c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
525