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