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

Side by Side Diff: third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp

Issue 2650343008: Implement Element.scrollIntoView for scroll-behavior: smooth. (Closed)
Patch Set: Rebase Created 3 years, 8 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
3 * reserved. 3 * reserved.
4 * 4 *
5 * Portions are Copyright (C) 1998 Netscape Communications Corporation. 5 * Portions are Copyright (C) 1998 Netscape Communications Corporation.
6 * 6 *
7 * Other contributors: 7 * Other contributors:
8 * Robert O'Callahan <roc+@cs.cmu.edu> 8 * Robert O'Callahan <roc+@cs.cmu.edu>
9 * David Baron <dbaron@fas.harvard.edu> 9 * David Baron <dbaron@fas.harvard.edu>
10 * Christian Biesinger <cbiesinger@gmail.com> 10 * Christian Biesinger <cbiesinger@gmail.com>
(...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 visitor->trace(m_scrollAnchor); 202 visitor->trace(m_scrollAnchor);
203 ScrollableArea::trace(visitor); 203 ScrollableArea::trace(visitor);
204 } 204 }
205 205
206 HostWindow* PaintLayerScrollableArea::getHostWindow() const { 206 HostWindow* PaintLayerScrollableArea::getHostWindow() const {
207 if (Page* page = box().frame()->page()) 207 if (Page* page = box().frame()->page())
208 return &page->chromeClient(); 208 return &page->chromeClient();
209 return nullptr; 209 return nullptr;
210 } 210 }
211 211
212 SmoothScrollSequencer* PaintLayerScrollableArea::getSmoothScrollSequencer()
213 const {
214 if (Page* page = box().frame()->page())
215 return page->smoothScrollSequencer();
216 return nullptr;
217 }
218
212 GraphicsLayer* PaintLayerScrollableArea::layerForScrolling() const { 219 GraphicsLayer* PaintLayerScrollableArea::layerForScrolling() const {
213 return layer()->hasCompositedLayerMapping() 220 return layer()->hasCompositedLayerMapping()
214 ? layer()->compositedLayerMapping()->scrollingContentsLayer() 221 ? layer()->compositedLayerMapping()->scrollingContentsLayer()
215 : 0; 222 : 0;
216 } 223 }
217 224
218 GraphicsLayer* PaintLayerScrollableArea::layerForHorizontalScrollbar() const { 225 GraphicsLayer* PaintLayerScrollableArea::layerForHorizontalScrollbar() const {
219 // See crbug.com/343132. 226 // See crbug.com/343132.
220 DisableCompositingQueryAsserts disabler; 227 DisableCompositingQueryAsserts disabler;
221 228
(...skipping 1441 matching lines...) Expand 10 before | Expand all | Expand 10 after
1663 document.updateStyleAndLayout(); 1670 document.updateStyleAndLayout();
1664 1671
1665 // FIXME (Radar 4118564): We should also autoscroll the window as necessary to 1672 // FIXME (Radar 4118564): We should also autoscroll the window as necessary to
1666 // keep the point under the cursor in view. 1673 // keep the point under the cursor in view.
1667 } 1674 }
1668 1675
1669 LayoutRect PaintLayerScrollableArea::scrollIntoView( 1676 LayoutRect PaintLayerScrollableArea::scrollIntoView(
1670 const LayoutRect& rect, 1677 const LayoutRect& rect,
1671 const ScrollAlignment& alignX, 1678 const ScrollAlignment& alignX,
1672 const ScrollAlignment& alignY, 1679 const ScrollAlignment& alignY,
1673 ScrollType scrollType) { 1680 ScrollType scrollType,
1681 bool isSmooth) {
1674 LayoutRect localExposeRect( 1682 LayoutRect localExposeRect(
1675 box() 1683 box()
1676 .absoluteToLocalQuad(FloatQuad(FloatRect(rect)), UseTransforms) 1684 .absoluteToLocalQuad(FloatQuad(FloatRect(rect)), UseTransforms)
1677 .boundingBox()); 1685 .boundingBox());
1678 localExposeRect.move(-box().borderLeft(), -box().borderTop()); 1686 localExposeRect.move(-box().borderLeft(), -box().borderTop());
1679 LayoutRect layerBounds(LayoutPoint(), 1687 LayoutRect layerBounds(LayoutPoint(),
1680 LayoutSize(box().clientWidth(), box().clientHeight())); 1688 LayoutSize(box().clientWidth(), box().clientHeight()));
1681 LayoutRect r = ScrollAlignment::getRectToExpose(layerBounds, localExposeRect, 1689 LayoutRect r = ScrollAlignment::getRectToExpose(layerBounds, localExposeRect,
1682 alignX, alignY); 1690 alignX, alignY);
1683 1691
1684 ScrollOffset oldScrollOffset = getScrollOffset(); 1692 ScrollOffset oldScrollOffset = getScrollOffset();
1685 ScrollOffset newScrollOffset(clampScrollOffset(roundedIntSize( 1693 ScrollOffset newScrollOffset(clampScrollOffset(roundedIntSize(
1686 toScrollOffset(FloatPoint(r.location()) + oldScrollOffset)))); 1694 toScrollOffset(FloatPoint(r.location()) + oldScrollOffset))));
1687 setScrollOffset(newScrollOffset, scrollType, ScrollBehaviorInstant); 1695 if (isSmooth) {
1696 DCHECK(scrollType != UserScroll);
1697 getSmoothScrollSequencer()->queueAnimation(this, newScrollOffset);
1698 } else {
1699 setScrollOffset(newScrollOffset, scrollType, ScrollBehaviorInstant);
1700 }
1688 ScrollOffset scrollOffsetDifference = getScrollOffset() - oldScrollOffset; 1701 ScrollOffset scrollOffsetDifference = getScrollOffset() - oldScrollOffset;
1689 localExposeRect.move(-LayoutSize(scrollOffsetDifference)); 1702 localExposeRect.move(-LayoutSize(scrollOffsetDifference));
1690 1703
1691 LayoutRect intersect = 1704 LayoutRect intersect =
1692 localToAbsolute(box(), intersection(layerBounds, localExposeRect)); 1705 localToAbsolute(box(), intersection(layerBounds, localExposeRect));
1693 if (intersect.isEmpty() && !layerBounds.isEmpty() && 1706 if (intersect.isEmpty() && !layerBounds.isEmpty() &&
1694 !localExposeRect.isEmpty()) { 1707 !localExposeRect.isEmpty()) {
1695 return localToAbsolute(box(), localExposeRect); 1708 return localToAbsolute(box(), localExposeRect);
1696 } 1709 }
1697 return intersect; 1710 return intersect;
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after
2150 2163
2151 void PaintLayerScrollableArea::DelayScrollOffsetClampScope:: 2164 void PaintLayerScrollableArea::DelayScrollOffsetClampScope::
2152 clampScrollableAreas() { 2165 clampScrollableAreas() {
2153 for (auto& scrollableArea : *s_needsClamp) 2166 for (auto& scrollableArea : *s_needsClamp)
2154 scrollableArea->clampScrollOffsetAfterOverflowChange(); 2167 scrollableArea->clampScrollOffsetAfterOverflowChange();
2155 delete s_needsClamp; 2168 delete s_needsClamp;
2156 s_needsClamp = nullptr; 2169 s_needsClamp = nullptr;
2157 } 2170 }
2158 2171
2159 } // namespace blink 2172 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698