| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * Copyright (c) 2008, 2009, Google Inc. All rights reserved. | 2  * Copyright (c) 2008, 2009, Google Inc. All rights reserved. | 
| 3  * | 3  * | 
| 4  * Redistribution and use in source and binary forms, with or without | 4  * Redistribution and use in source and binary forms, with or without | 
| 5  * modification, are permitted provided that the following conditions are | 5  * modification, are permitted provided that the following conditions are | 
| 6  * met: | 6  * met: | 
| 7  * | 7  * | 
| 8  *     * Redistributions of source code must retain the above copyright | 8  *     * Redistributions of source code must retain the above copyright | 
| 9  * notice, this list of conditions and the following disclaimer. | 9  * notice, this list of conditions and the following disclaimer. | 
| 10  *     * Redistributions in binary form must reproduce the above | 10  *     * Redistributions in binary form must reproduce the above | 
| (...skipping 25 matching lines...) Expand all  Loading... | 
| 36 #include "platform/graphics/GraphicsContext.h" | 36 #include "platform/graphics/GraphicsContext.h" | 
| 37 #include "platform/graphics/paint/DrawingRecorder.h" | 37 #include "platform/graphics/paint/DrawingRecorder.h" | 
| 38 #include "platform/scroll/ScrollbarThemeClient.h" | 38 #include "platform/scroll/ScrollbarThemeClient.h" | 
| 39 #include "platform/scroll/ScrollbarThemeOverlay.h" | 39 #include "platform/scroll/ScrollbarThemeOverlay.h" | 
| 40 #include "public/platform/Platform.h" | 40 #include "public/platform/Platform.h" | 
| 41 #include "public/platform/WebRect.h" | 41 #include "public/platform/WebRect.h" | 
| 42 #include "public/platform/WebThemeEngine.h" | 42 #include "public/platform/WebThemeEngine.h" | 
| 43 | 43 | 
| 44 namespace blink { | 44 namespace blink { | 
| 45 | 45 | 
| 46 namespace { |  | 
| 47 |  | 
| 48 static bool useMockTheme() | 46 static bool useMockTheme() | 
| 49 { | 47 { | 
| 50     return LayoutTestSupport::isRunningLayoutTest(); | 48     return LayoutTestSupport::isRunningLayoutTest(); | 
| 51 } | 49 } | 
| 52 | 50 | 
| 53 // Contains a flag indicating whether WebThemeEngine should paint a UI widget |  | 
| 54 // for a scrollbar part, and if so, what part and state apply. |  | 
| 55 // |  | 
| 56 // If the PartPaintingParams are not affected by a change in the scrollbar |  | 
| 57 // state, then the corresponding scrollbar part does not need to be repainted. |  | 
| 58 struct PartPaintingParams { |  | 
| 59     PartPaintingParams() |  | 
| 60         : shouldPaint(false) |  | 
| 61         , part(WebThemeEngine::PartScrollbarDownArrow) |  | 
| 62         , state(WebThemeEngine::StateNormal) {} |  | 
| 63     PartPaintingParams(WebThemeEngine::Part part, WebThemeEngine::State state) |  | 
| 64         : shouldPaint(true) |  | 
| 65         , part(part) |  | 
| 66         , state(state) {} |  | 
| 67 |  | 
| 68     bool shouldPaint; |  | 
| 69     WebThemeEngine::Part part; |  | 
| 70     WebThemeEngine::State state; |  | 
| 71 }; |  | 
| 72 |  | 
| 73 bool operator==(const PartPaintingParams& a, const PartPaintingParams& b) |  | 
| 74 { |  | 
| 75     return (!a.shouldPaint && !b.shouldPaint) || std::tie(a.shouldPaint, a.part,
      a.state) == std::tie(b.shouldPaint, b.part, b.state); |  | 
| 76 } |  | 
| 77 |  | 
| 78 bool operator!=(const PartPaintingParams& a, const PartPaintingParams& b) |  | 
| 79 { |  | 
| 80     return !(a == b); |  | 
| 81 } |  | 
| 82 |  | 
| 83 PartPaintingParams buttonPartPaintingParams(const ScrollbarThemeClient& scrollba
     r, float position, ScrollbarPart part) |  | 
| 84 { |  | 
| 85     WebThemeEngine::Part paintPart; |  | 
| 86     WebThemeEngine::State state = WebThemeEngine::StateNormal; |  | 
| 87     bool checkMin = false; |  | 
| 88     bool checkMax = false; |  | 
| 89 |  | 
| 90     if (scrollbar.orientation() == HorizontalScrollbar) { |  | 
| 91         if (part == BackButtonStartPart) { |  | 
| 92             paintPart = WebThemeEngine::PartScrollbarLeftArrow; |  | 
| 93             checkMin = true; |  | 
| 94         } else if (useMockTheme() && part != ForwardButtonEndPart) { |  | 
| 95             return PartPaintingParams(); |  | 
| 96         } else { |  | 
| 97             paintPart = WebThemeEngine::PartScrollbarRightArrow; |  | 
| 98             checkMax = true; |  | 
| 99         } |  | 
| 100     } else { |  | 
| 101         if (part == BackButtonStartPart) { |  | 
| 102             paintPart = WebThemeEngine::PartScrollbarUpArrow; |  | 
| 103             checkMin = true; |  | 
| 104         } else if (useMockTheme() && part != ForwardButtonEndPart) { |  | 
| 105             return PartPaintingParams(); |  | 
| 106         } else { |  | 
| 107             paintPart = WebThemeEngine::PartScrollbarDownArrow; |  | 
| 108             checkMax = true; |  | 
| 109         } |  | 
| 110     } |  | 
| 111 |  | 
| 112     if (useMockTheme() && !scrollbar.enabled()) { |  | 
| 113         state = WebThemeEngine::StateDisabled; |  | 
| 114     } else if (!useMockTheme() && ((checkMin && (position <= 0)) |  | 
| 115         || (checkMax && position >= scrollbar.maximum()))) { |  | 
| 116         state = WebThemeEngine::StateDisabled; |  | 
| 117     } else { |  | 
| 118         if (part == scrollbar.pressedPart()) |  | 
| 119             state = WebThemeEngine::StatePressed; |  | 
| 120         else if (part == scrollbar.hoveredPart()) |  | 
| 121             state = WebThemeEngine::StateHover; |  | 
| 122     } |  | 
| 123 |  | 
| 124     return PartPaintingParams(paintPart, state); |  | 
| 125 } |  | 
| 126 |  | 
| 127 } // namespace |  | 
| 128 |  | 
| 129 ScrollbarTheme& ScrollbarTheme::nativeTheme() | 51 ScrollbarTheme& ScrollbarTheme::nativeTheme() | 
| 130 { | 52 { | 
| 131     if (RuntimeEnabledFeatures::overlayScrollbarsEnabled()) { | 53     if (RuntimeEnabledFeatures::overlayScrollbarsEnabled()) { | 
| 132         DEFINE_STATIC_LOCAL(ScrollbarThemeOverlay, theme, (10, 0, ScrollbarTheme
     Overlay::AllowHitTest)); | 54         DEFINE_STATIC_LOCAL(ScrollbarThemeOverlay, theme, (10, 0, ScrollbarTheme
     Overlay::AllowHitTest)); | 
| 133         return theme; | 55         return theme; | 
| 134     } | 56     } | 
| 135 | 57 | 
| 136     DEFINE_STATIC_LOCAL(ScrollbarThemeAura, theme, ()); | 58     DEFINE_STATIC_LOCAL(ScrollbarThemeAura, theme, ()); | 
| 137     return theme; | 59     return theme; | 
| 138 } | 60 } | 
| 139 | 61 | 
| 140 int ScrollbarThemeAura::scrollbarThickness(ScrollbarControlSize controlSize) | 62 int ScrollbarThemeAura::scrollbarThickness(ScrollbarControlSize controlSize) | 
| 141 { | 63 { | 
| 142     // Horiz and Vert scrollbars are the same thickness. | 64     // Horiz and Vert scrollbars are the same thickness. | 
| 143     // In unit tests we don't have the mock theme engine (because of layering vi
     olations), so we hard code the size (see bug 327470). | 65     // In unit tests we don't have the mock theme engine (because of layering vi
     olations), so we hard code the size (see bug 327470). | 
| 144     if (useMockTheme()) | 66     if (useMockTheme()) | 
| 145         return 15; | 67         return 15; | 
| 146     IntSize scrollbarSize = Platform::current()->themeEngine()->getSize(WebTheme
     Engine::PartScrollbarVerticalTrack); | 68     IntSize scrollbarSize = Platform::current()->themeEngine()->getSize(WebTheme
     Engine::PartScrollbarVerticalTrack); | 
| 147     return scrollbarSize.width(); | 69     return scrollbarSize.width(); | 
| 148 } | 70 } | 
| 149 | 71 | 
| 150 bool ScrollbarThemeAura::shouldRepaintAllPartsOnInvalidation() const |  | 
| 151 { |  | 
| 152     // This theme can separately handle thumb invalidation. |  | 
| 153     return false; |  | 
| 154 } |  | 
| 155 |  | 
| 156 ScrollbarPart ScrollbarThemeAura::invalidateOnThumbPositionChange(const Scrollba
     rThemeClient& scrollbar, float oldPosition, float newPosition) const |  | 
