15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This file is part of the WebKit project.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006 Apple Computer, Inc.
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., 59 Temple Place - Suite 330,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02111-1307, USA.
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderThemeChromiumWin.h"
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <windows.h>
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <uxtheme.h>
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <vssym32.h>
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "CSSValueKeywords.h"
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "HTMLNames.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLMediaElement.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/shadow/MediaControlElements.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/LayoutTestSupport.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/ScrollbarTheme.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/FontSelector.h"
3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/GraphicsContext.h"
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/chromium/FontUtilsChromiumWin.h"
4153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/chromium/TransparencyWin.h"
4253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/win/SystemInfo.h"
4353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/PaintInfo.h"
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderBox.h"
4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderProgress.h"
4653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderSlider.h"
475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/Platform.h"
485267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebColor.h"
495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebRect.h"
505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/win/WebThemeEngine.h"
5102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch#include "wtf/CurrentTime.h"
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: This dependency should eventually be removed.
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <skia/ext/skia_utils_win.h>
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// The standard width for the menu list drop-down button when run under
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// layout test mode. Use the value that's currently captured in most baselines.
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const int kStandardMenuListButtonWidth = 17;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace {
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// We must not create multiple ThemePainter instances.
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class ThemePainter {
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ThemePainter(GraphicsContext* context, const IntRect& r)
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(!s_hasInstance);
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_hasInstance = true;
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        TransparencyWin::TransformMode transformMode = getTransformMode(context->getCTM());
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_helper.init(context, getLayerMode(context, transformMode), transformMode, r);
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!m_helper.context()) {
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // TransparencyWin doesn't have well-defined copy-ctor nor op=()
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // so we re-initialize it instead of assigning a fresh istance.
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // On the reinitialization, we fallback to use NoLayer mode.
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // Note that the original initialization failure can be caused by
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // a failure of an internal buffer allocation and NoLayer mode
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            // does not have such buffer allocations.
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_helper.~TransparencyWin();
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            new (&m_helper) TransparencyWin();
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_helper.init(context, TransparencyWin::NoLayer, transformMode, r);
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ~ThemePainter()
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_helper.composite();
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_hasInstance = false;
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GraphicsContext* context() { return m_helper.context(); }
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const IntRect& drawRect() { return m_helper.drawRect(); }
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static TransparencyWin::LayerMode getLayerMode(GraphicsContext* context, TransparencyWin::TransformMode transformMode)
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
10453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (!context->isCertainlyOpaque()) // Might have transparent background.
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return TransparencyWin::WhiteLayer;
10681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        if (context->canvas()->isDrawingToLayer()) // Needs antialiasing help.
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return TransparencyWin::OpaqueCompositeLayer;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Nothing interesting.
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return transformMode == TransparencyWin::KeepTransform ? TransparencyWin::NoLayer : TransparencyWin::OpaqueCompositeLayer;
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static TransparencyWin::TransformMode getTransformMode(const AffineTransform& matrix)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (matrix.b() || matrix.c()) // Skew.
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return TransparencyWin::Untransform;
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (matrix.a() != 1.0 || matrix.d() != 1.0) // Scale.
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return TransparencyWin::ScaleTransform;
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Nothing interesting.
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return TransparencyWin::KeepTransform;
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    TransparencyWin m_helper;
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static bool s_hasInstance;
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool ThemePainter::s_hasInstance = false;
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Internal static helper functions.  We don't put them in an anonymous
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// namespace so they have easier access to the WebCore namespace.
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static bool supportsFocus(ControlPart appearance)
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (appearance) {
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case SquareButtonPart:
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PushButtonPart:
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ButtonPart:
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case SearchFieldPart:
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case TextFieldPart:
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case TextAreaPart:
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static double querySystemBlinkInterval(double defaultInterval)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    UINT blinkTime = GetCaretBlinkTime();
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!blinkTime)
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return defaultInterval;
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (blinkTime == INFINITE)
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return blinkTime / 1000.0;
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<RenderTheme> RenderThemeChromiumWin::create()
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return adoptRef(new RenderThemeChromiumWin);
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<RenderTheme> RenderTheme::themeForPage(Page* page)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static RenderTheme* rt = RenderThemeChromiumWin::create().leakRef();
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return rt;
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderThemeChromiumWin::supportsFocusRing(const RenderStyle* style) const
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Let webkit draw one of its halo rings around any focused element,
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // except push buttons. For buttons we use the windows PBS_DEFAULTED
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // styling to give it a blue border.
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return style->appearance() == ButtonPart
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            || style->appearance() == PushButtonPart
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            || style->appearance() == SquareButtonPart;
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Color RenderThemeChromiumWin::platformActiveSelectionBackgroundColor() const
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isRunningLayoutTest())
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Color(0x00, 0x00, 0xff); // Royal blue.
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    COLORREF color = GetSysColor(COLOR_HIGHLIGHT);
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Color(GetRValue(color), GetGValue(color), GetBValue(color), 0xff);
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Color RenderThemeChromiumWin::platformInactiveSelectionBackgroundColor() const
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isRunningLayoutTest())
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Color(0x99, 0x99, 0x99); // Medium gray.
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    COLORREF color = GetSysColor(COLOR_GRAYTEXT);
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Color(GetRValue(color), GetGValue(color), GetBValue(color), 0xff);
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Color RenderThemeChromiumWin::platformActiveSelectionForegroundColor() const
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isRunningLayoutTest())
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return Color(0xff, 0xff, 0xcc); // Pale yellow.
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    COLORREF color = GetSysColor(COLOR_HIGHLIGHTTEXT);
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Color(GetRValue(color), GetGValue(color), GetBValue(color), 0xff);
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Color RenderThemeChromiumWin::platformInactiveSelectionForegroundColor() const
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Color::white;
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Color RenderThemeChromiumWin::platformActiveTextSearchHighlightColor() const
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Color(0xff, 0x96, 0x32); // Orange.
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Color RenderThemeChromiumWin::platformInactiveTextSearchHighlightColor() const
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Color(0xff, 0xff, 0x96); // Yellow.
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Map a CSSValue* system color to an index understood by GetSysColor().
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static int cssValueIdToSysColorIndex(int cssValueId)
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (cssValueId) {
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueActiveborder: return COLOR_ACTIVEBORDER;
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueActivecaption: return COLOR_ACTIVECAPTION;
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueAppworkspace: return COLOR_APPWORKSPACE;
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueBackground: return COLOR_BACKGROUND;
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueButtonface: return COLOR_BTNFACE;
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueButtonhighlight: return COLOR_BTNHIGHLIGHT;
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueButtonshadow: return COLOR_BTNSHADOW;
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueButtontext: return COLOR_BTNTEXT;
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueCaptiontext: return COLOR_CAPTIONTEXT;
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueGraytext: return COLOR_GRAYTEXT;
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueHighlight: return COLOR_HIGHLIGHT;
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueHighlighttext: return COLOR_HIGHLIGHTTEXT;
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueInactiveborder: return COLOR_INACTIVEBORDER;
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueInactivecaption: return COLOR_INACTIVECAPTION;
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueInactivecaptiontext: return COLOR_INACTIVECAPTIONTEXT;
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueInfobackground: return COLOR_INFOBK;
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueInfotext: return COLOR_INFOTEXT;
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueMenu: return COLOR_MENU;
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueMenutext: return COLOR_MENUTEXT;
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueScrollbar: return COLOR_SCROLLBAR;
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueThreeddarkshadow: return COLOR_3DDKSHADOW;
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueThreedface: return COLOR_3DFACE;
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueThreedhighlight: return COLOR_3DHIGHLIGHT;
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueThreedlightshadow: return COLOR_3DLIGHT;
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueThreedshadow: return COLOR_3DSHADOW;
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueWindow: return COLOR_WINDOW;
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueWindowframe: return COLOR_WINDOWFRAME;
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSValueWindowtext: return COLOR_WINDOWTEXT;
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default: return -1; // Unsupported CSSValue
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2575267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)Color RenderThemeChromiumWin::systemColor(CSSValueID cssValueId) const
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int sysColorIndex = cssValueIdToSysColorIndex(cssValueId);
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isRunningLayoutTest() || (sysColorIndex == -1))
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return RenderTheme::systemColor(cssValueId);
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    COLORREF color = GetSysColor(sysColorIndex);
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return Color(GetRValue(color), GetGValue(color), GetBValue(color));
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntSize RenderThemeChromiumWin::sliderTickSize() const
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return IntSize(1, 3);
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int RenderThemeChromiumWin::sliderTickOffsetFromTrackCenter() const
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 11;
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void RenderThemeChromiumWin::adjustSliderThumbSize(RenderStyle* style, Element* element) const
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // These sizes match what WinXP draws for various menus.
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const int sliderThumbAlongAxis = 11;
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const int sliderThumbAcrossAxis = 21;
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (style->appearance() == SliderThumbHorizontalPart) {
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        style->setWidth(Length(sliderThumbAlongAxis, Fixed));
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        style->setHeight(Length(sliderThumbAcrossAxis, Fixed));
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else if (style->appearance() == SliderThumbVerticalPart) {
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        style->setWidth(Length(sliderThumbAcrossAxis, Fixed));
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        style->setHeight(Length(sliderThumbAlongAxis, Fixed));
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        RenderThemeChromiumSkia::adjustSliderThumbSize(style, element);
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderThemeChromiumWin::paintCheckbox(RenderObject* o, const PaintInfo& i, const IntRect& r)
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return paintButton(o, i, r);
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderThemeChromiumWin::paintRadio(RenderObject* o, const PaintInfo& i, const IntRect& r)
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return paintButton(o, i, r);
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderThemeChromiumWin::paintButton(RenderObject* o, const PaintInfo& i, const IntRect& r)
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const ThemeData& themeData = getThemeData(o);
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ThemePainter painter(i.context, r);
30681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    WebKit::WebCanvas* canvas = painter.context()->canvas();
307926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebKit::Platform::current()->themeEngine()->paintButton(canvas, themeData.m_part, themeData.m_state, themeData.m_classicState, WebKit::WebRect(painter.drawRect()));
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderThemeChromiumWin::paintTextField(RenderObject* o, const PaintInfo& i, const IntRect& r)
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return paintTextFieldInternal(o, i, r, true);
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderThemeChromiumWin::paintSliderTrack(RenderObject* o, const PaintInfo& i, const IntRect& r)
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const ThemeData& themeData = getThemeData(o);
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ThemePainter painter(i.context, r);
32181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    WebKit::WebCanvas* canvas = painter.context()->canvas();
322926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebKit::Platform::current()->themeEngine()->paintTrackbar(canvas, themeData.m_part, themeData.m_state, themeData.m_classicState, WebKit::WebRect(painter.drawRect()));
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    paintSliderTicks(o, i, r);
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderThemeChromiumWin::paintSliderThumb(RenderObject* o, const PaintInfo& i, const IntRect& r)
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const ThemeData& themeData = getThemeData(o);
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ThemePainter painter(i.context, r);
33481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    WebKit::WebCanvas* canvas = painter.context()->canvas();
335926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebKit::Platform::current()->themeEngine()->paintTrackbar(canvas, themeData.m_part, themeData.m_state, themeData.m_classicState, WebKit::WebRect(painter.drawRect()));
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static int menuListButtonWidth()
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
34202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    static int width = isRunningLayoutTest() ? kStandardMenuListButtonWidth :
343926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        IntSize(WebKit::Platform::current()->themeEngine()->getSize(SBP_ARROWBTN)).width();
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return width;
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// Used to paint unstyled menulists (i.e. with the default border)
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderThemeChromiumWin::paintMenuList(RenderObject* o, const PaintInfo& i, const IntRect& r)
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!o->isBox())
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const RenderBox* box = toRenderBox(o);
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int borderRight = box->borderRight();
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int borderLeft = box->borderLeft();
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int borderTop = box->borderTop();
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int borderBottom = box->borderBottom();
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If all the borders are 0, then tell skia not to paint the border on the
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // textfield.  FIXME: http://b/1210017 Figure out how to get Windows to not
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // draw individual borders and then pass that to skia so we can avoid
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // drawing any borders that are set to 0. For non-zero borders, we draw the
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // border, but webkit just draws over it.
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool drawEdges = !(!borderRight && !borderLeft && !borderTop && !borderBottom);
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    paintTextFieldInternal(o, i, r, drawEdges);
36753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    return paintMenuListButton(o, i, r);
36853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
36953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
37053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)bool RenderThemeChromiumWin::paintMenuListButton(RenderObject* o, const PaintInfo& i, const IntRect& r)
37153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles){
37253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    if (!o->isBox())
37353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return false;
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
37553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    const RenderBox* box = toRenderBox(o);
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Take padding and border into account.  If the MenuList is smaller than
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // the size of a button, make sure to shrink it appropriately and not put
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // its x position to the left of the menulist.
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const int buttonWidth = menuListButtonWidth();
38053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    int spacingLeft = box->borderLeft() + box->paddingLeft();
38153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    int spacingRight = box->borderRight() + box->paddingRight();
38253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    int spacingTop = box->borderTop() + box->paddingTop();
38353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    int spacingBottom = box->borderBottom() + box->paddingBottom();
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int buttonX;
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (r.maxX() - r.x() < buttonWidth)
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        buttonX = r.x();
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        buttonX = o->style()->direction() == LTR ? r.maxX() - spacingRight - buttonWidth : r.x() + spacingLeft;
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Compute the rectangle of the button in the destination image.
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect rect(buttonX,
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 r.y() + spacingTop,
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 std::min(buttonWidth, r.maxX() - r.x()),
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                 r.height() - (spacingTop + spacingBottom));
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Get the correct theme data for a textfield and paint the menu.
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ThemePainter painter(i.context, rect);
39981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    WebKit::WebCanvas* canvas = painter.context()->canvas();
400926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebKit::Platform::current()->themeEngine()->paintMenuList(canvas, CP_DROPDOWNBUTTON, determineState(o), determineClassicState(o), WebKit::WebRect(painter.drawRect()));
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double RenderThemeChromiumWin::caretBlinkIntervalInternal() const
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This involves a system call, so we cache the result.
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static double blinkInterval = querySystemBlinkInterval(RenderTheme::caretBlinkInterval());
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return blinkInterval;
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned RenderThemeChromiumWin::determineState(RenderObject* o, ControlSubPart subPart)
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned result = TS_NORMAL;
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ControlPart appearance = o->style()->appearance();
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!isEnabled(o))
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = TS_DISABLED;
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (isReadOnlyControl(o))
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = (appearance == TextFieldPart || appearance == TextAreaPart || appearance == SearchFieldPart) ? ETS_READONLY : TS_DISABLED;
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Active overrides hover and focused.
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (isPressed(o) && (subPart == SpinButtonUp) == isSpinUpButtonPartPressed(o))
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = TS_PRESSED;
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (supportsFocus(appearance) && isFocused(o))
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = ETS_FOCUSED;
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (isHovered(o) && (subPart == SpinButtonUp) == isSpinUpButtonPartHovered(o))
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = TS_HOT;
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // CBS_UNCHECKED*: 1-4
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // CBS_CHECKED*: 5-8
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // CBS_MIXED*: 9-12
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isIndeterminate(o))
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result += 8;
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (isChecked(o))
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result += 4;
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned RenderThemeChromiumWin::determineSliderThumbState(RenderObject* o)
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned result = TUS_NORMAL;
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!isEnabled(o))
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = TUS_DISABLED;
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (supportsFocus(o->style()->appearance()) && isFocused(o))
4435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = TUS_FOCUSED;
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (isPressed(o))
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = TUS_PRESSED;
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (isHovered(o))
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result = TUS_HOT;
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)unsigned RenderThemeChromiumWin::determineClassicState(RenderObject* o, ControlSubPart subPart)
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned result = 0;
4545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ControlPart part = o->style()->appearance();
4565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Sliders are always in the normal state.
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (part == SliderHorizontalPart || part == SliderVerticalPart)
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return result;
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // So are readonly text fields.
4625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (isReadOnlyControl(o) && (part == TextFieldPart || part == TextAreaPart || part == SearchFieldPart))
4635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return result;
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (part == SliderThumbHorizontalPart || part == SliderThumbVerticalPart) {
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!isEnabled(o))
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result = DFCS_INACTIVE;
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else if (isPressed(o)) // Active supersedes hover
4695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result = DFCS_PUSHED;
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else if (isHovered(o))
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result = DFCS_HOT;
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else {
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (!isEnabled(o) || isReadOnlyControl(o))
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result = DFCS_INACTIVE;
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Active supersedes hover
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else if (isPressed(o) && (subPart == SpinButtonUp) == isSpinUpButtonPartPressed(o))
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result = DFCS_PUSHED;
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else if (supportsFocus(part) && isFocused(o)) // So does focused
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result = 0;
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else if (isHovered(o) && (subPart == SpinButtonUp) == isSpinUpButtonPartHovered(o))
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result = DFCS_HOT;
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Classic theme can't represent indeterminate states. Use unchecked appearance.
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (isChecked(o) && !isIndeterminate(o))
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            result |= DFCS_CHECKED;
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)ThemeData RenderThemeChromiumWin::getThemeData(RenderObject* o, ControlSubPart subPart)
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ThemeData result;
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (o->style()->appearance()) {
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CheckboxPart:
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_part = BP_CHECKBOX;
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_state = determineState(o);
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_classicState = DFCS_BUTTONCHECK;
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case RadioPart:
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_part = BP_RADIOBUTTON;
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_state = determineState(o);
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_classicState = DFCS_BUTTONRADIO;
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case SquareButtonPart:
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case PushButtonPart:
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ButtonPart:
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_part = BP_PUSHBUTTON;
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_state = determineState(o);
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_classicState = DFCS_BUTTONPUSH;
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case SliderHorizontalPart:
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_part = TKP_TRACK;
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_state = TRS_NORMAL;
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case SliderVerticalPart:
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_part = TKP_TRACKVERT;
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_state = TRVS_NORMAL;
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case SliderThumbHorizontalPart:
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_part = TKP_THUMBBOTTOM;
5205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_state = determineSliderThumbState(o);
5215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case SliderThumbVerticalPart:
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_part = TKP_THUMBVERT;
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_state = determineSliderThumbState(o);
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ListboxPart:
5275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case MenulistPart:
5285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case MenulistButtonPart:
5295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case SearchFieldPart:
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case TextFieldPart:
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case TextAreaPart:
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_part = EP_EDITTEXT;
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_state = determineState(o);
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case InnerSpinButtonPart:
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_part = subPart == SpinButtonUp ? SPNP_UP : SPNP_DOWN;
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_state = determineState(o, subPart);
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        result.m_classicState = subPart == SpinButtonUp ? DFCS_SCROLLUP : DFCS_SCROLLDOWN;
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    result.m_classicState |= determineClassicState(o, subPart);
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return result;
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderThemeChromiumWin::paintTextFieldInternal(RenderObject* o,
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                    const PaintInfo& i,
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                    const IntRect& r,
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                                                    bool drawEdges)
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Fallback to white if the specified color object is invalid.
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Color backgroundColor(Color::white);
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (o->style()->visitedDependentColor(CSSPropertyBackgroundColor).isValid())
55583750176c3ee2cea66c8a9751271026a5901be3aBen Murdoch        backgroundColor = o->resolveColor(CSSPropertyBackgroundColor);
5565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If we have background-image, don't fill the content area to expose the
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // parent's background. Also, we shouldn't fill the content area if the
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // alpha of the color is 0. The API of Windows GDI ignores the alpha.
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    //
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Note that we should paint the content area white if we have neither the
5625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // background color nor background image explicitly specified to keep the
5635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // appearance of select element consistent with other browsers.
5645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool fillContentArea = !o->style()->hasBackgroundImage() && backgroundColor.alpha();
5655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (o->style()->hasBorderRadius()) {
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // If the style has rounded borders, setup the context to clip the
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // background (themed or filled) appropriately.
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // FIXME: make sure we do the right thing if css background-clip is set.
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        i.context->save();
571926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        i.context->clipRoundedRect(o->style()->getRoundedBorderFor(r));
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const ThemeData& themeData = getThemeData(o);
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ThemePainter painter(i.context, r);
57681a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        WebKit::WebCanvas* canvas = painter.context()->canvas();
577926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        WebKit::Platform::current()->themeEngine()->paintTextField(canvas, themeData.m_part, themeData.m_state, themeData.m_classicState, WebKit::WebRect(painter.drawRect()), backgroundColor.rgb(), fillContentArea, drawEdges);
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // End of block commits the painter before restoring context.
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (o->style()->hasBorderRadius())
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        i.context->restore();
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5855267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void RenderThemeChromiumWin::adjustInnerSpinButtonStyle(RenderStyle* style, Element*) const
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int width = ScrollbarTheme::theme()->scrollbarThickness();
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    style->setWidth(Length(width, Fixed));
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    style->setMinWidth(Length(width, Fixed));
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderThemeChromiumWin::paintInnerSpinButton(RenderObject* object, const PaintInfo& info, const IntRect& rect)
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect half = rect;
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Need explicit blocks to avoid to create multiple ThemePainter instances.
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        half.setHeight(rect.height() / 2);
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const ThemeData& upThemeData = getThemeData(object, SpinButtonUp);
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ThemePainter upPainter(info.context, half);
60181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        WebKit::WebCanvas* canvas = upPainter.context()->canvas();
602926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        WebKit::Platform::current()->themeEngine()->paintSpinButton(canvas, upThemeData.m_part, upThemeData.m_state, upThemeData.m_classicState, WebKit::WebRect(upPainter.drawRect()));
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        half.setY(rect.y() + rect.height() / 2);
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        const ThemeData& downThemeData = getThemeData(object, SpinButtonDown);
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ThemePainter downPainter(info.context, half);
60981a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        WebKit::WebCanvas* canvas = downPainter.context()->canvas();
610926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        WebKit::Platform::current()->themeEngine()->paintSpinButton(canvas, downThemeData.m_part, downThemeData.m_state, downThemeData.m_classicState, WebKit::WebRect(downPainter.drawRect()));
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// MSDN says that update intervals for the bar is 30ms.
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// http://msdn.microsoft.com/en-us/library/bb760842(v=VS.85).aspx
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static const double progressAnimationFrameRate = 0.033;
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double RenderThemeChromiumWin::animationRepeatIntervalForProgressBar(RenderProgress*) const
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return progressAnimationFrameRate;
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)double RenderThemeChromiumWin::animationDurationForProgressBar(RenderProgress* renderProgress) const
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // On Chromium Windows port, animationProgress() and associated values aren't used.
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // So here we can return arbitrary positive value.
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return progressAnimationFrameRate;
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6315267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)void RenderThemeChromiumWin::adjustProgressBarStyle(RenderStyle*, Element*) const
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderThemeChromiumWin::paintProgressBar(RenderObject* o, const PaintInfo& i, const IntRect& r)
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!o->isProgress())
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderProgress* renderProgress = toRenderProgress(o);
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For indeterminate bar, valueRect is ignored and it is computed by the theme engine
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // because the animation is a platform detail and WebKit doesn't need to know how.
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    IntRect valueRect = renderProgress->isDeterminate() ? determinateProgressValueRectFor(renderProgress, r) : IntRect(0, 0, 0, 0);
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    double animatedSeconds = renderProgress->animationStartTime() ?  WTF::currentTime() - renderProgress->animationStartTime() : 0;
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ThemePainter painter(i.context, r);
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DirectionFlippingScope scope(o, i, r);
64781a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    WebKit::WebCanvas* canvas = painter.context()->canvas();
648926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    WebKit::Platform::current()->themeEngine()->paintProgressBar(canvas, WebKit::WebRect(r), WebKit::WebRect(valueRect), renderProgress->isDeterminate(), animatedSeconds);
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool RenderThemeChromiumWin::shouldOpenPickerWithF4Key() const
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return true;
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
65793ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)bool RenderThemeChromiumWin::shouldUseFallbackTheme(RenderStyle* style) const
65893ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles){
65993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    ControlPart part = style->appearance();
66093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    if (part == CheckboxPart || part == RadioPart)
66193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return style->effectiveZoom() != 1;
66293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    return false;
66393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)}
66493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
666