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

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

Issue 103583007: Ensure that if FrameView::isScrollable() is false, the assoc WebLayer is, too. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 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 | Annotate | Revision Log
« no previous file with comments | « Source/core/frame/FrameView.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 using blink::WebVector; 67 using blink::WebVector;
68 68
69 69
70 namespace WebCore { 70 namespace WebCore {
71 71
72 static WebLayer* scrollingWebLayerForGraphicsLayer(GraphicsLayer* layer) 72 static WebLayer* scrollingWebLayerForGraphicsLayer(GraphicsLayer* layer)
73 { 73 {
74 return layer->platformLayer(); 74 return layer->platformLayer();
75 } 75 }
76 76
77 static bool frameViewCouldBeScrolledByImplThread(FrameView* frameView)
78 {
79 // A frame view will report that isScrollable is false if overflow is hidden , but it may still
80 // end up getting scrolled on the impl thread.
81 return frameView && frameView->hasOverflow() && frameView->isVisibleToHitTes ting();
82 }
83
77 WebLayer* ScrollingCoordinator::scrollingWebLayerForScrollableArea(ScrollableAre a* scrollableArea) 84 WebLayer* ScrollingCoordinator::scrollingWebLayerForScrollableArea(ScrollableAre a* scrollableArea)
78 { 85 {
79 GraphicsLayer* graphicsLayer = scrollLayerForScrollableArea(scrollableArea); 86 GraphicsLayer* graphicsLayer = scrollLayerForScrollableArea(scrollableArea);
80 return graphicsLayer ? scrollingWebLayerForGraphicsLayer(graphicsLayer) : 0; 87 return graphicsLayer ? scrollingWebLayerForGraphicsLayer(graphicsLayer) : 0;
81 } 88 }
82 89
83 PassRefPtr<ScrollingCoordinator> ScrollingCoordinator::create(Page* page) 90 PassRefPtr<ScrollingCoordinator> ScrollingCoordinator::create(Page* page)
84 { 91 {
85 return adoptRef(new ScrollingCoordinator(page)); 92 return adoptRef(new ScrollingCoordinator(page));
86 } 93 }
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
146 setShouldHandleScrollGestureOnMainThreadRegion(shouldHandleScrollGesture OnMainThreadRegion); 153 setShouldHandleScrollGestureOnMainThreadRegion(shouldHandleScrollGesture OnMainThreadRegion);
147 m_scrollGestureRegionIsDirty = false; 154 m_scrollGestureRegionIsDirty = false;
148 } 155 }
149 156
150 if (m_touchEventTargetRectsAreDirty) { 157 if (m_touchEventTargetRectsAreDirty) {
151 updateTouchEventTargetRectsIfNeeded(); 158 updateTouchEventTargetRectsIfNeeded();
152 m_touchEventTargetRectsAreDirty = false; 159 m_touchEventTargetRectsAreDirty = false;
153 } 160 }
154 161
155 FrameView* frameView = m_page->mainFrame()->view(); 162 FrameView* frameView = m_page->mainFrame()->view();
156 bool frameIsScrollable = frameView && frameView->isScrollable(); 163 bool frameIsScrollable = frameViewCouldBeScrolledByImplThread(frameView);
157 if (m_wasFrameScrollable != frameIsScrollable) 164 if (m_wasFrameScrollable != frameIsScrollable)
158 updateShouldUpdateScrollLayerPositionOnMainThread(); 165 updateShouldUpdateScrollLayerPositionOnMainThread();
159 m_wasFrameScrollable = frameIsScrollable; 166 m_wasFrameScrollable = frameIsScrollable;
160 167
161 const FrameTree& tree = m_page->mainFrame()->tree(); 168 const FrameTree& tree = m_page->mainFrame()->tree();
162 for (const Frame* child = tree.firstChild(); child; child = child->tree().ne xtSibling()) { 169 for (const Frame* child = tree.firstChild(); child; child = child->tree().ne xtSibling()) {
163 if (WebLayer* scrollLayer = scrollingWebLayerForScrollableArea(child->vi ew())) 170 if (WebLayer* scrollLayer = scrollingWebLayerForScrollableArea(child->vi ew()))
164 scrollLayer->setBounds(child->view()->contentsSize()); 171 scrollLayer->setBounds(child->view()->contentsSize());
165 } 172 }
166 } 173 }
(...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after
608 { 615 {
609 setWheelEventHandlerCount(computeCurrentWheelEventHandlerCount()); 616 setWheelEventHandlerCount(computeCurrentWheelEventHandlerCount());
610 } 617 }
611 618
612 void ScrollingCoordinator::setShouldUpdateScrollLayerPositionOnMainThread(MainTh readScrollingReasons reasons) 619 void ScrollingCoordinator::setShouldUpdateScrollLayerPositionOnMainThread(MainTh readScrollingReasons reasons)
613 { 620 {
614 if (WebLayer* scrollLayer = scrollingWebLayerForScrollableArea(m_page->mainF rame()->view())) { 621 if (WebLayer* scrollLayer = scrollingWebLayerForScrollableArea(m_page->mainF rame()->view())) {
615 m_lastMainThreadScrollingReasons = reasons; 622 m_lastMainThreadScrollingReasons = reasons;
616 scrollLayer->setShouldScrollOnMainThread(reasons); 623 scrollLayer->setShouldScrollOnMainThread(reasons);
617 } 624 }
625
626 // We may be ignoring main thread scrolling reasons if the main thread claim s it cannot be scrolled. Check for this case.
shawnsingh 2013/12/17 09:05:11 misplaced comment? or should this be labeled as a
618 } 627 }
619 628
620 void ScrollingCoordinator::pageDestroyed() 629 void ScrollingCoordinator::pageDestroyed()
621 { 630 {
622 ASSERT(m_page); 631 ASSERT(m_page);
623 m_page = 0; 632 m_page = 0;
624 } 633 }
625 634
626 bool ScrollingCoordinator::coordinatesScrollingForFrameView(FrameView* frameView ) const 635 bool ScrollingCoordinator::coordinatesScrollingForFrameView(FrameView* frameView ) const
627 { 636 {
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
876 } 885 }
877 return false; 886 return false;
878 } 887 }
879 888
880 MainThreadScrollingReasons ScrollingCoordinator::mainThreadScrollingReasons() co nst 889 MainThreadScrollingReasons ScrollingCoordinator::mainThreadScrollingReasons() co nst
881 { 890 {
882 // The main thread scrolling reasons are applicable to scrolls of the main 891 // The main thread scrolling reasons are applicable to scrolls of the main
883 // frame. If it does not exist or if it is not scrollable, there is no 892 // frame. If it does not exist or if it is not scrollable, there is no
884 // reason to force main thread scrolling. 893 // reason to force main thread scrolling.
885 FrameView* frameView = m_page->mainFrame()->view(); 894 FrameView* frameView = m_page->mainFrame()->view();
886 if (!frameView || !frameView->isScrollable()) 895 if (!frameView || !frameViewCouldBeScrolledByImplThread(frameView))
887 return static_cast<MainThreadScrollingReasons>(0); 896 return static_cast<MainThreadScrollingReasons>(0);
888 897
889 MainThreadScrollingReasons mainThreadScrollingReasons = (MainThreadScrolling Reasons)0; 898 MainThreadScrollingReasons mainThreadScrollingReasons = (MainThreadScrolling Reasons)0;
890 899
891 if (frameView->hasSlowRepaintObjects()) 900 if (frameView->hasSlowRepaintObjects())
892 mainThreadScrollingReasons |= HasSlowRepaintObjects; 901 mainThreadScrollingReasons |= HasSlowRepaintObjects;
893 if (hasVisibleSlowRepaintViewportConstrainedObjects(frameView)) 902 if (hasVisibleSlowRepaintViewportConstrainedObjects(frameView))
894 mainThreadScrollingReasons |= HasNonLayerViewportConstrainedObjects; 903 mainThreadScrollingReasons |= HasNonLayerViewportConstrainedObjects;
895 904
896 return mainThreadScrollingReasons; 905 return mainThreadScrollingReasons;
(...skipping 21 matching lines...) Expand all
918 } 927 }
919 928
920 String ScrollingCoordinator::mainThreadScrollingReasonsAsText() const 929 String ScrollingCoordinator::mainThreadScrollingReasonsAsText() const
921 { 930 {
922 return mainThreadScrollingReasonsAsText(m_lastMainThreadScrollingReasons); 931 return mainThreadScrollingReasonsAsText(m_lastMainThreadScrollingReasons);
923 } 932 }
924 933
925 bool ScrollingCoordinator::frameViewIsScrollableIsDirty() const 934 bool ScrollingCoordinator::frameViewIsScrollableIsDirty() const
926 { 935 {
927 FrameView* frameView = m_page->mainFrame()->view(); 936 FrameView* frameView = m_page->mainFrame()->view();
928 bool frameIsScrollable = frameView && frameView->isScrollable(); 937 bool frameIsScrollable = frameViewCouldBeScrolledByImplThread(frameView);
929 return frameIsScrollable != m_wasFrameScrollable; 938 return frameIsScrollable != m_wasFrameScrollable;
930 } 939 }
931 940
932 } // namespace WebCore 941 } // namespace WebCore
OLDNEW
« no previous file with comments | « Source/core/frame/FrameView.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698