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

Side by Side Diff: third_party/WebKit/Source/core/frame/FrameView.cpp

Issue 2404393003: Tie scroll anchoring adjustments to frame lifecycle instead of layout. (Closed)
Patch Set: add DCHECK Created 4 years, 1 month 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) 1998, 1999 Torben Weis <weis@kde.org> 2 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org>
3 * 1999 Lars Knoll <knoll@kde.org> 3 * 1999 Lars Knoll <knoll@kde.org>
4 * 1999 Antti Koivisto <koivisto@kde.org> 4 * 1999 Antti Koivisto <koivisto@kde.org>
5 * 2000 Dirk Mueller <mueller@kde.org> 5 * 2000 Dirk Mueller <mueller@kde.org>
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
7 * (C) 2006 Graham Dennis (graham.dennis@gmail.com) 7 * (C) 2006 Graham Dennis (graham.dennis@gmail.com)
8 * (C) 2006 Alexey Proskuryakov (ap@nypop.com) 8 * (C) 2006 Alexey Proskuryakov (ap@nypop.com)
9 * Copyright (C) 2009 Google Inc. All rights reserved. 9 * Copyright (C) 2009 Google Inc. All rights reserved.
10 * 10 *
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 216
217 DEFINE_TRACE(FrameView) { 217 DEFINE_TRACE(FrameView) {
218 visitor->trace(m_frame); 218 visitor->trace(m_frame);
219 visitor->trace(m_fragmentAnchor); 219 visitor->trace(m_fragmentAnchor);
220 visitor->trace(m_scrollableAreas); 220 visitor->trace(m_scrollableAreas);
221 visitor->trace(m_animatingScrollableAreas); 221 visitor->trace(m_animatingScrollableAreas);
222 visitor->trace(m_autoSizeInfo); 222 visitor->trace(m_autoSizeInfo);
223 visitor->trace(m_children); 223 visitor->trace(m_children);
224 visitor->trace(m_viewportScrollableArea); 224 visitor->trace(m_viewportScrollableArea);
225 visitor->trace(m_scrollAnchor); 225 visitor->trace(m_scrollAnchor);
226 visitor->trace(m_anchoringAdjustmentQueue);
226 visitor->trace(m_scrollbarManager); 227 visitor->trace(m_scrollbarManager);
227 Widget::trace(visitor); 228 Widget::trace(visitor);
228 ScrollableArea::trace(visitor); 229 ScrollableArea::trace(visitor);
229 } 230 }
230 231
231 void FrameView::reset() { 232 void FrameView::reset() {
232 m_hasPendingLayout = false; 233 m_hasPendingLayout = false;
233 m_layoutSchedulingEnabled = true; 234 m_layoutSchedulingEnabled = true;
234 m_inSynchronousPostLayout = false; 235 m_inSynchronousPostLayout = false;
235 m_layoutCount = 0; 236 m_layoutCount = 0;
(...skipping 666 matching lines...) Expand 10 before | Expand all | Expand 10 after
902 document->styleResolver()->mediaQueryAffectedByDeviceChange())) { 903 document->styleResolver()->mediaQueryAffectedByDeviceChange())) {
903 document->mediaQueryAffectingValueChanged(); 904 document->mediaQueryAffectingValueChanged();
904 } else if (wasResized) { 905 } else if (wasResized) {
905 document->evaluateMediaQueryList(); 906 document->evaluateMediaQueryList();
906 } 907 }
907 908
908 document->updateStyleAndLayoutTree(); 909 document->updateStyleAndLayoutTree();
909 lifecycle().advanceTo(DocumentLifecycle::StyleClean); 910 lifecycle().advanceTo(DocumentLifecycle::StyleClean);
910 911
911 if (shouldPerformScrollAnchoring()) 912 if (shouldPerformScrollAnchoring())
912 m_scrollAnchor.save(); 913 m_scrollAnchor.notifyBeforeLayout();
913 } 914 }
914 915
915 bool FrameView::shouldPerformScrollAnchoring() const { 916 bool FrameView::shouldPerformScrollAnchoring() const {
916 return RuntimeEnabledFeatures::scrollAnchoringEnabled() && 917 return RuntimeEnabledFeatures::scrollAnchoringEnabled() &&
917 !RuntimeEnabledFeatures::rootLayerScrollingEnabled() && 918 !RuntimeEnabledFeatures::rootLayerScrollingEnabled() &&
918 m_scrollAnchor.hasScroller() && 919 m_scrollAnchor.hasScroller() &&
919 layoutBox()->style()->overflowAnchor() != AnchorNone && 920 layoutBox()->style()->overflowAnchor() != AnchorNone &&
920 !m_frame->document()->finishingOrIsPrinting(); 921 !m_frame->document()->finishingOrIsPrinting();
921 } 922 }
922 923
(...skipping 1356 matching lines...) Expand 10 before | Expand all | Expand 10 after
2279 // Plugins could have torn down the page inside updateWidgetGeometries(). 2280 // Plugins could have torn down the page inside updateWidgetGeometries().
2280 if (layoutViewItem().isNull()) 2281 if (layoutViewItem().isNull())
2281 return; 2282 return;
2282 2283
2283 scheduleUpdateWidgetsIfNecessary(); 2284 scheduleUpdateWidgetsIfNecessary();
2284 2285
2285 if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator()) 2286 if (ScrollingCoordinator* scrollingCoordinator = this->scrollingCoordinator())
2286 scrollingCoordinator->notifyGeometryChanged(); 2287 scrollingCoordinator->notifyGeometryChanged();
2287 2288
2288 scrollToFragmentAnchor(); 2289 scrollToFragmentAnchor();
2289 // TODO(skobes): Figure out interactions between scroll anchor, fragment
2290 // anchor, and history restoration.
2291 if (shouldPerformScrollAnchoring())
2292 m_scrollAnchor.restore();
2293
2294 sendResizeEventIfNeeded(); 2290 sendResizeEventIfNeeded();
2295 } 2291 }
2296 2292
2297 bool FrameView::wasViewportResized() { 2293 bool FrameView::wasViewportResized() {
2298 ASSERT(m_frame); 2294 ASSERT(m_frame);
2299 LayoutViewItem layoutViewItem = this->layoutViewItem(); 2295 LayoutViewItem layoutViewItem = this->layoutViewItem();
2300 if (layoutViewItem.isNull()) 2296 if (layoutViewItem.isNull())
2301 return false; 2297 return false;
2302 ASSERT(layoutViewItem.style()); 2298 ASSERT(layoutViewItem.style());
2303 return (layoutSize(IncludeScrollbars) != m_lastViewportSize || 2299 return (layoutSize(IncludeScrollbars) != m_lastViewportSize ||
(...skipping 406 matching lines...) Expand 10 before | Expand all | Expand 10 after
2710 } 2706 }
2711 2707
2712 updateStyleAndLayoutIfNeededRecursive(); 2708 updateStyleAndLayoutIfNeededRecursive();
2713 DCHECK(lifecycle().state() >= DocumentLifecycle::LayoutClean); 2709 DCHECK(lifecycle().state() >= DocumentLifecycle::LayoutClean);
2714 2710
2715 if (targetState == DocumentLifecycle::LayoutClean) { 2711 if (targetState == DocumentLifecycle::LayoutClean) {
2716 updateViewportIntersectionsForSubtree(targetState); 2712 updateViewportIntersectionsForSubtree(targetState);
2717 return; 2713 return;
2718 } 2714 }
2719 2715
2716 forAllNonThrottledFrameViews([](FrameView& frameView) {
2717 frameView.performScrollAnchoringAdjustments();
2718 });
2719
2720 if (targetState == DocumentLifecycle::PaintClean) { 2720 if (targetState == DocumentLifecycle::PaintClean) {
2721 forAllNonThrottledFrameViews( 2721 forAllNonThrottledFrameViews(
2722 [](FrameView& frameView) { frameView.notifyResizeObservers(); }); 2722 [](FrameView& frameView) { frameView.notifyResizeObservers(); });
2723 } 2723 }
2724 2724
2725 if (LayoutViewItem view = layoutViewItem()) { 2725 if (LayoutViewItem view = layoutViewItem()) {
2726 forAllNonThrottledFrameViews([](FrameView& frameView) { 2726 forAllNonThrottledFrameViews([](FrameView& frameView) {
2727 frameView.checkDoesNotNeedLayout(); 2727 frameView.checkDoesNotNeedLayout();
2728 frameView.m_allowsLayoutInvalidationAfterLayoutClean = false; 2728 frameView.m_allowsLayoutInvalidationAfterLayoutClean = false;
2729 }); 2729 });
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
2777 2777
2778 forAllNonThrottledFrameViews([](FrameView& frameView) { 2778 forAllNonThrottledFrameViews([](FrameView& frameView) {
2779 frameView.checkDoesNotNeedLayout(); 2779 frameView.checkDoesNotNeedLayout();
2780 frameView.m_allowsLayoutInvalidationAfterLayoutClean = true; 2780 frameView.m_allowsLayoutInvalidationAfterLayoutClean = true;
2781 }); 2781 });
2782 } 2782 }
2783 2783
2784 updateViewportIntersectionsForSubtree(targetState); 2784 updateViewportIntersectionsForSubtree(targetState);
2785 } 2785 }
2786 2786
2787 void FrameView::enqueueScrollAnchoringAdjustment(
2788 ScrollableArea* scrollableArea) {
2789 m_anchoringAdjustmentQueue.add(scrollableArea);
2790 }
2791
2792 void FrameView::performScrollAnchoringAdjustments() {
2793 for (WeakMember<ScrollableArea>& scroller : m_anchoringAdjustmentQueue) {
2794 if (scroller) {
2795 DCHECK(scroller->scrollAnchor());
2796 scroller->scrollAnchor()->adjust();
2797 }
2798 }
2799 m_anchoringAdjustmentQueue.clear();
2800 }
2801
2787 void FrameView::updatePaintProperties() { 2802 void FrameView::updatePaintProperties() {
2788 TRACE_EVENT0("blink", "FrameView::updatePaintProperties"); 2803 TRACE_EVENT0("blink", "FrameView::updatePaintProperties");
2789 2804
2790 if (!m_paintController) 2805 if (!m_paintController)
2791 m_paintController = PaintController::create(); 2806 m_paintController = PaintController::create();
2792 2807
2793 forAllNonThrottledFrameViews([](FrameView& frameView) { 2808 forAllNonThrottledFrameViews([](FrameView& frameView) {
2794 frameView.lifecycle().advanceTo(DocumentLifecycle::InPrePaint); 2809 frameView.lifecycle().advanceTo(DocumentLifecycle::InPrePaint);
2795 }); 2810 });
2796 2811
(...skipping 826 matching lines...) Expand 10 before | Expand all | Expand 10 after
3623 cache->handleScrollPositionChanged(this); 3638 cache->handleScrollPositionChanged(this);
3624 3639
3625 frame().loader().saveScrollState(); 3640 frame().loader().saveScrollState();
3626 didChangeScrollOffset(); 3641 didChangeScrollOffset();
3627 3642
3628 if (scrollType == CompositorScroll && m_frame->isMainFrame()) { 3643 if (scrollType == CompositorScroll && m_frame->isMainFrame()) {
3629 if (DocumentLoader* documentLoader = m_frame->loader().documentLoader()) 3644 if (DocumentLoader* documentLoader = m_frame->loader().documentLoader())
3630 documentLoader->initialScrollState().wasScrolledByUser = true; 3645 documentLoader->initialScrollState().wasScrolledByUser = true;
3631 } 3646 }
3632 3647
3633 if (scrollType != AnchoringScroll) 3648 if (scrollType != AnchoringScroll && scrollType != ClampingScroll)
3634 clearScrollAnchor(); 3649 clearScrollAnchor();
3635 } 3650 }
3636 3651
3637 void FrameView::didChangeScrollOffset() { 3652 void FrameView::didChangeScrollOffset() {
3638 frame().loader().client()->didChangeScrollOffset(); 3653 frame().loader().client()->didChangeScrollOffset();
3639 if (frame().isMainFrame()) 3654 if (frame().isMainFrame())
3640 frame().host()->chromeClient().mainFrameScrollOffsetChanged(); 3655 frame().host()->chromeClient().mainFrameScrollOffsetChanged();
3641 } 3656 }
3642 3657
3643 void FrameView::clearScrollAnchor() { 3658 void FrameView::clearScrollAnchor() {
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after
3851 frameRectsChanged(); 3866 frameRectsChanged();
3852 positionScrollbarLayers(); 3867 positionScrollbarLayers();
3853 updateScrollCorner(); 3868 updateScrollCorner();
3854 } 3869 }
3855 3870
3856 adjustScrollOffsetFromUpdateScrollbars(); 3871 adjustScrollOffsetFromUpdateScrollbars();
3857 } 3872 }
3858 3873
3859 void FrameView::adjustScrollOffsetFromUpdateScrollbars() { 3874 void FrameView::adjustScrollOffsetFromUpdateScrollbars() {
3860 ScrollOffset clamped = clampScrollOffset(scrollOffset()); 3875 ScrollOffset clamped = clampScrollOffset(scrollOffset());
3861 // Restore before clamping because clamping clears the scroll anchor.
3862 // TODO(ymalik): This same logic exists in PaintLayerScrollableArea.
3863 // Remove when root-layer-scrolls is enabled.
3864 if (clamped != scrollOffset() && shouldPerformScrollAnchoring()) {
3865 m_scrollAnchor.restore();
3866 clamped = clampScrollOffset(scrollOffset());
3867 }
3868 if (clamped != scrollOffset() || scrollOriginChanged()) { 3876 if (clamped != scrollOffset() || scrollOriginChanged()) {
3869 ScrollableArea::setScrollOffset(clamped, ProgrammaticScroll); 3877 ScrollableArea::setScrollOffset(clamped, ClampingScroll);
3870 resetScrollOriginChanged(); 3878 resetScrollOriginChanged();
3871 } 3879 }
3872 } 3880 }
3873 3881
3874 void FrameView::scrollContentsIfNeeded() { 3882 void FrameView::scrollContentsIfNeeded() {
3875 if (m_pendingScrollDelta.isZero()) 3883 if (m_pendingScrollDelta.isZero())
3876 return; 3884 return;
3877 ScrollOffset scrollDelta = m_pendingScrollDelta; 3885 ScrollOffset scrollDelta = m_pendingScrollDelta;
3878 m_pendingScrollDelta = ScrollOffset(); 3886 m_pendingScrollDelta = ScrollOffset();
3879 // FIXME: Change scrollContents() to take DoubleSize. crbug.com/414283. 3887 // FIXME: Change scrollContents() to take DoubleSize. crbug.com/414283.
(...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after
4530 DCHECK(m_frame->isMainFrame()); 4538 DCHECK(m_frame->isMainFrame());
4531 return m_initialViewportSize.width(); 4539 return m_initialViewportSize.width();
4532 } 4540 }
4533 4541
4534 int FrameView::initialViewportHeight() const { 4542 int FrameView::initialViewportHeight() const {
4535 DCHECK(m_frame->isMainFrame()); 4543 DCHECK(m_frame->isMainFrame());
4536 return m_initialViewportSize.height(); 4544 return m_initialViewportSize.height();
4537 } 4545 }
4538 4546
4539 } // namespace blink 4547 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/frame/FrameView.h ('k') | third_party/WebKit/Source/core/layout/LayoutBlock.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698