| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "content/child/webfallbackthemeengine_impl.h" |
| |
| #include "base/macros.h" |
| #include "skia/ext/platform_canvas.h" |
| #include "third_party/WebKit/public/platform/WebRect.h" |
| #include "third_party/WebKit/public/platform/WebSize.h" |
| #include "ui/native_theme/native_theme_base.h" |
| |
| using blink::WebCanvas; |
| using blink::WebColor; |
| using blink::WebRect; |
| using blink::WebFallbackThemeEngine; |
| |
| namespace content { |
| |
| class WebFallbackThemeEngineImpl::WebFallbackNativeTheme |
| : public ui::NativeThemeBase { |
| public: |
| WebFallbackNativeTheme() {} |
| ~WebFallbackNativeTheme() override {} |
| |
| // NativeTheme: |
| SkColor GetSystemColor(ColorId color_id) const override { |
| // The paint routines in NativeThemeBase only use GetSystemColor for |
| // button focus colors and the fallback theme is not used for buttons. |
| NOTREACHED(); |
| return SK_ColorRED; |
| } |
| |
| private: |
| DISALLOW_COPY_AND_ASSIGN(WebFallbackNativeTheme); |
| }; |
| |
| static ui::NativeTheme::Part NativeThemePart( |
| WebFallbackThemeEngine::Part part) { |
| switch (part) { |
| case WebFallbackThemeEngine::kPartScrollbarDownArrow: |
| return ui::NativeTheme::kScrollbarDownArrow; |
| case WebFallbackThemeEngine::kPartScrollbarLeftArrow: |
| return ui::NativeTheme::kScrollbarLeftArrow; |
| case WebFallbackThemeEngine::kPartScrollbarRightArrow: |
| return ui::NativeTheme::kScrollbarRightArrow; |
| case WebFallbackThemeEngine::kPartScrollbarUpArrow: |
| return ui::NativeTheme::kScrollbarUpArrow; |
| case WebFallbackThemeEngine::kPartScrollbarHorizontalThumb: |
| return ui::NativeTheme::kScrollbarHorizontalThumb; |
| case WebFallbackThemeEngine::kPartScrollbarVerticalThumb: |
| return ui::NativeTheme::kScrollbarVerticalThumb; |
| case WebFallbackThemeEngine::kPartScrollbarHorizontalTrack: |
| return ui::NativeTheme::kScrollbarHorizontalTrack; |
| case WebFallbackThemeEngine::kPartScrollbarVerticalTrack: |
| return ui::NativeTheme::kScrollbarVerticalTrack; |
| case WebFallbackThemeEngine::kPartScrollbarCorner: |
| return ui::NativeTheme::kScrollbarCorner; |
| case WebFallbackThemeEngine::kPartCheckbox: |
| return ui::NativeTheme::kCheckbox; |
| case WebFallbackThemeEngine::kPartRadio: |
| return ui::NativeTheme::kRadio; |
| case WebFallbackThemeEngine::kPartButton: |
| return ui::NativeTheme::kPushButton; |
| case WebFallbackThemeEngine::kPartTextField: |
| return ui::NativeTheme::kTextField; |
| case WebFallbackThemeEngine::kPartMenuList: |
| return ui::NativeTheme::kMenuList; |
| case WebFallbackThemeEngine::kPartSliderTrack: |
| return ui::NativeTheme::kSliderTrack; |
| case WebFallbackThemeEngine::kPartSliderThumb: |
| return ui::NativeTheme::kSliderThumb; |
| case WebFallbackThemeEngine::kPartInnerSpinButton: |
| return ui::NativeTheme::kInnerSpinButton; |
| case WebFallbackThemeEngine::kPartProgressBar: |
| return ui::NativeTheme::kProgressBar; |
| default: |
| return ui::NativeTheme::kScrollbarDownArrow; |
| } |
| } |
| |
| static ui::NativeTheme::State NativeThemeState( |
| WebFallbackThemeEngine::State state) { |
| switch (state) { |
| case WebFallbackThemeEngine::kStateDisabled: |
| return ui::NativeTheme::kDisabled; |
| case WebFallbackThemeEngine::kStateHover: |
| return ui::NativeTheme::kHovered; |
| case WebFallbackThemeEngine::kStateNormal: |
| return ui::NativeTheme::kNormal; |
| case WebFallbackThemeEngine::kStatePressed: |
| return ui::NativeTheme::kPressed; |
| default: |
| return ui::NativeTheme::kDisabled; |
| } |
| } |
| |
| static void GetNativeThemeExtraParams( |
| WebFallbackThemeEngine::Part part, |
| WebFallbackThemeEngine::State state, |
| const WebFallbackThemeEngine::ExtraParams* extra_params, |
| ui::NativeTheme::ExtraParams* native_theme_extra_params) { |
| switch (part) { |
| case WebFallbackThemeEngine::kPartScrollbarHorizontalTrack: |
| case WebFallbackThemeEngine::kPartScrollbarVerticalTrack: |
| native_theme_extra_params->scrollbar_track.track_x = |
| extra_params->scrollbar_track.track_x; |
| native_theme_extra_params->scrollbar_track.track_y = |
| extra_params->scrollbar_track.track_y; |
| native_theme_extra_params->scrollbar_track.track_width = |
| extra_params->scrollbar_track.track_width; |
| native_theme_extra_params->scrollbar_track.track_height = |
| extra_params->scrollbar_track.track_height; |
| break; |
| case WebFallbackThemeEngine::kPartCheckbox: |
| native_theme_extra_params->button.checked = extra_params->button.checked; |
| native_theme_extra_params->button.indeterminate = |
| extra_params->button.indeterminate; |
| break; |
| case WebFallbackThemeEngine::kPartRadio: |
| native_theme_extra_params->button.checked = extra_params->button.checked; |
| break; |
| case WebFallbackThemeEngine::kPartButton: |
| native_theme_extra_params->button.is_default = |
| extra_params->button.is_default; |
| native_theme_extra_params->button.has_border = |
| extra_params->button.has_border; |
| // Native buttons have a different focus style. |
| native_theme_extra_params->button.is_focused = false; |
| native_theme_extra_params->button.background_color = |
| extra_params->button.background_color; |
| break; |
| case WebFallbackThemeEngine::kPartTextField: |
| native_theme_extra_params->text_field.is_text_area = |
| extra_params->text_field.is_text_area; |
| native_theme_extra_params->text_field.is_listbox = |
| extra_params->text_field.is_listbox; |
| native_theme_extra_params->text_field.background_color = |
| extra_params->text_field.background_color; |
| break; |
| case WebFallbackThemeEngine::kPartMenuList: |
| native_theme_extra_params->menu_list.has_border = |
| extra_params->menu_list.has_border; |
| native_theme_extra_params->menu_list.has_border_radius = |
| extra_params->menu_list.has_border_radius; |
| native_theme_extra_params->menu_list.arrow_x = |
| extra_params->menu_list.arrow_x; |
| native_theme_extra_params->menu_list.arrow_y = |
| extra_params->menu_list.arrow_y; |
| native_theme_extra_params->menu_list.arrow_size = |
| extra_params->menu_list.arrow_size; |
| native_theme_extra_params->menu_list.arrow_color = |
| extra_params->menu_list.arrow_color; |
| native_theme_extra_params->menu_list.background_color = |
| extra_params->menu_list.background_color; |
| break; |
| case WebFallbackThemeEngine::kPartSliderTrack: |
| case WebFallbackThemeEngine::kPartSliderThumb: |
| native_theme_extra_params->slider.vertical = |
| extra_params->slider.vertical; |
| native_theme_extra_params->slider.in_drag = extra_params->slider.in_drag; |
| break; |
| case WebFallbackThemeEngine::kPartInnerSpinButton: |
| native_theme_extra_params->inner_spin.spin_up = |
| extra_params->inner_spin.spin_up; |
| native_theme_extra_params->inner_spin.read_only = |
| extra_params->inner_spin.read_only; |
| break; |
| case WebFallbackThemeEngine::kPartProgressBar: |
| native_theme_extra_params->progress_bar.determinate = |
| extra_params->progress_bar.determinate; |
| native_theme_extra_params->progress_bar.value_rect_x = |
| extra_params->progress_bar.value_rect_x; |
| native_theme_extra_params->progress_bar.value_rect_y = |
| extra_params->progress_bar.value_rect_y; |
| native_theme_extra_params->progress_bar.value_rect_width = |
| extra_params->progress_bar.value_rect_width; |
| native_theme_extra_params->progress_bar.value_rect_height = |
| extra_params->progress_bar.value_rect_height; |
| break; |
| default: |
| break; // Parts that have no extra params get here. |
| } |
| } |
| |
| WebFallbackThemeEngineImpl::WebFallbackThemeEngineImpl() |
| : theme_(new WebFallbackNativeTheme()) {} |
| |
| WebFallbackThemeEngineImpl::~WebFallbackThemeEngineImpl() {} |
| |
| blink::WebSize WebFallbackThemeEngineImpl::GetSize( |
| WebFallbackThemeEngine::Part part) { |
| ui::NativeTheme::ExtraParams extra; |
| return theme_->GetPartSize(NativeThemePart(part), |
| ui::NativeTheme::kNormal, |
| extra); |
| } |
| |
| void WebFallbackThemeEngineImpl::Paint( |
| blink::WebCanvas* canvas, |
| WebFallbackThemeEngine::Part part, |
| WebFallbackThemeEngine::State state, |
| const blink::WebRect& rect, |
| const WebFallbackThemeEngine::ExtraParams* extra_params) { |
| ui::NativeTheme::ExtraParams native_theme_extra_params; |
| GetNativeThemeExtraParams( |
| part, state, extra_params, &native_theme_extra_params); |
| theme_->Paint(canvas, |
| NativeThemePart(part), |
| NativeThemeState(state), |
| gfx::Rect(rect), |
| native_theme_extra_params); |
| } |
| |
| } // namespace content |