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

Side by Side Diff: third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.cpp

Issue 1308273010: Adapt and reland old position sticky implementation (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Make sticky vertical ref tests expectations not dependent on font size. Created 4 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) 2011 Apple Inc. All rights reserved. 2 * Copyright (C) 2011 Apple Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 918 matching lines...) Expand 10 before | Expand all | Expand 10 after
929 #endif 929 #endif
930 930
931 bool ScrollingCoordinator::hasVisibleSlowRepaintViewportConstrainedObjects(Frame View* frameView) const 931 bool ScrollingCoordinator::hasVisibleSlowRepaintViewportConstrainedObjects(Frame View* frameView) const
932 { 932 {
933 const FrameView::ViewportConstrainedObjectSet* viewportConstrainedObjects = frameView->viewportConstrainedObjects(); 933 const FrameView::ViewportConstrainedObjectSet* viewportConstrainedObjects = frameView->viewportConstrainedObjects();
934 if (!viewportConstrainedObjects) 934 if (!viewportConstrainedObjects)
935 return false; 935 return false;
936 936
937 for (const LayoutObject* layoutObject : *viewportConstrainedObjects) { 937 for (const LayoutObject* layoutObject : *viewportConstrainedObjects) {
938 ASSERT(layoutObject->isBoxModelObject() && layoutObject->hasLayer()); 938 ASSERT(layoutObject->isBoxModelObject() && layoutObject->hasLayer());
939 ASSERT(layoutObject->style()->position() == FixedPosition); 939 ASSERT(layoutObject->style()->position() == FixedPosition
940 || layoutObject->style()->position() == StickyPosition);
940 PaintLayer* layer = toLayoutBoxModelObject(layoutObject)->layer(); 941 PaintLayer* layer = toLayoutBoxModelObject(layoutObject)->layer();
941 942
942 // Whether the Layer scrolls with the viewport is a tree-depenent 943 // Whether the Layer scrolls with the viewport is a tree-depenent
943 // property and our viewportConstrainedObjects collection is maintained 944 // property and our viewportConstrainedObjects collection is maintained
944 // with only LayoutObject-level information. 945 // with only LayoutObject-level information.
945 if (!layer->scrollsWithViewport()) 946 if (!layer->scrollsWithViewport())
946 continue; 947 continue;
947 948
948 // If the whole subtree is invisible, there's no reason to scroll on 949 // If the whole subtree is invisible, there's no reason to scroll on
949 // the main thread because we don't need to generate invalidations 950 // the main thread because we don't need to generate invalidations
(...skipping 28 matching lines...) Expand all
978 for (Frame* frame = m_page->mainFrame(); frame; frame = frame->tree().traver seNext()) { 979 for (Frame* frame = m_page->mainFrame(); frame; frame = frame->tree().traver seNext()) {
979 if (!frame->isLocalFrame()) 980 if (!frame->isLocalFrame())
980 continue; 981 continue;
981 982
982 FrameView* frameView = toLocalFrame(frame)->view(); 983 FrameView* frameView = toLocalFrame(frame)->view();
983 if (!frameView) 984 if (!frameView)
984 continue; 985 continue;
985 986
986 if (frameView->hasBackgroundAttachmentFixedObjects()) 987 if (frameView->hasBackgroundAttachmentFixedObjects())
987 reasons |= MainThreadScrollingReason::kHasBackgroundAttachmentFixedO bjects; 988 reasons |= MainThreadScrollingReason::kHasBackgroundAttachmentFixedO bjects;
989 if (frameView->hasStickyPositionObjects())
990 reasons |= MainThreadScrollingReason::kHasStickyPositionObjects;
988 FrameView::ScrollingReasons scrollingReasons = frameView->getScrollingRe asons(); 991 FrameView::ScrollingReasons scrollingReasons = frameView->getScrollingRe asons();
989 const bool mayBeScrolledByInput = (scrollingReasons == FrameView::Scroll able); 992 const bool mayBeScrolledByInput = (scrollingReasons == FrameView::Scroll able);
990 const bool mayBeScrolledByScript = mayBeScrolledByInput || (scrollingRea sons == 993 const bool mayBeScrolledByScript = mayBeScrolledByInput || (scrollingRea sons ==
991 FrameView::NotScrollableExplicitlyDisabled); 994 FrameView::NotScrollableExplicitlyDisabled);
992 995
993 // TODO(awoloszyn) Currently crbug.com/304810 will let certain 996 // TODO(awoloszyn) Currently crbug.com/304810 will let certain
994 // overflow:hidden elements scroll on the compositor thread, so we shoul d 997 // overflow:hidden elements scroll on the compositor thread, so we shoul d
995 // not let this move there path as an optimization, when we have slow-re paint 998 // not let this move there path as an optimization, when we have slow-re paint
996 // elements. 999 // elements.
997 if (mayBeScrolledByScript && hasVisibleSlowRepaintViewportConstrainedObj ects(frameView)) { 1000 if (mayBeScrolledByScript && hasVisibleSlowRepaintViewportConstrainedObj ects(frameView)) {
998 reasons |= MainThreadScrollingReason::kHasNonLayerViewportConstraine dObjects; 1001 reasons |= MainThreadScrollingReason::kHasNonLayerViewportConstraine dObjects;
999 } 1002 }
1000 } 1003 }
1001 1004
1002 return reasons; 1005 return reasons;
1003 } 1006 }
1004 1007
1005 String ScrollingCoordinator::mainThreadScrollingReasonsAsText(MainThreadScrollin gReasons reasons) 1008 String ScrollingCoordinator::mainThreadScrollingReasonsAsText(MainThreadScrollin gReasons reasons)
1006 { 1009 {
1007 StringBuilder stringBuilder; 1010 StringBuilder stringBuilder;
1008 1011
1009 if (reasons & MainThreadScrollingReason::kHasBackgroundAttachmentFixedObject s) 1012 if (reasons & MainThreadScrollingReason::kHasBackgroundAttachmentFixedObject s)
1010 stringBuilder.appendLiteral("Has background-attachment:fixed, "); 1013 stringBuilder.appendLiteral("Has background-attachment:fixed, ");
1011 if (reasons & MainThreadScrollingReason::kHasNonLayerViewportConstrainedObje cts) 1014 if (reasons & MainThreadScrollingReason::kHasNonLayerViewportConstrainedObje cts)
1012 stringBuilder.appendLiteral("Has non-layer viewport-constrained objects, "); 1015 stringBuilder.appendLiteral("Has non-layer viewport-constrained objects, ");
1016 if (reasons & MainThreadScrollingReason::kHasStickyPositionObjects)
1017 stringBuilder.appendLiteral("Has sticky position objects, ");
1013 if (reasons & MainThreadScrollingReason::kThreadedScrollingDisabled) 1018 if (reasons & MainThreadScrollingReason::kThreadedScrollingDisabled)
1014 stringBuilder.appendLiteral("Threaded scrolling is disabled, "); 1019 stringBuilder.appendLiteral("Threaded scrolling is disabled, ");
1015 if (reasons & MainThreadScrollingReason::kAnimatingScrollOnMainThread) 1020 if (reasons & MainThreadScrollingReason::kAnimatingScrollOnMainThread)
1016 stringBuilder.appendLiteral("Animating scroll on main thread, "); 1021 stringBuilder.appendLiteral("Animating scroll on main thread, ");
1017 1022
1018 if (stringBuilder.length()) 1023 if (stringBuilder.length())
1019 stringBuilder.resize(stringBuilder.length() - 2); 1024 stringBuilder.resize(stringBuilder.length() - 2);
1020 return stringBuilder.toString(); 1025 return stringBuilder.toString();
1021 } 1026 }
1022 1027
(...skipping 12 matching lines...) Expand all
1035 bool frameIsScrollable = frameView && frameView->isScrollable(); 1040 bool frameIsScrollable = frameView && frameView->isScrollable();
1036 if (frameIsScrollable != m_wasFrameScrollable) 1041 if (frameIsScrollable != m_wasFrameScrollable)
1037 return true; 1042 return true;
1038 1043
1039 if (WebLayer* scrollLayer = frameView ? toWebLayer(frameView->layerForScroll ing()) : nullptr) 1044 if (WebLayer* scrollLayer = frameView ? toWebLayer(frameView->layerForScroll ing()) : nullptr)
1040 return WebSize(frameView->contentsSize()) != scrollLayer->bounds(); 1045 return WebSize(frameView->contentsSize()) != scrollLayer->bounds();
1041 return false; 1046 return false;
1042 } 1047 }
1043 1048
1044 } // namespace blink 1049 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698