| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
reserved. |
| 3 * | 3 * |
| 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. | 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. |
| 5 * | 5 * |
| 6 * Other contributors: | 6 * Other contributors: |
| 7 * Robert O'Callahan <roc+@cs.cmu.edu> | 7 * Robert O'Callahan <roc+@cs.cmu.edu> |
| 8 * David Baron <dbaron@fas.harvard.edu> | 8 * David Baron <dbaron@fas.harvard.edu> |
| 9 * Christian Biesinger <cbiesinger@gmail.com> | 9 * Christian Biesinger <cbiesinger@gmail.com> |
| 10 * Randall Jesup <rjesup@wgate.com> | 10 * Randall Jesup <rjesup@wgate.com> |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 PaintLayerScrollableArea::PaintLayerScrollableArea(PaintLayer& layer) | 89 PaintLayerScrollableArea::PaintLayerScrollableArea(PaintLayer& layer) |
| 90 : m_layer(layer), | 90 : m_layer(layer), |
| 91 m_nextTopmostScrollChild(0), | 91 m_nextTopmostScrollChild(0), |
| 92 m_topmostScrollChild(0), | 92 m_topmostScrollChild(0), |
| 93 m_inResizeMode(false), | 93 m_inResizeMode(false), |
| 94 m_scrollsOverflow(false), | 94 m_scrollsOverflow(false), |
| 95 m_inOverflowRelayout(false), | 95 m_inOverflowRelayout(false), |
| 96 m_needsCompositedScrolling(false), | 96 m_needsCompositedScrolling(false), |
| 97 m_rebuildHorizontalScrollbarLayer(false), | 97 m_rebuildHorizontalScrollbarLayer(false), |
| 98 m_rebuildVerticalScrollbarLayer(false), | 98 m_rebuildVerticalScrollbarLayer(false), |
| 99 m_needsScrollPositionClamp(false), | 99 m_needsScrollOffsetClamp(false), |
| 100 m_needsRelayout(false), | 100 m_needsRelayout(false), |
| 101 m_hadHorizontalScrollbarBeforeRelayout(false), | 101 m_hadHorizontalScrollbarBeforeRelayout(false), |
| 102 m_hadVerticalScrollbarBeforeRelayout(false), | 102 m_hadVerticalScrollbarBeforeRelayout(false), |
| 103 m_scrollbarManager(*this), | 103 m_scrollbarManager(*this), |
| 104 m_scrollCorner(nullptr), | 104 m_scrollCorner(nullptr), |
| 105 m_resizer(nullptr), | 105 m_resizer(nullptr), |
| 106 m_scrollAnchor(this) | 106 m_scrollAnchor(this) |
| 107 #if ENABLE(ASSERT) | 107 #if ENABLE(ASSERT) |
| 108 , | 108 , |
| 109 m_hasBeenDisposed(false) | 109 m_hasBeenDisposed(false) |
| 110 #endif | 110 #endif |
| 111 { | 111 { |
| 112 Node* node = box().node(); | 112 Node* node = box().node(); |
| 113 if (node && node->isElementNode()) { | 113 if (node && node->isElementNode()) { |
| 114 // We save and restore only the scrollOffset as the other scroll values are
recalculated. | 114 // We save and restore only the scrollOffset as the other scroll values are
recalculated. |
| 115 Element* element = toElement(node); | 115 Element* element = toElement(node); |
| 116 m_scrollPosition = element->savedLayerScrollOffset(); | 116 m_scrollOffset = element->savedLayerScrollOffset(); |
| 117 if (!m_scrollPosition.isZero()) { | 117 if (!m_scrollOffset.isZero()) |
| 118 scrollAnimator().setCurrentPosition( | 118 scrollAnimator().setCurrentOffset(m_scrollOffset); |
| 119 FloatPoint(m_scrollPosition.width(), m_scrollPosition.height())); | 119 element->setSavedLayerScrollOffset(ScrollOffset()); |
| 120 } | |
| 121 element->setSavedLayerScrollOffset(IntSize()); | |
| 122 } | 120 } |
| 123 updateResizerAreaSet(); | 121 updateResizerAreaSet(); |
| 124 } | 122 } |
| 125 | 123 |
| 126 PaintLayerScrollableArea::~PaintLayerScrollableArea() { | 124 PaintLayerScrollableArea::~PaintLayerScrollableArea() { |
| 127 ASSERT(m_hasBeenDisposed); | 125 ASSERT(m_hasBeenDisposed); |
| 128 } | 126 } |
| 129 | 127 |
| 130 void PaintLayerScrollableArea::dispose() { | 128 void PaintLayerScrollableArea::dispose() { |
| 131 if (inResizeMode() && !box().documentBeingDestroyed()) { | 129 if (inResizeMode() && !box().documentBeingDestroyed()) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 142 | 140 |
| 143 if (box().frame() && box().frame()->page()) { | 141 if (box().frame() && box().frame()->page()) { |
| 144 if (ScrollingCoordinator* scrollingCoordinator = | 142 if (ScrollingCoordinator* scrollingCoordinator = |
| 145 box().frame()->page()->scrollingCoordinator()) | 143 box().frame()->page()->scrollingCoordinator()) |
| 146 scrollingCoordinator->willDestroyScrollableArea(this); | 144 scrollingCoordinator->willDestroyScrollableArea(this); |
| 147 } | 145 } |
| 148 | 146 |
| 149 if (!box().documentBeingDestroyed()) { | 147 if (!box().documentBeingDestroyed()) { |
| 150 Node* node = box().node(); | 148 Node* node = box().node(); |
| 151 // FIXME: Make setSavedLayerScrollOffset take DoubleSize. crbug.com/414283. | 149 // FIXME: Make setSavedLayerScrollOffset take DoubleSize. crbug.com/414283. |
| 152 if (node && node->isElementNode()) { | 150 if (node && node->isElementNode()) |
| 153 toElement(node)->setSavedLayerScrollOffset( | 151 toElement(node)->setSavedLayerScrollOffset(m_scrollOffset); |
| 154 flooredIntSize(m_scrollPosition)); | |
| 155 } | |
| 156 } | 152 } |
| 157 | 153 |
| 158 if (LocalFrame* frame = box().frame()) { | 154 if (LocalFrame* frame = box().frame()) { |
| 159 if (FrameView* frameView = frame->view()) | 155 if (FrameView* frameView = frame->view()) |
| 160 frameView->removeResizerArea(box()); | 156 frameView->removeResizerArea(box()); |
| 161 } | 157 } |
| 162 | 158 |
| 163 if (RootScrollerController* controller = | 159 if (RootScrollerController* controller = |
| 164 box().document().rootScrollerController()) | 160 box().document().rootScrollerController()) |
| 165 controller->didDisposePaintLayerScrollableArea(*this); | 161 controller->didDisposePaintLayerScrollableArea(*this); |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 344 return parentPoint; | 340 return parentPoint; |
| 345 | 341 |
| 346 IntPoint point = view->frameView()->convertToLayoutObject(box(), parentPoint); | 342 IntPoint point = view->frameView()->convertToLayoutObject(box(), parentPoint); |
| 347 | 343 |
| 348 point.move(-scrollbarOffset(scrollbar)); | 344 point.move(-scrollbarOffset(scrollbar)); |
| 349 return point; | 345 return point; |
| 350 } | 346 } |
| 351 | 347 |
| 352 int PaintLayerScrollableArea::scrollSize( | 348 int PaintLayerScrollableArea::scrollSize( |
| 353 ScrollbarOrientation orientation) const { | 349 ScrollbarOrientation orientation) const { |
| 354 IntSize scrollDimensions = maximumScrollPosition() - minimumScrollPosition(); | 350 IntSize scrollDimensions = |
| 351 maximumScrollOffsetInt() - minimumScrollOffsetInt(); |
| 355 return (orientation == HorizontalScrollbar) ? scrollDimensions.width() | 352 return (orientation == HorizontalScrollbar) ? scrollDimensions.width() |
| 356 : scrollDimensions.height(); | 353 : scrollDimensions.height(); |
| 357 } | 354 } |
| 358 | 355 |
| 359 void PaintLayerScrollableArea::updateScrollPosition( | 356 void PaintLayerScrollableArea::updateScrollOffset(const ScrollOffset& newOffset, |
| 360 const DoublePoint& newPosition, | 357 ScrollType scrollType) { |
| 361 ScrollType scrollType) { | 358 if (scrollOffset() == newOffset) |
| 362 if (scrollPositionDouble() == newPosition) | |
| 363 return; | 359 return; |
| 364 | 360 |
| 365 DoubleSize scrollDelta = scrollPositionDouble() - newPosition; | 361 ScrollOffset scrollDelta = scrollOffset() - newOffset; |
| 366 m_scrollPosition = toDoubleSize(newPosition); | 362 m_scrollOffset = newOffset; |
| 367 | 363 |
| 368 LocalFrame* frame = box().frame(); | 364 LocalFrame* frame = box().frame(); |
| 369 ASSERT(frame); | 365 ASSERT(frame); |
| 370 | 366 |
| 371 FrameView* frameView = box().frameView(); | 367 FrameView* frameView = box().frameView(); |
| 372 | 368 |
| 373 TRACE_EVENT1("devtools.timeline", "ScrollLayer", "data", | 369 TRACE_EVENT1("devtools.timeline", "ScrollLayer", "data", |
| 374 InspectorScrollLayerEvent::data(&box())); | 370 InspectorScrollLayerEvent::data(&box())); |
| 375 | 371 |
| 376 // FIXME(420741): Resolve circular dependency between scroll offset and | 372 // FIXME(420741): Resolve circular dependency between scroll offset and |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 434 } | 430 } |
| 435 | 431 |
| 436 // Schedule the scroll DOM event. | 432 // Schedule the scroll DOM event. |
| 437 if (box().node()) | 433 if (box().node()) |
| 438 box().node()->document().enqueueScrollEventForNode(box().node()); | 434 box().node()->document().enqueueScrollEventForNode(box().node()); |
| 439 | 435 |
| 440 if (AXObjectCache* cache = box().document().existingAXObjectCache()) | 436 if (AXObjectCache* cache = box().document().existingAXObjectCache()) |
| 441 cache->handleScrollPositionChanged(&box()); | 437 cache->handleScrollPositionChanged(&box()); |
| 442 box().view()->clearHitTestCache(); | 438 box().view()->clearHitTestCache(); |
| 443 | 439 |
| 444 // Inform the FrameLoader of the new scroll position, so it can be restored wh
en navigating back. | 440 // Inform the FrameLoader of the new scroll offset, so it can be restored when
navigating back. |
| 445 if (layer()->isRootLayer()) { | 441 if (layer()->isRootLayer()) { |
| 446 frameView->frame().loader().saveScrollState(); | 442 frameView->frame().loader().saveScrollState(); |
| 447 frameView->didChangeScrollOffset(); | 443 frameView->didChangeScrollOffset(); |
| 448 } | 444 } |
| 449 | 445 |
| 450 // All scrolls clear the fragment anchor. | 446 // All scrolls clear the fragment anchor. |
| 451 frameView->clearFragmentAnchor(); | 447 frameView->clearFragmentAnchor(); |
| 452 | 448 |
| 453 // Clear the scroll anchor, unless it is the reason for this scroll. | 449 // Clear the scroll anchor, unless it is the reason for this scroll. |
| 454 if (RuntimeEnabledFeatures::scrollAnchoringEnabled() && | 450 if (RuntimeEnabledFeatures::scrollAnchoringEnabled() && |
| 455 scrollType != AnchoringScroll) | 451 scrollType != AnchoringScroll) |
| 456 scrollAnchor()->clear(); | 452 scrollAnchor()->clear(); |
| 457 } | 453 } |
| 458 | 454 |
| 459 IntPoint PaintLayerScrollableArea::scrollPosition() const { | 455 IntSize PaintLayerScrollableArea::scrollOffsetInt() const { |
| 460 return IntPoint(flooredIntSize(m_scrollPosition)); | 456 return flooredIntSize(m_scrollOffset); |
| 461 } | 457 } |
| 462 | 458 |
| 463 DoublePoint PaintLayerScrollableArea::scrollPositionDouble() const { | 459 ScrollOffset PaintLayerScrollableArea::scrollOffset() const { |
| 464 return DoublePoint(m_scrollPosition); | 460 return m_scrollOffset; |
| 465 } | 461 } |
| 466 | 462 |
| 467 IntPoint PaintLayerScrollableArea::minimumScrollPosition() const { | 463 IntSize PaintLayerScrollableArea::minimumScrollOffsetInt() const { |
| 468 return -scrollOrigin(); | 464 return toIntSize(-scrollOrigin()); |
| 469 } | 465 } |
| 470 | 466 |
| 471 IntPoint PaintLayerScrollableArea::maximumScrollPosition() const { | 467 IntSize PaintLayerScrollableArea::maximumScrollOffsetInt() const { |
| 472 IntSize contentSize; | 468 IntSize contentSize; |
| 473 IntSize visibleSize; | 469 IntSize visibleSize; |
| 474 if (box().hasOverflowClip()) { | 470 if (box().hasOverflowClip()) { |
| 475 contentSize = | 471 contentSize = |
| 476 IntSize(pixelSnappedScrollWidth(), pixelSnappedScrollHeight()); | 472 IntSize(pixelSnappedScrollWidth(), pixelSnappedScrollHeight()); |
| 477 visibleSize = | 473 visibleSize = |
| 478 pixelSnappedIntRect(box().overflowClipRect(box().location())).size(); | 474 pixelSnappedIntRect(box().overflowClipRect(box().location())).size(); |
| 479 | 475 |
| 480 // TODO(skobes): We should really ASSERT that contentSize >= visibleSize | 476 // TODO(skobes): We should really ASSERT that contentSize >= visibleSize |
| 481 // when we are not the root layer, but we can't because contentSize is | 477 // when we are not the root layer, but we can't because contentSize is |
| 482 // based on stale layout overflow data (http://crbug.com/576933). | 478 // based on stale layout overflow data (http://crbug.com/576933). |
| 483 contentSize = contentSize.expandedTo(visibleSize); | 479 contentSize = contentSize.expandedTo(visibleSize); |
| 484 } | 480 } |
| 485 return -scrollOrigin() + (contentSize - visibleSize); | 481 return toIntSize(-scrollOrigin() + (contentSize - visibleSize)); |
| 486 } | 482 } |
| 487 | 483 |
| 488 IntRect PaintLayerScrollableArea::visibleContentRect( | 484 IntRect PaintLayerScrollableArea::visibleContentRect( |
| 489 IncludeScrollbarsInRect scrollbarInclusion) const { | 485 IncludeScrollbarsInRect scrollbarInclusion) const { |
| 490 int verticalScrollbarWidth = 0; | 486 int verticalScrollbarWidth = 0; |
| 491 int horizontalScrollbarHeight = 0; | 487 int horizontalScrollbarHeight = 0; |
| 492 if (scrollbarInclusion == IncludeScrollbars) { | 488 if (scrollbarInclusion == IncludeScrollbars) { |
| 493 verticalScrollbarWidth = | 489 verticalScrollbarWidth = |
| 494 (verticalScrollbar() && !verticalScrollbar()->isOverlayScrollbar()) | 490 (verticalScrollbar() && !verticalScrollbar()->isOverlayScrollbar()) |
| 495 ? verticalScrollbar()->width() | 491 ? verticalScrollbar()->width() |
| 496 : 0; | 492 : 0; |
| 497 horizontalScrollbarHeight = | 493 horizontalScrollbarHeight = |
| 498 (horizontalScrollbar() && !horizontalScrollbar()->isOverlayScrollbar()) | 494 (horizontalScrollbar() && !horizontalScrollbar()->isOverlayScrollbar()) |
| 499 ? horizontalScrollbar()->height() | 495 ? horizontalScrollbar()->height() |
| 500 : 0; | 496 : 0; |
| 501 } | 497 } |
| 502 | 498 |
| 503 // TODO(szager): Handle fractional scroll offsets correctly. | 499 // TODO(szager): Handle fractional scroll offsets correctly. |
| 504 return IntRect( | 500 return IntRect( |
| 505 IntPoint(flooredIntSize(offsetFromOrigin())), | 501 flooredIntPoint(absolutePosition()), |
| 506 IntSize(max(0, layer()->size().width() - verticalScrollbarWidth), | 502 IntSize(max(0, layer()->size().width() - verticalScrollbarWidth), |
| 507 max(0, layer()->size().height() - horizontalScrollbarHeight))); | 503 max(0, layer()->size().height() - horizontalScrollbarHeight))); |
| 508 } | 504 } |
| 509 | 505 |
| 510 int PaintLayerScrollableArea::visibleHeight() const { | 506 int PaintLayerScrollableArea::visibleHeight() const { |
| 511 return layer()->size().height(); | 507 return layer()->size().height(); |
| 512 } | 508 } |
| 513 | 509 |
| 514 int PaintLayerScrollableArea::visibleWidth() const { | 510 int PaintLayerScrollableArea::visibleWidth() const { |
| 515 return layer()->size().width(); | 511 return layer()->size().width(); |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 631 setScrollOrigin(flooredIntPoint(-scrollableOverflow) + | 627 setScrollOrigin(flooredIntPoint(-scrollableOverflow) + |
| 632 box().originAdjustmentForScrollbars()); | 628 box().originAdjustmentForScrollbars()); |
| 633 } | 629 } |
| 634 | 630 |
| 635 void PaintLayerScrollableArea::updateScrollDimensions() { | 631 void PaintLayerScrollableArea::updateScrollDimensions() { |
| 636 m_overflowRect = box().layoutOverflowRect(); | 632 m_overflowRect = box().layoutOverflowRect(); |
| 637 box().flipForWritingMode(m_overflowRect); | 633 box().flipForWritingMode(m_overflowRect); |
| 638 updateScrollOrigin(); | 634 updateScrollOrigin(); |
| 639 } | 635 } |
| 640 | 636 |
| 641 void PaintLayerScrollableArea::setScrollPositionUnconditionally( | 637 void PaintLayerScrollableArea::setScrollOffsetUnconditionally( |
| 642 const DoublePoint& position, | 638 const ScrollOffset& offset, |
| 643 ScrollType scrollType) { | 639 ScrollType scrollType) { |
| 644 cancelScrollAnimation(); | 640 cancelScrollAnimation(); |
| 645 scrollPositionChanged(position, scrollType); | 641 scrollOffsetChanged(offset, scrollType); |
| 646 } | 642 } |
| 647 | 643 |
| 648 void PaintLayerScrollableArea::updateAfterLayout() { | 644 void PaintLayerScrollableArea::updateAfterLayout() { |
| 649 ASSERT(box().hasOverflowClip()); | 645 ASSERT(box().hasOverflowClip()); |
| 650 | 646 |
| 651 bool relayoutIsPrevented = PreventRelayoutScope::relayoutIsPrevented(); | 647 bool relayoutIsPrevented = PreventRelayoutScope::relayoutIsPrevented(); |
| 652 bool scrollbarsAreFrozen = | 648 bool scrollbarsAreFrozen = |
| 653 m_inOverflowRelayout || FreezeScrollbarsScope::scrollbarsAreFrozen(); | 649 m_inOverflowRelayout || FreezeScrollbarsScope::scrollbarsAreFrozen(); |
| 654 | 650 |
| 655 if (needsScrollbarReconstruction()) { | 651 if (needsScrollbarReconstruction()) { |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 769 } | 765 } |
| 770 } | 766 } |
| 771 | 767 |
| 772 if (!scrollbarsAreFrozen && hasOverlayScrollbars()) { | 768 if (!scrollbarsAreFrozen && hasOverlayScrollbars()) { |
| 773 if (!scrollSize(HorizontalScrollbar)) | 769 if (!scrollSize(HorizontalScrollbar)) |
| 774 setHasHorizontalScrollbar(false); | 770 setHasHorizontalScrollbar(false); |
| 775 if (!scrollSize(VerticalScrollbar)) | 771 if (!scrollSize(VerticalScrollbar)) |
| 776 setHasVerticalScrollbar(false); | 772 setHasVerticalScrollbar(false); |
| 777 } | 773 } |
| 778 | 774 |
| 779 clampScrollPositionsAfterLayout(); | 775 clampScrollOffsetsAfterLayout(); |
| 780 | 776 |
| 781 if (!scrollbarsAreFrozen) { | 777 if (!scrollbarsAreFrozen) { |
| 782 bool hasOverflow = | 778 bool hasOverflow = |
| 783 hasScrollableHorizontalOverflow() || hasScrollableVerticalOverflow(); | 779 hasScrollableHorizontalOverflow() || hasScrollableVerticalOverflow(); |
| 784 updateScrollableAreaSet(hasOverflow); | 780 updateScrollableAreaSet(hasOverflow); |
| 785 } | 781 } |
| 786 | 782 |
| 787 DisableCompositingQueryAsserts disabler; | 783 DisableCompositingQueryAsserts disabler; |
| 788 positionOverflowControls(); | 784 positionOverflowControls(); |
| 789 } | 785 } |
| 790 | 786 |
| 791 void PaintLayerScrollableArea::clampScrollPositionsAfterLayout() { | 787 void PaintLayerScrollableArea::clampScrollOffsetsAfterLayout() { |
| 792 // If a vertical scrollbar was removed, the min/max scroll positions may have
changed, | 788 // If a vertical scrollbar was removed, the min/max scroll offsets may have ch
anged, |
| 793 // so the scroll positions needs to be clamped. If the scroll position did no
t change, | 789 // so the scroll offsets needs to be clamped. If the scroll offset did not ch
ange, |
| 794 // but the scroll origin *did* change, we still need to notify the scrollbars
to | 790 // but the scroll origin *did* change, we still need to notify the scrollbars
to |
| 795 // update their dimensions. | 791 // update their dimensions. |
| 796 | 792 |
| 797 if (DelayScrollPositionClampScope::clampingIsDelayed()) { | 793 if (DelayScrollOffsetClampScope::clampingIsDelayed()) { |
| 798 DelayScrollPositionClampScope::setNeedsClamp(this); | 794 DelayScrollOffsetClampScope::setNeedsClamp(this); |
| 799 return; | 795 return; |
| 800 } | 796 } |
| 801 | 797 |
| 802 // Restore before clamping because clamping clears the scroll anchor. | 798 // Restore before clamping because clamping clears the scroll anchor. |
| 803 if (shouldPerformScrollAnchoring()) | 799 if (shouldPerformScrollAnchoring()) |
| 804 m_scrollAnchor.restore(); | 800 m_scrollAnchor.restore(); |
| 805 | 801 |
| 806 DoublePoint clamped = clampScrollPosition(scrollPositionDouble()); | 802 ScrollOffset clamped = clampScrollOffset(scrollOffset()); |
| 807 if (scrollOriginChanged()) | 803 if (scrollOriginChanged()) |
| 808 setScrollPositionUnconditionally(clamped); | 804 setScrollOffsetUnconditionally(clamped); |
| 809 else if (clamped != scrollPositionDouble()) | 805 else if (clamped != scrollOffset()) |
| 810 ScrollableArea::setScrollPosition(clamped, ProgrammaticScroll); | 806 ScrollableArea::setScrollOffset(clamped, ProgrammaticScroll); |
| 811 | 807 |
| 812 setNeedsScrollPositionClamp(false); | 808 setNeedsScrollOffsetClamp(false); |
| 813 resetScrollOriginChanged(); | 809 resetScrollOriginChanged(); |
| 814 m_scrollbarManager.destroyDetachedScrollbars(); | 810 m_scrollbarManager.destroyDetachedScrollbars(); |
| 815 } | 811 } |
| 816 | 812 |
| 817 bool PaintLayerScrollableArea::shouldPerformScrollAnchoring() const { | 813 bool PaintLayerScrollableArea::shouldPerformScrollAnchoring() const { |
| 818 return RuntimeEnabledFeatures::scrollAnchoringEnabled() && | 814 return RuntimeEnabledFeatures::scrollAnchoringEnabled() && |
| 819 m_scrollAnchor.hasScroller() && | 815 m_scrollAnchor.hasScroller() && |
| 820 layoutBox()->style()->overflowAnchor() != AnchorNone; | 816 layoutBox()->style()->overflowAnchor() != AnchorNone; |
| 821 } | 817 } |
| 822 | 818 |
| (...skipping 729 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1552 LayoutRect localExposeRect( | 1548 LayoutRect localExposeRect( |
| 1553 box() | 1549 box() |
| 1554 .absoluteToLocalQuad(FloatQuad(FloatRect(rect)), UseTransforms) | 1550 .absoluteToLocalQuad(FloatQuad(FloatRect(rect)), UseTransforms) |
| 1555 .boundingBox()); | 1551 .boundingBox()); |
| 1556 localExposeRect.move(-box().borderLeft(), -box().borderTop()); | 1552 localExposeRect.move(-box().borderLeft(), -box().borderTop()); |
| 1557 LayoutRect layerBounds(LayoutPoint(), | 1553 LayoutRect layerBounds(LayoutPoint(), |
| 1558 LayoutSize(box().clientWidth(), box().clientHeight())); | 1554 LayoutSize(box().clientWidth(), box().clientHeight())); |
| 1559 LayoutRect r = ScrollAlignment::getRectToExpose(layerBounds, localExposeRect, | 1555 LayoutRect r = ScrollAlignment::getRectToExpose(layerBounds, localExposeRect, |
| 1560 alignX, alignY); | 1556 alignX, alignY); |
| 1561 | 1557 |
| 1562 DoublePoint oldScrollPosition = scrollPositionDouble(); | 1558 ScrollOffset oldScrollOffset = scrollOffset(); |
| 1563 DoublePoint newScrollPosition = | 1559 ScrollOffset newScrollOffset(clampScrollOffset(roundedIntSize( |
| 1564 clampScrollPosition(oldScrollPosition + roundedIntSize(r.location())); | 1560 toScrollOffset(FloatPoint(r.location()) + oldScrollOffset)))); |
| 1565 if (newScrollPosition == oldScrollPosition) | 1561 |
| 1562 if (newScrollOffset == oldScrollOffset) |
| 1566 return LayoutRect( | 1563 return LayoutRect( |
| 1567 box() | 1564 box() |
| 1568 .localToAbsoluteQuad(FloatQuad(FloatRect(intersection( | 1565 .localToAbsoluteQuad(FloatQuad(FloatRect(intersection( |
| 1569 layerBounds, localExposeRect))), | 1566 layerBounds, localExposeRect))), |
| 1570 UseTransforms) | 1567 UseTransforms) |
| 1571 .boundingBox()); | 1568 .boundingBox()); |
| 1572 | 1569 |
| 1573 setScrollPosition(newScrollPosition, scrollType, ScrollBehaviorInstant); | 1570 setScrollOffset(newScrollOffset, scrollType, ScrollBehaviorInstant); |
| 1574 DoubleSize scrollOffsetDifference = | 1571 ScrollOffset scrollOffsetDifference = scrollOffset() - oldScrollOffset; |
| 1575 scrollPositionDouble() - oldScrollPosition; | |
| 1576 localExposeRect.move(-LayoutSize(scrollOffsetDifference)); | 1572 localExposeRect.move(-LayoutSize(scrollOffsetDifference)); |
| 1577 return LayoutRect( | 1573 return LayoutRect( |
| 1578 box() | 1574 box() |
| 1579 .localToAbsoluteQuad( | 1575 .localToAbsoluteQuad( |
| 1580 FloatQuad(FloatRect(intersection(layerBounds, localExposeRect))), | 1576 FloatQuad(FloatRect(intersection(layerBounds, localExposeRect))), |
| 1581 UseTransforms) | 1577 UseTransforms) |
| 1582 .boundingBox()); | 1578 .boundingBox()); |
| 1583 } | 1579 } |
| 1584 | 1580 |
| 1585 void PaintLayerScrollableArea::updateScrollableAreaSet(bool hasOverflow) { | 1581 void PaintLayerScrollableArea::updateScrollableAreaSet(bool hasOverflow) { |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1758 if (!m_hBar) { | 1754 if (!m_hBar) { |
| 1759 m_hBar = createScrollbar(HorizontalScrollbar); | 1755 m_hBar = createScrollbar(HorizontalScrollbar); |
| 1760 m_hBarIsAttached = 1; | 1756 m_hBarIsAttached = 1; |
| 1761 if (!m_hBar->isCustomScrollbar()) | 1757 if (!m_hBar->isCustomScrollbar()) |
| 1762 m_scrollableArea->didAddScrollbar(*m_hBar, HorizontalScrollbar); | 1758 m_scrollableArea->didAddScrollbar(*m_hBar, HorizontalScrollbar); |
| 1763 } else { | 1759 } else { |
| 1764 m_hBarIsAttached = 1; | 1760 m_hBarIsAttached = 1; |
| 1765 } | 1761 } |
| 1766 } else { | 1762 } else { |
| 1767 m_hBarIsAttached = 0; | 1763 m_hBarIsAttached = 0; |
| 1768 if (!DelayScrollPositionClampScope::clampingIsDelayed()) | 1764 if (!DelayScrollOffsetClampScope::clampingIsDelayed()) |
| 1769 destroyScrollbar(HorizontalScrollbar); | 1765 destroyScrollbar(HorizontalScrollbar); |
| 1770 } | 1766 } |
| 1771 } | 1767 } |
| 1772 | 1768 |
| 1773 void PaintLayerScrollableArea::ScrollbarManager::setHasVerticalScrollbar( | 1769 void PaintLayerScrollableArea::ScrollbarManager::setHasVerticalScrollbar( |
| 1774 bool hasScrollbar) { | 1770 bool hasScrollbar) { |
| 1775 if (hasScrollbar) { | 1771 if (hasScrollbar) { |
| 1776 DisableCompositingQueryAsserts disabler; | 1772 DisableCompositingQueryAsserts disabler; |
| 1777 if (!m_vBar) { | 1773 if (!m_vBar) { |
| 1778 m_vBar = createScrollbar(VerticalScrollbar); | 1774 m_vBar = createScrollbar(VerticalScrollbar); |
| 1779 m_vBarIsAttached = 1; | 1775 m_vBarIsAttached = 1; |
| 1780 if (!m_vBar->isCustomScrollbar()) | 1776 if (!m_vBar->isCustomScrollbar()) |
| 1781 m_scrollableArea->didAddScrollbar(*m_vBar, VerticalScrollbar); | 1777 m_scrollableArea->didAddScrollbar(*m_vBar, VerticalScrollbar); |
| 1782 } else { | 1778 } else { |
| 1783 m_vBarIsAttached = 1; | 1779 m_vBarIsAttached = 1; |
| 1784 } | 1780 } |
| 1785 } else { | 1781 } else { |
| 1786 m_vBarIsAttached = 0; | 1782 m_vBarIsAttached = 0; |
| 1787 if (!DelayScrollPositionClampScope::clampingIsDelayed()) | 1783 if (!DelayScrollOffsetClampScope::clampingIsDelayed()) |
| 1788 destroyScrollbar(VerticalScrollbar); | 1784 destroyScrollbar(VerticalScrollbar); |
| 1789 } | 1785 } |
| 1790 } | 1786 } |
| 1791 | 1787 |
| 1792 Scrollbar* PaintLayerScrollableArea::ScrollbarManager::createScrollbar( | 1788 Scrollbar* PaintLayerScrollableArea::ScrollbarManager::createScrollbar( |
| 1793 ScrollbarOrientation orientation) { | 1789 ScrollbarOrientation orientation) { |
| 1794 ASSERT(orientation == HorizontalScrollbar ? !m_hBarIsAttached | 1790 ASSERT(orientation == HorizontalScrollbar ? !m_hBarIsAttached |
| 1795 : !m_vBarIsAttached); | 1791 : !m_vBarIsAttached); |
| 1796 Scrollbar* scrollbar = nullptr; | 1792 Scrollbar* scrollbar = nullptr; |
| 1797 const LayoutObject& actualLayoutObject = | 1793 const LayoutObject& actualLayoutObject = |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1914 } | 1910 } |
| 1915 | 1911 |
| 1916 void PaintLayerScrollableArea::PreventRelayoutScope::resetRelayoutNeeded() { | 1912 void PaintLayerScrollableArea::PreventRelayoutScope::resetRelayoutNeeded() { |
| 1917 DCHECK_EQ(s_count, 0); | 1913 DCHECK_EQ(s_count, 0); |
| 1918 DCHECK(!s_needsRelayout || s_needsRelayout->isEmpty()); | 1914 DCHECK(!s_needsRelayout || s_needsRelayout->isEmpty()); |
| 1919 s_relayoutNeeded = false; | 1915 s_relayoutNeeded = false; |
| 1920 } | 1916 } |
| 1921 | 1917 |
| 1922 int PaintLayerScrollableArea::FreezeScrollbarsScope::s_count = 0; | 1918 int PaintLayerScrollableArea::FreezeScrollbarsScope::s_count = 0; |
| 1923 | 1919 |
| 1924 int PaintLayerScrollableArea::DelayScrollPositionClampScope::s_count = 0; | 1920 int PaintLayerScrollableArea::DelayScrollOffsetClampScope::s_count = 0; |
| 1925 PersistentHeapVector<Member<PaintLayerScrollableArea>>* | 1921 PersistentHeapVector<Member<PaintLayerScrollableArea>>* |
| 1926 PaintLayerScrollableArea::DelayScrollPositionClampScope::s_needsClamp = | 1922 PaintLayerScrollableArea::DelayScrollOffsetClampScope::s_needsClamp = |
| 1927 nullptr; | 1923 nullptr; |
| 1928 | 1924 |
| 1929 PaintLayerScrollableArea::DelayScrollPositionClampScope:: | 1925 PaintLayerScrollableArea::DelayScrollOffsetClampScope:: |
| 1930 DelayScrollPositionClampScope() { | 1926 DelayScrollOffsetClampScope() { |
| 1931 if (!s_needsClamp) | 1927 if (!s_needsClamp) |
| 1932 s_needsClamp = new PersistentHeapVector<Member<PaintLayerScrollableArea>>(); | 1928 s_needsClamp = new PersistentHeapVector<Member<PaintLayerScrollableArea>>(); |
| 1933 DCHECK(s_count > 0 || s_needsClamp->isEmpty()); | 1929 DCHECK(s_count > 0 || s_needsClamp->isEmpty()); |
| 1934 s_count++; | 1930 s_count++; |
| 1935 } | 1931 } |
| 1936 | 1932 |
| 1937 PaintLayerScrollableArea::DelayScrollPositionClampScope:: | 1933 PaintLayerScrollableArea::DelayScrollOffsetClampScope:: |
| 1938 ~DelayScrollPositionClampScope() { | 1934 ~DelayScrollOffsetClampScope() { |
| 1939 if (--s_count == 0) | 1935 if (--s_count == 0) |
| 1940 DelayScrollPositionClampScope::clampScrollableAreas(); | 1936 DelayScrollOffsetClampScope::clampScrollableAreas(); |
| 1941 } | 1937 } |
| 1942 | 1938 |
| 1943 void PaintLayerScrollableArea::DelayScrollPositionClampScope::setNeedsClamp( | 1939 void PaintLayerScrollableArea::DelayScrollOffsetClampScope::setNeedsClamp( |
| 1944 PaintLayerScrollableArea* scrollableArea) { | 1940 PaintLayerScrollableArea* scrollableArea) { |
| 1945 if (!scrollableArea->needsScrollPositionClamp()) { | 1941 if (!scrollableArea->needsScrollOffsetClamp()) { |
| 1946 scrollableArea->setNeedsScrollPositionClamp(true); | 1942 scrollableArea->setNeedsScrollOffsetClamp(true); |
| 1947 s_needsClamp->append(scrollableArea); | 1943 s_needsClamp->append(scrollableArea); |
| 1948 } | 1944 } |
| 1949 } | 1945 } |
| 1950 | 1946 |
| 1951 void PaintLayerScrollableArea::DelayScrollPositionClampScope:: | 1947 void PaintLayerScrollableArea::DelayScrollOffsetClampScope:: |
| 1952 clampScrollableAreas() { | 1948 clampScrollableAreas() { |
| 1953 for (auto& scrollableArea : *s_needsClamp) | 1949 for (auto& scrollableArea : *s_needsClamp) |
| 1954 scrollableArea->clampScrollPositionsAfterLayout(); | 1950 scrollableArea->clampScrollOffsetsAfterLayout(); |
| 1955 delete s_needsClamp; | 1951 delete s_needsClamp; |
| 1956 s_needsClamp = nullptr; | 1952 s_needsClamp = nullptr; |
| 1957 } | 1953 } |
| 1958 | 1954 |
| 1959 } // namespace blink | 1955 } // namespace blink |
| OLD | NEW |