| 157 { |  | 
| 158     ScrollbarPart invalidParts = NoPart; |  | 
| 159     ASSERT(buttonsPlacement() == WebScrollbarButtonsPlacementSingle); |  | 
| 160     static const ScrollbarPart kButtonParts[] = {BackButtonStartPart, ForwardBut
     tonEndPart}; |  | 
| 161     for (ScrollbarPart part : kButtonParts) { |  | 
| 162         if (buttonPartPaintingParams(scrollbar, oldPosition, part) != buttonPart
     PaintingParams(scrollbar, newPosition, part)) |  | 
| 163             invalidParts = static_cast<ScrollbarPart>(invalidParts | part); |  | 
| 164     } |  | 
| 165     return invalidParts; |  | 
| 166 } |  | 
| 167 |  | 
| 168 void ScrollbarThemeAura::paintTrackPiece(GraphicsContext& gc, const ScrollbarThe
     meClient& scrollbar, const IntRect& rect, ScrollbarPart partType) | 72 void ScrollbarThemeAura::paintTrackPiece(GraphicsContext& gc, const ScrollbarThe
     meClient& scrollbar, const IntRect& rect, ScrollbarPart partType) | 
| 169 { | 73 { | 
| 170     DisplayItem::Type displayItemType = trackPiecePartToDisplayItemType(partType
     ); | 74     DisplayItem::Type displayItemType = trackPiecePartToDisplayItemType(partType
     ); | 
| 171     if (DrawingRecorder::useCachedDrawingIfPossible(gc, scrollbar, displayItemTy
     pe)) | 75     if (DrawingRecorder::useCachedDrawingIfPossible(gc, scrollbar, displayItemTy
     pe)) | 
| 172         return; | 76         return; | 
| 173 | 77 | 
| 174     DrawingRecorder recorder(gc, scrollbar, displayItemType, rect); | 78     DrawingRecorder recorder(gc, scrollbar, displayItemType, rect); | 
| 175 | 79 | 
| 176     WebThemeEngine::State state = scrollbar.hoveredPart() == partType ? WebTheme
     Engine::StateHover : WebThemeEngine::StateNormal; | 80     WebThemeEngine::State state = scrollbar.hoveredPart() == partType ? WebTheme
     Engine::StateHover : WebThemeEngine::StateNormal; | 
| 177 | 81 | 
| 178     if (useMockTheme() && !scrollbar.enabled()) | 82     if (useMockTheme() && !scrollbar.enabled()) | 
| 179         state = WebThemeEngine::StateDisabled; | 83         state = WebThemeEngine::StateDisabled; | 
| 180 | 84 | 
| 181     IntRect alignRect = trackRect(scrollbar, false); | 85     IntRect alignRect = trackRect(scrollbar, false); | 
| 182     WebThemeEngine::ExtraParams extraParams; | 86     WebThemeEngine::ExtraParams extraParams; | 
| 183     extraParams.scrollbarTrack.isBack = (partType == BackTrackPart); | 87     extraParams.scrollbarTrack.isBack = (partType == BackTrackPart); | 
| 184     extraParams.scrollbarTrack.trackX = alignRect.x(); | 88     extraParams.scrollbarTrack.trackX = alignRect.x(); | 
| 185     extraParams.scrollbarTrack.trackY = alignRect.y(); | 89     extraParams.scrollbarTrack.trackY = alignRect.y(); | 
| 186     extraParams.scrollbarTrack.trackWidth = alignRect.width(); | 90     extraParams.scrollbarTrack.trackWidth = alignRect.width(); | 
| 187     extraParams.scrollbarTrack.trackHeight = alignRect.height(); | 91     extraParams.scrollbarTrack.trackHeight = alignRect.height(); | 
| 188     Platform::current()->themeEngine()->paint(gc.canvas(), scrollbar.orientation
     () == HorizontalScrollbar ? WebThemeEngine::PartScrollbarHorizontalTrack : WebTh
     emeEngine::PartScrollbarVerticalTrack, state, WebRect(rect), &extraParams); | 92     Platform::current()->themeEngine()->paint(gc.canvas(), scrollbar.orientation
     () == HorizontalScrollbar ? WebThemeEngine::PartScrollbarHorizontalTrack : WebTh
     emeEngine::PartScrollbarVerticalTrack, state, WebRect(rect), &extraParams); | 
| 189 } | 93 } | 
| 190 | 94 | 
| 191 void ScrollbarThemeAura::paintButton(GraphicsContext& gc, const ScrollbarThemeCl
     ient& scrollbar, const IntRect& rect, ScrollbarPart part) | 95 void ScrollbarThemeAura::paintButton(GraphicsContext& gc, const ScrollbarThemeCl
     ient& scrollbar, const IntRect& rect, ScrollbarPart part) | 
