Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(904)

Unified Diff: Source/core/frame/FrameView.cpp

Issue 1308273010: Adapt and reland old position sticky implementation (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Fix style errors and remaining layout tests. Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/core/frame/FrameView.cpp
diff --git a/Source/core/frame/FrameView.cpp b/Source/core/frame/FrameView.cpp
index efcdd6c3a22a18d209f366da8f030030480bf837..3582b3597ada38dd3ec884e9bbe7681b868e4123 100644
--- a/Source/core/frame/FrameView.cpp
+++ b/Source/core/frame/FrameView.cpp
@@ -1563,7 +1563,7 @@ void FrameView::didScrollTimerFired(Timer<FrameView>*)
}
}
-void FrameView::updateLayersAndCompositingAfterScrollIfNeeded()
+void FrameView::updateLayersAndCompositingAfterScrollIfNeeded(const DoubleSize& scrollDelta)
{
// Nothing to do after scrolling if there are no fixed position elements.
if (!hasViewportConstrainedObjects())
@@ -1571,6 +1571,14 @@ void FrameView::updateLayersAndCompositingAfterScrollIfNeeded()
RefPtrWillBeRawPtr<FrameView> protect(this);
+ // Update sticky positioned elements which scroll with the viewport.
+ for (const auto& viewportConstrainedObject : *m_viewportConstrainedObjects) {
+ LayoutObject* layoutObject = viewportConstrainedObject;
+ DeprecatedPaintLayer* layer = toLayoutBoxModelObject(layoutObject)->layer();
+ if (layoutObject->style()->position() == StickyPosition && layer->scrollsWithViewport())
+ layer->updateLayerPositionsAfterOverflowScroll(scrollDelta);
flackr 2015/09/15 21:13:11 +skobes, does this seem like the right way / place
skobes 2015/09/16 00:07:57 Possibly, but keep in mind that FrameView scrolls
chrishtr 2015/09/17 01:18:56 This method of implementation is not performant en
flackr 2015/09/22 22:25:32 Agreed, my intention is to only add those sticky o
+ }
+
// If there fixed position elements, scrolling may cause compositing layers to change.
// Update widget and layer positions after scrolling, but only if we're not inside of
// layout.
@@ -2129,7 +2137,7 @@ void FrameView::scrollTo(const DoublePoint& newPosition)
m_pendingScrollDelta += scrollDelta;
clearScrollAnchor();
- updateLayersAndCompositingAfterScrollIfNeeded();
+ updateLayersAndCompositingAfterScrollIfNeeded(scrollDelta);
scrollPositionChanged();
frame().loader().client()->didChangeScrollOffset();
}
@@ -3157,14 +3165,28 @@ int FrameView::scrollSize(ScrollbarOrientation orientation) const
return scrollbar->totalSize() - scrollbar->visibleSize();
}
-void FrameView::setScrollOffset(const IntPoint& offset, ScrollType)
+void FrameView::setScrollOffset(const IntPoint& offset, ScrollType type)
{
- scrollTo(clampScrollPosition(offset));
+ if (type != CompositorScroll) {
+ // Scrolling is triggered directly in response to scrollbar thumb movement,
+ // but should be processed after compositing update. http://crbug.com/420741
+ DisableCompositingQueryAsserts disabler;
+ scrollTo(clampScrollPosition(offset));
+ } else {
+ scrollTo(clampScrollPosition(offset));
+ }
}
-void FrameView::setScrollOffset(const DoublePoint& offset, ScrollType)
+void FrameView::setScrollOffset(const DoublePoint& offset, ScrollType type)
{
- scrollTo(clampScrollPosition(offset));
+ if (type != CompositorScroll) {
+ // Scrolling is triggered directly in response to scrollbar thumb movement,
+ // but should be processed after compositing update. http://crbug.com/420741
+ DisableCompositingQueryAsserts disabler;
+ scrollTo(clampScrollPosition(offset));
+ } else {
+ scrollTo(clampScrollPosition(offset));
+ }
}
void FrameView::windowResizerRectChanged()

Powered by Google App Engine
This is Rietveld 408576698