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

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

Issue 2650343008: Implement Element.scrollIntoView for scroll-behavior: smooth. (Closed)
Patch Set: Created 3 years, 10 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 193 matching lines...) Expand 10 before | Expand all | Expand 10 after
204 visitor->trace(m_scrollAnchor); 204 visitor->trace(m_scrollAnchor);
205 ScrollableArea::trace(visitor); 205 ScrollableArea::trace(visitor);
206 } 206 }
207 207
208 HostWindow* PaintLayerScrollableArea::getHostWindow() const { 208 HostWindow* PaintLayerScrollableArea::getHostWindow() const {
209 if (Page* page = box().frame()->page()) 209 if (Page* page = box().frame()->page())
210 return &page->chromeClient(); 210 return &page->chromeClient();
211 return nullptr; 211 return nullptr;
212 } 212 }
213 213
214 ProgrammaticScrollCoordinator*
215 PaintLayerScrollableArea::getProgrammaticScrollCoordinator() const {
216 if (Page* page = box().frame()->page())
217 return page->scrollingCoordinator()->programmaticScrollCoordinator();
218 return nullptr;
219 }
220
214 GraphicsLayer* PaintLayerScrollableArea::layerForScrolling() const { 221 GraphicsLayer* PaintLayerScrollableArea::layerForScrolling() const {
215 return layer()->hasCompositedLayerMapping() 222 return layer()->hasCompositedLayerMapping()
216 ? layer()->compositedLayerMapping()->scrollingContentsLayer() 223 ? layer()->compositedLayerMapping()->scrollingContentsLayer()
217 : 0; 224 : 0;
218 } 225 }
219 226
220 GraphicsLayer* PaintLayerScrollableArea::layerForHorizontalScrollbar() const { 227 GraphicsLayer* PaintLayerScrollableArea::layerForHorizontalScrollbar() const {
221 // See crbug.com/343132. 228 // See crbug.com/343132.
222 DisableCompositingQueryAsserts disabler; 229 DisableCompositingQueryAsserts disabler;
223 230
(...skipping 1399 matching lines...) Expand 10 before | Expand all | Expand 10 after
1623 document.updateStyleAndLayout(); 1630 document.updateStyleAndLayout();
1624 1631
1625 // FIXME (Radar 4118564): We should also autoscroll the window as necessary to 1632 // FIXME (Radar 4118564): We should also autoscroll the window as necessary to
1626 // keep the point under the cursor in view. 1633 // keep the point under the cursor in view.
1627 } 1634 }
1628 1635
1629 LayoutRect PaintLayerScrollableArea::scrollIntoView( 1636 LayoutRect PaintLayerScrollableArea::scrollIntoView(
1630 const LayoutRect& rect, 1637 const LayoutRect& rect,
1631 const ScrollAlignment& alignX, 1638 const ScrollAlignment& alignX,
1632 const ScrollAlignment& alignY, 1639 const ScrollAlignment& alignY,
1633 ScrollType scrollType) { 1640 ScrollType scrollType,
1641 ScrollBehavior scrollBehavior) {
1634 LayoutRect localExposeRect( 1642 LayoutRect localExposeRect(
1635 box() 1643 box()
1636 .absoluteToLocalQuad(FloatQuad(FloatRect(rect)), UseTransforms) 1644 .absoluteToLocalQuad(FloatQuad(FloatRect(rect)), UseTransforms)
1637 .boundingBox()); 1645 .boundingBox());
1638 localExposeRect.move(-box().borderLeft(), -box().borderTop()); 1646 localExposeRect.move(-box().borderLeft(), -box().borderTop());
1639 LayoutRect layerBounds(LayoutPoint(), 1647 LayoutRect layerBounds(LayoutPoint(),
1640 LayoutSize(box().clientWidth(), box().clientHeight())); 1648 LayoutSize(box().clientWidth(), box().clientHeight()));
1641 LayoutRect r = ScrollAlignment::getRectToExpose(layerBounds, localExposeRect, 1649 LayoutRect r = ScrollAlignment::getRectToExpose(layerBounds, localExposeRect,
1642 alignX, alignY); 1650 alignX, alignY);
1643 1651
1644 ScrollOffset oldScrollOffset = getScrollOffset(); 1652 ScrollOffset oldScrollOffset = getScrollOffset();
1645 ScrollOffset newScrollOffset(clampScrollOffset(roundedIntSize( 1653 ScrollOffset newScrollOffset(clampScrollOffset(roundedIntSize(
1646 toScrollOffset(FloatPoint(r.location()) + oldScrollOffset)))); 1654 toScrollOffset(FloatPoint(r.location()) + oldScrollOffset))));
1647 setScrollOffset(newScrollOffset, scrollType, ScrollBehaviorInstant); 1655 if (scrollType == ProgrammaticScroll &&
1656 scrollBehavior == ScrollBehaviorSmooth) {
1657 getProgrammaticScrollCoordinator()->queueAnimation(this, newScrollOffset);
bokan 2017/02/02 22:51:50 Hmm, maybe I'm missing something obvious here, but
sunyunjia 2017/02/10 23:25:20 Right! See here: https://docs.google.com/a/chromiu
bokan 2017/02/21 21:33:00 Got it. I think the name makes it sound like it's
1658 } else {
1659 setScrollOffset(newScrollOffset, scrollType, ScrollBehaviorInstant);
1660 }
1648 ScrollOffset scrollOffsetDifference = getScrollOffset() - oldScrollOffset; 1661 ScrollOffset scrollOffsetDifference = getScrollOffset() - oldScrollOffset;
1649 localExposeRect.move(-LayoutSize(scrollOffsetDifference)); 1662 localExposeRect.move(-LayoutSize(scrollOffsetDifference));
1650 1663
1651 LayoutRect intersect = 1664 LayoutRect intersect =
1652 localToAbsolute(box(), intersection(layerBounds, localExposeRect)); 1665 localToAbsolute(box(), intersection(layerBounds, localExposeRect));
1653 if (intersect.isEmpty() && !layerBounds.isEmpty() && 1666 if (intersect.isEmpty() && !layerBounds.isEmpty() &&
1654 !localExposeRect.isEmpty()) { 1667 !localExposeRect.isEmpty()) {
1655 return localToAbsolute(box(), localExposeRect); 1668 return localToAbsolute(box(), localExposeRect);
1656 } 1669 }
1657 return intersect; 1670 return intersect;
(...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after
2117 2130
2118 void PaintLayerScrollableArea::DelayScrollOffsetClampScope:: 2131 void PaintLayerScrollableArea::DelayScrollOffsetClampScope::
2119 clampScrollableAreas() { 2132 clampScrollableAreas() {
2120 for (auto& scrollableArea : *s_needsClamp) 2133 for (auto& scrollableArea : *s_needsClamp)
2121 scrollableArea->clampScrollOffsetAfterOverflowChange(); 2134 scrollableArea->clampScrollOffsetAfterOverflowChange();
2122 delete s_needsClamp; 2135 delete s_needsClamp;
2123 s_needsClamp = nullptr; 2136 s_needsClamp = nullptr;
2124 } 2137 }
2125 2138
2126 } // namespace blink 2139 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698