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

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

Issue 2531603003: Only scroll on main if the targeted frames need to scroll on main (Closed)
Patch Set: Resolve conflict Created 4 years 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.cpp
diff --git a/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.cpp b/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.cpp
index 126c7e1df78494e91d952b882db88a6f2079a263..3b603c804ab20e34430fe9932cad7dfc2c349316 100644
--- a/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.cpp
+++ b/third_party/WebKit/Source/core/page/scrolling/ScrollingCoordinator.cpp
@@ -186,12 +186,17 @@ void ScrollingCoordinator::updateAfterCompositingChangeIfNeeded() {
m_touchEventTargetRectsAreDirty = false;
}
- FrameView* frameView = m_page->deprecatedLocalMainFrame()->view();
+ FrameView* frameView = toLocalFrame(m_page->mainFrame())->view();
bool frameIsScrollable = frameView && frameView->isScrollable();
if (m_shouldScrollOnMainThreadDirty ||
m_wasFrameScrollable != frameIsScrollable) {
setShouldUpdateScrollLayerPositionOnMainThread(
- mainThreadScrollingReasons());
+ frameView->mainThreadScrollingReasons());
+
+ // Need to update scroll on main thread reasons for subframe because
+ // subframe (e.g. iframe with background-attachment:fixed) should
+ // scroll on main thread while the main frame scrolls on impl.
+ frameView->updateSubFrameScrollOnMainReason(*(m_page->mainFrame()), 0);
m_shouldScrollOnMainThreadDirty = false;
}
m_wasFrameScrollable = frameIsScrollable;
@@ -1099,115 +1104,6 @@ void ScrollingCoordinator::frameViewRootLayerDidChange(FrameView* frameView) {
notifyGeometryChanged();
}
-bool ScrollingCoordinator::hasVisibleSlowRepaintViewportConstrainedObjects(
- FrameView* frameView) const {
- const FrameView::ViewportConstrainedObjectSet* viewportConstrainedObjects =
- frameView->viewportConstrainedObjects();
- if (!viewportConstrainedObjects)
- return false;
-
- for (const LayoutObject* layoutObject : *viewportConstrainedObjects) {
- DCHECK(layoutObject->isBoxModelObject() && layoutObject->hasLayer());
- DCHECK(layoutObject->style()->position() == FixedPosition ||
- layoutObject->style()->position() == StickyPosition);
- PaintLayer* layer = toLayoutBoxModelObject(layoutObject)->layer();
-
- // Whether the Layer sticks to the viewport is a tree-depenent
- // property and our viewportConstrainedObjects collection is maintained
- // with only LayoutObject-level information.
- if (!layer->sticksToViewport())
- continue;
-
- // If the whole subtree is invisible, there's no reason to scroll on
- // the main thread because we don't need to generate invalidations
- // for invisible content.
- if (layer->subtreeIsInvisible())
- continue;
-
- // We're only smart enough to scroll viewport-constrainted objects
- // in the compositor if they have their own backing or they paint
- // into a grouped back (which necessarily all have the same viewport
- // constraints).
- CompositingState compositingState = layer->compositingState();
- if (compositingState != PaintsIntoOwnBacking &&
- compositingState != PaintsIntoGroupedBacking)
- return true;
- }
- return false;
-}
-
-MainThreadScrollingReasons ScrollingCoordinator::mainThreadScrollingReasons()
- const {
- MainThreadScrollingReasons reasons =
- static_cast<MainThreadScrollingReasons>(0);
-
- if (!m_page->settings().threadedScrollingEnabled())
- reasons |= MainThreadScrollingReason::kThreadedScrollingDisabled;
-
- if (!m_page->mainFrame()->isLocalFrame())
- return reasons;
-
- // TODO(flackr) Currently we combine reasons for main thread scrolling from
- // all frames but we should only look at the targetted frame (and its
- // ancestors if the scroll bubbles up). http://crbug.com/568901
- for (Frame* frame = m_page->mainFrame(); frame;
- frame = frame->tree().traverseNext()) {
- if (!frame->isLocalFrame())
- continue;
-
- // TODO(alexmos,kenrb): For OOPIF, local roots that are different from
- // the main frame can't be used in the calculation, since they use
- // different compositors with unrelated state, which breaks some of the
- // calculations below.
- if (toLocalFrame(frame)->localFrameRoot() != m_page->mainFrame())
- continue;
-
- FrameView* frameView = toLocalFrame(frame)->view();
- if (!frameView || frameView->shouldThrottleRendering())
- continue;
-
- if (frameView->hasBackgroundAttachmentFixedObjects())
- reasons |=
- MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects;
- FrameView::ScrollingReasons scrollingReasons =
- frameView->getScrollingReasons();
- const bool mayBeScrolledByInput =
- (scrollingReasons == FrameView::Scrollable);
- const bool mayBeScrolledByScript =
- mayBeScrolledByInput ||
- (scrollingReasons == FrameView::NotScrollableExplicitlyDisabled);
-
- // TODO(awoloszyn) Currently crbug.com/304810 will let certain
- // overflow:hidden elements scroll on the compositor thread, so we should
- // not let this move there path as an optimization, when we have
- // slow-repaint elements.
- if (mayBeScrolledByScript &&
- hasVisibleSlowRepaintViewportConstrainedObjects(frameView)) {
- reasons |=
- MainThreadScrollingReason::kHasNonLayerViewportConstrainedObjects;
- }
- }
-
- return reasons;
-}
-
-String ScrollingCoordinator::mainThreadScrollingReasonsAsText() const {
- DCHECK(m_page->deprecatedLocalMainFrame()->document()->lifecycle().state() >=
- DocumentLifecycle::CompositingClean);
- if (WebLayer* scrollLayer = toWebLayer(
- m_page->deprecatedLocalMainFrame()->view()->layerForScrolling())) {
- String result(MainThreadScrollingReason::mainThreadScrollingReasonsAsText(
- scrollLayer->mainThreadScrollingReasons())
- .c_str());
- return result;
- }
-
- String result(MainThreadScrollingReason::mainThreadScrollingReasonsAsText(
- m_lastMainThreadScrollingReasons)
- .c_str());
- return result;
-}
-
bool ScrollingCoordinator::frameViewIsDirty() const {
FrameView* frameView = m_page->mainFrame()->isLocalFrame()
? m_page->deprecatedLocalMainFrame()->view()

Powered by Google App Engine
This is Rietveld 408576698