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