Chromium Code Reviews| Index: third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp |
| diff --git a/third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp b/third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp |
| index ae5d8e41f19e34536c1bda4be73988007efa3e4e..0b3fc1a545382631c9d4b4993a3e165bcfa2e098 100644 |
| --- a/third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp |
| +++ b/third_party/WebKit/Source/platform/scroll/ScrollableArea.cpp |
| @@ -44,19 +44,6 @@ static const float kMinFractionToStepWhenPaging = 0.875f; |
| namespace blink { |
| -struct SameSizeAsScrollableArea { |
| - virtual ~SameSizeAsScrollableArea(); |
| -#if ENABLE(ASSERT) |
| - VerifyEagerFinalization verifyEager; |
| -#endif |
| - Member<void*> pointer[2]; |
| - unsigned bitfields : 17; |
| - IntPoint origin; |
| -}; |
| - |
| -static_assert(sizeof(ScrollableArea) == sizeof(SameSizeAsScrollableArea), |
| - "ScrollableArea should stay small"); |
| - |
| int ScrollableArea::pixelsPerLineStep(HostWindow* host) { |
| if (!host) |
| return kPixelsPerLineStep; |
| @@ -79,17 +66,20 @@ ScrollableArea::ScrollableArea() |
| m_horizontalScrollbarNeedsPaintInvalidation(false), |
| m_verticalScrollbarNeedsPaintInvalidation(false), |
| m_scrollCornerNeedsPaintInvalidation(false), |
| - m_scrollbarsHidden(false) {} |
| + m_scrollbarsHidden(false), |
| + m_scrollbarCaptured(false) {} |
| ScrollableArea::~ScrollableArea() {} |
| -void ScrollableArea::clearScrollAnimators() { |
| +void ScrollableArea::clearScrollableArea() { |
| #if OS(MACOSX) |
| if (m_scrollAnimator) |
| m_scrollAnimator->dispose(); |
| #endif |
| m_scrollAnimator.clear(); |
| m_programmaticScrollAnimator.clear(); |
| + if (m_fadeOverlayScrollbarsTimer) |
| + m_fadeOverlayScrollbarsTimer->stop(); |
| } |
| ScrollAnimatorBase& ScrollableArea::scrollAnimator() const { |
| @@ -332,14 +322,29 @@ void ScrollableArea::mouseMovedInContentArea() const { |
| scrollAnimator->mouseMovedInContentArea(); |
| } |
| -void ScrollableArea::mouseEnteredScrollbar(Scrollbar& scrollbar) const { |
| +void ScrollableArea::mouseEnteredScrollbar(Scrollbar& scrollbar) { |
| scrollAnimator().mouseEnteredScrollbar(scrollbar); |
| + // Restart the fade out timer. |
| + showOverlayScrollbars(); |
| } |
| -void ScrollableArea::mouseExitedScrollbar(Scrollbar& scrollbar) const { |
| +void ScrollableArea::mouseExitedScrollbar(Scrollbar& scrollbar) { |
| scrollAnimator().mouseExitedScrollbar(scrollbar); |
| } |
| +void ScrollableArea::mouseCapturedScrollbar() { |
| + m_scrollbarCaptured = true; |
| + showOverlayScrollbars(); |
| + if (m_fadeOverlayScrollbarsTimer) |
| + m_fadeOverlayScrollbarsTimer->stop(); |
| +} |
| + |
| +void ScrollableArea::mouseReleasedScrollbar() { |
| + m_scrollbarCaptured = false; |
| + // This will kick off the fade out timer. |
| + showOverlayScrollbars(); |
| +} |
| + |
| void ScrollableArea::contentAreaDidShow() const { |
| if (ScrollAnimatorBase* scrollAnimator = existingScrollAnimator()) |
| scrollAnimator->contentAreaDidShow(); |
| @@ -378,6 +383,7 @@ void ScrollableArea::willRemoveScrollbar(Scrollbar& scrollbar, |
| } |
| void ScrollableArea::contentsResized() { |
| + showOverlayScrollbars(); |
| if (ScrollAnimatorBase* scrollAnimator = existingScrollAnimator()) |
| scrollAnimator->contentsResized(); |
| } |
| @@ -538,8 +544,40 @@ bool ScrollableArea::scrollbarsHidden() const { |
| void ScrollableArea::setScrollbarsHidden(bool hidden) { |
| if (m_scrollbarsHidden == static_cast<unsigned>(hidden)) |
| return; |
| + |
| m_scrollbarsHidden = hidden; |
| - didChangeScrollbarsHidden(); |
| + scrollbarVisibilityChanged(); |
| +} |
| + |
| +void ScrollableArea::fadeOverlayScrollbarsTimerFired(TimerBase*) { |
| + setScrollbarsHidden(true); |
| +} |
| + |
| +void ScrollableArea::showOverlayScrollbars() { |
| + if (!ScrollbarTheme::theme().usesOverlayScrollbars()) |
| + return; |
| + |
| + setScrollbarsHidden(false); |
| + |
| + const double timeUntilDisable = |
| + ScrollbarTheme::theme().overlayScrollbarFadeOutDelaySeconds() + |
| + ScrollbarTheme::theme().overlayScrollbarFadeOutDurationSeconds(); |
| + |
| + // If the overlay scrollbars don't fade out, don't do anything. This is the |
| + // case for the mock overlays used in tests and on Mac, where the fade-out is |
| + // animated in ScrollAnimatorMac. |
| + if (!timeUntilDisable) |
|
tapted
2016/11/04 01:54:32
STDERR: ==4==WARNING: MemorySanitizer: use-of-unin
Lei Zhang
2016/11/04 02:03:02
Uninitialized value was created by an allocation o
|
| + return; |
| + |
| + if (!m_fadeOverlayScrollbarsTimer) { |
| + m_fadeOverlayScrollbarsTimer.reset(new Timer<ScrollableArea>( |
| + this, &ScrollableArea::fadeOverlayScrollbarsTimerFired)); |
| + } |
| + |
| + if (!m_scrollbarCaptured) { |
| + m_fadeOverlayScrollbarsTimer->startOneShot(timeUntilDisable, |
| + BLINK_FROM_HERE); |
| + } |
| } |
| IntRect ScrollableArea::visibleContentRect( |