| 192 { | 96 { | 
|  | 97     WebThemeEngine::Part paintPart; | 
|  | 98     WebThemeEngine::State state = WebThemeEngine::StateNormal; | 
|  | 99     bool checkMin = false; | 
|  | 100     bool checkMax = false; | 
|  | 101 | 
|  | 102     if (scrollbar.orientation() == HorizontalScrollbar) { | 
|  | 103         if (part == BackButtonStartPart) { | 
|  | 104             paintPart = WebThemeEngine::PartScrollbarLeftArrow; | 
|  | 105             checkMin = true; | 
|  | 106         } else if (useMockTheme() && part != ForwardButtonEndPart) { | 
|  | 107             return; | 
|  | 108         } else { | 
|  | 109             paintPart = WebThemeEngine::PartScrollbarRightArrow; | 
|  | 110             checkMax = true; | 
|  | 111         } | 
|  | 112     } else { | 
|  | 113         if (part == BackButtonStartPart) { | 
|  | 114             paintPart = WebThemeEngine::PartScrollbarUpArrow; | 
|  | 115             checkMin = true; | 
|  | 116         } else if (useMockTheme() && part != ForwardButtonEndPart) { | 
|  | 117             return; | 
|  | 118         } else { | 
|  | 119             paintPart = WebThemeEngine::PartScrollbarDownArrow; | 
|  | 120             checkMax = true; | 
|  | 121         } | 
|  | 122     } | 
|  | 123 | 
| 193     DisplayItem::Type displayItemType = buttonPartToDisplayItemType(part); | 124     DisplayItem::Type displayItemType = buttonPartToDisplayItemType(part); | 
| 194     if (DrawingRecorder::useCachedDrawingIfPossible(gc, scrollbar, displayItemTy
     pe)) | 125     if (DrawingRecorder::useCachedDrawingIfPossible(gc, scrollbar, displayItemTy
     pe)) | 
| 195         return; | 126         return; | 
| 196     PartPaintingParams params = buttonPartPaintingParams(scrollbar, scrollbar.cu
     rrentPos(), part); | 127 | 
| 197     if (!params.shouldPaint) |  | 
| 198         return; |  | 
| 199     DrawingRecorder recorder(gc, scrollbar, displayItemType, rect); | 128     DrawingRecorder recorder(gc, scrollbar, displayItemType, rect); | 
| 200     Platform::current()->themeEngine()->paint(gc.canvas(), params.part, params.s
     tate, WebRect(rect), 0); | 129 | 
|  | 130     if (useMockTheme() && !scrollbar.enabled()) { | 
|  | 131         state = WebThemeEngine::StateDisabled; | 
|  | 132     } else if (!useMockTheme() && ((checkMin && (scrollbar.currentPos() <= 0)) | 
|  | 133         || (checkMax && scrollbar.currentPos() >= scrollbar.maximum()))) { | 
|  | 134         state = WebThemeEngine::StateDisabled; | 
|  | 135     } else { | 
|  | 136         if (part == scrollbar.pressedPart()) | 
|  | 137             state = WebThemeEngine::StatePressed; | 
|  | 138         else if (part == scrollbar.hoveredPart()) | 
|  | 139             state = WebThemeEngine::StateHover; | 
|  | 140     } | 
|  | 141     Platform::current()->themeEngine()->paint(gc.canvas(), paintPart, state, Web
     Rect(rect), 0); | 
| 201 } | 142 } | 
| 202 | 143 | 
| 203 void ScrollbarThemeAura::paintThumb(GraphicsContext& gc, const ScrollbarThemeCli
     ent& scrollbar, const IntRect& rect) | 144 void ScrollbarThemeAura::paintThumb(GraphicsContext& gc, const ScrollbarThemeCli
     ent& scrollbar, const IntRect& rect) | 
