Home | History | Annotate | Download | only in child
      1 // Copyright 2014 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "content/child/webthemeengine_impl_default.h"
      6 
      7 #include "skia/ext/platform_canvas.h"
      8 #include "third_party/WebKit/public/platform/WebRect.h"
      9 #include "third_party/WebKit/public/platform/WebSize.h"
     10 #include "ui/native_theme/native_theme.h"
     11 
     12 using blink::WebCanvas;
     13 using blink::WebColor;
     14 using blink::WebRect;
     15 using blink::WebThemeEngine;
     16 
     17 namespace content {
     18 
     19 static ui::NativeTheme::Part NativeThemePart(
     20     WebThemeEngine::Part part) {
     21   switch (part) {
     22     case WebThemeEngine::PartScrollbarDownArrow:
     23       return ui::NativeTheme::kScrollbarDownArrow;
     24     case WebThemeEngine::PartScrollbarLeftArrow:
     25       return ui::NativeTheme::kScrollbarLeftArrow;
     26     case WebThemeEngine::PartScrollbarRightArrow:
     27       return ui::NativeTheme::kScrollbarRightArrow;
     28     case WebThemeEngine::PartScrollbarUpArrow:
     29       return ui::NativeTheme::kScrollbarUpArrow;
     30     case WebThemeEngine::PartScrollbarHorizontalThumb:
     31       return ui::NativeTheme::kScrollbarHorizontalThumb;
     32     case WebThemeEngine::PartScrollbarVerticalThumb:
     33       return ui::NativeTheme::kScrollbarVerticalThumb;
     34     case WebThemeEngine::PartScrollbarHorizontalTrack:
     35       return ui::NativeTheme::kScrollbarHorizontalTrack;
     36     case WebThemeEngine::PartScrollbarVerticalTrack:
     37       return ui::NativeTheme::kScrollbarVerticalTrack;
     38     case WebThemeEngine::PartScrollbarCorner:
     39       return ui::NativeTheme::kScrollbarCorner;
     40     case WebThemeEngine::PartCheckbox:
     41       return ui::NativeTheme::kCheckbox;
     42     case WebThemeEngine::PartRadio:
     43       return ui::NativeTheme::kRadio;
     44     case WebThemeEngine::PartButton:
     45       return ui::NativeTheme::kPushButton;
     46     case WebThemeEngine::PartTextField:
     47       return ui::NativeTheme::kTextField;
     48     case WebThemeEngine::PartMenuList:
     49       return ui::NativeTheme::kMenuList;
     50     case WebThemeEngine::PartSliderTrack:
     51       return ui::NativeTheme::kSliderTrack;
     52     case WebThemeEngine::PartSliderThumb:
     53       return ui::NativeTheme::kSliderThumb;
     54     case WebThemeEngine::PartInnerSpinButton:
     55       return ui::NativeTheme::kInnerSpinButton;
     56     case WebThemeEngine::PartProgressBar:
     57       return ui::NativeTheme::kProgressBar;
     58     default:
     59       return ui::NativeTheme::kScrollbarDownArrow;
     60   }
     61 }
     62 
     63 static ui::NativeTheme::State NativeThemeState(
     64     WebThemeEngine::State state) {
     65   switch (state) {
     66     case WebThemeEngine::StateDisabled:
     67       return ui::NativeTheme::kDisabled;
     68     case WebThemeEngine::StateHover:
     69       return ui::NativeTheme::kHovered;
     70     case WebThemeEngine::StateNormal:
     71       return ui::NativeTheme::kNormal;
     72     case WebThemeEngine::StatePressed:
     73       return ui::NativeTheme::kPressed;
     74     default:
     75       return ui::NativeTheme::kDisabled;
     76   }
     77 }
     78 
     79 static void GetNativeThemeExtraParams(
     80     WebThemeEngine::Part part,
     81     WebThemeEngine::State state,
     82     const WebThemeEngine::ExtraParams* extra_params,
     83     ui::NativeTheme::ExtraParams* native_theme_extra_params) {
     84   switch (part) {
     85     case WebThemeEngine::PartScrollbarHorizontalTrack:
     86     case WebThemeEngine::PartScrollbarVerticalTrack:
     87       native_theme_extra_params->scrollbar_track.track_x =
     88           extra_params->scrollbarTrack.trackX;
     89       native_theme_extra_params->scrollbar_track.track_y =
     90           extra_params->scrollbarTrack.trackY;
     91       native_theme_extra_params->scrollbar_track.track_width =
     92           extra_params->scrollbarTrack.trackWidth;
     93       native_theme_extra_params->scrollbar_track.track_height =
     94           extra_params->scrollbarTrack.trackHeight;
     95       break;
     96     case WebThemeEngine::PartCheckbox:
     97       native_theme_extra_params->button.checked = extra_params->button.checked;
     98       native_theme_extra_params->button.indeterminate =
     99           extra_params->button.indeterminate;
    100       break;
    101     case WebThemeEngine::PartRadio:
    102       native_theme_extra_params->button.checked = extra_params->button.checked;
    103       break;
    104     case WebThemeEngine::PartButton:
    105       native_theme_extra_params->button.is_default =
    106           extra_params->button.isDefault;
    107       native_theme_extra_params->button.has_border =
    108           extra_params->button.hasBorder;
    109       // Native buttons have a different focus style.
    110       native_theme_extra_params->button.is_focused = false;
    111       native_theme_extra_params->button.background_color =
    112           extra_params->button.backgroundColor;
    113       break;
    114     case WebThemeEngine::PartTextField:
    115       native_theme_extra_params->text_field.is_text_area =
    116           extra_params->textField.isTextArea;
    117       native_theme_extra_params->text_field.is_listbox =
    118           extra_params->textField.isListbox;
    119       native_theme_extra_params->text_field.background_color =
    120           extra_params->textField.backgroundColor;
    121       break;
    122     case WebThemeEngine::PartMenuList:
    123       native_theme_extra_params->menu_list.has_border =
    124           extra_params->menuList.hasBorder;
    125       native_theme_extra_params->menu_list.has_border_radius =
    126           extra_params->menuList.hasBorderRadius;
    127       native_theme_extra_params->menu_list.arrow_x =
    128           extra_params->menuList.arrowX;
    129       native_theme_extra_params->menu_list.arrow_y =
    130           extra_params->menuList.arrowY;
    131       native_theme_extra_params->menu_list.background_color =
    132           extra_params->menuList.backgroundColor;
    133       break;
    134     case WebThemeEngine::PartSliderTrack:
    135     case WebThemeEngine::PartSliderThumb:
    136       native_theme_extra_params->slider.vertical =
    137           extra_params->slider.vertical;
    138       native_theme_extra_params->slider.in_drag = extra_params->slider.inDrag;
    139       break;
    140     case WebThemeEngine::PartInnerSpinButton:
    141       native_theme_extra_params->inner_spin.spin_up =
    142           extra_params->innerSpin.spinUp;
    143       native_theme_extra_params->inner_spin.read_only =
    144           extra_params->innerSpin.readOnly;
    145       break;
    146     case WebThemeEngine::PartProgressBar:
    147       native_theme_extra_params->progress_bar.determinate =
    148           extra_params->progressBar.determinate;
    149       native_theme_extra_params->progress_bar.value_rect_x =
    150           extra_params->progressBar.valueRectX;
    151       native_theme_extra_params->progress_bar.value_rect_y =
    152           extra_params->progressBar.valueRectY;
    153       native_theme_extra_params->progress_bar.value_rect_width =
    154           extra_params->progressBar.valueRectWidth;
    155       native_theme_extra_params->progress_bar.value_rect_height =
    156           extra_params->progressBar.valueRectHeight;
    157       break;
    158     default:
    159       break;  // Parts that have no extra params get here.
    160   }
    161 }
    162 
    163 blink::WebSize WebThemeEngineImpl::getSize(WebThemeEngine::Part part) {
    164   ui::NativeTheme::ExtraParams extra;
    165   return ui::NativeTheme::instance()->GetPartSize(NativeThemePart(part),
    166                                                    ui::NativeTheme::kNormal,
    167                                                    extra);
    168 }
    169 
    170 void WebThemeEngineImpl::paint(
    171     blink::WebCanvas* canvas,
    172     WebThemeEngine::Part part,
    173     WebThemeEngine::State state,
    174     const blink::WebRect& rect,
    175     const WebThemeEngine::ExtraParams* extra_params) {
    176   ui::NativeTheme::ExtraParams native_theme_extra_params;
    177   GetNativeThemeExtraParams(
    178       part, state, extra_params, &native_theme_extra_params);
    179   ui::NativeTheme::instance()->Paint(
    180       canvas,
    181       NativeThemePart(part),
    182       NativeThemeState(state),
    183       gfx::Rect(rect),
    184       native_theme_extra_params);
    185 }
    186 
    187 void WebThemeEngineImpl::paintStateTransition(blink::WebCanvas* canvas,
    188                                               WebThemeEngine::Part part,
    189                                               WebThemeEngine::State startState,
    190                                               WebThemeEngine::State endState,
    191                                               double progress,
    192                                               const blink::WebRect& rect) {
    193   ui::NativeTheme::instance()->PaintStateTransition(
    194       canvas,
    195       NativeThemePart(part),
    196       NativeThemeState(startState),
    197       NativeThemeState(endState),
    198       progress,
    199       gfx::Rect(rect));
    200 }
    201 
    202 }  // namespace content
    203