15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/child/webthemeengine_impl_android.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "skia/ext/platform_canvas.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRect.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebSize.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/native_theme/native_theme.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebCanvas; 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebColor; 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebRect; 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebThemeEngine; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace content { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static ui::NativeTheme::Part NativeThemePart( 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebThemeEngine::Part part) { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (part) { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartScrollbarDownArrow: 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::NativeTheme::kScrollbarDownArrow; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartScrollbarLeftArrow: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::NativeTheme::kScrollbarLeftArrow; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartScrollbarRightArrow: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::NativeTheme::kScrollbarRightArrow; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartScrollbarUpArrow: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::NativeTheme::kScrollbarUpArrow; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartScrollbarHorizontalThumb: 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartScrollbarVerticalThumb: 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartScrollbarHorizontalTrack: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartScrollbarVerticalTrack: 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case WebThemeEngine::PartScrollbarCorner: 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Android doesn't draw scrollbars. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<ui::NativeTheme::Part>(0); 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartCheckbox: 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::NativeTheme::kCheckbox; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartRadio: 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::NativeTheme::kRadio; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartButton: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::NativeTheme::kPushButton; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartTextField: 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::NativeTheme::kTextField; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartMenuList: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::NativeTheme::kMenuList; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartSliderTrack: 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::NativeTheme::kSliderTrack; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartSliderThumb: 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::NativeTheme::kSliderThumb; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartInnerSpinButton: 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::NativeTheme::kInnerSpinButton; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartProgressBar: 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::NativeTheme::kProgressBar; 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::NativeTheme::kScrollbarDownArrow; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static ui::NativeTheme::State NativeThemeState( 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebThemeEngine::State state) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (state) { 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::StateDisabled: 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::NativeTheme::kDisabled; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::StateHover: 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::NativeTheme::kHovered; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::StateNormal: 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::NativeTheme::kNormal; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::StatePressed: 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::NativeTheme::kPressed; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::NativeTheme::kDisabled; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void GetNativeThemeExtraParams( 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebThemeEngine::Part part, 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebThemeEngine::State state, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebThemeEngine::ExtraParams* extra_params, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::NativeTheme::ExtraParams* native_theme_extra_params) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (part) { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartScrollbarHorizontalTrack: 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartScrollbarVerticalTrack: 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Android doesn't draw scrollbars. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartCheckbox: 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->button.checked = extra_params->button.checked; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->button.indeterminate = 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params->button.indeterminate; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartRadio: 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->button.checked = extra_params->button.checked; 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartButton: 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->button.is_default = 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params->button.isDefault; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->button.has_border = 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params->button.hasBorder; 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Native buttons have a different focus style. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->button.is_focused = false; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->button.background_color = 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params->button.backgroundColor; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartTextField: 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->text_field.is_text_area = 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params->textField.isTextArea; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->text_field.is_listbox = 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params->textField.isListbox; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->text_field.background_color = 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params->textField.backgroundColor; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartMenuList: 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->menu_list.has_border = 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params->menuList.hasBorder; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->menu_list.has_border_radius = 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params->menuList.hasBorderRadius; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->menu_list.arrow_x = 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params->menuList.arrowX; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->menu_list.arrow_y = 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params->menuList.arrowY; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->menu_list.background_color = 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params->menuList.backgroundColor; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartSliderTrack: 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartSliderThumb: 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->slider.vertical = 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params->slider.vertical; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->slider.in_drag = extra_params->slider.inDrag; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartInnerSpinButton: 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->inner_spin.spin_up = 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params->innerSpin.spinUp; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->inner_spin.read_only = 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params->innerSpin.readOnly; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case WebThemeEngine::PartProgressBar: 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->progress_bar.determinate = 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params->progressBar.determinate; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->progress_bar.value_rect_x = 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params->progressBar.valueRectX; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->progress_bar.value_rect_y = 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params->progressBar.valueRectY; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->progress_bar.value_rect_width = 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params->progressBar.valueRectWidth; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params->progress_bar.value_rect_height = 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) extra_params->progressBar.valueRectHeight; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; // Parts that have no extra params get here. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)blink::WebSize WebThemeEngineImpl::getSize(WebThemeEngine::Part part) { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::NativeTheme::ExtraParams extra; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::NativeTheme::instance()->GetPartSize( 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NativeThemePart(part), ui::NativeTheme::kNormal, extra); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebThemeEngineImpl::paint( 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebCanvas* canvas, 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebThemeEngine::Part part, 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebThemeEngine::State state, 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebRect& rect, 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const WebThemeEngine::ExtraParams* extra_params) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::NativeTheme::ExtraParams native_theme_extra_params; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetNativeThemeExtraParams( 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) part, state, extra_params, &native_theme_extra_params); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::NativeTheme::instance()->Paint( 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) canvas, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NativeThemePart(part), 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NativeThemeState(state), 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect(rect), 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_theme_extra_params); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace content 179