Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / ui / native_theme / native_theme_win.cc
index 5bd78f3..474bcab 100644 (file)
@@ -82,9 +82,9 @@ void SetCheckerboardShader(SkPaint* paint, const RECT& align_rect) {
   // function returns.  The copy will copy the pixel data into a place owned by
   // the bitmap, which is in turn owned by the shader, etc., so it will live
   // until we're done using it.
+  SkImageInfo info = SkImageInfo::MakeN32Premul(2, 2);
   SkBitmap temp_bitmap;
-  temp_bitmap.setConfig(SkBitmap::kARGB_8888_Config, 2, 2);
-  temp_bitmap.setPixels(buffer);
+  temp_bitmap.installPixels(info, buffer, info.minRowBytes());
   SkBitmap bitmap;
   temp_bitmap.copyTo(&bitmap);
 
@@ -132,9 +132,7 @@ RECT InsetRect(const RECT* rect, int size) {
 namespace ui {
 
 bool NativeThemeWin::IsThemingActive() const {
-  if (is_theme_active_)
-    return !!is_theme_active_();
-  return false;
+  return is_theme_active_ && is_theme_active_();
 }
 
 bool NativeThemeWin::IsUsingHighContrastTheme() const {
@@ -155,15 +153,13 @@ HRESULT NativeThemeWin::GetThemeColor(ThemeName theme,
                                       int prop_id,
                                       SkColor* color) const {
   HANDLE handle = GetThemeHandle(theme);
-  if (handle && get_theme_color_) {
-    COLORREF color_ref;
-    if (get_theme_color_(handle, part_id, state_id, prop_id, &color_ref) ==
-        S_OK) {
-      *color = skia::COLORREFToSkColor(color_ref);
-      return S_OK;
-    }
-  }
-  return E_NOTIMPL;
+  if (!handle || !get_theme_color_)
+    return E_NOTIMPL;
+  COLORREF color_ref;
+  if (get_theme_color_(handle, part_id, state_id, prop_id, &color_ref) != S_OK)
+    return E_NOTIMPL;
+  *color = skia::COLORREFToSkColor(color_ref);
+  return S_OK;
 }
 
 SkColor NativeThemeWin::GetThemeColorWithDefault(ThemeName theme,
@@ -172,25 +168,22 @@ SkColor NativeThemeWin::GetThemeColorWithDefault(ThemeName theme,
                                                  int prop_id,
                                                  int default_sys_color) const {
   SkColor color;
-  if (GetThemeColor(theme, part_id, state_id, prop_id, &color) != S_OK)
-    color = color_utils::GetSysSkColor(default_sys_color);
-  return color;
+  return (GetThemeColor(theme, part_id, state_id, prop_id, &color) == S_OK) ?
+      color : color_utils::GetSysSkColor(default_sys_color);
 }
 
 gfx::Size NativeThemeWin::GetThemeBorderSize(ThemeName theme) const {
   // For simplicity use the wildcard state==0, part==0, since it works
   // for the cases we currently depend on.
   int border;
-  if (GetThemeInt(theme, 0, 0, TMT_BORDERSIZE, &border) == S_OK)
-    return gfx::Size(border, border);
-  else
-    return gfx::Size(GetSystemMetrics(SM_CXEDGE), GetSystemMetrics(SM_CYEDGE));
+  return (GetThemeInt(theme, 0, 0, TMT_BORDERSIZE, &border) == S_OK) ?
+      gfx::Size(border, border) :
+      gfx::Size(GetSystemMetrics(SM_CXEDGE), GetSystemMetrics(SM_CYEDGE));
 }
 
 void NativeThemeWin::DisableTheming() const {
-  if (!set_theme_properties_)
-    return;
-  set_theme_properties_(0);
+  if (set_theme_properties_)
+    set_theme_properties_(0);
 }
 
 void NativeThemeWin::CloseHandles() const {
@@ -206,10 +199,7 @@ void NativeThemeWin::CloseHandles() const {
 }
 
 bool NativeThemeWin::IsClassicTheme(ThemeName name) const {
-  if (!theme_dll_)
-    return true;
-
-  return !GetThemeHandle(name);
+  return !theme_dll_ || !GetThemeHandle(name);
 }
 
 // static
@@ -241,37 +231,24 @@ gfx::Size NativeThemeWin::GetPartSize(Part part,
         size = 17;
       return gfx::Size(size, size);
     }
+    default:
+      break;
   }
 
   int part_id = GetWindowsPart(part, state, extra);
   int state_id = GetWindowsState(part, state, extra);
 
+  base::win::ScopedGetDC screen_dc(NULL);
   SIZE size;
-  HDC hdc = GetDC(NULL);
-  HRESULT hr = GetThemePartSize(GetThemeName(part), hdc, part_id, state_id,
-                                NULL, TS_TRUE, &size);
-  ReleaseDC(NULL, hdc);
-
-  if (FAILED(hr)) {
-    // TODO(rogerta): For now, we need to support radio buttons and checkboxes
-    // when theming is not enabled.  Support for other parts can be added
-    // if/when needed.
-    switch (part) {
-      case kCheckbox:
-      case kRadio:
-        // TODO(rogerta): I was not able to find any API to get the default
-        // size of these controls, so determined these values empirically.
-        size.cx = 13;
-        size.cy = 13;
-        break;
-      default:
-        size.cx = 0;
-        size.cy = 0;
-        break;
-    }
-  }
-
-  return gfx::Size(size.cx, size.cy);
+  if (SUCCEEDED(GetThemePartSize(GetThemeName(part), screen_dc, part_id,
+                                 state_id, NULL, TS_TRUE, &size)))
+    return gfx::Size(size.cx, size.cy);
+
+  // TODO(rogerta): For now, we need to support radio buttons and checkboxes
+  // when theming is not enabled.  Support for other parts can be added
+  // if/when needed.
+  return (part == kCheckbox || part == kRadio) ?
+      gfx::Size(13, 13) : gfx::Size();
 }
 
 void NativeThemeWin::Paint(SkCanvas* canvas,
@@ -298,6 +275,8 @@ void NativeThemeWin::Paint(SkCanvas* canvas,
     case kMenuItemBackground:
       CommonThemePaintMenuItemBackground(canvas, state, rect);
       return;
+    default:
+      break;
   }
 
   bool needs_paint_indirect = false;
@@ -315,16 +294,14 @@ void NativeThemeWin::Paint(SkCanvas* canvas,
       case kScrollbarUpArrow:
       case kScrollbarLeftArrow:
       case kScrollbarRightArrow:
-        if (!GetThemeHandle(SCROLLBAR))
-          needs_paint_indirect = true;
+        needs_paint_indirect = !GetThemeHandle(SCROLLBAR);
         break;
       case kScrollbarHorizontalThumb:
       case kScrollbarVerticalThumb:
       case kScrollbarHorizontalGripper:
       case kScrollbarVerticalGripper:
-        if (!GetThemeHandle(SCROLLBAR) ||
-            base::win::GetVersion() == base::win::VERSION_XP)
-          needs_paint_indirect = true;
+        needs_paint_indirect = !GetThemeHandle(SCROLLBAR) ||
+            base::win::GetVersion() == base::win::VERSION_XP;
         break;
       default:
         break;
@@ -413,82 +390,80 @@ void NativeThemeWin::PaintDirect(SkCanvas* canvas,
   switch (part) {
     case kCheckbox:
       PaintCheckbox(hdc, part, state, rect, extra.button);
-      break;
-    case kRadio:
-      PaintRadioButton(hdc, part, state, rect, extra.button);
-      break;
-    case kPushButton:
-      PaintPushButton(hdc, part, state, rect, extra.button);
-      break;
+      return;
+    case kInnerSpinButton:
+      PaintSpinButton(hdc, part, state, rect, extra.inner_spin);
+      return;
+    case kMenuList:
+      PaintMenuList(hdc, state, rect, extra.menu_list);
+      return;
+    case kMenuCheck:
+      PaintMenuCheck(hdc, state, rect, extra.menu_check);
+      return;
+    case kMenuCheckBackground:
+      PaintMenuCheckBackground(hdc, state, rect);
+      return;
     case kMenuPopupArrow:
       PaintMenuArrow(hdc, state, rect, extra.menu_arrow);
-      break;
+      return;
+    case kMenuPopupBackground:
+      PaintMenuBackground(hdc, rect);
+      return;
     case kMenuPopupGutter:
       PaintMenuGutter(hdc, rect);
-      break;
+      return;
     case kMenuPopupSeparator:
       PaintMenuSeparator(hdc, rect, extra.menu_separator);
-      break;
-    case kMenuPopupBackground:
-      PaintMenuBackground(hdc, rect);
-      break;
-    case kMenuCheck:
-      PaintMenuCheck(hdc, state, rect, extra.menu_check);
-      break;
-    case kMenuCheckBackground:
-      PaintMenuCheckBackground(hdc, state, rect);
-      break;
+      return;
     case kMenuItemBackground:
       PaintMenuItemBackground(hdc, state, rect, extra.menu_item);
-      break;
-    case kMenuList:
-      PaintMenuList(hdc, state, rect, extra.menu_list);
-      break;
+      return;
+    case kProgressBar:
+      PaintProgressBar(hdc, rect, extra.progress_bar);
+      return;
+    case kPushButton:
+      PaintPushButton(hdc, part, state, rect, extra.button);
+      return;
+    case kRadio:
+      PaintRadioButton(hdc, part, state, rect, extra.button);
+      return;
     case kScrollbarDownArrow:
     case kScrollbarUpArrow:
     case kScrollbarLeftArrow:
     case kScrollbarRightArrow:
       PaintScrollbarArrow(hdc, part, state, rect, extra.scrollbar_arrow);
-      break;
+      return;
+    case kScrollbarHorizontalThumb:
+    case kScrollbarVerticalThumb:
+    case kScrollbarHorizontalGripper:
+    case kScrollbarVerticalGripper:
+      PaintScrollbarThumb(hdc, part, state, rect, extra.scrollbar_thumb);
+      return;
     case kScrollbarHorizontalTrack:
     case kScrollbarVerticalTrack:
       PaintScrollbarTrack(canvas, hdc, part, state, rect,
                           extra.scrollbar_track);
-      break;
+      return;
     case kScrollbarCorner:
       canvas->drawColor(SK_ColorWHITE, SkXfermode::kSrc_Mode);
-      break;
-    case kScrollbarHorizontalThumb:
-    case kScrollbarVerticalThumb:
-    case kScrollbarHorizontalGripper:
-    case kScrollbarVerticalGripper:
-      PaintScrollbarThumb(hdc, part, state, rect, extra.scrollbar_thumb);
-      break;
-    case kInnerSpinButton:
-      PaintSpinButton(hdc, part, state, rect, extra.inner_spin);
-      break;
+      return;
+    case kTabPanelBackground:
+      PaintTabPanelBackground(hdc, rect);
+      return;
+    case kTextField:
+      PaintTextField(hdc, part, state, rect, extra.text_field);
+      return;
     case kTrackbarThumb:
     case kTrackbarTrack:
       PaintTrackbar(canvas, hdc, part, state, rect, extra.trackbar);
-      break;
-    case kProgressBar:
-      PaintProgressBar(hdc, rect, extra.progress_bar);
-      break;
+      return;
     case kWindowResizeGripper:
       PaintWindowResizeGripper(hdc, rect);
-      break;
-    case kTabPanelBackground:
-      PaintTabPanelBackground(hdc, rect);
-      break;
-    case kTextField:
-      PaintTextField(hdc, part, state, rect, extra.text_field);
-      break;
-
+      return;
+    case kComboboxArrow:
     case kSliderTrack:
     case kSliderThumb:
-    default:
-      // While transitioning NativeThemeWin to the single Paint() entry point,
-      // unsupported parts will DCHECK here.
+    case kMaxPart:
       NOTREACHED();
   }
 }
@@ -505,9 +480,9 @@ SkColor NativeThemeWin::GetSystemColor(ColorId color_id) const {
 
     // Dialogs
     case kColorId_DialogBackground:
-      if (gfx::IsInvertedColorScheme())
-        return color_utils::InvertColor(kDialogBackgroundColor);
-      return kDialogBackgroundColor;
+      return gfx::IsInvertedColorScheme() ?
+          color_utils::InvertColor(kDialogBackgroundColor) :
+          kDialogBackgroundColor;
 
     // FocusableBorder
     case kColorId_FocusedBorderColor:
@@ -528,6 +503,12 @@ SkColor NativeThemeWin::GetSystemColor(ColorId color_id) const {
       return kButtonHoverColor;
     case kColorId_ButtonHoverBackgroundColor:
       return kButtonHoverBackgroundColor;
+    case kColorId_BlueButtonEnabledColor:
+    case kColorId_BlueButtonDisabledColor:
+    case kColorId_BlueButtonPressedColor:
+    case kColorId_BlueButtonHoverColor:
+      NOTREACHED();
+      return kInvalidColorIdColor;
 
     // MenuItem
     case kColorId_EnabledMenuItemForegroundColor:
@@ -540,6 +521,19 @@ SkColor NativeThemeWin::GetSystemColor(ColorId color_id) const {
       return kFocusedMenuItemBackgroundColor;
     case kColorId_MenuSeparatorColor:
       return kMenuSeparatorColor;
+    case kColorId_SelectedMenuItemForegroundColor:
+    case kColorId_HoverMenuItemBackgroundColor:
+    case kColorId_MenuBackgroundColor:
+    case kColorId_MenuBorderColor:
+      NOTREACHED();
+      return kInvalidColorIdColor;
+
+    // MenuButton
+    case kColorId_EnabledMenuButtonBorderColor:
+    case kColorId_FocusedMenuButtonBorderColor:
+    case kColorId_HoverMenuButtonBorderColor:
+      NOTREACHED();
+      return kInvalidColorIdColor;
 
     // Label
     case kColorId_LabelEnabledColor:
@@ -563,6 +557,12 @@ SkColor NativeThemeWin::GetSystemColor(ColorId color_id) const {
     case kColorId_TextfieldSelectionBackgroundFocused:
       return system_colors_[COLOR_HIGHLIGHT];
 
+    // Tooltip
+    case kColorId_TooltipBackground:
+    case kColorId_TooltipText:
+      NOTREACHED();
+      return kInvalidColorIdColor;
+
     // Tree
     // NOTE: these aren't right for all themes, but as close as I could get.
     case kColorId_TreeBackground:
@@ -641,11 +641,8 @@ SkColor NativeThemeWin::GetSystemColor(ColorId color_id) const {
     case kColorId_ResultsTableSelectedDivider:
       return color_utils::AlphaBlend(system_colors_[COLOR_HIGHLIGHTTEXT],
                                      system_colors_[COLOR_HIGHLIGHT], 0x34);
-
-    default:
-      NOTREACHED();
-      break;
   }
+  NOTREACHED();
   return kInvalidColorIdColor;
 }
 
@@ -664,8 +661,6 @@ void NativeThemeWin::PaintIndirect(SkCanvas* canvas,
       skia::BitmapPlatformDevice::Create(
           rect.width(), rect.height(), false, NULL));
   DCHECK(device);
-  if (!device)
-    return;
   SkCanvas offscreen_canvas(device.get());
   DCHECK(skia::SupportsPlatformPaint(&offscreen_canvas));
 
@@ -692,21 +687,18 @@ void NativeThemeWin::PaintIndirect(SkCanvas* canvas,
       adjusted_extra.scrollbar_track.track_x = 0;
       adjusted_extra.scrollbar_track.track_y = 0;
       break;
-    default: break;
+    default:
+      break;
   }
   // Draw the theme controls using existing HDC-drawing code.
-  PaintDirect(&offscreen_canvas,
-              part,
-              state,
-              adjusted_rect,
-              adjusted_extra);
+  PaintDirect(&offscreen_canvas, part, state, adjusted_rect, adjusted_extra);
 
   // Copy the pixels to a bitmap that has ref-counted pixel storage, which is
   // necessary to have when drawing to a SkPicture.
   const SkBitmap& hdc_bitmap =
       offscreen_canvas.getDevice()->accessBitmap(false);
   SkBitmap bitmap;
-  hdc_bitmap.copyTo(&bitmap, kPMColor_SkColorType);
+  hdc_bitmap.copyTo(&bitmap, kN32_SkColorType);
 
   // Post-process the pixels to fix up the alpha values (see big comment above).
   const SkPMColor placeholder_value = SkPreMultiplyColor(placeholder);
@@ -737,10 +729,9 @@ HRESULT NativeThemeWin::GetThemePartSize(ThemeName theme_name,
                                          int ts,
                                          SIZE* size) const {
   HANDLE handle = GetThemeHandle(theme_name);
-  if (handle && get_theme_part_size_)
-    return get_theme_part_size_(handle, hdc, part_id, state_id, rect, ts, size);
-
-  return E_NOTIMPL;
+  return (handle && get_theme_part_size_) ?
+      get_theme_part_size_(handle, hdc, part_id, state_id, rect, ts, size) :
+      E_NOTIMPL;
 }
 
 HRESULT NativeThemeWin::PaintButton(HDC hdc,
@@ -766,7 +757,7 @@ HRESULT NativeThemeWin::PaintButton(HDC hdc,
       classic_state |= DFCS_BUTTONPUSH;
       break;
     default:
-      NOTREACHED() << "Unknown part_id: " << part_id;
+      NOTREACHED();
       break;
   }
 
@@ -774,14 +765,14 @@ HRESULT NativeThemeWin::PaintButton(HDC hdc,
     case kDisabled:
       classic_state |= DFCS_INACTIVE;
       break;
+    case kHovered:
+    case kNormal:
+      break;
     case kPressed:
       classic_state |= DFCS_PUSHED;
       break;
-    case kNormal:
-    case kHovered:
-      break;
-    default:
-      NOTREACHED() << "Unknown state: " << state;
+    case kNumStates:
+      NOTREACHED();
       break;
   }
 
@@ -854,17 +845,16 @@ HRESULT NativeThemeWin::PaintMenuGutter(HDC hdc,
                                         const gfx::Rect& rect) const {
   RECT rect_win = rect.ToRECT();
   HANDLE handle = GetThemeHandle(MENU);
-  if (handle && draw_theme_)
-    return draw_theme_(handle, hdc, MENU_POPUPGUTTER, MPI_NORMAL, &rect_win,
-                       NULL);
-  return E_NOTIMPL;
+  return (handle && draw_theme_) ?
+      draw_theme_(handle, hdc, MENU_POPUPGUTTER, MPI_NORMAL, &rect_win, NULL) :
+      E_NOTIMPL;
 }
 
-HRESULT NativeThemeWin::PaintMenuArrow(HDC hdc,
-                                       State state,
-                                       const gfx::Rect& rect,
-                                       const MenuArrowExtraParams& extra)
-    const {
+HRESULT NativeThemeWin::PaintMenuArrow(
+    HDC hdc,
+    State state,
+    const gfx::Rect& rect,
+    const MenuArrowExtraParams& extra) const {
   int state_id = MSM_NORMAL;
   if (state == kDisabled)
     state_id = MSM_DISABLED;
@@ -875,39 +865,33 @@ HRESULT NativeThemeWin::PaintMenuArrow(HDC hdc,
     if (extra.pointing_right) {
       return draw_theme_(handle, hdc, MENU_POPUPSUBMENU, state_id, &rect_win,
                          NULL);
-    } else {
-      // There is no way to tell the uxtheme API to draw a left pointing arrow;
-      // it doesn't have a flag equivalent to DFCS_MENUARROWRIGHT.  But they
-      // are needed for RTL locales on Vista.  So use a memory DC and mirror
-      // the region with GDI's StretchBlt.
-      gfx::Rect r(rect);
-      base::win::ScopedCreateDC mem_dc(CreateCompatibleDC(hdc));
-      base::win::ScopedBitmap mem_bitmap(CreateCompatibleBitmap(hdc, r.width(),
-                                                                r.height()));
-      base::win::ScopedSelectObject select_bitmap(mem_dc, mem_bitmap);
-      // Copy and horizontally mirror the background from hdc into mem_dc. Use
-      // a negative-width source rect, starting at the rightmost pixel.
-      StretchBlt(mem_dc, 0, 0, r.width(), r.height(),
-                 hdc, r.right()-1, r.y(), -r.width(), r.height(), SRCCOPY);
-      // Draw the arrow.
-      RECT theme_rect = {0, 0, r.width(), r.height()};
-      HRESULT result = draw_theme_(handle, mem_dc, MENU_POPUPSUBMENU,
-                                   state_id, &theme_rect, NULL);
-      // Copy and mirror the result back into mem_dc.
-      StretchBlt(hdc, r.x(), r.y(), r.width(), r.height(),
-                 mem_dc, r.width()-1, 0, -r.width(), r.height(), SRCCOPY);
-      return result;
     }
+    // There is no way to tell the uxtheme API to draw a left pointing arrow; it
+    // doesn't have a flag equivalent to DFCS_MENUARROWRIGHT.  But they are
+    // needed for RTL locales on Vista.  So use a memory DC and mirror the
+    // region with GDI's StretchBlt.
+    gfx::Rect r(rect);
+    base::win::ScopedCreateDC mem_dc(CreateCompatibleDC(hdc));
+    base::win::ScopedBitmap mem_bitmap(CreateCompatibleBitmap(hdc, r.width(),
+                                                              r.height()));
+    base::win::ScopedSelectObject select_bitmap(mem_dc, mem_bitmap);
+    // Copy and horizontally mirror the background from hdc into mem_dc. Use
+    // a negative-width source rect, starting at the rightmost pixel.
+    StretchBlt(mem_dc, 0, 0, r.width(), r.height(),
+                hdc, r.right()-1, r.y(), -r.width(), r.height(), SRCCOPY);
+    // Draw the arrow.
+    RECT theme_rect = {0, 0, r.width(), r.height()};
+    HRESULT result = draw_theme_(handle, mem_dc, MENU_POPUPSUBMENU,
+                                  state_id, &theme_rect, NULL);
+    // Copy and mirror the result back into mem_dc.
+    StretchBlt(hdc, r.x(), r.y(), r.width(), r.height(),
+                mem_dc, r.width()-1, 0, -r.width(), r.height(), SRCCOPY);
+    return result;
   }
 
   // For some reason, Windows uses the name DFCS_MENUARROWRIGHT to indicate a
-  // left pointing arrow. This makes the following 'if' statement slightly
-  // counterintuitive.
-  UINT pfc_state;
-  if (extra.pointing_right)
-    pfc_state = DFCS_MENUARROW;
-  else
-    pfc_state = DFCS_MENUARROWRIGHT;
+  // left pointing arrow. This makes the following statement counterintuitive.
+  UINT pfc_state = extra.pointing_right ? DFCS_MENUARROW : DFCS_MENUARROWRIGHT;
   return PaintFrameControl(hdc, rect, DFC_MENU, pfc_state, extra.is_selected,
                            state);
 }
@@ -934,16 +918,13 @@ HRESULT NativeThemeWin::PaintMenuCheck(
     const gfx::Rect& rect,
     const MenuCheckExtraParams& extra) const {
   HANDLE handle = GetThemeHandle(MENU);
-  int state_id;
-  if (extra.is_radio) {
-    state_id = state == kDisabled ? MC_BULLETDISABLED : MC_BULLETNORMAL;
-  } else {
-    state_id = state == kDisabled ? MC_CHECKMARKDISABLED : MC_CHECKMARKNORMAL;
-  }
-
-  RECT rect_win = rect.ToRECT();
-  if (handle && draw_theme_)
+  if (handle && draw_theme_) {
+    const int state_id = extra.is_radio ?
+        ((state == kDisabled) ? MC_BULLETDISABLED : MC_BULLETNORMAL) :
+        ((state == kDisabled) ? MC_CHECKMARKDISABLED : MC_CHECKMARKNORMAL);
+    RECT rect_win = rect.ToRECT();
     return draw_theme_(handle, hdc, MENU_POPUPCHECK, state_id, &rect_win, NULL);
+  }
 
   return PaintFrameControl(hdc, rect, DFC_MENU,
                            extra.is_radio ? DFCS_MENUBULLET : DFCS_MENUCHECK,
@@ -954,13 +935,13 @@ HRESULT NativeThemeWin::PaintMenuCheckBackground(HDC hdc,
                                                  State state,
                                                  const gfx::Rect& rect) const {
   HANDLE handle = GetThemeHandle(MENU);
+  if (!handle || !draw_theme_)
+    return S_OK;  // Nothing to do for background.
+
   int state_id = state == kDisabled ? MCB_DISABLED : MCB_NORMAL;
   RECT rect_win = rect.ToRECT();
-  if (handle && draw_theme_)
-    return draw_theme_(handle, hdc, MENU_POPUPCHECKBACKGROUND, state_id,
-                       &rect_win, NULL);
-  // Nothing to do for background.
-  return S_OK;
+  return draw_theme_(handle, hdc, MENU_POPUPCHECKBACKGROUND, state_id,
+                     &rect_win, NULL);
 }
 
 HRESULT NativeThemeWin::PaintMenuItemBackground(
@@ -970,19 +951,19 @@ HRESULT NativeThemeWin::PaintMenuItemBackground(
     const MenuItemExtraParams& extra) const {
   HANDLE handle = GetThemeHandle(MENU);
   RECT rect_win = rect.ToRECT();
-  int state_id;
+  int state_id = MPI_NORMAL;
   switch (state) {
-    case kNormal:
-      state_id = MPI_NORMAL;
-      break;
     case kDisabled:
       state_id = extra.is_selected ? MPI_DISABLEDHOT : MPI_DISABLED;
       break;
     case kHovered:
       state_id = MPI_HOT;
       break;
-    default:
-      NOTREACHED() << "Invalid state " << state;
+    case kNormal:
+      break;
+    case kPressed:
+    case kNumStates:
+      NOTREACHED();
       break;
   }
 
@@ -999,7 +980,7 @@ HRESULT NativeThemeWin::PaintPushButton(HDC hdc,
                                         State state,
                                         const gfx::Rect& rect,
                                         const ButtonExtraParams& extra) const {
-  int state_id;
+  int state_id = extra.is_default ? PBS_DEFAULTED : PBS_NORMAL;
   switch (state) {
     case kDisabled:
       state_id = PBS_DISABLED;
@@ -1008,13 +989,12 @@ HRESULT NativeThemeWin::PaintPushButton(HDC hdc,
       state_id = PBS_HOT;
       break;
     case kNormal:
-      state_id = extra.is_default ? PBS_DEFAULTED : PBS_NORMAL;
       break;
     case kPressed:
       state_id = PBS_PRESSED;
       break;
-    default:
-      NOTREACHED() << "Invalid state: " << state;
+    case kNumStates:
+      NOTREACHED();
       break;
   }
 
@@ -1027,7 +1007,7 @@ HRESULT NativeThemeWin::PaintRadioButton(HDC hdc,
                                          State state,
                                          const gfx::Rect& rect,
                                          const ButtonExtraParams& extra) const {
-  int state_id;
+  int state_id = extra.checked ? RBS_CHECKEDNORMAL : RBS_UNCHECKEDNORMAL;
   switch (state) {
     case kDisabled:
       state_id = extra.checked ? RBS_CHECKEDDISABLED : RBS_UNCHECKEDDISABLED;
@@ -1036,13 +1016,12 @@ HRESULT NativeThemeWin::PaintRadioButton(HDC hdc,
       state_id = extra.checked ? RBS_CHECKEDHOT : RBS_UNCHECKEDHOT;
       break;
     case kNormal:
-      state_id = extra.checked ? RBS_CHECKEDNORMAL : RBS_UNCHECKEDNORMAL;
       break;
     case kPressed:
       state_id = extra.checked ? RBS_CHECKEDPRESSED : RBS_UNCHECKEDPRESSED;
       break;
-    default:
-      NOTREACHED() << "Invalid state: " << state;
+    case kNumStates:
+      NOTREACHED();
       break;
   }
 
@@ -1055,30 +1034,29 @@ HRESULT NativeThemeWin::PaintCheckbox(HDC hdc,
                                       State state,
                                       const gfx::Rect& rect,
                                       const ButtonExtraParams& extra) const {
-  int state_id;
+  int state_id = extra.checked ?
+      CBS_CHECKEDNORMAL :
+      (extra.indeterminate ? CBS_MIXEDNORMAL : CBS_UNCHECKEDNORMAL);
   switch (state) {
     case kDisabled:
-      state_id = extra.checked ? CBS_CHECKEDDISABLED :
-          extra.indeterminate ? CBS_MIXEDDISABLED :
-              CBS_UNCHECKEDDISABLED;
+      state_id = extra.checked ?
+          CBS_CHECKEDDISABLED :
+          (extra.indeterminate ? CBS_MIXEDDISABLED : CBS_UNCHECKEDDISABLED);
       break;
     case kHovered:
-      state_id = extra.checked ? CBS_CHECKEDHOT :
-          extra.indeterminate ? CBS_MIXEDHOT :
-              CBS_UNCHECKEDHOT;
+      state_id = extra.checked ?
+          CBS_CHECKEDHOT :
+          (extra.indeterminate ? CBS_MIXEDHOT : CBS_UNCHECKEDHOT);
       break;
     case kNormal:
-      state_id = extra.checked ? CBS_CHECKEDNORMAL :
-          extra.indeterminate ? CBS_MIXEDNORMAL :
-              CBS_UNCHECKEDNORMAL;
       break;
     case kPressed:
-      state_id = extra.checked ? CBS_CHECKEDPRESSED :
-          extra.indeterminate ? CBS_MIXEDPRESSED :
-              CBS_UNCHECKEDPRESSED;
+      state_id = extra.checked ?
+          CBS_CHECKEDPRESSED :
+          (extra.indeterminate ? CBS_MIXEDPRESSED : CBS_UNCHECKEDPRESSED);
       break;
-    default:
-      NOTREACHED() << "Invalid state: " << state;
+    case kNumStates:
+      NOTREACHED();
       break;
   }
 
@@ -1092,22 +1070,21 @@ HRESULT NativeThemeWin::PaintMenuList(HDC hdc,
                                       const MenuListExtraParams& extra) const {
   HANDLE handle = GetThemeHandle(MENULIST);
   RECT rect_win = rect.ToRECT();
-  int state_id;
+  int state_id = CBXS_NORMAL;
   switch (state) {
-    case kNormal:
-      state_id = CBXS_NORMAL;
-      break;
     case kDisabled:
       state_id = CBXS_DISABLED;
       break;
     case kHovered:
       state_id = CBXS_HOT;
       break;
+    case kNormal:
+      break;
     case kPressed:
       state_id = CBXS_PRESSED;
       break;
-    default:
-      NOTREACHED() << "Invalid state " << state;
+    case kNumStates:
+      NOTREACHED();
       break;
   }
 
@@ -1127,7 +1104,7 @@ HRESULT NativeThemeWin::PaintScrollbarArrow(
     State state,
     const gfx::Rect& rect,
     const ScrollbarArrowExtraParams& extra) const {
-  static const int state_id_matrix[4][kMaxState] = {
+  static const int state_id_matrix[4][kNumStates] = {
       ABS_DOWNDISABLED, ABS_DOWNHOT, ABS_DOWNNORMAL, ABS_DOWNPRESSED,
       ABS_LEFTDISABLED, ABS_LEFTHOT, ABS_LEFTNORMAL, ABS_LEFTPRESSED,
       ABS_RIGHTDISABLED, ABS_RIGHTHOT, ABS_RIGHTNORMAL, ABS_RIGHTPRESSED,
@@ -1137,7 +1114,8 @@ HRESULT NativeThemeWin::PaintScrollbarArrow(
   RECT rect_win = rect.ToRECT();
   if (handle && draw_theme_) {
     int index = part - kScrollbarDownArrow;
-    DCHECK(index >=0 && index < 4);
+    DCHECK_GE(index, 0);
+    DCHECK_LT(static_cast<size_t>(index), arraysize(state_id_matrix));
     int state_id = state_id_matrix[index][state];
 
     // Hovering means that the cursor is over the scroolbar, but not over the
@@ -1158,7 +1136,7 @@ HRESULT NativeThemeWin::PaintScrollbarArrow(
           state_id = ABS_UPHOVER;
           break;
         default:
-          NOTREACHED() << "Invalid part: " << part;
+          NOTREACHED();
           break;
       }
     }
@@ -1168,7 +1146,6 @@ HRESULT NativeThemeWin::PaintScrollbarArrow(
   int classic_state = DFCS_SCROLLDOWN;
   switch (part) {
     case kScrollbarDownArrow:
-      classic_state = DFCS_SCROLLDOWN;
       break;
     case kScrollbarLeftArrow:
       classic_state = DFCS_SCROLLLEFT;
@@ -1180,7 +1157,7 @@ HRESULT NativeThemeWin::PaintScrollbarArrow(
       classic_state = DFCS_SCROLLUP;
       break;
     default:
-      NOTREACHED() << "Invalid part: " << part;
+      NOTREACHED();
       break;
   }
   switch (state) {
@@ -1195,8 +1172,8 @@ HRESULT NativeThemeWin::PaintScrollbarArrow(
     case kPressed:
       classic_state |= DFCS_PUSHED;
       break;
-    default:
-      NOTREACHED() << "Invalid state: " << state;
+    case kNumStates:
+      NOTREACHED();
       break;
   }
   DrawFrameControl(hdc, &rect_win, DFC_SCROLL, classic_state);
@@ -1211,27 +1188,26 @@ HRESULT NativeThemeWin::PaintScrollbarThumb(
     const ScrollbarThumbExtraParams& extra) const {
   HANDLE handle = GetThemeHandle(SCROLLBAR);
   RECT rect_win = rect.ToRECT();
-  int part_id;
-  int state_id;
 
+  int part_id = SBP_THUMBBTNVERT;
   switch (part) {
-    case NativeTheme::kScrollbarHorizontalThumb:
+    case kScrollbarHorizontalThumb:
       part_id = SBP_THUMBBTNHORZ;
       break;
-    case NativeTheme::kScrollbarVerticalThumb:
-      part_id = SBP_THUMBBTNVERT;
+    case kScrollbarVerticalThumb:
       break;
-    case NativeTheme::kScrollbarHorizontalGripper:
+    case kScrollbarHorizontalGripper:
       part_id = SBP_GRIPPERHORZ;
       break;
-    case NativeTheme::kScrollbarVerticalGripper:
+    case kScrollbarVerticalGripper:
       part_id = SBP_GRIPPERVERT;
       break;
     default:
-      NOTREACHED() << "Invalid part: " << part;
+      NOTREACHED();
       break;
   }
 
+  int state_id = SCRBS_NORMAL;
   switch (state) {
     case kDisabled:
       state_id = SCRBS_DISABLED;
@@ -1240,13 +1216,12 @@ HRESULT NativeThemeWin::PaintScrollbarThumb(
       state_id = extra.is_hovering ? SCRBS_HOVER : SCRBS_HOT;
       break;
     case kNormal:
-      state_id = SCRBS_NORMAL;
       break;
     case kPressed:
       state_id = SCRBS_PRESSED;
       break;
-    default:
-      NOTREACHED() << "Invalid state: " << state;
+    case kNumStates:
+      NOTREACHED();
       break;
   }
 
@@ -1269,21 +1244,14 @@ HRESULT NativeThemeWin::PaintScrollbarTrack(
     const ScrollbarTrackExtraParams& extra) const {
   HANDLE handle = GetThemeHandle(SCROLLBAR);
   RECT rect_win = rect.ToRECT();
-  int part_id;
-  int state_id;
 
-  switch (part) {
-    case NativeTheme::kScrollbarHorizontalTrack:
-      part_id = extra.is_upper ? SBP_UPPERTRACKHORZ : SBP_LOWERTRACKHORZ;
-      break;
-    case NativeTheme::kScrollbarVerticalTrack:
-      part_id = extra.is_upper ? SBP_UPPERTRACKVERT : SBP_LOWERTRACKVERT;
-      break;
-    default:
-      NOTREACHED() << "Invalid part: " << part;
-      break;
-  }
+  const int part_id = extra.is_upper ?
+      ((part == kScrollbarHorizontalTrack) ?
+          SBP_UPPERTRACKHORZ : SBP_UPPERTRACKVERT) :
+      ((part == kScrollbarHorizontalTrack) ?
+          SBP_LOWERTRACKHORZ : SBP_LOWERTRACKVERT);
 
+  int state_id = SCRBS_NORMAL;
   switch (state) {
     case kDisabled:
       state_id = SCRBS_DISABLED;
@@ -1292,13 +1260,12 @@ HRESULT NativeThemeWin::PaintScrollbarTrack(
       state_id = SCRBS_HOVER;
       break;
     case kNormal:
-      state_id = SCRBS_NORMAL;
       break;
     case kPressed:
       state_id = SCRBS_PRESSED;
       break;
-    default:
-      NOTREACHED() << "Invalid state: " << state;
+    case kNumStates:
+      NOTREACHED();
       break;
   }
 
@@ -1330,7 +1297,7 @@ HRESULT NativeThemeWin::PaintSpinButton(
   HANDLE handle = GetThemeHandle(SPIN);
   RECT rect_win = rect.ToRECT();
   int part_id = extra.spin_up ? SPNP_UP : SPNP_DOWN;
-  int state_id;
+  int state_id = extra.spin_up ? UPS_NORMAL : DNS_NORMAL;
   switch (state) {
     case kDisabled:
       state_id = extra.spin_up ? UPS_DISABLED : DNS_DISABLED;
@@ -1339,13 +1306,12 @@ HRESULT NativeThemeWin::PaintSpinButton(
       state_id = extra.spin_up ? UPS_HOT : DNS_HOT;
       break;
     case kNormal:
-      state_id = extra.spin_up ? UPS_NORMAL : DNS_NORMAL;
       break;
     case kPressed:
       state_id = extra.spin_up ? UPS_PRESSED : DNS_PRESSED;
       break;
-    default:
-      NOTREACHED() << "Invalid state " << state;
+    case kNumStates:
+      NOTREACHED();
       break;
   }
 
@@ -1362,11 +1328,11 @@ HRESULT NativeThemeWin::PaintTrackbar(
     State state,
     const gfx::Rect& rect,
     const TrackbarExtraParams& extra) const {
-  int part_id = part == kTrackbarTrack ? TKP_TRACK : TKP_THUMBBOTTOM;
-  if (extra.vertical)
-    part_id = part == kTrackbarTrack ? TKP_TRACKVERT : TKP_THUMBVERT;
+  const int part_id = extra.vertical ?
+      ((part == kTrackbarTrack) ? TKP_TRACKVERT : TKP_THUMBVERT) :
+      ((part == kTrackbarTrack) ? TKP_TRACK : TKP_THUMBBOTTOM);
 
-  int state_id = 0;
+  int state_id = TUS_NORMAL;
   switch (state) {
     case kDisabled:
       state_id = TUS_DISABLED;
@@ -1375,13 +1341,12 @@ HRESULT NativeThemeWin::PaintTrackbar(
       state_id = TUS_HOT;
       break;
     case kNormal:
-      state_id = TUS_NORMAL;
       break;
     case kPressed:
       state_id = TUS_PRESSED;
       break;
-    default:
-      NOTREACHED() << "Invalid state " << state;
+    case kNumStates:
+      NOTREACHED();
       break;
   }
 
@@ -1469,8 +1434,8 @@ HRESULT NativeThemeWin::PaintProgressBar(
   // There is no documentation about the animation speed, frame-rate, nor
   // size of moving overlay of the indeterminate progress bar.
   // So we just observed real-world programs and guessed following parameters.
-  const int kDeteminateOverlayPixelsPerSecond = 300;
-  const int kDeteminateOverlayWidth = 120;
+  const int kDeterminateOverlayPixelsPerSecond = 300;
+  const int kDeterminateOverlayWidth = 120;
   const int kIndeterminateOverlayPixelsPerSecond =  175;
   const int kVistaIndeterminateOverlayWidth = 120;
   const int kXPIndeterminateOverlayWidth = 55;
@@ -1483,79 +1448,69 @@ HRESULT NativeThemeWin::PaintProgressBar(
                               extra.value_rect_width,
                               extra.value_rect_height).ToRECT();
 
-  bool pre_vista = base::win::GetVersion() < base::win::VERSION_VISTA;
   HANDLE handle = GetThemeHandle(PROGRESS);
-  if (handle && draw_theme_ && draw_theme_ex_) {
-    draw_theme_(handle, hdc, PP_BAR, 0, &bar_rect, NULL);
-
-    int bar_width = bar_rect.right - bar_rect.left;
-    if (extra.determinate) {
-      // TODO(morrita): this RTL guess can be wrong.
-      // We should pass the direction from WebKit side.
-      bool is_rtl = (bar_rect.right == value_rect.right &&
-                     bar_rect.left != value_rect.left);
-      // We should care the direction here because PP_CNUNK painting
-      // is asymmetric.
-      DTBGOPTS value_draw_options;
-      value_draw_options.dwSize = sizeof(DTBGOPTS);
-      value_draw_options.dwFlags = is_rtl ? DTBG_MIRRORDC : 0;
-      value_draw_options.rcClip = bar_rect;
-
-      if (pre_vista) {
-        // On XP, progress bar is chunk-style and has no glossy effect.
-        // We need to shrink destination rect to fit the part inside the bar
-        // with an appropriate margin.
-        RECT shrunk_value_rect = InsetRect(&value_rect, kXPBarPadding);
-        draw_theme_ex_(handle, hdc, PP_CHUNK, 0,
-                       &shrunk_value_rect, &value_draw_options);
-      } else  {
-        // On Vista or later, the progress bar part has a
-        // single-block value part. It also has glossy effect.
-        // And the value part has exactly same height as the bar part
-        // so we don't need to shrink the rect.
-        draw_theme_ex_(handle, hdc, PP_FILL, 0,
-                       &value_rect, &value_draw_options);
-
-        int dx = ComputeAnimationProgress(bar_width,
-                                          kDeteminateOverlayWidth,
-                                          kDeteminateOverlayPixelsPerSecond,
-                                          extra.animated_seconds);
-        RECT overlay_rect = value_rect;
-        overlay_rect.left += dx;
-        overlay_rect.right = overlay_rect.left + kDeteminateOverlayWidth;
-        draw_theme_(handle, hdc, PP_MOVEOVERLAY, 0, &overlay_rect, &value_rect);
-      }
+  if (!handle || !draw_theme_ || !draw_theme_ex_) {
+    FillRect(hdc, &bar_rect, GetSysColorBrush(COLOR_BTNFACE));
+    FillRect(hdc, &value_rect, GetSysColorBrush(COLOR_BTNSHADOW));
+    DrawEdge(hdc, &bar_rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
+    return S_OK;
+  }
+
+  draw_theme_(handle, hdc, PP_BAR, 0, &bar_rect, NULL);
+
+  bool pre_vista = base::win::GetVersion() < base::win::VERSION_VISTA;
+  int bar_width = bar_rect.right - bar_rect.left;
+  if (!extra.determinate) {
+    // The glossy overlay for the indeterminate progress bar has a small pause
+    // after each animation. We emulate this by adding an invisible margin the
+    // animation has to traverse.
+    int width_with_margin = bar_width + kIndeterminateOverlayPixelsPerSecond;
+    int overlay_width = pre_vista ?
+        kXPIndeterminateOverlayWidth : kVistaIndeterminateOverlayWidth;
+    RECT overlay_rect = bar_rect;
+    overlay_rect.left += ComputeAnimationProgress(
+        width_with_margin, overlay_width, kIndeterminateOverlayPixelsPerSecond,
+        extra.animated_seconds);
+    overlay_rect.right = overlay_rect.left + overlay_width;
+    if (pre_vista) {
+      RECT shrunk_rect = InsetRect(&overlay_rect, kXPBarPadding);
+      RECT shrunk_bar_rect = InsetRect(&bar_rect, kXPBarPadding);
+      draw_theme_(handle, hdc, PP_CHUNK, 0, &shrunk_rect, &shrunk_bar_rect);
     } else {
-      // A glossy overlay for indeterminate progress bar has small pause
-      // after each animation. We emulate this by adding an invisible margin
-      // the animation has to traverse.
-      int width_with_margin = bar_width + kIndeterminateOverlayPixelsPerSecond;
-      int overlay_width = pre_vista ?
-          kXPIndeterminateOverlayWidth : kVistaIndeterminateOverlayWidth;
-      int dx = ComputeAnimationProgress(width_with_margin,
-                                        overlay_width,
-                                        kIndeterminateOverlayPixelsPerSecond,
-                                        extra.animated_seconds);
-      RECT overlay_rect = bar_rect;
-      overlay_rect.left += dx;
-      overlay_rect.right = overlay_rect.left + overlay_width;
-      if (pre_vista) {
-        RECT shrunk_rect = InsetRect(&overlay_rect, kXPBarPadding);
-        RECT shrunk_bar_rect = InsetRect(&bar_rect, kXPBarPadding);
-        draw_theme_(handle, hdc, PP_CHUNK, 0, &shrunk_rect, &shrunk_bar_rect);
-      } else {
-        draw_theme_(handle, hdc, PP_MOVEOVERLAY, 0, &overlay_rect, &bar_rect);
-      }
+      draw_theme_(handle, hdc, PP_MOVEOVERLAY, 0, &overlay_rect, &bar_rect);
     }
-
     return S_OK;
   }
 
-  HBRUSH bg_brush = GetSysColorBrush(COLOR_BTNFACE);
-  HBRUSH fg_brush = GetSysColorBrush(COLOR_BTNSHADOW);
-  FillRect(hdc, &bar_rect, bg_brush);
-  FillRect(hdc, &value_rect, fg_brush);
-  DrawEdge(hdc, &bar_rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
+  // We care about the direction here because PP_CHUNK painting is asymmetric.
+  // TODO(morrita): This RTL guess can be wrong.  We should pass in the
+  // direction from WebKit.
+  const DTBGOPTS value_draw_options = {
+    sizeof(DTBGOPTS),
+    (bar_rect.right == value_rect.right && bar_rect.left != value_rect.left) ?
+        DTBG_MIRRORDC : 0,
+    bar_rect
+  };
+  if (pre_vista) {
+    // On XP, the progress bar is chunk-style and has no glossy effect.  We need
+    // to shrink the destination rect to fit the part inside the bar with an
+    // appropriate margin.
+    RECT shrunk_value_rect = InsetRect(&value_rect, kXPBarPadding);
+    draw_theme_ex_(handle, hdc, PP_CHUNK, 0, &shrunk_value_rect,
+                   &value_draw_options);
+  } else  {
+    // On Vista or later, the progress bar part has a single-block value part
+    // and a glossy effect.  The value part has exactly same height as the bar
+    // part, so we don't need to shrink the rect.
+    draw_theme_ex_(handle, hdc, PP_FILL, 0, &value_rect, &value_draw_options);
+
+    RECT overlay_rect = value_rect;
+    overlay_rect.left += ComputeAnimationProgress(
+        bar_width, kDeterminateOverlayWidth, kDeterminateOverlayPixelsPerSecond,
+        extra.animated_seconds);
+    overlay_rect.right = overlay_rect.left + kDeterminateOverlayWidth;
+    draw_theme_(handle, hdc, PP_MOVEOVERLAY, 0, &overlay_rect, &value_rect);
+  }
   return S_OK;
 }
 
@@ -1564,10 +1519,9 @@ HRESULT NativeThemeWin::PaintWindowResizeGripper(HDC hdc,
   HANDLE handle = GetThemeHandle(STATUS);
   RECT rect_win = rect.ToRECT();
   if (handle && draw_theme_) {
-    // Paint the status bar gripper.  There doesn't seem to be a
-    // standard gripper in Windows for the space between
-    // scrollbars.  This is pretty close, but it's supposed to be
-    // painted over a status bar.
+    // Paint the status bar gripper.  There doesn't seem to be a standard
+    // gripper in Windows for the space between scrollbars.  This is pretty
+    // close, but it's supposed to be painted over a status bar.
     return draw_theme_(handle, hdc, SP_GRIPPER, 0, &rect_win, NULL);
   }
 
@@ -1594,34 +1548,30 @@ HRESULT NativeThemeWin::PaintTextField(
     State state,
     const gfx::Rect& rect,
     const TextFieldExtraParams& extra) const {
-  int part_id = EP_EDITTEXT;
   int state_id = ETS_NORMAL;
   switch (state) {
-    case kNormal:
-      if (extra.is_read_only) {
-        state_id = ETS_READONLY;
-      } else if (extra.is_focused) {
-        state_id = ETS_FOCUSED;
-      } else {
-        state_id = ETS_NORMAL;
-      }
+    case kDisabled:
+      state_id = ETS_DISABLED;
       break;
     case kHovered:
       state_id = ETS_HOT;
       break;
+    case kNormal:
+      if (extra.is_read_only)
+        state_id = ETS_READONLY;
+      else if (extra.is_focused)
+        state_id = ETS_FOCUSED;
+      break;
     case kPressed:
       state_id = ETS_SELECTED;
       break;
-    case kDisabled:
-      state_id = ETS_DISABLED;
-      break;
-    default:
-      NOTREACHED() << "Invalid state: " << state;
+    case kNumStates:
+      NOTREACHED();
       break;
   }
 
   RECT rect_win = rect.ToRECT();
-  return PaintTextField(hdc, part_id, state_id, extra.classic_state,
+  return PaintTextField(hdc, EP_EDITTEXT, state_id, extra.classic_state,
                         &rect_win,
                         skia::SkColorToCOLORREF(extra.background_color),
                         extra.fill_content_area, extra.draw_edges);
@@ -1642,31 +1592,10 @@ HRESULT NativeThemeWin::PaintTextField(HDC hdc,
   // TODO(mpcomplete): can we detect if the color is specified by the user,
   // and if not, just use the system color?
   // CreateSolidBrush() accepts a RGB value but alpha must be 0.
-  HBRUSH bg_brush = CreateSolidBrush(color);
-  HRESULT hr;
+  base::win::ScopedGDIObject<HBRUSH> bg_brush(CreateSolidBrush(color));
   // DrawThemeBackgroundEx was introduced in XP SP2, so that it's possible
   // draw_theme_ex_ is NULL and draw_theme_ is non-null.
-  if (handle && (draw_theme_ex_ || (draw_theme_ && draw_edges))) {
-    if (draw_theme_ex_) {
-      static const DTBGOPTS omit_border_options = {
-        sizeof(DTBGOPTS),
-        DTBG_OMITBORDER,
-        { 0, 0, 0, 0 }
-      };
-      const DTBGOPTS* draw_opts = draw_edges ? NULL : &omit_border_options;
-      hr = draw_theme_ex_(handle, hdc, part_id, state_id, rect, draw_opts);
-    } else {
-      hr = draw_theme_(handle, hdc, part_id, state_id, rect, NULL);
-    }
-
-    // TODO(maruel): Need to be fixed if get_theme_content_rect_ is NULL.
-    if (fill_content_area && get_theme_content_rect_) {
-      RECT content_rect;
-      hr = get_theme_content_rect_(handle, hdc, part_id, state_id, rect,
-                                   &content_rect);
-      FillRect(hdc, &content_rect, bg_brush);
-    }
-  } else {
+  if (!handle || (!draw_theme_ex_ && (!draw_theme_ || !draw_edges))) {
     // Draw it manually.
     if (draw_edges)
       DrawEdge(hdc, rect, EDGE_SUNKEN, BF_RECT | BF_ADJUST);
@@ -1675,9 +1604,26 @@ HRESULT NativeThemeWin::PaintTextField(HDC hdc,
       FillRect(hdc, rect, (classic_state & DFCS_INACTIVE) ?
                    reinterpret_cast<HBRUSH>(COLOR_BTNFACE + 1) : bg_brush);
     }
-    hr = S_OK;
+    return S_OK;
+  }
+
+  static const DTBGOPTS omit_border_options = {
+    sizeof(DTBGOPTS),
+    DTBG_OMITBORDER,
+    { 0, 0, 0, 0 }
+  };
+  HRESULT hr = draw_theme_ex_ ?
+    draw_theme_ex_(handle, hdc, part_id, state_id, rect,
+                   draw_edges ? NULL : &omit_border_options) :
+    draw_theme_(handle, hdc, part_id, state_id, rect, NULL);
+
+  // TODO(maruel): Need to be fixed if get_theme_content_rect_ is NULL.
+  if (fill_content_area && get_theme_content_rect_) {
+    RECT content_rect;
+    hr = get_theme_content_rect_(handle, hdc, part_id, state_id, rect,
+                                  &content_rect);
+    FillRect(hdc, &content_rect, bg_brush);
   }
-  DeleteObject(bg_brush);
   return hr;
 }
 
@@ -1694,12 +1640,9 @@ HRESULT NativeThemeWin::PaintScaledTheme(HANDLE theme,
     float scale = save_transform.eM11;
     if (scale != 1 && save_transform.eM12 == 0) {
       ModifyWorldTransform(hdc, NULL, MWT_IDENTITY);
-      gfx::Rect scaled_rect = gfx::ToEnclosedRect(
-          gfx::ScaleRect(rect, scale));
-      RECT bounds = gfx::Rect(scaled_rect.x() + save_transform.eDx,
-                              scaled_rect.y() + save_transform.eDy,
-                              scaled_rect.width(),
-                              scaled_rect.height()).ToRECT();
+      gfx::Rect scaled_rect(gfx::ToEnclosedRect(gfx::ScaleRect(rect, scale)));
+      scaled_rect.Offset(save_transform.eDx, save_transform.eDy);
+      RECT bounds = scaled_rect.ToRECT();
       HRESULT result = draw_theme_(theme, hdc, part_id, state_id, &bounds,
                                    NULL);
       SetWorldTransform(hdc, &save_transform);
@@ -1712,26 +1655,21 @@ HRESULT NativeThemeWin::PaintScaledTheme(HANDLE theme,
 
 // static
 NativeThemeWin::ThemeName NativeThemeWin::GetThemeName(Part part) {
-  ThemeName name;
   switch (part) {
     case kCheckbox:
-    case kRadio:
     case kPushButton:
-      name = BUTTON;
-      break;
+    case kRadio:
+      return BUTTON;
     case kInnerSpinButton:
-      name = SPIN;
-      break;
-    case kMenuCheck:
-    case kMenuPopupGutter:
+      return SPIN;
     case kMenuList:
+    case kMenuCheck:
     case kMenuPopupArrow:
+    case kMenuPopupGutter:
     case kMenuPopupSeparator:
-      name = MENU;
-      break;
+      return MENU;
     case kProgressBar:
-      name = PROGRESS;
-      break;
+      return PROGRESS;
     case kScrollbarDownArrow:
     case kScrollbarLeftArrow:
     case kScrollbarRightArrow:
@@ -1740,298 +1678,276 @@ NativeThemeWin::ThemeName NativeThemeWin::GetThemeName(Part part) {
     case kScrollbarVerticalThumb:
     case kScrollbarHorizontalTrack:
     case kScrollbarVerticalTrack:
-      name = SCROLLBAR;
-      break;
+      return SCROLLBAR;
     case kSliderTrack:
     case kSliderThumb:
-      name = TRACKBAR;
-      break;
+      return TRACKBAR;
     case kTextField:
-      name = TEXTFIELD;
-      break;
+      return TEXTFIELD;
     case kWindowResizeGripper:
-      name = STATUS;
-      break;
-    default:
-      NOTREACHED() << "Invalid part: " << part;
-      break;
+      return STATUS;
+    case kComboboxArrow:
+    case kMenuCheckBackground:
+    case kMenuPopupBackground:
+    case kMenuItemBackground:
+    case kScrollbarHorizontalGripper:
+    case kScrollbarVerticalGripper:
+    case kScrollbarCorner:
+    case kTabPanelBackground:
+    case kTrackbarThumb:
+    case kTrackbarTrack:
+    case kMaxPart:
+      NOTREACHED();
   }
-  return name;
+  return LAST;
 }
 
 // static
 int NativeThemeWin::GetWindowsPart(Part part,
                                    State state,
                                    const ExtraParams& extra) {
-  int part_id;
   switch (part) {
     case kCheckbox:
-      part_id = BP_CHECKBOX;
-      break;
+      return BP_CHECKBOX;
     case kMenuCheck:
-      part_id = MENU_POPUPCHECK;
-      break;
+      return MENU_POPUPCHECK;
     case kMenuPopupArrow:
-      part_id = MENU_POPUPSUBMENU;
-      break;
+      return MENU_POPUPSUBMENU;
     case kMenuPopupGutter:
-      part_id = MENU_POPUPGUTTER;
-      break;
+      return MENU_POPUPGUTTER;
     case kMenuPopupSeparator:
-      part_id = MENU_POPUPSEPARATOR;
-      break;
+      return MENU_POPUPSEPARATOR;
     case kPushButton:
-      part_id = BP_PUSHBUTTON;
-      break;
+      return BP_PUSHBUTTON;
     case kRadio:
-      part_id = BP_RADIOBUTTON;
-      break;
-    case kWindowResizeGripper:
-      part_id = SP_GRIPPER;
-      break;
+      return BP_RADIOBUTTON;
     case kScrollbarDownArrow:
     case kScrollbarLeftArrow:
     case kScrollbarRightArrow:
     case kScrollbarUpArrow:
-      part_id = SBP_ARROWBTN;
-      break;
+      return SBP_ARROWBTN;
     case kScrollbarHorizontalThumb:
-      part_id = SBP_THUMBBTNHORZ;
-      break;
+      return SBP_THUMBBTNHORZ;
     case kScrollbarVerticalThumb:
-      part_id = SBP_THUMBBTNVERT;
-      break;
-    default:
-      NOTREACHED() << "Invalid part: " << part;
-      break;
+      return SBP_THUMBBTNVERT;
+    case kWindowResizeGripper:
+      return SP_GRIPPER;
+    case kComboboxArrow:
+    case kInnerSpinButton:
+    case kMenuList:
+    case kMenuCheckBackground:
+    case kMenuPopupBackground:
+    case kMenuItemBackground:
+    case kProgressBar:
+    case kScrollbarHorizontalTrack:
+    case kScrollbarVerticalTrack:
+    case kScrollbarHorizontalGripper:
+    case kScrollbarVerticalGripper:
+    case kScrollbarCorner:
+    case kSliderTrack:
+    case kSliderThumb:
+    case kTabPanelBackground:
+    case kTextField:
+    case kTrackbarThumb:
+    case kTrackbarTrack:
+    case kMaxPart:
+      NOTREACHED();
   }
-  return part_id;
+  return 0;
 }
 
 int NativeThemeWin::GetWindowsState(Part part,
                                     State state,
                                     const ExtraParams& extra) {
-  int state_id;
   switch (part) {
     case kCheckbox:
       switch (state) {
-        case kNormal:
-          state_id = CBS_UNCHECKEDNORMAL;
-          break;
+        case kDisabled:
+          return CBS_UNCHECKEDDISABLED;
         case kHovered:
-          state_id = CBS_UNCHECKEDHOT;
-          break;
+          return CBS_UNCHECKEDHOT;
+        case kNormal:
+          return CBS_UNCHECKEDNORMAL;
         case kPressed:
-          state_id = CBS_UNCHECKEDPRESSED;
-          break;
-        case kDisabled:
-          state_id = CBS_UNCHECKEDDISABLED;
-          break;
-        default:
-          NOTREACHED() << "Invalid state: " << state;
-          break;
+          return CBS_UNCHECKEDPRESSED;
+        case kNumStates:
+          NOTREACHED();
+          return 0;
       }
-      break;
     case kMenuCheck:
       switch (state) {
-        case kNormal:
+        case kDisabled:
+          return extra.menu_check.is_radio ?
+              MC_BULLETDISABLED : MC_CHECKMARKDISABLED;
         case kHovered:
+        case kNormal:
         case kPressed:
-          state_id = extra.menu_check.is_radio ? MC_BULLETNORMAL
-                                               : MC_CHECKMARKNORMAL;
-          break;
-        case kDisabled:
-          state_id = extra.menu_check.is_radio ? MC_BULLETDISABLED
-                                               : MC_CHECKMARKDISABLED;
-          break;
-        default:
-          NOTREACHED() << "Invalid state: " << state;
-          break;
+          return extra.menu_check.is_radio ?
+              MC_BULLETNORMAL : MC_CHECKMARKNORMAL;
+        case kNumStates:
+          NOTREACHED();
+          return 0;
       }
-      break;
     case kMenuPopupArrow:
     case kMenuPopupGutter:
     case kMenuPopupSeparator:
       switch (state) {
-        case kNormal:
-          state_id = MBI_NORMAL;
-          break;
+        case kDisabled:
+          return MBI_DISABLED;
         case kHovered:
-          state_id = MBI_HOT;
-          break;
+          return MBI_HOT;
+        case kNormal:
+          return MBI_NORMAL;
         case kPressed:
-          state_id = MBI_PUSHED;
-          break;
-        case kDisabled:
-          state_id = MBI_DISABLED;
-          break;
-        default:
-          NOTREACHED() << "Invalid state: " << state;
-          break;
+          return MBI_PUSHED;
+        case kNumStates:
+          NOTREACHED();
+          return 0;
       }
-      break;
     case kPushButton:
       switch (state) {
-        case kNormal:
-          state_id = PBS_NORMAL;
-          break;
+        case kDisabled:
+          return PBS_DISABLED;
         case kHovered:
-          state_id = PBS_HOT;
-          break;
+          return PBS_HOT;
+        case kNormal:
+          return PBS_NORMAL;
         case kPressed:
-          state_id = PBS_PRESSED;
-          break;
-        case kDisabled:
-          state_id = PBS_DISABLED;
-          break;
-        default:
-          NOTREACHED() << "Invalid state: " << state;
-          break;
+          return PBS_PRESSED;
+        case kNumStates:
+          NOTREACHED();
+          return 0;
       }
-      break;
     case kRadio:
       switch (state) {
-        case kNormal:
-          state_id = RBS_UNCHECKEDNORMAL;
-          break;
-        case kHovered:
-          state_id = RBS_UNCHECKEDHOT;
-          break;
-        case kPressed:
-          state_id = RBS_UNCHECKEDPRESSED;
-          break;
         case kDisabled:
-          state_id = RBS_UNCHECKEDDISABLED;
-          break;
-        default:
-          NOTREACHED() << "Invalid state: " << state;
-          break;
-      }
-      break;
-    case kWindowResizeGripper:
-      switch (state) {
-        case kNormal:
+          return RBS_UNCHECKEDDISABLED;
         case kHovered:
+          return RBS_UNCHECKEDHOT;
+        case kNormal:
+          return RBS_UNCHECKEDNORMAL;
         case kPressed:
-        case kDisabled:
-          state_id = 1;  // gripper has no windows state
-          break;
-        default:
-          NOTREACHED() << "Invalid state: " << state;
-          break;
+          return RBS_UNCHECKEDPRESSED;
+        case kNumStates:
+          NOTREACHED();
+          return 0;
       }
-      break;
     case kScrollbarDownArrow:
       switch (state) {
-        case kNormal:
-          state_id = ABS_DOWNNORMAL;
-          break;
+        case kDisabled:
+          return ABS_DOWNDISABLED;
         case kHovered:
           // Mimic ScrollbarThemeChromiumWin.cpp in WebKit.
-          state_id = base::win::GetVersion() < base::win::VERSION_VISTA ?
+          return base::win::GetVersion() < base::win::VERSION_VISTA ?
               ABS_DOWNHOT : ABS_DOWNHOVER;
-          break;
+        case kNormal:
+          return ABS_DOWNNORMAL;
         case kPressed:
-          state_id = ABS_DOWNPRESSED;
-          break;
-        case kDisabled:
-          state_id = ABS_DOWNDISABLED;
-          break;
-        default:
-          NOTREACHED() << "Invalid state: " << state;
-          break;
+          return ABS_DOWNPRESSED;
+        case kNumStates:
+          NOTREACHED();
+          return 0;
       }
-      break;
     case kScrollbarLeftArrow:
       switch (state) {
-        case kNormal:
-          state_id = ABS_LEFTNORMAL;
-          break;
+        case kDisabled:
+          return ABS_LEFTDISABLED;
         case kHovered:
           // Mimic ScrollbarThemeChromiumWin.cpp in WebKit.
-          state_id = base::win::GetVersion() < base::win::VERSION_VISTA ?
+          return base::win::GetVersion() < base::win::VERSION_VISTA ?
               ABS_LEFTHOT : ABS_LEFTHOVER;
-          break;
+        case kNormal:
+          return ABS_LEFTNORMAL;
         case kPressed:
-          state_id = ABS_LEFTPRESSED;
-          break;
-        case kDisabled:
-          state_id = ABS_LEFTDISABLED;
-          break;
-        default:
-          NOTREACHED() << "Invalid state: " << state;
-          break;
+          return ABS_LEFTPRESSED;
+        case kNumStates:
+          NOTREACHED();
+          return 0;
       }
-      break;
     case kScrollbarRightArrow:
       switch (state) {
-        case kNormal:
-          state_id = ABS_RIGHTNORMAL;
-          break;
+        case kDisabled:
+          return ABS_RIGHTDISABLED;
         case kHovered:
           // Mimic ScrollbarThemeChromiumWin.cpp in WebKit.
-          state_id = base::win::GetVersion() < base::win::VERSION_VISTA ?
+          return base::win::GetVersion() < base::win::VERSION_VISTA ?
               ABS_RIGHTHOT : ABS_RIGHTHOVER;
-          break;
+        case kNormal:
+          return ABS_RIGHTNORMAL;
         case kPressed:
-          state_id = ABS_RIGHTPRESSED;
-          break;
-        case kDisabled:
-          state_id = ABS_RIGHTDISABLED;
-          break;
-        default:
-          NOTREACHED() << "Invalid state: " << state;
-          break;
+          return ABS_RIGHTPRESSED;
+        case kNumStates:
+          NOTREACHED();
+          return 0;
       }
       break;
     case kScrollbarUpArrow:
       switch (state) {
-        case kNormal:
-          state_id = ABS_UPNORMAL;
-          break;
+        case kDisabled:
+          return ABS_UPDISABLED;
         case kHovered:
           // Mimic ScrollbarThemeChromiumWin.cpp in WebKit.
-          state_id = base::win::GetVersion() < base::win::VERSION_VISTA ?
+          return base::win::GetVersion() < base::win::VERSION_VISTA ?
               ABS_UPHOT : ABS_UPHOVER;
-          break;
+        case kNormal:
+          return ABS_UPNORMAL;
         case kPressed:
-          state_id = ABS_UPPRESSED;
-          break;
-        case kDisabled:
-          state_id = ABS_UPDISABLED;
-          break;
-        default:
-          NOTREACHED() << "Invalid state: " << state;
-          break;
+          return ABS_UPPRESSED;
+        case kNumStates:
+          NOTREACHED();
+          return 0;
       }
       break;
     case kScrollbarHorizontalThumb:
     case kScrollbarVerticalThumb:
       switch (state) {
-        case kNormal:
-          state_id = SCRBS_NORMAL;
-          break;
+        case kDisabled:
+          return SCRBS_DISABLED;
         case kHovered:
           // Mimic WebKit's behaviour in ScrollbarThemeChromiumWin.cpp.
-          state_id = base::win::GetVersion() < base::win::VERSION_VISTA ?
+          return base::win::GetVersion() < base::win::VERSION_VISTA ?
               SCRBS_HOT : SCRBS_HOVER;
-          break;
+        case kNormal:
+          return SCRBS_NORMAL;
         case kPressed:
-          state_id = SCRBS_PRESSED;
-          break;
+          return SCRBS_PRESSED;
+        case kNumStates:
+          NOTREACHED();
+          return 0;
+      }
+    case kWindowResizeGripper:
+      switch (state) {
         case kDisabled:
-          state_id = SCRBS_DISABLED;
-          break;
-        default:
-          NOTREACHED() << "Invalid state: " << state;
-          break;
+        case kHovered:
+        case kNormal:
+        case kPressed:
+          return 1;  // gripper has no windows state
+        case kNumStates:
+          NOTREACHED();
+          return 0;
       }
-      break;
-    default:
-      NOTREACHED() << "Invalid part: " << part;
-      break;
+    case kComboboxArrow:
+    case kInnerSpinButton:
+    case kMenuList:
+    case kMenuCheckBackground:
+    case kMenuPopupBackground:
+    case kMenuItemBackground:
+    case kProgressBar:
+    case kScrollbarHorizontalTrack:
+    case kScrollbarVerticalTrack:
+    case kScrollbarHorizontalGripper:
+    case kScrollbarVerticalGripper:
+    case kScrollbarCorner:
+    case kSliderTrack:
+    case kSliderThumb:
+    case kTabPanelBackground:
+    case kTextField:
+    case kTrackbarThumb:
+    case kTrackbarTrack:
+    case kMaxPart:
+      NOTREACHED();
   }
-  return state_id;
+  return 0;
 }
 
 HRESULT NativeThemeWin::GetThemeInt(ThemeName theme,
@@ -2040,9 +1956,8 @@ HRESULT NativeThemeWin::GetThemeInt(ThemeName theme,
                                     int prop_id,
                                     int *value) const {
   HANDLE handle = GetThemeHandle(theme);
-  if (handle && get_theme_int_)
-    return get_theme_int_(handle, part_id, state_id, prop_id, value);
-  return E_NOTIMPL;
+  return (handle && get_theme_int_) ?
+      get_theme_int_(handle, part_id, state_id, prop_id, value) : E_NOTIMPL;
 }
 
 HRESULT NativeThemeWin::PaintFrameControl(HDC hdc,
@@ -2069,25 +1984,22 @@ HRESULT NativeThemeWin::PaintFrameControl(HDC hdc,
   // dc's text color for the black bits in the mask, and the dest dc's
   // background color for the white bits in the mask. DrawFrameControl draws the
   // check in black, and the background in white.
-  int bg_color_key;
-  int text_color_key;
+  int bg_color_key = COLOR_MENU;
+  int text_color_key = COLOR_MENUTEXT;
   switch (control_state) {
-    case NativeTheme::kHovered:
+    case kDisabled:
+      bg_color_key = is_selected ? COLOR_HIGHLIGHT : COLOR_MENU;
+      text_color_key = COLOR_GRAYTEXT;
+      break;
+    case kHovered:
       bg_color_key = COLOR_HIGHLIGHT;
       text_color_key = COLOR_HIGHLIGHTTEXT;
       break;
-    case NativeTheme::kNormal:
-      bg_color_key = COLOR_MENU;
-      text_color_key = COLOR_MENUTEXT;
-      break;
-    case NativeTheme::kDisabled:
-      bg_color_key = is_selected ? COLOR_HIGHLIGHT : COLOR_MENU;
-      text_color_key = COLOR_GRAYTEXT;
+    case kNormal:
       break;
-    default:
+    case kPressed:
+    case kNumStates:
       NOTREACHED();
-      bg_color_key = COLOR_MENU;
-      text_color_key = COLOR_MENUTEXT;
       break;
   }
   COLORREF old_bg_color = SetBkColor(hdc, GetSysColor(bg_color_key));
@@ -2145,8 +2057,9 @@ HANDLE NativeThemeWin::GetThemeHandle(ThemeName theme_name) const {
   case SPIN:
     handle = open_theme_(NULL, L"Spin");
     break;
-  default:
+  case LAST:
     NOTREACHED();
+    break;
   }
   theme_handles_[theme_name] = handle;
   return handle;