Chromium Code Reviews| Index: third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.cpp |
| diff --git a/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.cpp b/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.cpp |
| index 126c7e1df78494e91d952b882db88a6f2079a263..7fb7316bceffcc11fd734ff53df9f5cc4b32a5cd 100644 |
| --- a/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.cpp |
| +++ b/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.cpp |
| @@ -95,7 +95,10 @@ ScrollingCoordinator::ScrollingCoordinator(Page* page) |
| m_touchEventTargetRectsAreDirty(false), |
| m_shouldScrollOnMainThreadDirty(false), |
| m_wasFrameScrollable(false), |
| - m_lastMainThreadScrollingReasons(0) {} |
| + m_lastMainThreadScrollingReasons(0), |
| + m_mainThreadScrollingReasonsCounter( |
| + MainThreadScrollingReason::kMainThreadScrollingReasonCount, |
| + 0) {} |
| ScrollingCoordinator::~ScrollingCoordinator() { |
| DCHECK(!m_page); |
| @@ -290,6 +293,7 @@ void ScrollingCoordinator::updateLayerPositionConstraint(PaintLayer* layer) { |
| void ScrollingCoordinator::willDestroyScrollableArea( |
| ScrollableArea* scrollableArea) { |
| + removeStyleRelatedMainThreadScrollingReasonsForLayer(scrollableArea); |
| removeWebScrollbarLayer(scrollableArea, HorizontalScrollbar); |
| removeWebScrollbarLayer(scrollableArea, VerticalScrollbar); |
| } |
| @@ -1169,6 +1173,9 @@ MainThreadScrollingReasons ScrollingCoordinator::mainThreadScrollingReasons() |
| if (frameView->hasBackgroundAttachmentFixedObjects()) |
| reasons |= |
| MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects; |
| + |
| + reasons |= getStyleRelatedMainThreadScrollingReasons(); |
| + |
| FrameView::ScrollingReasons scrollingReasons = |
| frameView->getScrollingReasons(); |
| const bool mayBeScrolledByInput = |
| @@ -1222,4 +1229,44 @@ bool ScrollingCoordinator::frameViewIsDirty() const { |
| return false; |
| } |
| +void ScrollingCoordinator::removeStyleRelatedMainThreadScrollingReasonsForLayer( |
| + ScrollableArea* scrollableArea) { |
| + // Decrese the number of layer that has any main thread |
|
bokan
2016/12/19 21:25:14
nit: layer->layers, has->have
yigu
2016/12/20 01:41:19
Done.
|
| + // scrolling reasons stored in ScrollingCoordinator |
| + if (scrollableArea->isPaintLayerScrollableArea()) { |
| + PaintLayerScrollableArea* paintLayerScrollableArea = |
| + toPaintLayerScrollableArea(scrollableArea); |
| + for (uint32_t i = 0; |
| + i < MainThreadScrollingReason::kMainThreadScrollingReasonCount; ++i) { |
| + if (paintLayerScrollableArea->hasMainThreadScrollingReason(1 << i)) { |
|
bokan
2016/12/19 21:25:14
Nit: might be clearer to store and reuse 1 << i
yigu
2016/12/20 01:41:19
Done.
|
| + paintLayerScrollableArea->flipMainThreadScrollingReason(1 << i); |
|
bokan
2016/12/19 21:25:14
You have adding a reason go through PLSA and call
yigu
2016/12/20 01:41:19
Done.
|
| + adjustStyleRelatedMainThreadScrollingReasons(1 << i, false); |
| + } |
| + } |
| + } |
| +} |
| + |
| +void ScrollingCoordinator::adjustStyleRelatedMainThreadScrollingReasons( |
| + const uint32_t reason, |
| + bool increase) { |
| + int index = MainThreadScrollingReason::getReasonIndex(reason); |
| + DCHECK_GE(index, 0); |
| + m_mainThreadScrollingReasonsCounter[index] += increase ? 1 : -1; |
| + DCHECK_GE(m_mainThreadScrollingReasonsCounter[index], 0); |
| +} |
| + |
| +MainThreadScrollingReasons |
| +ScrollingCoordinator::getStyleRelatedMainThreadScrollingReasons() const { |
| + MainThreadScrollingReasons reasons = |
| + static_cast<MainThreadScrollingReasons>(0); |
| + for (uint32_t reason = 1; |
| + reason < MainThreadScrollingReason::kMainThreadScrollingReasonCount; |
| + ++reason) { |
| + if (m_mainThreadScrollingReasonsCounter[reason] > 0) { |
| + reasons |= 1 << (reason - 1); |
| + } |
| + } |
| + return reasons; |
| +} |
| + |
| } // namespace blink |