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

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

Issue 2531603003: Only scroll on main if the targeted frames need to scroll on main (Closed)
Patch Set: Moving mainThreadScrollingReason related function from ScrollingCoordinator to FrameView to indicat… 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 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 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 m_hiddenForThrottling(false), 187 m_hiddenForThrottling(false),
188 m_subtreeThrottled(false), 188 m_subtreeThrottled(false),
189 m_lifecycleUpdatesThrottled(false), 189 m_lifecycleUpdatesThrottled(false),
190 m_needsPaintPropertyUpdate(true), 190 m_needsPaintPropertyUpdate(true),
191 m_currentUpdateLifecyclePhasesTargetState( 191 m_currentUpdateLifecyclePhasesTargetState(
192 DocumentLifecycle::Uninitialized), 192 DocumentLifecycle::Uninitialized),
193 m_scrollAnchor(this), 193 m_scrollAnchor(this),
194 m_scrollbarManager(*this), 194 m_scrollbarManager(*this),
195 m_needsScrollbarsUpdate(false), 195 m_needsScrollbarsUpdate(false),
196 m_suppressAdjustViewSize(false), 196 m_suppressAdjustViewSize(false),
197 m_allowsLayoutInvalidationAfterLayoutClean(true) { 197 m_allowsLayoutInvalidationAfterLayoutClean(true),
198 m_lastMainThreadScrollingReasons(0) {
198 init(); 199 init();
199 } 200 }
200 201
201 FrameView* FrameView::create(LocalFrame& frame) { 202 FrameView* FrameView::create(LocalFrame& frame) {
202 FrameView* view = new FrameView(frame); 203 FrameView* view = new FrameView(frame);
203 view->show(); 204 view->show();
204 return view; 205 return view;
205 } 206 }
206 207
207 FrameView* FrameView::create(LocalFrame& frame, const IntSize& initialSize) { 208 FrameView* FrameView::create(LocalFrame& frame, const IntSize& initialSize) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 m_firstLayout = true; 251 m_firstLayout = true;
251 m_safeToPropagateScrollToParent = true; 252 m_safeToPropagateScrollToParent = true;
252 m_lastViewportSize = IntSize(); 253 m_lastViewportSize = IntSize();
253 m_lastZoomFactor = 1.0f; 254 m_lastZoomFactor = 1.0f;
254 m_trackedObjectPaintInvalidations = WTF::wrapUnique( 255 m_trackedObjectPaintInvalidations = WTF::wrapUnique(
255 s_initialTrackAllPaintInvalidations ? new Vector<ObjectPaintInvalidation> 256 s_initialTrackAllPaintInvalidations ? new Vector<ObjectPaintInvalidation>
256 : nullptr); 257 : nullptr);
257 m_visuallyNonEmptyCharacterCount = 0; 258 m_visuallyNonEmptyCharacterCount = 0;
258 m_visuallyNonEmptyPixelCount = 0; 259 m_visuallyNonEmptyPixelCount = 0;
259 m_isVisuallyNonEmpty = false; 260 m_isVisuallyNonEmpty = false;
261 m_lastMainThreadScrollingReasons = 0;
260 m_layoutObjectCounter.reset(); 262 m_layoutObjectCounter.reset();
261 clearFragmentAnchor(); 263 clearFragmentAnchor();
262 m_viewportConstrainedObjects.reset(); 264 m_viewportConstrainedObjects.reset();
263 m_layoutSubtreeRootList.clear(); 265 m_layoutSubtreeRootList.clear();
264 m_orthogonalWritingModeRootList.clear(); 266 m_orthogonalWritingModeRootList.clear();
265 } 267 }
266 268
267 // Call function for each non-throttled frame view in pre tree order. 269 // Call function for each non-throttled frame view in pre tree order.
268 // Note it needs a null check of the frame's layoutView to access it in case of 270 // Note it needs a null check of the frame's layoutView to access it in case of
269 // detached frames. 271 // detached frames.
(...skipping 547 matching lines...) Expand 10 before | Expand all | Expand 10 after
817 LayoutViewItem layoutView = this->layoutViewItem(); 819 LayoutViewItem layoutView = this->layoutViewItem();
818 if (layoutView.isNull()) 820 if (layoutView.isNull())
819 return false; 821 return false;
820 if (m_frame->settings() && 822 if (m_frame->settings() &&
821 m_frame->settings()->preferCompositingToLCDTextEnabled()) 823 m_frame->settings()->preferCompositingToLCDTextEnabled())
822 return layoutView.compositor()->inCompositingMode(); 824 return layoutView.compositor()->inCompositingMode();
823 return false; 825 return false;
824 } 826 }
825 827
826 bool FrameView::shouldScrollOnMainThread() const { 828 bool FrameView::shouldScrollOnMainThread() const {
827 if (ScrollingCoordinator* sc = scrollingCoordinator()) { 829 if (mainThreadScrollingReasons())
828 if (sc->shouldUpdateScrollLayerPositionOnMainThread()) 830 return true;
829 return true;
830 }
831 return ScrollableArea::shouldScrollOnMainThread(); 831 return ScrollableArea::shouldScrollOnMainThread();
832 } 832 }
833 833
834 GraphicsLayer* FrameView::layerForScrolling() const { 834 GraphicsLayer* FrameView::layerForScrolling() const {
835 LayoutViewItem layoutView = this->layoutViewItem(); 835 LayoutViewItem layoutView = this->layoutViewItem();
836 if (layoutView.isNull()) 836 if (layoutView.isNull())
837 return nullptr; 837 return nullptr;
838 return layoutView.compositor()->frameScrollLayer(); 838 return layoutView.compositor()->frameScrollLayer();
839 } 839 }
840 840
(...skipping 3831 matching lines...) Expand 10 before | Expand all | Expand 10 after
4672 int FrameView::initialViewportWidth() const { 4672 int FrameView::initialViewportWidth() const {
4673 DCHECK(m_frame->isMainFrame()); 4673 DCHECK(m_frame->isMainFrame());
4674 return m_initialViewportSize.width(); 4674 return m_initialViewportSize.width();
4675 } 4675 }
4676 4676
4677 int FrameView::initialViewportHeight() const { 4677 int FrameView::initialViewportHeight() const {
4678 DCHECK(m_frame->isMainFrame()); 4678 DCHECK(m_frame->isMainFrame());
4679 return m_initialViewportSize.height(); 4679 return m_initialViewportSize.height();
4680 } 4680 }
4681 4681
4682 bool FrameView::hasVisibleSlowRepaintViewportConstrainedObjects(
pdr. 2016/12/17 05:50:16 Nit: I don't think you need to pass in frameView h
yigu 2016/12/18 17:57:11 Done.
4683 const FrameView& frameView) const {
4684 const ViewportConstrainedObjectSet* viewportConstrainedObjects =
4685 frameView.viewportConstrainedObjects();
4686 if (!viewportConstrainedObjects)
4687 return false;
4688
4689 for (const LayoutObject* layoutObject : *viewportConstrainedObjects) {
4690 DCHECK(layoutObject->isBoxModelObject() && layoutObject->hasLayer());
4691 DCHECK(layoutObject->style()->position() == FixedPosition ||
4692 layoutObject->style()->position() == StickyPosition);
4693 PaintLayer* layer = toLayoutBoxModelObject(layoutObject)->layer();
4694
4695 // Whether the Layer sticks to the viewport is a tree-depenent
4696 // property and our viewportConstrainedObjects collection is maintained
4697 // with only LayoutObject-level information.
4698 if (!layer->sticksToViewport())
4699 continue;
4700
4701 // If the whole subtree is invisible, there's no reason to scroll on
4702 // the main thread because we don't need to generate invalidations
4703 // for invisible content.
4704 if (layer->subtreeIsInvisible())
4705 continue;
4706
4707 // We're only smart enough to scroll viewport-constrainted objects
4708 // in the compositor if they have their own backing or they paint
4709 // into a grouped back (which necessarily all have the same viewport
4710 // constraints).
4711 CompositingState compositingState = layer->compositingState();
4712 if (compositingState != PaintsIntoOwnBacking &&
4713 compositingState != PaintsIntoGroupedBacking)
4714 return true;
4715 }
4716 return false;
4717 }
4718
4719 void FrameView::updateSubFrameScrollOnMainReason(
4720 const Frame& frame,
4721 MainThreadScrollingReasons parentReason) {
4722 MainThreadScrollingReasons reasons = parentReason;
4723
4724 if (!page()->settings().threadedScrollingEnabled())
4725 reasons |= MainThreadScrollingReason::kThreadedScrollingDisabled;
4726
4727 if (!frame.isLocalFrame())
4728 return;
4729
4730 if (!toLocalFrame(frame).view()->layerForScrolling())
4731 return;
4732
4733 reasons |= mainThreadScrollingReasonsPerFrame(*toLocalFrame(&frame));
4734 if (WebLayer* scrollLayer =
4735 toLocalFrame(frame).view()->layerForScrolling()->platformLayer()) {
4736 if (reasons) {
4737 scrollLayer->addMainThreadScrollingReasons(reasons);
4738 } else {
4739 scrollLayer->clearMainThreadScrollingReasons(
4740 ~0 & ~MainThreadScrollingReason::kHandlingScrollFromMainThread);
pdr. 2016/12/17 05:50:16 What is ~0 for?
yigu 2016/12/18 17:57:11 That was silly..
4741 }
4742 }
4743
4744 Frame* child = frame.tree().firstChild();
4745 while (child) {
4746 updateSubFrameScrollOnMainReason(*child, reasons);
4747 child = child->tree().nextSibling();
4748 }
4749
4750 if (frame.isMainFrame())
4751 m_lastMainThreadScrollingReasons = reasons;
4752 }
4753
4754 MainThreadScrollingReasons FrameView::mainThreadScrollingReasonsPerFrame(
pdr. 2016/12/17 05:50:16 Is "const LocalFrame& frame" needed? Similar to ha
yigu 2016/12/18 17:57:11 Done.
4755 const LocalFrame& frame) const {
4756 MainThreadScrollingReasons reasons =
4757 static_cast<MainThreadScrollingReasons>(0);
4758
4759 FrameView* frameView = frame.view();
4760 if (!frameView || frameView->shouldThrottleRendering())
4761 return reasons;
4762
4763 if (frameView->hasBackgroundAttachmentFixedObjects())
4764 reasons |= MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects;
4765 ScrollingReasons scrollingReasons = frameView->getScrollingReasons();
4766 const bool mayBeScrolledByInput = (scrollingReasons == Scrollable);
4767 const bool mayBeScrolledByScript =
4768 mayBeScrolledByInput ||
4769 (scrollingReasons == NotScrollableExplicitlyDisabled);
4770
4771 // TODO(awoloszyn) Currently crbug.com/304810 will let certain
4772 // overflow:hidden elements scroll on the compositor thread, so we should
4773 // not let this move there path as an optimization, when we have
4774 // slow-repaint elements.
4775 if (mayBeScrolledByScript &&
4776 hasVisibleSlowRepaintViewportConstrainedObjects(*frameView)) {
4777 reasons |=
4778 MainThreadScrollingReason::kHasNonLayerViewportConstrainedObjects;
4779 }
4780 return reasons;
4781 }
4782
4783 MainThreadScrollingReasons FrameView::mainThreadScrollingReasons() const {
4784 MainThreadScrollingReasons reasons =
4785 static_cast<MainThreadScrollingReasons>(0);
4786
4787 if (!page()->settings().threadedScrollingEnabled())
4788 reasons |= MainThreadScrollingReason::kThreadedScrollingDisabled;
4789
4790 if (!page()->mainFrame()->isLocalFrame())
4791 return reasons;
4792
4793 // TODO(alexmos,kenrb): For OOPIF, local roots that are different from
4794 // the main frame can't be used in the calculation, since they use
4795 // different compositors with unrelated state, which breaks some of the
4796 // calculations below.
4797 if (m_frame->localFrameRoot() != page()->mainFrame())
4798 return reasons;
4799
4800 // Walk through the subtree from the target frame to root. Use the gathered
pdr. 2016/12/17 05:50:16 Nit: Update this to reflect that the function is n
yigu 2016/12/18 17:57:11 Done.
4801 // reasons to determine whether the target frame should be scrolled on main
4802 // thread regardless other subframes on the same page.
4803 for (Frame* frame = m_frame; frame; frame = frame->tree().parent()) {
4804 if (!frame->isLocalFrame())
4805 continue;
4806 reasons |= mainThreadScrollingReasonsPerFrame(*toLocalFrame(frame));
4807 }
4808
4809 return reasons;
4810 }
4811
4812 String FrameView::mainThreadScrollingReasonsAsText() const {
4813 DCHECK(lifecycle().state() >= DocumentLifecycle::CompositingClean);
4814 if (layerForScrolling() && layerForScrolling()->platformLayer()) {
4815 String result(
4816 MainThreadScrollingReason::mainThreadScrollingReasonsAsText(
4817 layerForScrolling()->platformLayer()->mainThreadScrollingReasons())
4818 .c_str());
4819 return result;
4820 }
4821
4822 String result(MainThreadScrollingReason::mainThreadScrollingReasonsAsText(
4823 m_lastMainThreadScrollingReasons)
4824 .c_str());
4825 return result;
4826 }
4827
4682 } // namespace blink 4828 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698