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

Unified Diff: third_party/WebKit/Source/core/layout/ScrollAnchor.cpp

Issue 2404393003: Tie scroll anchoring adjustments to frame lifecycle instead of layout. (Closed)
Patch Set: add DCHECK Created 4 years, 2 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: third_party/WebKit/Source/core/layout/ScrollAnchor.cpp
diff --git a/third_party/WebKit/Source/core/layout/ScrollAnchor.cpp b/third_party/WebKit/Source/core/layout/ScrollAnchor.cpp
index eb2c42712b310688e88397640b6842e5cf7616b2..1a2f1cad321cc606b1e79379181eb41fe1cb1458 100644
--- a/third_party/WebKit/Source/core/layout/ScrollAnchor.cpp
+++ b/third_party/WebKit/Source/core/layout/ScrollAnchor.cpp
@@ -21,7 +21,7 @@ ScrollAnchor::ScrollAnchor()
: m_anchorObject(nullptr),
m_corner(Corner::TopLeft),
m_scrollAnchorDisablingStyleChanged(false),
- m_saved(false) {}
+ m_queued(false) {}
ScrollAnchor::ScrollAnchor(ScrollableArea* scroller) : ScrollAnchor() {
setScroller(scroller);
@@ -107,7 +107,7 @@ static LayoutRect relativeBounds(const LayoutObject* layoutObject,
// offset (since scrolling is handled by the FrameView) so
// localToAncestorQuad returns document coords, so we must subtract scroll
// offset to get viewport coords. We discard the fractional part of the
- // scroll offset so that the rounding in restore() matches the snapping of
+ // scroll offset so that the rounding in adjust() matches the snapping of
// the anchor node to the pixel grid of the layer it paints into. For
// non-FrameView scrollers, we rely on the flooring behavior of
// LayoutBox::scrolledContentOffset.
@@ -212,10 +212,12 @@ bool ScrollAnchor::computeScrollAnchorDisablingStyleChanged() {
}
}
-void ScrollAnchor::save() {
- if (m_saved)
+void ScrollAnchor::notifyBeforeLayout() {
+ if (m_queued) {
+ m_scrollAnchorDisablingStyleChanged |=
+ computeScrollAnchorDisablingStyleChanged();
return;
- m_saved = true;
+ }
DCHECK(m_scroller);
ScrollOffset scrollOffset = m_scroller->scrollOffset();
float blockDirectionScrollOffset =
@@ -237,11 +239,16 @@ void ScrollAnchor::save() {
computeRelativeOffset(m_anchorObject, m_scroller, m_corner);
}
- // Note that we must compute this during save() since the scroller's
- // descendants have finished layout (and had the bit cleared) by the
- // time restore() is called.
m_scrollAnchorDisablingStyleChanged =
computeScrollAnchorDisablingStyleChanged();
+
+ FrameView* frameView = scrollerLayoutBox(m_scroller)->frameView();
+ ScrollableArea* owningScroller =
+ m_scroller->isRootFrameViewport()
+ ? &toRootFrameViewport(m_scroller)->layoutViewport()
+ : m_scroller.get();
+ frameView->enqueueScrollAnchoringAdjustment(owningScroller);
+ m_queued = true;
}
IntSize ScrollAnchor::computeAdjustment() const {
@@ -264,10 +271,10 @@ IntSize ScrollAnchor::computeAdjustment() const {
return delta;
}
-void ScrollAnchor::restore() {
- if (!m_saved)
+void ScrollAnchor::adjust() {
+ if (!m_queued)
return;
- m_saved = false;
+ m_queued = false;
DCHECK(m_scroller);
if (!m_anchorObject)
return;

Powered by Google App Engine
This is Rietveld 408576698