| OLD | NEW |
| 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 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 90 PaintLayerScrollableArea::PaintLayerScrollableArea(PaintLayer& layer) | 90 PaintLayerScrollableArea::PaintLayerScrollableArea(PaintLayer& layer) |
| 91 : m_layer(layer), | 91 : m_layer(layer), |
| 92 m_nextTopmostScrollChild(0), | 92 m_nextTopmostScrollChild(0), |
| 93 m_topmostScrollChild(0), | 93 m_topmostScrollChild(0), |
| 94 m_inResizeMode(false), | 94 m_inResizeMode(false), |
| 95 m_scrollsOverflow(false), | 95 m_scrollsOverflow(false), |
| 96 m_inOverflowRelayout(false), | 96 m_inOverflowRelayout(false), |
| 97 m_needsCompositedScrolling(false), | 97 m_needsCompositedScrolling(false), |
| 98 m_rebuildHorizontalScrollbarLayer(false), | 98 m_rebuildHorizontalScrollbarLayer(false), |
| 99 m_rebuildVerticalScrollbarLayer(false), | 99 m_rebuildVerticalScrollbarLayer(false), |
| 100 m_needsScrollPositionClamp(false), | 100 m_needsScrollOffsetClamp(false), |
| 101 m_needsRelayout(false), | 101 m_needsRelayout(false), |
| 102 m_hadHorizontalScrollbarBeforeRelayout(false), | 102 m_hadHorizontalScrollbarBeforeRelayout(false), |
| 103 m_hadVerticalScrollbarBeforeRelayout(false), | 103 m_hadVerticalScrollbarBeforeRelayout(false), |
| 104 m_scrollbarManager(*this), | 104 m_scrollbarManager(*this), |
| 105 m_scrollCorner(nullptr), | 105 m_scrollCorner(nullptr), |
| 106 m_resizer(nullptr), | 106 m_resizer(nullptr), |
| 107 m_scrollAnchor(this) | 107 m_scrollAnchor(this) |
| 108 #if ENABLE(ASSERT) | 108 #if ENABLE(ASSERT) |
| 109 , | 109 , |
| 110 m_hasBeenDisposed(false) | 110 m_hasBeenDisposed(false) |
| 111 #endif | 111 #endif |
| 112 { | 112 { |
| 113 Node* node = box().node(); | 113 Node* node = box().node(); |
| 114 if (node && node->isElementNode()) { | 114 if (node && node->isElementNode()) { |
| 115 // We save and restore only the scrollOffset as the other scroll values are | 115 // We save and restore only the scrollOffset as the other scroll values are |
| 116 // recalculated. | 116 // recalculated. |
| 117 Element* element = toElement(node); | 117 Element* element = toElement(node); |
| 118 m_scrollOffset = element->savedLayerScrollOffset(); | 118 m_scrollOffset = element->savedLayerScrollOffset(); |
| 119 if (!m_scrollOffset.isZero()) { | 119 if (!m_scrollOffset.isZero()) |
| 120 scrollAnimator().setCurrentPosition( | 120 scrollAnimator().setCurrentOffset(m_scrollOffset); |
| 121 FloatPoint(m_scrollOffset.width(), m_scrollOffset.height())); | 121 element->setSavedLayerScrollOffset(ScrollOffset()); |
| 122 } | |
| 123 element->setSavedLayerScrollOffset(IntSize()); | |
| 124 } | 122 } |
| 125 updateResizerAreaSet(); | 123 updateResizerAreaSet(); |
| 126 } | 124 } |
| 127 | 125 |
| 128 PaintLayerScrollableArea::~PaintLayerScrollableArea() { | 126 PaintLayerScrollableArea::~PaintLayerScrollableArea() { |
| 129 ASSERT(m_hasBeenDisposed); | 127 ASSERT(m_hasBeenDisposed); |
| 130 } | 128 } |
| 131 | 129 |
| 132 void PaintLayerScrollableArea::dispose() { | 130 void PaintLayerScrollableArea::dispose() { |
| 133 if (inResizeMode() && !box().documentBeingDestroyed()) { | 131 if (inResizeMode() && !box().documentBeingDestroyed()) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 144 | 142 |
| 145 if (box().frame() && box().frame()->page()) { | 143 if (box().frame() && box().frame()->page()) { |
| 146 if (ScrollingCoordinator* scrollingCoordinator = | 144 if (ScrollingCoordinator* scrollingCoordinator = |
| 147 box().frame()->page()->scrollingCoordinator()) | 145 box().frame()->page()->scrollingCoordinator()) |
| 148 scrollingCoordinator->willDestroyScrollableArea(this); | 146 scrollingCoordinator->willDestroyScrollableArea(this); |
| 149 } | 147 } |
| 150 | 148 |
| 151 if (!box().documentBeingDestroyed()) { | 149 if (!box().documentBeingDestroyed()) { |
| 152 Node* node = box().node(); | 150 Node* node = box().node(); |
| 153 // FIXME: Make setSavedLayerScrollOffset take DoubleSize. crbug.com/414283. | 151 // FIXME: Make setSavedLayerScrollOffset take DoubleSize. crbug.com/414283. |
| 154 if (node && node->isElementNode()) { | 152 if (node && node->isElementNode()) |
| 155 toElement(node)->setSavedLayerScrollOffset( | 153 toElement(node)->setSavedLayerScrollOffset(m_scrollOffset); |
| 156 flooredIntSize(m_scrollOffset)); | |
| 157 } | |
| 158 } | 154 } |
| 159 | 155 |
| 160 if (LocalFrame* frame = box().frame()) { | 156 if (LocalFrame* frame = box().frame()) { |
| 161 if (FrameView* frameView = frame->view()) | 157 if (FrameView* frameView = frame->view()) |
| 162 frameView->removeResizerArea(box()); | 158 frameView->removeResizerArea(box()); |
| 163 } | 159 } |
| 164 | 160 |
| 165 if (RootScrollerController* controller = | 161 if (RootScrollerController* controller = |
| 166 box().document().rootScrollerController()) | 162 box().document().rootScrollerController()) |
| 167 controller->didDisposePaintLayerScrollableArea(*this); | 163 controller->didDisposePaintLayerScrollableArea(*this); |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 return parentPoint; | 345 return parentPoint; |
| 350 | 346 |
| 351 IntPoint point = view->frameView()->convertToLayoutObject(box(), parentPoint); | 347 IntPoint point = view->frameView()->convertToLayoutObject(box(), parentPoint); |
| 352 | 348 |
| 353 point.move(-scrollbarOffset(scrollbar)); | 349 point.move(-scrollbarOffset(scrollbar)); |
| 354 return point; | 350 return point; |
| 355 } | 351 } |
| 356 | 352 |
| 357 int PaintLayerScrollableArea::scrollSize( | 353 int PaintLayerScrollableArea::scrollSize( |
| 358 ScrollbarOrientation orientation) const { | 354 ScrollbarOrientation orientation) const { |
| 359 IntSize scrollDimensions = maximumScrollPosition() - minimumScrollPosition(); | 355 IntSize scrollDimensions = |
| 356 maximumScrollOffsetInt() - minimumScrollOffsetInt(); |
| 360 return (orientation == HorizontalScrollbar) ? scrollDimensions.width() | 357 return (orientation == HorizontalScrollbar) ? scrollDimensions.width() |
| 361 : scrollDimensions.height(); | 358 : scrollDimensions.height(); |
| 362 } | 359 } |
| 363 | 360 |
| 364 void PaintLayerScrollableArea::setScrollOffset( | 361 void PaintLayerScrollableArea::updateScrollOffset(const ScrollOffset& newOffset, |
| 365 const DoublePoint& newScrollOffset, | 362 ScrollType scrollType) { |
| 366 ScrollType scrollType) { | 363 if (scrollOffset() == newOffset) |
| 367 if (scrollOffset() == toDoubleSize(newScrollOffset)) | |
| 368 return; | 364 return; |
| 369 | 365 |
| 370 DoubleSize scrollDelta = scrollOffset() - toDoubleSize(newScrollOffset); | 366 ScrollOffset scrollDelta = scrollOffset() - newOffset; |
| 371 m_scrollOffset = toDoubleSize(newScrollOffset); | 367 m_scrollOffset = newOffset; |
| 372 | 368 |
| 373 LocalFrame* frame = box().frame(); | 369 LocalFrame* frame = box().frame(); |
| 374 ASSERT(frame); | 370 ASSERT(frame); |
| 375 | 371 |
| 376 FrameView* frameView = box().frameView(); | 372 FrameView* frameView = box().frameView(); |
| 377 | 373 |
| 378 TRACE_EVENT1("devtools.timeline", "ScrollLayer", "data", | 374 TRACE_EVENT1("devtools.timeline", "ScrollLayer", "data", |
| 379 InspectorScrollLayerEvent::data(&box())); | 375 InspectorScrollLayerEvent::data(&box())); |
| 380 | 376 |
| 381 // FIXME(420741): Resolve circular dependency between scroll offset and | 377 // FIXME(420741): Resolve circular dependency between scroll offset and |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 457 | 453 |
| 458 // All scrolls clear the fragment anchor. | 454 // All scrolls clear the fragment anchor. |
| 459 frameView->clearFragmentAnchor(); | 455 frameView->clearFragmentAnchor(); |
| 460 | 456 |
| 461 // Clear the scroll anchor, unless it is the reason for this scroll. | 457 // Clear the scroll anchor, unless it is the reason for this scroll. |
| 462 if (RuntimeEnabledFeatures::scrollAnchoringEnabled() && | 458 if (RuntimeEnabledFeatures::scrollAnchoringEnabled() && |
| 463 scrollType != AnchoringScroll) | 459 scrollType != AnchoringScroll) |
| 464 scrollAnchor()->clear(); | 460 scrollAnchor()->clear(); |
| 465 } | 461 } |
| 466 | 462 |
| 467 IntPoint PaintLayerScrollableArea::scrollPosition() const { | 463 IntSize PaintLayerScrollableArea::scrollOffsetInt() const { |
| 468 return IntPoint(flooredIntSize(m_scrollOffset)); | 464 return flooredIntSize(m_scrollOffset); |
| 469 } | 465 } |
| 470 | 466 |
| 471 DoublePoint PaintLayerScrollableArea::scrollPositionDouble() const { | 467 ScrollOffset PaintLayerScrollableArea::scrollOffset() const { |
| 472 return DoublePoint(m_scrollOffset); | 468 return m_scrollOffset; |
| 473 } | 469 } |
| 474 | 470 |
| 475 IntPoint PaintLayerScrollableArea::minimumScrollPosition() const { | 471 IntSize PaintLayerScrollableArea::minimumScrollOffsetInt() const { |
| 476 return -scrollOrigin(); | 472 return toIntSize(-scrollOrigin()); |
| 477 } | 473 } |
| 478 | 474 |
| 479 IntPoint PaintLayerScrollableArea::maximumScrollPosition() const { | 475 IntSize PaintLayerScrollableArea::maximumScrollOffsetInt() const { |
| 480 IntSize contentSize; | 476 IntSize contentSize; |
| 481 IntSize visibleSize; | 477 IntSize visibleSize; |
| 482 if (box().hasOverflowClip()) { | 478 if (box().hasOverflowClip()) { |
| 483 contentSize = | 479 contentSize = |
| 484 IntSize(pixelSnappedScrollWidth(), pixelSnappedScrollHeight()); | 480 IntSize(pixelSnappedScrollWidth(), pixelSnappedScrollHeight()); |
| 485 visibleSize = | 481 visibleSize = |
| 486 pixelSnappedIntRect(box().overflowClipRect(box().location())).size(); | 482 pixelSnappedIntRect(box().overflowClipRect(box().location())).size(); |
| 487 | 483 |
| 488 // TODO(skobes): We should really ASSERT that contentSize >= visibleSize | 484 // TODO(skobes): We should really ASSERT that contentSize >= visibleSize |
| 489 // when we are not the root layer, but we can't because contentSize is | 485 // when we are not the root layer, but we can't because contentSize is |
| 490 // based on stale layout overflow data (http://crbug.com/576933). | 486 // based on stale layout overflow data (http://crbug.com/576933). |
| 491 contentSize = contentSize.expandedTo(visibleSize); | 487 contentSize = contentSize.expandedTo(visibleSize); |
| 492 } | 488 } |
| 493 return -scrollOrigin() + (contentSize - visibleSize); | 489 return toIntSize(-scrollOrigin() + (contentSize - visibleSize)); |
| 494 } | 490 } |
| 495 | 491 |
| 496 IntRect PaintLayerScrollableArea::visibleContentRect( | 492 IntRect PaintLayerScrollableArea::visibleContentRect( |
| 497 IncludeScrollbarsInRect scrollbarInclusion) const { | 493 IncludeScrollbarsInRect scrollbarInclusion) const { |
| 498 int verticalScrollbarWidth = 0; | 494 int verticalScrollbarWidth = 0; |
| 499 int horizontalScrollbarHeight = 0; | 495 int horizontalScrollbarHeight = 0; |
| 500 if (scrollbarInclusion == IncludeScrollbars) { | 496 if (scrollbarInclusion == IncludeScrollbars) { |
| 501 verticalScrollbarWidth = | 497 verticalScrollbarWidth = |
| 502 (verticalScrollbar() && !verticalScrollbar()->isOverlayScrollbar()) | 498 (verticalScrollbar() && !verticalScrollbar()->isOverlayScrollbar()) |
| 503 ? verticalScrollbar()->scrollbarThickness() | 499 ? verticalScrollbar()->scrollbarThickness() |
| 504 : 0; | 500 : 0; |
| 505 horizontalScrollbarHeight = | 501 horizontalScrollbarHeight = |
| 506 (horizontalScrollbar() && !horizontalScrollbar()->isOverlayScrollbar()) | 502 (horizontalScrollbar() && !horizontalScrollbar()->isOverlayScrollbar()) |
| 507 ? horizontalScrollbar()->scrollbarThickness() | 503 ? horizontalScrollbar()->scrollbarThickness() |
| 508 : 0; | 504 : 0; |
| 509 } | 505 } |
| 510 | 506 |
| 511 // TODO(szager): Handle fractional scroll offsets correctly. | 507 // TODO(szager): Handle fractional scroll offsets correctly. |
| 512 return IntRect( | 508 return IntRect( |
| 513 IntPoint(flooredIntSize(adjustedScrollOffset())), | 509 flooredIntPoint(scrollPosition()), |
| 514 IntSize(max(0, layer()->size().width() - verticalScrollbarWidth), | 510 IntSize(max(0, layer()->size().width() - verticalScrollbarWidth), |
| 515 max(0, layer()->size().height() - horizontalScrollbarHeight))); | 511 max(0, layer()->size().height() - horizontalScrollbarHeight))); |
| 516 } | 512 } |
| 517 | 513 |
| 518 int PaintLayerScrollableArea::visibleHeight() const { | 514 int PaintLayerScrollableArea::visibleHeight() const { |
| 519 return layer()->size().height(); | 515 return layer()->size().height(); |
| 520 } | 516 } |
| 521 | 517 |
| 522 int PaintLayerScrollableArea::visibleWidth() const { | 518 int PaintLayerScrollableArea::visibleWidth() const { |
| 523 return layer()->size().width(); | 519 return layer()->size().width(); |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 640 setScrollOrigin(flooredIntPoint(-scrollableOverflow) + | 636 setScrollOrigin(flooredIntPoint(-scrollableOverflow) + |
| 641 box().originAdjustmentForScrollbars()); | 637 box().originAdjustmentForScrollbars()); |
| 642 } | 638 } |
| 643 | 639 |
| 644 void PaintLayerScrollableArea::updateScrollDimensions() { | 640 void PaintLayerScrollableArea::updateScrollDimensions() { |
| 645 m_overflowRect = box().layoutOverflowRect(); | 641 m_overflowRect = box().layoutOverflowRect(); |
| 646 box().flipForWritingMode(m_overflowRect); | 642 box().flipForWritingMode(m_overflowRect); |
| 647 updateScrollOrigin(); | 643 updateScrollOrigin(); |
| 648 } | 644 } |
| 649 | 645 |
| 650 void PaintLayerScrollableArea::setScrollPositionUnconditionally( | 646 void PaintLayerScrollableArea::setScrollOffsetUnconditionally( |
| 651 const DoublePoint& position, | 647 const ScrollOffset& offset, |
| 652 ScrollType scrollType) { | 648 ScrollType scrollType) { |
| 653 cancelScrollAnimation(); | 649 cancelScrollAnimation(); |
| 654 scrollPositionChanged(position, scrollType); | 650 scrollOffsetChanged(offset, scrollType); |
| 655 } | 651 } |
| 656 | 652 |
| 657 void PaintLayerScrollableArea::updateAfterLayout() { | 653 void PaintLayerScrollableArea::updateAfterLayout() { |
| 658 ASSERT(box().hasOverflowClip()); | 654 ASSERT(box().hasOverflowClip()); |
| 659 | 655 |
| 660 bool relayoutIsPrevented = PreventRelayoutScope::relayoutIsPrevented(); | 656 bool relayoutIsPrevented = PreventRelayoutScope::relayoutIsPrevented(); |
| 661 bool scrollbarsAreFrozen = | 657 bool scrollbarsAreFrozen = |
| 662 m_inOverflowRelayout || FreezeScrollbarsScope::scrollbarsAreFrozen(); | 658 m_inOverflowRelayout || FreezeScrollbarsScope::scrollbarsAreFrozen(); |
| 663 | 659 |
| 664 if (needsScrollbarReconstruction()) { | 660 if (needsScrollbarReconstruction()) { |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 787 } | 783 } |
| 788 } | 784 } |
| 789 | 785 |
| 790 if (!scrollbarsAreFrozen && hasOverlayScrollbars()) { | 786 if (!scrollbarsAreFrozen && hasOverlayScrollbars()) { |
| 791 if (!scrollSize(HorizontalScrollbar)) | 787 if (!scrollSize(HorizontalScrollbar)) |
| 792 setHasHorizontalScrollbar(false); | 788 setHasHorizontalScrollbar(false); |
| 793 if (!scrollSize(VerticalScrollbar)) | 789 if (!scrollSize(VerticalScrollbar)) |
| 794 setHasVerticalScrollbar(false); | 790 setHasVerticalScrollbar(false); |
| 795 } | 791 } |
| 796 | 792 |
| 797 clampScrollPositionsAfterLayout(); | 793 clampScrollOffsetsAfterLayout(); |
| 798 | 794 |
| 799 if (!scrollbarsAreFrozen) { | 795 if (!scrollbarsAreFrozen) { |
| 800 bool hasOverflow = | 796 bool hasOverflow = |
| 801 hasScrollableHorizontalOverflow() || hasScrollableVerticalOverflow(); | 797 hasScrollableHorizontalOverflow() || hasScrollableVerticalOverflow(); |
| 802 updateScrollableAreaSet(hasOverflow); | 798 updateScrollableAreaSet(hasOverflow); |
| 803 } | 799 } |
| 804 | 800 |
| 805 DisableCompositingQueryAsserts disabler; | 801 DisableCompositingQueryAsserts disabler; |
| 806 positionOverflowControls(); | 802 positionOverflowControls(); |
| 807 } | 803 } |
| 808 | 804 |
| 809 void PaintLayerScrollableArea::clampScrollPositionsAfterLayout() { | 805 void PaintLayerScrollableArea::clampScrollOffsetsAfterLayout() { |
| 810 // If a vertical scrollbar was removed, the min/max scroll positions may have | 806 // If a vertical scrollbar was removed, the min/max scroll offsets may have |
| 811 // changed, so the scroll positions needs to be clamped. If the scroll | 807 // changed, so the scroll offsets needs to be clamped. If the scroll offset |
| 812 // position did not change, but the scroll origin *did* change, we still need | 808 // did not change, but the scroll origin *did* change, we still need to notify |
| 813 // to notify the scrollbars to update their dimensions. | 809 // the scrollbars to update their dimensions. |
| 814 | 810 |
| 815 if (DelayScrollPositionClampScope::clampingIsDelayed()) { | 811 if (DelayScrollOffsetClampScope::clampingIsDelayed()) { |
| 816 DelayScrollPositionClampScope::setNeedsClamp(this); | 812 DelayScrollOffsetClampScope::setNeedsClamp(this); |
| 817 return; | 813 return; |
| 818 } | 814 } |
| 819 | 815 |
| 820 // Restore before clamping because clamping clears the scroll anchor. | 816 // Restore before clamping because clamping clears the scroll anchor. |
| 821 if (shouldPerformScrollAnchoring()) | 817 if (shouldPerformScrollAnchoring()) |
| 822 m_scrollAnchor.restore(); | 818 m_scrollAnchor.restore(); |
| 823 | 819 |
| 824 if (scrollOriginChanged()) { | 820 if (scrollOriginChanged()) |
| 825 setScrollPositionUnconditionally( | 821 setScrollOffsetUnconditionally(clampScrollOffset(scrollOffset())); |
| 826 clampScrollPosition(scrollPositionDouble())); | 822 else |
| 827 } else { | 823 ScrollableArea::setScrollOffset(scrollOffset(), ProgrammaticScroll); |
| 828 ScrollableArea::setScrollPosition(scrollPositionDouble(), | |
| 829 ProgrammaticScroll); | |
| 830 } | |
| 831 | 824 |
| 832 setNeedsScrollPositionClamp(false); | 825 setNeedsScrollOffsetClamp(false); |
| 833 resetScrollOriginChanged(); | 826 resetScrollOriginChanged(); |
| 834 m_scrollbarManager.destroyDetachedScrollbars(); | 827 m_scrollbarManager.destroyDetachedScrollbars(); |
| 835 } | 828 } |
| 836 | 829 |
| 837 bool PaintLayerScrollableArea::shouldPerformScrollAnchoring() const { | 830 bool PaintLayerScrollableArea::shouldPerformScrollAnchoring() const { |
| 838 return RuntimeEnabledFeatures::scrollAnchoringEnabled() && | 831 return RuntimeEnabledFeatures::scrollAnchoringEnabled() && |
| 839 m_scrollAnchor.hasScroller() && | 832 m_scrollAnchor.hasScroller() && |
| 840 layoutBox()->style()->overflowAnchor() != AnchorNone; | 833 layoutBox()->style()->overflowAnchor() != AnchorNone; |
| 841 } | 834 } |
| 842 | 835 |
| (...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1583 LayoutRect localExposeRect( | 1576 LayoutRect localExposeRect( |
| 1584 box() | 1577 box() |
| 1585 .absoluteToLocalQuad(FloatQuad(FloatRect(rect)), UseTransforms) | 1578 .absoluteToLocalQuad(FloatQuad(FloatRect(rect)), UseTransforms) |
| 1586 .boundingBox()); | 1579 .boundingBox()); |
| 1587 localExposeRect.move(-box().borderLeft(), -box().borderTop()); | 1580 localExposeRect.move(-box().borderLeft(), -box().borderTop()); |
| 1588 LayoutRect layerBounds(LayoutPoint(), | 1581 LayoutRect layerBounds(LayoutPoint(), |
| 1589 LayoutSize(box().clientWidth(), box().clientHeight())); | 1582 LayoutSize(box().clientWidth(), box().clientHeight())); |
| 1590 LayoutRect r = ScrollAlignment::getRectToExpose(layerBounds, localExposeRect, | 1583 LayoutRect r = ScrollAlignment::getRectToExpose(layerBounds, localExposeRect, |
| 1591 alignX, alignY); | 1584 alignX, alignY); |
| 1592 | 1585 |
| 1593 DoublePoint clampedScrollPosition = clampScrollPosition( | 1586 ScrollOffset oldScrollOffset = scrollOffset(); |
| 1594 scrollPositionDouble() + roundedIntSize(r.location())); | 1587 ScrollOffset newScrollOffset(clampScrollOffset(roundedIntSize( |
| 1595 if (clampedScrollPosition == scrollPositionDouble()) { | 1588 toScrollOffset(FloatPoint(r.location()) + oldScrollOffset)))); |
| 1589 |
| 1590 if (newScrollOffset == oldScrollOffset) { |
| 1596 return LayoutRect( | 1591 return LayoutRect( |
| 1597 box() | 1592 box() |
| 1598 .localToAbsoluteQuad(FloatQuad(FloatRect(intersection( | 1593 .localToAbsoluteQuad(FloatQuad(FloatRect(intersection( |
| 1599 layerBounds, localExposeRect))), | 1594 layerBounds, localExposeRect))), |
| 1600 UseTransforms) | 1595 UseTransforms) |
| 1601 .boundingBox()); | 1596 .boundingBox()); |
| 1602 } | 1597 } |
| 1603 | 1598 |
| 1604 DoubleSize oldScrollOffset = adjustedScrollOffset(); | 1599 setScrollOffset(newScrollOffset, scrollType, ScrollBehaviorInstant); |
| 1605 setScrollPosition(clampedScrollPosition, scrollType, ScrollBehaviorInstant); | 1600 ScrollOffset scrollOffsetDifference = scrollOffset() - oldScrollOffset; |
| 1606 DoubleSize scrollOffsetDifference = adjustedScrollOffset() - oldScrollOffset; | |
| 1607 localExposeRect.move(-LayoutSize(scrollOffsetDifference)); | 1601 localExposeRect.move(-LayoutSize(scrollOffsetDifference)); |
| 1608 return LayoutRect( | 1602 return LayoutRect( |
| 1609 box() | 1603 box() |
| 1610 .localToAbsoluteQuad( | 1604 .localToAbsoluteQuad( |
| 1611 FloatQuad(FloatRect(intersection(layerBounds, localExposeRect))), | 1605 FloatQuad(FloatRect(intersection(layerBounds, localExposeRect))), |
| 1612 UseTransforms) | 1606 UseTransforms) |
| 1613 .boundingBox()); | 1607 .boundingBox()); |
| 1614 } | 1608 } |
| 1615 | 1609 |
| 1616 void PaintLayerScrollableArea::updateScrollableAreaSet(bool hasOverflow) { | 1610 void PaintLayerScrollableArea::updateScrollableAreaSet(bool hasOverflow) { |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1792 if (!m_hBar) { | 1786 if (!m_hBar) { |
| 1793 m_hBar = createScrollbar(HorizontalScrollbar); | 1787 m_hBar = createScrollbar(HorizontalScrollbar); |
| 1794 m_hBarIsAttached = 1; | 1788 m_hBarIsAttached = 1; |
| 1795 if (!m_hBar->isCustomScrollbar()) | 1789 if (!m_hBar->isCustomScrollbar()) |
| 1796 m_scrollableArea->didAddScrollbar(*m_hBar, HorizontalScrollbar); | 1790 m_scrollableArea->didAddScrollbar(*m_hBar, HorizontalScrollbar); |
| 1797 } else { | 1791 } else { |
| 1798 m_hBarIsAttached = 1; | 1792 m_hBarIsAttached = 1; |
| 1799 } | 1793 } |
| 1800 } else { | 1794 } else { |
| 1801 m_hBarIsAttached = 0; | 1795 m_hBarIsAttached = 0; |
| 1802 if (!DelayScrollPositionClampScope::clampingIsDelayed()) | 1796 if (!DelayScrollOffsetClampScope::clampingIsDelayed()) |
| 1803 destroyScrollbar(HorizontalScrollbar); | 1797 destroyScrollbar(HorizontalScrollbar); |
| 1804 } | 1798 } |
| 1805 } | 1799 } |
| 1806 | 1800 |
| 1807 void PaintLayerScrollableArea::ScrollbarManager::setHasVerticalScrollbar( | 1801 void PaintLayerScrollableArea::ScrollbarManager::setHasVerticalScrollbar( |
| 1808 bool hasScrollbar) { | 1802 bool hasScrollbar) { |
| 1809 if (hasScrollbar) { | 1803 if (hasScrollbar) { |
| 1810 DisableCompositingQueryAsserts disabler; | 1804 DisableCompositingQueryAsserts disabler; |
| 1811 if (!m_vBar) { | 1805 if (!m_vBar) { |
| 1812 m_vBar = createScrollbar(VerticalScrollbar); | 1806 m_vBar = createScrollbar(VerticalScrollbar); |
| 1813 m_vBarIsAttached = 1; | 1807 m_vBarIsAttached = 1; |
| 1814 if (!m_vBar->isCustomScrollbar()) | 1808 if (!m_vBar->isCustomScrollbar()) |
| 1815 m_scrollableArea->didAddScrollbar(*m_vBar, VerticalScrollbar); | 1809 m_scrollableArea->didAddScrollbar(*m_vBar, VerticalScrollbar); |
| 1816 } else { | 1810 } else { |
| 1817 m_vBarIsAttached = 1; | 1811 m_vBarIsAttached = 1; |
| 1818 } | 1812 } |
| 1819 } else { | 1813 } else { |
| 1820 m_vBarIsAttached = 0; | 1814 m_vBarIsAttached = 0; |
| 1821 if (!DelayScrollPositionClampScope::clampingIsDelayed()) | 1815 if (!DelayScrollOffsetClampScope::clampingIsDelayed()) |
| 1822 destroyScrollbar(VerticalScrollbar); | 1816 destroyScrollbar(VerticalScrollbar); |
| 1823 } | 1817 } |
| 1824 } | 1818 } |
| 1825 | 1819 |
| 1826 Scrollbar* PaintLayerScrollableArea::ScrollbarManager::createScrollbar( | 1820 Scrollbar* PaintLayerScrollableArea::ScrollbarManager::createScrollbar( |
| 1827 ScrollbarOrientation orientation) { | 1821 ScrollbarOrientation orientation) { |
| 1828 ASSERT(orientation == HorizontalScrollbar ? !m_hBarIsAttached | 1822 ASSERT(orientation == HorizontalScrollbar ? !m_hBarIsAttached |
| 1829 : !m_vBarIsAttached); | 1823 : !m_vBarIsAttached); |
| 1830 Scrollbar* scrollbar = nullptr; | 1824 Scrollbar* scrollbar = nullptr; |
| 1831 const LayoutObject& actualLayoutObject = | 1825 const LayoutObject& actualLayoutObject = |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1948 } | 1942 } |
| 1949 | 1943 |
| 1950 void PaintLayerScrollableArea::PreventRelayoutScope::resetRelayoutNeeded() { | 1944 void PaintLayerScrollableArea::PreventRelayoutScope::resetRelayoutNeeded() { |
| 1951 DCHECK_EQ(s_count, 0); | 1945 DCHECK_EQ(s_count, 0); |
| 1952 DCHECK(!s_needsRelayout || s_needsRelayout->isEmpty()); | 1946 DCHECK(!s_needsRelayout || s_needsRelayout->isEmpty()); |
| 1953 s_relayoutNeeded = false; | 1947 s_relayoutNeeded = false; |
| 1954 } | 1948 } |
| 1955 | 1949 |
| 1956 int PaintLayerScrollableArea::FreezeScrollbarsScope::s_count = 0; | 1950 int PaintLayerScrollableArea::FreezeScrollbarsScope::s_count = 0; |
| 1957 | 1951 |
| 1958 int PaintLayerScrollableArea::DelayScrollPositionClampScope::s_count = 0; | 1952 int PaintLayerScrollableArea::DelayScrollOffsetClampScope::s_count = 0; |
| 1959 PersistentHeapVector<Member<PaintLayerScrollableArea>>* | 1953 PersistentHeapVector<Member<PaintLayerScrollableArea>>* |
| 1960 PaintLayerScrollableArea::DelayScrollPositionClampScope::s_needsClamp = | 1954 PaintLayerScrollableArea::DelayScrollOffsetClampScope::s_needsClamp = |
| 1961 nullptr; | 1955 nullptr; |
| 1962 | 1956 |
| 1963 PaintLayerScrollableArea::DelayScrollPositionClampScope:: | 1957 PaintLayerScrollableArea::DelayScrollOffsetClampScope:: |
| 1964 DelayScrollPositionClampScope() { | 1958 DelayScrollOffsetClampScope() { |
| 1965 if (!s_needsClamp) | 1959 if (!s_needsClamp) |
| 1966 s_needsClamp = new PersistentHeapVector<Member<PaintLayerScrollableArea>>(); | 1960 s_needsClamp = new PersistentHeapVector<Member<PaintLayerScrollableArea>>(); |
| 1967 DCHECK(s_count > 0 || s_needsClamp->isEmpty()); | 1961 DCHECK(s_count > 0 || s_needsClamp->isEmpty()); |
| 1968 s_count++; | 1962 s_count++; |
| 1969 } | 1963 } |
| 1970 | 1964 |
| 1971 PaintLayerScrollableArea::DelayScrollPositionClampScope:: | 1965 PaintLayerScrollableArea::DelayScrollOffsetClampScope:: |
| 1972 ~DelayScrollPositionClampScope() { | 1966 ~DelayScrollOffsetClampScope() { |
| 1973 if (--s_count == 0) | 1967 if (--s_count == 0) |
| 1974 DelayScrollPositionClampScope::clampScrollableAreas(); | 1968 DelayScrollOffsetClampScope::clampScrollableAreas(); |
| 1975 } | 1969 } |
| 1976 | 1970 |
| 1977 void PaintLayerScrollableArea::DelayScrollPositionClampScope::setNeedsClamp( | 1971 void PaintLayerScrollableArea::DelayScrollOffsetClampScope::setNeedsClamp( |
| 1978 PaintLayerScrollableArea* scrollableArea) { | 1972 PaintLayerScrollableArea* scrollableArea) { |
| 1979 if (!scrollableArea->needsScrollPositionClamp()) { | 1973 if (!scrollableArea->needsScrollOffsetClamp()) { |
| 1980 scrollableArea->setNeedsScrollPositionClamp(true); | 1974 scrollableArea->setNeedsScrollOffsetClamp(true); |
| 1981 s_needsClamp->append(scrollableArea); | 1975 s_needsClamp->append(scrollableArea); |
| 1982 } | 1976 } |
| 1983 } | 1977 } |
| 1984 | 1978 |
| 1985 void PaintLayerScrollableArea::DelayScrollPositionClampScope:: | 1979 void PaintLayerScrollableArea::DelayScrollOffsetClampScope:: |
| 1986 clampScrollableAreas() { | 1980 clampScrollableAreas() { |
| 1987 for (auto& scrollableArea : *s_needsClamp) | 1981 for (auto& scrollableArea : *s_needsClamp) |
| 1988 scrollableArea->clampScrollPositionsAfterLayout(); | 1982 scrollableArea->clampScrollOffsetsAfterLayout(); |
| 1989 delete s_needsClamp; | 1983 delete s_needsClamp; |
| 1990 s_needsClamp = nullptr; | 1984 s_needsClamp = nullptr; |
| 1991 } | 1985 } |
| 1992 | 1986 |
| 1993 } // namespace blink | 1987 } // namespace blink |
| OLD | NEW |