| 204 { | 145 { | 
| 205     if (DrawingRecorder::useCachedDrawingIfPossible(gc, scrollbar, DisplayItem::
     ScrollbarThumb)) | 146     if (DrawingRecorder::useCachedDrawingIfPossible(gc, scrollbar, DisplayItem::
     ScrollbarThumb)) | 
| 206         return; | 147         return; | 
| 207 | 148 | 
| 208     DrawingRecorder recorder(gc, scrollbar, DisplayItem::ScrollbarThumb, rect); | 149     DrawingRecorder recorder(gc, scrollbar, DisplayItem::ScrollbarThumb, rect); | 
| 209 | 150 | 
| 210     WebThemeEngine::State state; | 151     WebThemeEngine::State state; | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
| 235     if (scrollbar.orientation() == VerticalScrollbar) { | 176     if (scrollbar.orientation() == VerticalScrollbar) { | 
| 236         IntSize size = Platform::current()->themeEngine()->getSize(WebThemeEngin
     e::PartScrollbarVerticalThumb); | 177         IntSize size = Platform::current()->themeEngine()->getSize(WebThemeEngin
     e::PartScrollbarVerticalThumb); | 
| 237         return size.height(); | 178         return size.height(); | 
| 238     } | 179     } | 
| 239 | 180 | 
| 240     IntSize size = Platform::current()->themeEngine()->getSize(WebThemeEngine::P
     artScrollbarHorizontalThumb); | 181     IntSize size = Platform::current()->themeEngine()->getSize(WebThemeEngine::P
     artScrollbarHorizontalThumb); | 
| 241     return size.width(); | 182     return size.width(); | 
| 242 } | 183 } | 
| 243 | 184 | 
| 244 } // namespace blink | 185 } // namespace blink | 
| OLD | NEW | 
|---|