OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/layout/ScrollAnchor.h" | 5 #include "core/layout/ScrollAnchor.h" |
6 | 6 |
7 #include "core/frame/FrameView.h" | 7 #include "core/frame/FrameView.h" |
8 #include "core/frame/UseCounter.h" | 8 #include "core/frame/UseCounter.h" |
9 #include "core/layout/LayoutBlockFlow.h" | 9 #include "core/layout/LayoutBlockFlow.h" |
10 #include "core/layout/api/LayoutBoxItem.h" | 10 #include "core/layout/api/LayoutBoxItem.h" |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 // When root layer scrolling is off, the LayoutView will have no scroll | 105 // When root layer scrolling is off, the LayoutView will have no scroll |
106 // offset (since scrolling is handled by the FrameView) so | 106 // offset (since scrolling is handled by the FrameView) so |
107 // localToAncestorQuad returns document coords, so we must subtract scroll | 107 // localToAncestorQuad returns document coords, so we must subtract scroll |
108 // offset to get viewport coords. We discard the fractional part of the | 108 // offset to get viewport coords. We discard the fractional part of the |
109 // scroll offset so that the rounding in restore() matches the snapping of | 109 // scroll offset so that the rounding in restore() matches the snapping of |
110 // the anchor node to the pixel grid of the layer it paints into. For | 110 // the anchor node to the pixel grid of the layer it paints into. For |
111 // non-FrameView scrollers, we rely on the flooring behavior of | 111 // non-FrameView scrollers, we rely on the flooring behavior of |
112 // LayoutBox::scrolledContentOffset. | 112 // LayoutBox::scrolledContentOffset. |
113 if (!RuntimeEnabledFeatures::rootLayerScrollingEnabled() && | 113 if (!RuntimeEnabledFeatures::rootLayerScrollingEnabled() && |
114 scrollerBox->isLayoutView()) | 114 scrollerBox->isLayoutView()) |
115 relativeBounds.moveBy(-flooredIntPoint(scroller->scrollPositionDouble())); | 115 relativeBounds.moveBy(IntPoint(-scroller->scrollOffsetInt())); |
116 return relativeBounds; | 116 return relativeBounds; |
117 } | 117 } |
118 | 118 |
119 static LayoutPoint computeRelativeOffset(const LayoutObject* layoutObject, | 119 static LayoutPoint computeRelativeOffset(const LayoutObject* layoutObject, |
120 const ScrollableArea* scroller, | 120 const ScrollableArea* scroller, |
121 Corner corner) { | 121 Corner corner) { |
122 return cornerPointOfRect(relativeBounds(layoutObject, scroller), corner); | 122 return cornerPointOfRect(relativeBounds(layoutObject, scroller), corner); |
123 } | 123 } |
124 | 124 |
125 static bool candidateMayMoveWithScroller(const LayoutObject* candidate, | 125 static bool candidateMayMoveWithScroller(const LayoutObject* candidate, |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
209 return false; | 209 return false; |
210 current = current->parent(); | 210 current = current->parent(); |
211 } | 211 } |
212 } | 212 } |
213 | 213 |
214 void ScrollAnchor::save() { | 214 void ScrollAnchor::save() { |
215 if (m_saved) | 215 if (m_saved) |
216 return; | 216 return; |
217 m_saved = true; | 217 m_saved = true; |
218 DCHECK(m_scroller); | 218 DCHECK(m_scroller); |
219 | 219 ScrollOffset scrollOffset = m_scroller->scrollOffset(); |
220 ScrollbarOrientation blockLayoutAxis = | 220 float blockDirectionScrollOffset = |
221 scrollerLayoutBox(m_scroller)->isHorizontalWritingMode() | 221 scrollerLayoutBox(m_scroller)->isHorizontalWritingMode() |
222 ? VerticalScrollbar | 222 ? scrollOffset.height() |
223 : HorizontalScrollbar; | 223 : scrollOffset.width(); |
224 if (m_scroller->scrollPosition(blockLayoutAxis) == 0) { | 224 if (blockDirectionScrollOffset == 0) { |
225 clear(); | 225 clear(); |
226 return; | 226 return; |
227 } | 227 } |
228 | 228 |
229 if (!m_anchorObject) { | 229 if (!m_anchorObject) { |
230 findAnchor(); | 230 findAnchor(); |
231 if (!m_anchorObject) | 231 if (!m_anchorObject) |
232 return; | 232 return; |
233 | 233 |
234 m_anchorObject->setIsScrollAnchorObject(); | 234 m_anchorObject->setIsScrollAnchorObject(); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
280 // TODO(skobes): add UMA metric for this. | 280 // TODO(skobes): add UMA metric for this. |
281 clear(); | 281 clear(); |
282 | 282 |
283 DEFINE_STATIC_LOCAL(EnumerationHistogram, suppressedBySanaclapHistogram, | 283 DEFINE_STATIC_LOCAL(EnumerationHistogram, suppressedBySanaclapHistogram, |
284 ("Layout.ScrollAnchor.SuppressedBySanaclap", 2)); | 284 ("Layout.ScrollAnchor.SuppressedBySanaclap", 2)); |
285 suppressedBySanaclapHistogram.count(1); | 285 suppressedBySanaclapHistogram.count(1); |
286 | 286 |
287 return; | 287 return; |
288 } | 288 } |
289 | 289 |
290 m_scroller->setScrollPosition(m_scroller->scrollPositionDouble() + adjustment, | 290 m_scroller->setScrollOffset( |
291 AnchoringScroll); | 291 m_scroller->scrollOffset() + FloatSize(adjustment), AnchoringScroll); |
292 | 292 |
293 // Update UMA metric. | 293 // Update UMA metric. |
294 DEFINE_STATIC_LOCAL(EnumerationHistogram, adjustedOffsetHistogram, | 294 DEFINE_STATIC_LOCAL(EnumerationHistogram, adjustedOffsetHistogram, |
295 ("Layout.ScrollAnchor.AdjustedScrollOffset", 2)); | 295 ("Layout.ScrollAnchor.AdjustedScrollOffset", 2)); |
296 adjustedOffsetHistogram.count(1); | 296 adjustedOffsetHistogram.count(1); |
297 UseCounter::count(scrollerLayoutBox(m_scroller)->document(), | 297 UseCounter::count(scrollerLayoutBox(m_scroller)->document(), |
298 UseCounter::ScrollAnchored); | 298 UseCounter::ScrollAnchored); |
299 } | 299 } |
300 | 300 |
301 void ScrollAnchor::clear() { | 301 void ScrollAnchor::clear() { |
302 LayoutObject* anchorObject = m_anchorObject; | 302 LayoutObject* anchorObject = m_anchorObject; |
303 m_anchorObject = nullptr; | 303 m_anchorObject = nullptr; |
304 | 304 |
305 if (anchorObject) | 305 if (anchorObject) |
306 anchorObject->maybeClearIsScrollAnchorObject(); | 306 anchorObject->maybeClearIsScrollAnchorObject(); |
307 } | 307 } |
308 | 308 |
309 bool ScrollAnchor::refersTo(const LayoutObject* layoutObject) const { | 309 bool ScrollAnchor::refersTo(const LayoutObject* layoutObject) const { |
310 return m_anchorObject == layoutObject; | 310 return m_anchorObject == layoutObject; |
311 } | 311 } |
312 | 312 |
313 void ScrollAnchor::notifyRemoved(LayoutObject* layoutObject) { | 313 void ScrollAnchor::notifyRemoved(LayoutObject* layoutObject) { |
314 if (m_anchorObject == layoutObject) | 314 if (m_anchorObject == layoutObject) |
315 clear(); | 315 clear(); |
316 } | 316 } |
317 | 317 |
318 } // namespace blink | 318 } // namespace blink |
OLD | NEW |