1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 2116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 3116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// found in the LICENSE file. 4116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "mojo/services/html_viewer/webthemeengine_impl.h" 6116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 7116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "skia/ext/platform_canvas.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/WebKit/public/platform/WebRect.h" 9116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "third_party/WebKit/public/platform/WebSize.h" 10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/native_theme/native_theme.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing blink::WebCanvas; 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing blink::WebColor; 14116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing blink::WebRect; 15116680a4aac90f2aa7413d9095a592090648e557Ben Murdochusing blink::WebThemeEngine; 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace mojo { 18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 19116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstatic ui::NativeTheme::Part NativeThemePart( 20116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebThemeEngine::Part part) { 21116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (part) { 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartScrollbarDownArrow: 23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kScrollbarDownArrow; 24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartScrollbarLeftArrow: 25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kScrollbarLeftArrow; 26116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartScrollbarRightArrow: 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kScrollbarRightArrow; 28116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartScrollbarUpArrow: 29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kScrollbarUpArrow; 30116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartScrollbarHorizontalThumb: 31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kScrollbarHorizontalThumb; 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartScrollbarVerticalThumb: 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kScrollbarVerticalThumb; 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartScrollbarHorizontalTrack: 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kScrollbarHorizontalTrack; 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartScrollbarVerticalTrack: 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kScrollbarVerticalTrack; 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartScrollbarCorner: 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kScrollbarCorner; 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartCheckbox: 41116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kCheckbox; 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartRadio: 43116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kRadio; 44116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartButton: 45116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kPushButton; 46116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartTextField: 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kTextField; 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartMenuList: 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kMenuList; 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartSliderTrack: 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kSliderTrack; 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartSliderThumb: 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kSliderThumb; 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartInnerSpinButton: 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kInnerSpinButton; 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartProgressBar: 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kProgressBar; 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default: 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kScrollbarDownArrow; 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstatic ui::NativeTheme::State NativeThemeState( 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebThemeEngine::State state) { 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (state) { 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::StateDisabled: 67116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kDisabled; 68116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::StateHover: 69116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kHovered; 70116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::StateNormal: 71116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kNormal; 72116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::StatePressed: 73116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kPressed; 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default: 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::kDisabled; 76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 79116680a4aac90f2aa7413d9095a592090648e557Ben Murdochstatic void GetNativeThemeExtraParams( 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebThemeEngine::Part part, 81116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebThemeEngine::State state, 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const WebThemeEngine::ExtraParams* extra_params, 83116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::NativeTheme::ExtraParams* native_theme_extra_params) { 84116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (part) { 85116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartScrollbarHorizontalTrack: 86116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartScrollbarVerticalTrack: 87116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->scrollbar_track.track_x = 88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->scrollbarTrack.trackX; 89116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->scrollbar_track.track_y = 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->scrollbarTrack.trackY; 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->scrollbar_track.track_width = 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->scrollbarTrack.trackWidth; 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->scrollbar_track.track_height = 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->scrollbarTrack.trackHeight; 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartCheckbox: 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->button.checked = extra_params->button.checked; 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->button.indeterminate = 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->button.indeterminate; 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartRadio: 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->button.checked = extra_params->button.checked; 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartButton: 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->button.is_default = 106116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->button.isDefault; 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->button.has_border = 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->button.hasBorder; 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Native buttons have a different focus style. 110116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->button.is_focused = false; 111116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->button.background_color = 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->button.backgroundColor; 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartTextField: 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->text_field.is_text_area = 116116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->textField.isTextArea; 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->text_field.is_listbox = 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->textField.isListbox; 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->text_field.background_color = 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->textField.backgroundColor; 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartMenuList: 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->menu_list.has_border = 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->menuList.hasBorder; 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->menu_list.has_border_radius = 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->menuList.hasBorderRadius; 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->menu_list.arrow_x = 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->menuList.arrowX; 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->menu_list.arrow_y = 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->menuList.arrowY; 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->menu_list.background_color = 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->menuList.backgroundColor; 133116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartSliderTrack: 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartSliderThumb: 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->slider.vertical = 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->slider.vertical; 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->slider.in_drag = extra_params->slider.inDrag; 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartInnerSpinButton: 141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->inner_spin.spin_up = 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->innerSpin.spinUp; 143116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->inner_spin.read_only = 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->innerSpin.readOnly; 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case WebThemeEngine::PartProgressBar: 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->progress_bar.determinate = 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->progressBar.determinate; 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->progress_bar.value_rect_x = 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->progressBar.valueRectX; 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->progress_bar.value_rect_y = 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->progressBar.valueRectY; 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->progress_bar.value_rect_width = 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->progressBar.valueRectWidth; 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params->progress_bar.value_rect_height = 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra_params->progressBar.valueRectHeight; 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default: 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch break; // Parts that have no extra params get here. 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdochblink::WebSize WebThemeEngineImpl::getSize(WebThemeEngine::Part part) { 164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::NativeTheme::ExtraParams extra; 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return ui::NativeTheme::instance()->GetPartSize(NativeThemePart(part), 166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::NativeTheme::kNormal, 167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch extra); 168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 170116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebThemeEngineImpl::paint( 171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blink::WebCanvas* canvas, 172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebThemeEngine::Part part, 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebThemeEngine::State state, 174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const blink::WebRect& rect, 175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const WebThemeEngine::ExtraParams* extra_params) { 176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::NativeTheme::ExtraParams native_theme_extra_params; 177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetNativeThemeExtraParams( 178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch part, state, extra_params, &native_theme_extra_params); 179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::NativeTheme::instance()->Paint( 180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch canvas, 181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NativeThemePart(part), 182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NativeThemeState(state), 183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Rect(rect), 184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_theme_extra_params); 185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 187116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid WebThemeEngineImpl::paintStateTransition(blink::WebCanvas* canvas, 188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebThemeEngine::Part part, 189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebThemeEngine::State startState, 190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch WebThemeEngine::State endState, 191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch double progress, 192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const blink::WebRect& rect) { 193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::NativeTheme::instance()->PaintStateTransition( 194116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch canvas, 195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NativeThemePart(part), 196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NativeThemeState(startState), 197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NativeThemeState(endState), 198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch progress, 199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch gfx::Rect(rect)); 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} // namespace mojo 203