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

Side by Side Diff: third_party/WebKit/Source/core/paint/DeprecatedPaintLayerScrollableArea.cpp

Issue 1373413002: Avoid scrollbar construction/destruction thrashing during flex layout. (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Created 5 years, 2 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
« no previous file with comments | « third_party/WebKit/Source/core/paint/DeprecatedPaintLayerScrollableArea.h ('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) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved. 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights reserved.
3 * 3 *
4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation.
5 * 5 *
6 * Other contributors: 6 * Other contributors:
7 * Robert O'Callahan <roc+@cs.cmu.edu> 7 * Robert O'Callahan <roc+@cs.cmu.edu>
8 * David Baron <dbaron@fas.harvard.edu> 8 * David Baron <dbaron@fas.harvard.edu>
9 * Christian Biesinger <cbiesinger@web.de> 9 * Christian Biesinger <cbiesinger@web.de>
10 * Randall Jesup <rjesup@wgate.com> 10 * Randall Jesup <rjesup@wgate.com>
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 const int ResizerControlExpandRatioForTouch = 2; 81 const int ResizerControlExpandRatioForTouch = 2;
82 82
83 DeprecatedPaintLayerScrollableArea::DeprecatedPaintLayerScrollableArea(Deprecate dPaintLayer& layer) 83 DeprecatedPaintLayerScrollableArea::DeprecatedPaintLayerScrollableArea(Deprecate dPaintLayer& layer)
84 : m_layer(layer) 84 : m_layer(layer)
85 , m_inResizeMode(false) 85 , m_inResizeMode(false)
86 , m_scrollsOverflow(false) 86 , m_scrollsOverflow(false)
87 , m_inOverflowRelayout(false) 87 , m_inOverflowRelayout(false)
88 , m_nextTopmostScrollChild(0) 88 , m_nextTopmostScrollChild(0)
89 , m_topmostScrollChild(0) 89 , m_topmostScrollChild(0)
90 , m_needsCompositedScrolling(false) 90 , m_needsCompositedScrolling(false)
91 , m_scrollbarManager(*this)
91 , m_scrollCorner(nullptr) 92 , m_scrollCorner(nullptr)
92 , m_resizer(nullptr) 93 , m_resizer(nullptr)
93 #if ENABLE(ASSERT) 94 #if ENABLE(ASSERT)
94 , m_hasBeenDisposed(false) 95 , m_hasBeenDisposed(false)
95 #endif 96 #endif
96 { 97 {
97 Node* node = box().node(); 98 Node* node = box().node();
98 if (node && node->isElementNode()) { 99 if (node && node->isElementNode()) {
99 // We save and restore only the scrollOffset as the other scroll values are recalculated. 100 // We save and restore only the scrollOffset as the other scroll values are recalculated.
100 Element* element = toElement(node); 101 Element* element = toElement(node);
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 // FIXME: Make setSavedLayerScrollOffset take DoubleSize. crbug.com/4142 83. 136 // FIXME: Make setSavedLayerScrollOffset take DoubleSize. crbug.com/4142 83.
136 if (node && node->isElementNode()) 137 if (node && node->isElementNode())
137 toElement(node)->setSavedLayerScrollOffset(flooredIntSize(m_scrollOf fset)); 138 toElement(node)->setSavedLayerScrollOffset(flooredIntSize(m_scrollOf fset));
138 } 139 }
139 140
140 if (LocalFrame* frame = box().frame()) { 141 if (LocalFrame* frame = box().frame()) {
141 if (FrameView* frameView = frame->view()) 142 if (FrameView* frameView = frame->view())
142 frameView->removeResizerArea(box()); 143 frameView->removeResizerArea(box());
143 } 144 }
144 145
145 destroyScrollbar(HorizontalScrollbar); 146 m_scrollbarManager.dispose();
146 destroyScrollbar(VerticalScrollbar);
147 147
148 if (m_scrollCorner) 148 if (m_scrollCorner)
149 m_scrollCorner->destroy(); 149 m_scrollCorner->destroy();
150 if (m_resizer) 150 if (m_resizer)
151 m_resizer->destroy(); 151 m_resizer->destroy();
152 152
153 clearScrollAnimators(); 153 clearScrollAnimators();
154 154
155 #if ENABLE(ASSERT) 155 #if ENABLE(ASSERT)
156 m_hasBeenDisposed = true; 156 m_hasBeenDisposed = true;
157 #endif 157 #endif
158 } 158 }
159 159
160 DEFINE_TRACE(DeprecatedPaintLayerScrollableArea) 160 DEFINE_TRACE(DeprecatedPaintLayerScrollableArea)
161 { 161 {
162 visitor->trace(m_hBar); 162 m_scrollbarManager.trace(visitor);
163 visitor->trace(m_vBar);
164 ScrollableArea::trace(visitor); 163 ScrollableArea::trace(visitor);
165 } 164 }
166 165
167 HostWindow* DeprecatedPaintLayerScrollableArea::hostWindow() const 166 HostWindow* DeprecatedPaintLayerScrollableArea::hostWindow() const
168 { 167 {
169 if (Page* page = box().frame()->page()) 168 if (Page* page = box().frame()->page())
170 return &page->chromeClient(); 169 return &page->chromeClient();
171 return nullptr; 170 return nullptr;
172 } 171 }
173 172
(...skipping 24 matching lines...) Expand all
198 DisableCompositingQueryAsserts disabler; 197 DisableCompositingQueryAsserts disabler;
199 198
200 return layer()->hasCompositedDeprecatedPaintLayerMapping() ? layer()->compos itedDeprecatedPaintLayerMapping()->layerForScrollCorner() : 0; 199 return layer()->hasCompositedDeprecatedPaintLayerMapping() ? layer()->compos itedDeprecatedPaintLayerMapping()->layerForScrollCorner() : 0;
201 } 200 }
202 201
203 void DeprecatedPaintLayerScrollableArea::invalidateScrollbarRect(Scrollbar* scro llbar, const IntRect& rect) 202 void DeprecatedPaintLayerScrollableArea::invalidateScrollbarRect(Scrollbar* scro llbar, const IntRect& rect)
204 { 203 {
205 // See crbug.com/343132. 204 // See crbug.com/343132.
206 DisableCompositingQueryAsserts disabler; 205 DisableCompositingQueryAsserts disabler;
207 206
208 ASSERT(scrollbar == m_hBar.get() || scrollbar == m_vBar.get()); 207 ASSERT(scrollbar == horizontalScrollbar() || scrollbar == verticalScrollbar( ));
209 ASSERT(scrollbar == m_hBar.get() ? !layerForHorizontalScrollbar() : !layerFo rVerticalScrollbar()); 208 ASSERT(scrollbar == horizontalScrollbar() ? !layerForHorizontalScrollbar() : !layerForVerticalScrollbar());
210 209
211 IntRect scrollRect = rect; 210 IntRect scrollRect = rect;
212 // If we are not yet inserted into the tree, there is no need to issue paint invaldiations. 211 // If we are not yet inserted into the tree, there is no need to issue paint invaldiations.
213 if (!box().isLayoutView() && !box().parent()) 212 if (!box().isLayoutView() && !box().parent())
214 return; 213 return;
215 214
216 if (scrollbar == m_vBar.get()) 215 if (scrollbar == verticalScrollbar())
217 scrollRect.move(verticalScrollbarStart(0, box().size().width()), box().b orderTop()); 216 scrollRect.move(verticalScrollbarStart(0, box().size().width()), box().b orderTop());
218 else 217 else
219 scrollRect.move(horizontalScrollbarStart(0), box().size().height() - box ().borderBottom() - scrollbar->height()); 218 scrollRect.move(horizontalScrollbarStart(0), box().size().height() - box ().borderBottom() - scrollbar->height());
220 219
221 if (scrollRect.isEmpty()) 220 if (scrollRect.isEmpty())
222 return; 221 return;
223 222
224 box().invalidateDisplayItemClient(*scrollbar); 223 box().invalidateDisplayItemClient(*scrollbar);
225 224
226 LayoutRect paintInvalidationRect = LayoutRect(scrollRect); 225 LayoutRect paintInvalidationRect = LayoutRect(scrollRect);
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after
646 DoublePoint newScrollPosition = clamp == ScrollOffsetClamped ? clampScrollPo sition(scrollPosition) : scrollPosition; 645 DoublePoint newScrollPosition = clamp == ScrollOffsetClamped ? clampScrollPo sition(scrollPosition) : scrollPosition;
647 if (newScrollPosition != scrollPositionDouble()) 646 if (newScrollPosition != scrollPositionDouble())
648 ScrollableArea::setScrollPosition(newScrollPosition, ProgrammaticScroll, scrollBehavior); 647 ScrollableArea::setScrollPosition(newScrollPosition, ProgrammaticScroll, scrollBehavior);
649 } 648 }
650 649
651 void DeprecatedPaintLayerScrollableArea::updateScrollDimensions(DoubleSize& scro llOffset, bool& autoHorizontalScrollBarChanged, bool& autoVerticalScrollBarChang ed) 650 void DeprecatedPaintLayerScrollableArea::updateScrollDimensions(DoubleSize& scro llOffset, bool& autoHorizontalScrollBarChanged, bool& autoVerticalScrollBarChang ed)
652 { 651 {
653 ASSERT(box().hasOverflowClip()); 652 ASSERT(box().hasOverflowClip());
654 653
655 if (needsScrollbarReconstruction()) { 654 if (needsScrollbarReconstruction()) {
656 if (m_hBar) 655 m_scrollbarManager.setCanDetachScrollbars(false);
657 destroyScrollbar(HorizontalScrollbar); 656 setHasHorizontalScrollbar(false);
658 if (m_vBar) 657 setHasVerticalScrollbar(false);
659 destroyScrollbar(VerticalScrollbar);
660 } 658 }
661 659
660 m_scrollbarManager.setCanDetachScrollbars(true);
661
662 scrollOffset = adjustedScrollOffset(); 662 scrollOffset = adjustedScrollOffset();
663 computeScrollDimensions(); 663 computeScrollDimensions();
664 bool hasHorizontalOverflow = this->hasHorizontalOverflow(); 664 bool hasHorizontalOverflow = this->hasHorizontalOverflow();
665 bool hasVerticalOverflow = this->hasVerticalOverflow(); 665 bool hasVerticalOverflow = this->hasVerticalOverflow();
666 if (hasOverlayScrollbars()) { 666 if (hasOverlayScrollbars()) {
667 if (!scrollSize(HorizontalScrollbar)) 667 if (!scrollSize(HorizontalScrollbar))
668 setHasHorizontalScrollbar(false); 668 setHasHorizontalScrollbar(false);
669 if (!scrollSize(VerticalScrollbar)) 669 if (!scrollSize(VerticalScrollbar))
670 setHasVerticalScrollbar(false); 670 setHasVerticalScrollbar(false);
671 } 671 }
672 672
673 // overflow:auto may need to lay out again if scrollbars got added/removed. 673 // overflow:auto may need to lay out again if scrollbars got added/removed.
674 autoHorizontalScrollBarChanged = (box().hasAutoHorizontalScrollbar() && (has HorizontalScrollbar() != hasHorizontalOverflow)) || (box().style()->overflowX() == OSCROLL && !horizontalScrollbar()); 674 autoHorizontalScrollBarChanged = (box().hasAutoHorizontalScrollbar() && (has HorizontalScrollbar() != hasHorizontalOverflow)) || (box().style()->overflowX() == OSCROLL && !horizontalScrollbar());
675 autoVerticalScrollBarChanged = (box().hasAutoVerticalScrollbar() && (hasVert icalScrollbar() != hasVerticalOverflow)) || (box().style()->overflowY() == OSCRO LL && !verticalScrollbar()); 675 autoVerticalScrollBarChanged = (box().hasAutoVerticalScrollbar() && (hasVert icalScrollbar() != hasVerticalOverflow)) || (box().style()->overflowY() == OSCRO LL && !verticalScrollbar());
676 if (!visualViewportSuppliesScrollbars() && (autoHorizontalScrollBarChanged | | autoVerticalScrollBarChanged)) { 676 if (!visualViewportSuppliesScrollbars() && (autoHorizontalScrollBarChanged | | autoVerticalScrollBarChanged)) {
677 if (box().hasAutoHorizontalScrollbar() || (box().style()->overflowX() == OSCROLL && !horizontalScrollbar())) 677 if (box().hasAutoHorizontalScrollbar())
678 setHasHorizontalScrollbar(box().style()->overflowX() == OSCROLL ? tr ue : hasHorizontalOverflow); 678 setHasHorizontalScrollbar(hasHorizontalOverflow);
679 if (box().hasAutoVerticalScrollbar() || (box().style()->overflowY() == O SCROLL && !verticalScrollbar())) 679 else if (box().style()->overflowX() == OSCROLL)
680 setHasVerticalScrollbar(box().style()->overflowY() == OSCROLL ? true : hasVerticalOverflow); 680 setHasHorizontalScrollbar(true);
681 if (box().hasAutoVerticalScrollbar())
682 setHasVerticalScrollbar(hasVerticalOverflow);
683 else if (box().style()->overflowX() == OSCROLL)
MuVen 2015/10/01 13:41:48 small typo error, corrected at https://codereview
684 setHasVerticalScrollbar(true);
681 } 685 }
682 } 686 }
683 687
684 void DeprecatedPaintLayerScrollableArea::finalizeScrollDimensions(const DoubleSi ze& originalScrollOffset, bool autoHorizontalScrollBarChanged, bool autoVertical ScrollBarChanged) 688 void DeprecatedPaintLayerScrollableArea::finalizeScrollDimensions(const DoubleSi ze& originalScrollOffset, bool autoHorizontalScrollBarChanged, bool autoVertical ScrollBarChanged)
685 { 689 {
686 ASSERT(box().hasOverflowClip()); 690 ASSERT(box().hasOverflowClip());
687 691
688 // Layout may cause us to be at an invalid scroll position. In this case we need 692 // Layout may cause us to be at an invalid scroll position. In this case we need
689 // to pull our scroll offsets back to the max (or push them up to the min). 693 // to pull our scroll offsets back to the max (or push them up to the min).
690 DoublePoint clampedScrollPosition = clampScrollPosition(scrollPositionDouble ()); 694 DoublePoint clampedScrollPosition = clampScrollPosition(scrollPositionDouble ());
691 if (clampedScrollPosition != scrollPositionDouble()) 695 if (clampedScrollPosition != scrollPositionDouble())
692 scrollToPosition(clampedScrollPosition); 696 scrollToPosition(clampedScrollPosition);
693 697
694 if (originalScrollOffset != adjustedScrollOffset()) { 698 if (originalScrollOffset != adjustedScrollOffset()) {
695 DoublePoint origin(scrollOrigin()); 699 DoublePoint origin(scrollOrigin());
696 scrollPositionChanged(-origin + adjustedScrollOffset(), ProgrammaticScro ll); 700 scrollPositionChanged(-origin + adjustedScrollOffset(), ProgrammaticScro ll);
697 } 701 }
698 702
703 m_scrollbarManager.setCanDetachScrollbars(false);
704
699 bool hasHorizontalOverflow = this->hasHorizontalOverflow(); 705 bool hasHorizontalOverflow = this->hasHorizontalOverflow();
700 bool hasVerticalOverflow = this->hasVerticalOverflow(); 706 bool hasVerticalOverflow = this->hasVerticalOverflow();
701 707
702 { 708 {
703 // Hits in compositing/overflow/automatically-opt-into-composited-scroll ing-after-style-change.html. 709 // Hits in compositing/overflow/automatically-opt-into-composited-scroll ing-after-style-change.html.
704 DisableCompositingQueryAsserts disabler; 710 DisableCompositingQueryAsserts disabler;
705 711
706 // overflow:scroll should just enable/disable. 712 // overflow:scroll should just enable/disable.
707 if (box().style()->overflowX() == OSCROLL && horizontalScrollbar()) 713 if (box().style()->overflowX() == OSCROLL && horizontalScrollbar())
708 horizontalScrollbar()->setEnabled(hasHorizontalOverflow); 714 horizontalScrollbar()->setEnabled(hasHorizontalOverflow);
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
862 } 868 }
863 } 869 }
864 870
865 setHasHorizontalScrollbar(needsHorizontalScrollbar); 871 setHasHorizontalScrollbar(needsHorizontalScrollbar);
866 setHasVerticalScrollbar(needsVerticalScrollbar); 872 setHasVerticalScrollbar(needsVerticalScrollbar);
867 873
868 // With overflow: scroll, scrollbars are always visible but may be disabled. 874 // With overflow: scroll, scrollbars are always visible but may be disabled.
869 // When switching to another value, we need to re-enable them (see bug 11985 ). 875 // When switching to another value, we need to re-enable them (see bug 11985 ).
870 if (needsHorizontalScrollbar && oldStyle && oldStyle->overflowX() == OSCROLL && overflowX != OSCROLL) { 876 if (needsHorizontalScrollbar && oldStyle && oldStyle->overflowX() == OSCROLL && overflowX != OSCROLL) {
871 ASSERT(hasHorizontalScrollbar()); 877 ASSERT(hasHorizontalScrollbar());
872 m_hBar->setEnabled(true); 878 horizontalScrollbar()->setEnabled(true);
873 } 879 }
874 880
875 if (needsVerticalScrollbar && oldStyle && oldStyle->overflowY() == OSCROLL & & overflowY != OSCROLL) { 881 if (needsVerticalScrollbar && oldStyle && oldStyle->overflowY() == OSCROLL & & overflowY != OSCROLL) {
876 ASSERT(hasVerticalScrollbar()); 882 ASSERT(hasVerticalScrollbar());
877 m_vBar->setEnabled(true); 883 verticalScrollbar()->setEnabled(true);
878 } 884 }
879 885
880 // FIXME: Need to detect a swap from custom to native scrollbars (and vice v ersa). 886 // FIXME: Need to detect a swap from custom to native scrollbars (and vice v ersa).
881 if (m_hBar) 887 if (horizontalScrollbar())
882 m_hBar->styleChanged(); 888 horizontalScrollbar()->styleChanged();
883 if (m_vBar) 889 if (verticalScrollbar())
884 m_vBar->styleChanged(); 890 verticalScrollbar()->styleChanged();
885 891
886 updateScrollCornerStyle(); 892 updateScrollCornerStyle();
887 updateResizerAreaSet(); 893 updateResizerAreaSet();
888 updateResizerStyle(); 894 updateResizerStyle();
889 } 895 }
890 896
891 bool DeprecatedPaintLayerScrollableArea::updateAfterCompositingChange() 897 bool DeprecatedPaintLayerScrollableArea::updateAfterCompositingChange()
892 { 898 {
893 layer()->updateScrollingStateAfterCompositingChange(); 899 layer()->updateScrollingStateAfterCompositingChange();
894 const bool layersChanged = m_topmostScrollChild != m_nextTopmostScrollChild; 900 const bool layersChanged = m_topmostScrollChild != m_nextTopmostScrollChild;
(...skipping 17 matching lines...) Expand all
912 bool hasHorizontalOverflow = this->hasHorizontalOverflow(); 918 bool hasHorizontalOverflow = this->hasHorizontalOverflow();
913 bool hasVerticalOverflow = this->hasVerticalOverflow(); 919 bool hasVerticalOverflow = this->hasVerticalOverflow();
914 bool autoHorizontalScrollBarChanged = box().hasAutoHorizontalScrollbar() && (hasHorizontalScrollbar() != hasHorizontalOverflow); 920 bool autoHorizontalScrollBarChanged = box().hasAutoHorizontalScrollbar() && (hasHorizontalScrollbar() != hasHorizontalOverflow);
915 bool autoVerticalScrollBarChanged = box().hasAutoVerticalScrollbar() && (has VerticalScrollbar() != hasVerticalOverflow); 921 bool autoVerticalScrollBarChanged = box().hasAutoVerticalScrollbar() && (has VerticalScrollbar() != hasVerticalOverflow);
916 if (autoHorizontalScrollBarChanged || autoVerticalScrollBarChanged) 922 if (autoHorizontalScrollBarChanged || autoVerticalScrollBarChanged)
917 box().setNeedsLayoutAndFullPaintInvalidation(LayoutInvalidationReason::U nknown); 923 box().setNeedsLayoutAndFullPaintInvalidation(LayoutInvalidationReason::U nknown);
918 } 924 }
919 925
920 IntRect DeprecatedPaintLayerScrollableArea::rectForHorizontalScrollbar(const Int Rect& borderBoxRect) const 926 IntRect DeprecatedPaintLayerScrollableArea::rectForHorizontalScrollbar(const Int Rect& borderBoxRect) const
921 { 927 {
922 if (!m_hBar) 928 if (!hasHorizontalScrollbar())
923 return IntRect(); 929 return IntRect();
924 930
925 const IntRect& scrollCorner = scrollCornerRect(); 931 const IntRect& scrollCorner = scrollCornerRect();
926 932
927 return IntRect(horizontalScrollbarStart(borderBoxRect.x()), 933 return IntRect(horizontalScrollbarStart(borderBoxRect.x()),
928 borderBoxRect.maxY() - box().borderBottom() - m_hBar->height(), 934 borderBoxRect.maxY() - box().borderBottom() - horizontalScrollbar()->hei ght(),
929 borderBoxRect.width() - (box().borderLeft() + box().borderRight()) - scr ollCorner.width(), 935 borderBoxRect.width() - (box().borderLeft() + box().borderRight()) - scr ollCorner.width(),
930 m_hBar->height()); 936 horizontalScrollbar()->height());
931 } 937 }
932 938
933 IntRect DeprecatedPaintLayerScrollableArea::rectForVerticalScrollbar(const IntRe ct& borderBoxRect) const 939 IntRect DeprecatedPaintLayerScrollableArea::rectForVerticalScrollbar(const IntRe ct& borderBoxRect) const
934 { 940 {
935 if (!m_vBar) 941 if (!hasVerticalScrollbar())
936 return IntRect(); 942 return IntRect();
937 943
938 const IntRect& scrollCorner = scrollCornerRect(); 944 const IntRect& scrollCorner = scrollCornerRect();
939 945
940 return IntRect(verticalScrollbarStart(borderBoxRect.x(), borderBoxRect.maxX( )), 946 return IntRect(verticalScrollbarStart(borderBoxRect.x(), borderBoxRect.maxX( )),
941 borderBoxRect.y() + box().borderTop(), 947 borderBoxRect.y() + box().borderTop(),
942 m_vBar->width(), 948 verticalScrollbar()->width(),
943 borderBoxRect.height() - (box().borderTop() + box().borderBottom()) - sc rollCorner.height()); 949 borderBoxRect.height() - (box().borderTop() + box().borderBottom()) - sc rollCorner.height());
944 } 950 }
945 951
946 LayoutUnit DeprecatedPaintLayerScrollableArea::verticalScrollbarStart(int minX, int maxX) const 952 LayoutUnit DeprecatedPaintLayerScrollableArea::verticalScrollbarStart(int minX, int maxX) const
947 { 953 {
948 if (box().style()->shouldPlaceBlockDirectionScrollbarOnLogicalLeft()) 954 if (box().style()->shouldPlaceBlockDirectionScrollbarOnLogicalLeft())
949 return minX + box().borderLeft(); 955 return minX + box().borderLeft();
950 return maxX - box().borderRight() - m_vBar->width(); 956 return maxX - box().borderRight() - verticalScrollbar()->width();
951 } 957 }
952 958
953 LayoutUnit DeprecatedPaintLayerScrollableArea::horizontalScrollbarStart(int minX ) const 959 LayoutUnit DeprecatedPaintLayerScrollableArea::horizontalScrollbarStart(int minX ) const
954 { 960 {
955 int x = minX + box().borderLeft(); 961 int x = minX + box().borderLeft();
956 if (box().style()->shouldPlaceBlockDirectionScrollbarOnLogicalLeft()) 962 if (box().style()->shouldPlaceBlockDirectionScrollbarOnLogicalLeft())
957 x += m_vBar ? m_vBar->width() : resizerCornerRect(box().pixelSnappedBord erBoxRect(), ResizerForPointer).width(); 963 x += hasVerticalScrollbar() ? verticalScrollbar()->width() : resizerCorn erRect(box().pixelSnappedBorderBoxRect(), ResizerForPointer).width();
958 return x; 964 return x;
959 } 965 }
960 966
961 IntSize DeprecatedPaintLayerScrollableArea::scrollbarOffset(const Scrollbar* scr ollbar) const 967 IntSize DeprecatedPaintLayerScrollableArea::scrollbarOffset(const Scrollbar* scr ollbar) const
962 { 968 {
963 if (scrollbar == m_vBar.get()) 969 if (scrollbar == verticalScrollbar())
964 return IntSize(verticalScrollbarStart(0, box().size().width()), box().bo rderTop()); 970 return IntSize(verticalScrollbarStart(0, box().size().width()), box().bo rderTop());
965 971
966 if (scrollbar == m_hBar.get()) 972 if (scrollbar == horizontalScrollbar())
967 return IntSize(horizontalScrollbarStart(0), box().size().height() - box( ).borderBottom() - scrollbar->height()); 973 return IntSize(horizontalScrollbarStart(0), box().size().height() - box( ).borderBottom() - scrollbar->height());
968 974
969 ASSERT_NOT_REACHED(); 975 ASSERT_NOT_REACHED();
970 return IntSize(); 976 return IntSize();
971 } 977 }
972 978
973 static inline LayoutObject* layoutObjectForScrollbar(LayoutObject& layoutObject) 979 static inline LayoutObject* layoutObjectForScrollbar(LayoutObject& layoutObject)
974 { 980 {
975 if (Node* node = layoutObject.node()) { 981 if (Node* node = layoutObject.node()) {
976 if (layoutObject.isLayoutView()) { 982 if (layoutObject.isLayoutView()) {
(...skipping 25 matching lines...) Expand all
1002 } 1008 }
1003 1009
1004 return &layoutObject; 1010 return &layoutObject;
1005 } 1011 }
1006 1012
1007 bool DeprecatedPaintLayerScrollableArea::needsScrollbarReconstruction() const 1013 bool DeprecatedPaintLayerScrollableArea::needsScrollbarReconstruction() const
1008 { 1014 {
1009 LayoutObject* actualLayoutObject = layoutObjectForScrollbar(box()); 1015 LayoutObject* actualLayoutObject = layoutObjectForScrollbar(box());
1010 bool shouldUseCustom = actualLayoutObject->isBox() && actualLayoutObject->st yle()->hasPseudoStyle(SCROLLBAR); 1016 bool shouldUseCustom = actualLayoutObject->isBox() && actualLayoutObject->st yle()->hasPseudoStyle(SCROLLBAR);
1011 bool hasAnyScrollbar = hasScrollbar(); 1017 bool hasAnyScrollbar = hasScrollbar();
1012 bool hasCustom = (m_hBar && m_hBar->isCustomScrollbar()) || (m_vBar && m_vBa r->isCustomScrollbar()); 1018 bool hasCustom = (hasHorizontalScrollbar() && horizontalScrollbar()->isCusto mScrollbar()) || (hasVerticalScrollbar() && verticalScrollbar()->isCustomScrollb ar());
1013 return hasAnyScrollbar && (shouldUseCustom != hasCustom); 1019 return hasAnyScrollbar && (shouldUseCustom != hasCustom);
1014 } 1020 }
1015 1021
1016 PassRefPtrWillBeRawPtr<Scrollbar> DeprecatedPaintLayerScrollableArea::createScro llbar(ScrollbarOrientation orientation)
1017 {
1018 RefPtrWillBeRawPtr<Scrollbar> widget = nullptr;
1019 LayoutObject* actualLayoutObject = layoutObjectForScrollbar(box());
1020 bool hasCustomScrollbarStyle = actualLayoutObject->isBox() && actualLayoutOb ject->style()->hasPseudoStyle(SCROLLBAR);
1021 if (hasCustomScrollbarStyle) {
1022 widget = LayoutScrollbar::createCustomScrollbar(this, orientation, actua lLayoutObject->node());
1023 } else {
1024 ScrollbarControlSize scrollbarSize = RegularScrollbar;
1025 if (actualLayoutObject->style()->hasAppearance())
1026 scrollbarSize = LayoutTheme::theme().scrollbarControlSizeForPart(act ualLayoutObject->style()->appearance());
1027 widget = Scrollbar::create(this, orientation, scrollbarSize);
1028 if (orientation == HorizontalScrollbar)
1029 didAddScrollbar(widget.get(), HorizontalScrollbar);
1030 else
1031 didAddScrollbar(widget.get(), VerticalScrollbar);
1032 }
1033 box().document().view()->addChild(widget.get());
1034 return widget.release();
1035 }
1036
1037 void DeprecatedPaintLayerScrollableArea::destroyScrollbar(ScrollbarOrientation o rientation)
1038 {
1039 RefPtrWillBeMember<Scrollbar>& scrollbar = orientation == HorizontalScrollba r ? m_hBar : m_vBar;
1040 if (!scrollbar)
1041 return;
1042
1043 if (!scrollbar->isCustomScrollbar())
1044 willRemoveScrollbar(scrollbar.get(), orientation);
1045
1046 toFrameView(scrollbar->parent())->removeChild(scrollbar.get());
1047 scrollbar->disconnectFromScrollableArea();
1048 scrollbar = nullptr;
1049 }
1050
1051 void DeprecatedPaintLayerScrollableArea::setHasHorizontalScrollbar(bool hasScrol lbar) 1022 void DeprecatedPaintLayerScrollableArea::setHasHorizontalScrollbar(bool hasScrol lbar)
1052 { 1023 {
1053 if (hasScrollbar == hasHorizontalScrollbar()) 1024 if (hasScrollbar == hasHorizontalScrollbar())
1054 return; 1025 return;
1055 1026
1056 if (hasScrollbar) { 1027 if (!hasScrollbar && !layerForHorizontalScrollbar())
1057 // This doesn't hit in any tests, but since the equivalent code in setHa sVerticalScrollbar 1028 horizontalScrollbar()->invalidate();
1058 // does, presumably this code does as well.
1059 DisableCompositingQueryAsserts disabler;
1060 m_hBar = createScrollbar(HorizontalScrollbar);
1061 } else {
1062 if (!layerForHorizontalScrollbar())
1063 m_hBar->invalidate();
1064 // Otherwise we will remove the layer and just need recompositing.
1065 1029
1066 destroyScrollbar(HorizontalScrollbar); 1030 m_scrollbarManager.setHasHorizontalScrollbar(hasScrollbar);
1067 }
1068 1031
1069 // Destroying or creating one bar can cause our scrollbar corner to come and go. We need to update the opposite scrollbar's style. 1032 // Destroying or creating one bar can cause our scrollbar corner to come and go. We need to update the opposite scrollbar's style.
1070 if (m_hBar) 1033 if (hasHorizontalScrollbar())
1071 m_hBar->styleChanged(); 1034 horizontalScrollbar()->styleChanged();
1072 if (m_vBar) 1035 if (hasVerticalScrollbar())
1073 m_vBar->styleChanged(); 1036 verticalScrollbar()->styleChanged();
1074 1037
1075 // These are valid because we want to invalidate display item clients on the current backing. 1038 // These are valid because we want to invalidate display item clients on the current backing.
1076 DisablePaintInvalidationStateAsserts paintInvalidationAssertDisabler; 1039 DisablePaintInvalidationStateAsserts paintInvalidationAssertDisabler;
1077 DisableCompositingQueryAsserts compositingAssertDisabler; 1040 DisableCompositingQueryAsserts compositingAssertDisabler;
1078 invalidateScrollCorner(scrollCornerRect()); 1041 invalidateScrollCorner(scrollCornerRect());
1079 1042
1080 // Force an update since we know the scrollbars have changed things. 1043 // Force an update since we know the scrollbars have changed things.
1081 if (box().document().hasAnnotatedRegions()) 1044 if (box().document().hasAnnotatedRegions())
1082 box().document().setAnnotatedRegionsDirty(true); 1045 box().document().setAnnotatedRegionsDirty(true);
1083 } 1046 }
1084 1047
1085 void DeprecatedPaintLayerScrollableArea::setHasVerticalScrollbar(bool hasScrollb ar) 1048 void DeprecatedPaintLayerScrollableArea::setHasVerticalScrollbar(bool hasScrollb ar)
1086 { 1049 {
1087 if (hasScrollbar == hasVerticalScrollbar()) 1050 if (hasScrollbar == hasVerticalScrollbar())
1088 return; 1051 return;
1089 1052
1090 if (hasScrollbar) { 1053 if (!hasScrollbar && !layerForVerticalScrollbar())
1091 // Hits in compositing/overflow/automatically-opt-into-composited-scroll ing-after-style-change.html 1054 verticalScrollbar()->invalidate();
1092 DisableCompositingQueryAsserts disabler;
1093 m_vBar = createScrollbar(VerticalScrollbar);
1094 } else {
1095 if (!layerForVerticalScrollbar())
1096 m_vBar->invalidate();
1097 // Otherwise we will remove the layer and just need recompositing.
1098 1055
1099 destroyScrollbar(VerticalScrollbar); 1056 m_scrollbarManager.setHasVerticalScrollbar(hasScrollbar);
1100 }
1101 1057
1102 // Destroying or creating one bar can cause our scrollbar corner to come and go. We need to update the opposite scrollbar's style. 1058 // Destroying or creating one bar can cause our scrollbar corner to come and go. We need to update the opposite scrollbar's style.
1103 if (m_hBar) 1059 if (hasHorizontalScrollbar())
1104 m_hBar->styleChanged(); 1060 horizontalScrollbar()->styleChanged();
1105 if (m_vBar) 1061 if (hasVerticalScrollbar())
1106 m_vBar->styleChanged(); 1062 verticalScrollbar()->styleChanged();
1107 1063
1108 // These are valid because we want to invalidate display item clients on the current backing. 1064 // These are valid because we want to invalidate display item clients on the current backing.
1109 DisablePaintInvalidationStateAsserts paintInvalidationAssertDisabler; 1065 DisablePaintInvalidationStateAsserts paintInvalidationAssertDisabler;
1110 DisableCompositingQueryAsserts compositingAssertDisabler; 1066 DisableCompositingQueryAsserts compositingAssertDisabler;
1111 invalidateScrollCorner(scrollCornerRect()); 1067 invalidateScrollCorner(scrollCornerRect());
1112 1068
1113 // Force an update since we know the scrollbars have changed things. 1069 // Force an update since we know the scrollbars have changed things.
1114 if (box().document().hasAnnotatedRegions()) 1070 if (box().document().hasAnnotatedRegions())
1115 box().document().setAnnotatedRegionsDirty(true); 1071 box().document().setAnnotatedRegionsDirty(true);
1116 } 1072 }
1117 1073
1118 int DeprecatedPaintLayerScrollableArea::verticalScrollbarWidth(OverlayScrollbarS izeRelevancy relevancy) const 1074 int DeprecatedPaintLayerScrollableArea::verticalScrollbarWidth(OverlayScrollbarS izeRelevancy relevancy) const
1119 { 1075 {
1120 if (!m_vBar || (m_vBar->isOverlayScrollbar() && (relevancy == IgnoreOverlayS crollbarSize || !m_vBar->shouldParticipateInHitTesting()))) 1076 if (!hasVerticalScrollbar() || (verticalScrollbar()->isOverlayScrollbar() && (relevancy == IgnoreOverlayScrollbarSize || !verticalScrollbar()->shouldPartici pateInHitTesting())))
1121 return 0; 1077 return 0;
1122 return m_vBar->width(); 1078 return verticalScrollbar()->width();
1123 } 1079 }
1124 1080
1125 int DeprecatedPaintLayerScrollableArea::horizontalScrollbarHeight(OverlayScrollb arSizeRelevancy relevancy) const 1081 int DeprecatedPaintLayerScrollableArea::horizontalScrollbarHeight(OverlayScrollb arSizeRelevancy relevancy) const
1126 { 1082 {
1127 if (!m_hBar || (m_hBar->isOverlayScrollbar() && (relevancy == IgnoreOverlayS crollbarSize || !m_hBar->shouldParticipateInHitTesting()))) 1083 if (!hasHorizontalScrollbar() || (horizontalScrollbar()->isOverlayScrollbar( ) && (relevancy == IgnoreOverlayScrollbarSize || !horizontalScrollbar()->shouldP articipateInHitTesting())))
1128 return 0; 1084 return 0;
1129 return m_hBar->height(); 1085 return horizontalScrollbar()->height();
1130 } 1086 }
1131 1087
1132 void DeprecatedPaintLayerScrollableArea::positionOverflowControls() 1088 void DeprecatedPaintLayerScrollableArea::positionOverflowControls()
1133 { 1089 {
1134 if (!hasScrollbar() && !box().canResize()) 1090 if (!hasScrollbar() && !box().canResize())
1135 return; 1091 return;
1136 1092
1137 const IntRect borderBox = box().pixelSnappedBorderBoxRect(); 1093 const IntRect borderBox = box().pixelSnappedBorderBoxRect();
1138 if (Scrollbar* verticalScrollbar = this->verticalScrollbar()) 1094 if (Scrollbar* verticalScrollbar = this->verticalScrollbar())
1139 verticalScrollbar->setFrameRect(rectForVerticalScrollbar(borderBox)); 1095 verticalScrollbar->setFrameRect(rectForVerticalScrollbar(borderBox));
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1182 return false; 1138 return false;
1183 1139
1184 IntRect resizeControlRect; 1140 IntRect resizeControlRect;
1185 if (box().style()->resize() != RESIZE_NONE) { 1141 if (box().style()->resize() != RESIZE_NONE) {
1186 resizeControlRect = resizerCornerRect(box().pixelSnappedBorderBoxRect(), ResizerForPointer); 1142 resizeControlRect = resizerCornerRect(box().pixelSnappedBorderBoxRect(), ResizerForPointer);
1187 if (resizeControlRect.contains(localPoint)) 1143 if (resizeControlRect.contains(localPoint))
1188 return true; 1144 return true;
1189 } 1145 }
1190 1146
1191 int resizeControlSize = max(resizeControlRect.height(), 0); 1147 int resizeControlSize = max(resizeControlRect.height(), 0);
1192 if (m_vBar && m_vBar->shouldParticipateInHitTesting()) { 1148 if (hasVerticalScrollbar() && verticalScrollbar()->shouldParticipateInHitTes ting()) {
1193 LayoutRect vBarRect(verticalScrollbarStart(0, box().size().width()), 1149 LayoutRect vBarRect(verticalScrollbarStart(0, box().size().width()),
1194 box().borderTop(), 1150 box().borderTop(),
1195 m_vBar->width(), 1151 verticalScrollbar()->width(),
1196 box().size().height() - (box().borderTop() + box().borderBottom()) - (m_hBar ? m_hBar->height() : resizeControlSize)); 1152 box().size().height() - (box().borderTop() + box().borderBottom()) - (hasHorizontalScrollbar() ? horizontalScrollbar()->height() : resizeControlSize ));
1197 if (vBarRect.contains(localPoint)) { 1153 if (vBarRect.contains(localPoint)) {
1198 result.setScrollbar(m_vBar.get()); 1154 result.setScrollbar(verticalScrollbar());
1199 return true; 1155 return true;
1200 } 1156 }
1201 } 1157 }
1202 1158
1203 resizeControlSize = max(resizeControlRect.width(), 0); 1159 resizeControlSize = max(resizeControlRect.width(), 0);
1204 if (m_hBar && m_hBar->shouldParticipateInHitTesting()) { 1160 if (hasHorizontalScrollbar() && horizontalScrollbar()->shouldParticipateInHi tTesting()) {
1205 LayoutRect hBarRect(horizontalScrollbarStart(0), 1161 LayoutRect hBarRect(horizontalScrollbarStart(0),
1206 box().size().height() - box().borderBottom() - m_hBar->height(), 1162 box().size().height() - box().borderBottom() - horizontalScrollbar() ->height(),
1207 box().size().width() - (box().borderLeft() + box().borderRight()) - (m_vBar ? m_vBar->width() : resizeControlSize), 1163 box().size().width() - (box().borderLeft() + box().borderRight()) - (hasVerticalScrollbar() ? verticalScrollbar()->width() : resizeControlSize),
1208 m_hBar->height()); 1164 horizontalScrollbar()->height());
1209 if (hBarRect.contains(localPoint)) { 1165 if (hBarRect.contains(localPoint)) {
1210 result.setScrollbar(m_hBar.get()); 1166 result.setScrollbar(horizontalScrollbar());
1211 return true; 1167 return true;
1212 } 1168 }
1213 } 1169 }
1214 1170
1215 // FIXME: We should hit test the m_scrollCorner and pass it back through the result. 1171 // FIXME: We should hit test the m_scrollCorner and pass it back through the result.
1216 1172
1217 return false; 1173 return false;
1218 } 1174 }
1219 1175
1220 IntRect DeprecatedPaintLayerScrollableArea::resizerCornerRect(const IntRect& bou nds, ResizerHitTestType resizerHitTestType) const 1176 IntRect DeprecatedPaintLayerScrollableArea::resizerCornerRect(const IntRect& bou nds, ResizerHitTestType resizerHitTestType) const
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
1501 if (!layer()->isRootLayer()) 1457 if (!layer()->isRootLayer())
1502 return false; 1458 return false;
1503 1459
1504 LocalFrame* frame = box().frame(); 1460 LocalFrame* frame = box().frame();
1505 if (!frame || !frame->isMainFrame() || !frame->settings()) 1461 if (!frame || !frame->isMainFrame() || !frame->settings())
1506 return false; 1462 return false;
1507 1463
1508 return frame->settings()->viewportMetaEnabled(); 1464 return frame->settings()->viewportMetaEnabled();
1509 } 1465 }
1510 1466
1467 DeprecatedPaintLayerScrollableArea::ScrollbarManager::ScrollbarManager(Deprecate dPaintLayerScrollableArea& scrollableArea)
1468 : m_scrollableArea(scrollableArea)
1469 , m_canDetachScrollbars(0)
1470 , m_hBarIsAttached(0)
1471 , m_vBarIsAttached(0)
1472 {
1473 }
1474
1475 void DeprecatedPaintLayerScrollableArea::ScrollbarManager::dispose()
1476 {
1477 m_canDetachScrollbars = m_hBarIsAttached = m_vBarIsAttached = 0;
1478 destroyScrollbar(HorizontalScrollbar);
1479 destroyScrollbar(VerticalScrollbar);
1480 }
1481
1482 void DeprecatedPaintLayerScrollableArea::ScrollbarManager::setCanDetachScrollbar s(bool detach)
1483 {
1484 ASSERT(!m_hBarIsAttached || m_hBar);
1485 ASSERT(!m_vBarIsAttached || m_vBar);
1486 m_canDetachScrollbars = detach ? 1 : 0;
1487 if (!detach) {
1488 if (m_hBar && !m_hBarIsAttached)
1489 destroyScrollbar(HorizontalScrollbar, true);
1490 if (m_vBar && !m_vBarIsAttached)
1491 destroyScrollbar(VerticalScrollbar, true);
1492 }
1493 }
1494
1495 void DeprecatedPaintLayerScrollableArea::ScrollbarManager::setHasHorizontalScrol lbar(bool hasScrollbar)
1496 {
1497 if (hasScrollbar) {
1498 // This doesn't hit in any tests, but since the equivalent code in setHa sVerticalScrollbar
1499 // does, presumably this code does as well.
1500 DisableCompositingQueryAsserts disabler;
1501 if (!m_hBar)
1502 m_hBar = createScrollbar(HorizontalScrollbar);
1503 m_hBarIsAttached = 1;
1504 } else {
1505 m_hBarIsAttached = 0;
1506 if (!m_canDetachScrollbars)
1507 destroyScrollbar(HorizontalScrollbar);
1508 }
1509 }
1510
1511 void DeprecatedPaintLayerScrollableArea::ScrollbarManager::setHasVerticalScrollb ar(bool hasScrollbar)
1512 {
1513 if (hasScrollbar) {
1514 DisableCompositingQueryAsserts disabler;
1515 if (!m_vBar)
1516 m_vBar = createScrollbar(VerticalScrollbar);
1517 m_vBarIsAttached = 1;
1518 } else {
1519 m_vBarIsAttached = 0;
1520 if (!m_canDetachScrollbars)
1521 destroyScrollbar(VerticalScrollbar);
1522 }
1523 }
1524
1525 PassRefPtrWillBeRawPtr<Scrollbar> DeprecatedPaintLayerScrollableArea::ScrollbarM anager::createScrollbar(ScrollbarOrientation orientation)
1526 {
1527 ASSERT(orientation == HorizontalScrollbar ? !m_hBarIsAttached : !m_vBarIsAtt ached);
1528 RefPtrWillBeRawPtr<Scrollbar> widget = nullptr;
1529 LayoutObject* actualLayoutObject = layoutObjectForScrollbar(m_scrollableArea .box());
1530 bool hasCustomScrollbarStyle = actualLayoutObject->isBox() && actualLayoutOb ject->style()->hasPseudoStyle(SCROLLBAR);
1531 if (hasCustomScrollbarStyle) {
1532 widget = LayoutScrollbar::createCustomScrollbar(&m_scrollableArea, orien tation, actualLayoutObject->node());
1533 } else {
1534 ScrollbarControlSize scrollbarSize = RegularScrollbar;
1535 if (actualLayoutObject->style()->hasAppearance())
1536 scrollbarSize = LayoutTheme::theme().scrollbarControlSizeForPart(act ualLayoutObject->style()->appearance());
1537 widget = Scrollbar::create(&m_scrollableArea, orientation, scrollbarSize );
1538 if (orientation == HorizontalScrollbar)
1539 m_scrollableArea.didAddScrollbar(widget.get(), HorizontalScrollbar);
1540 else
1541 m_scrollableArea.didAddScrollbar(widget.get(), VerticalScrollbar);
1542 }
1543 m_scrollableArea.box().document().view()->addChild(widget.get());
1544 return widget.release();
1545 }
1546
1547 void DeprecatedPaintLayerScrollableArea::ScrollbarManager::destroyScrollbar(Scro llbarOrientation orientation, bool invalidate)
1548 {
1549 RefPtrWillBeMember<Scrollbar>& scrollbar = orientation == HorizontalScrollba r ? m_hBar : m_vBar;
1550 ASSERT(orientation == HorizontalScrollbar ? !m_hBarIsAttached: !m_vBarIsAtta ched);
1551 if (!scrollbar)
1552 return;
1553
1554 if (invalidate)
1555 scrollbar->invalidate();
1556 if (!scrollbar->isCustomScrollbar())
1557 m_scrollableArea.willRemoveScrollbar(scrollbar.get(), orientation);
1558
1559 toFrameView(scrollbar->parent())->removeChild(scrollbar.get());
1560 scrollbar->disconnectFromScrollableArea();
1561 scrollbar = nullptr;
1562 }
1563
1564 DEFINE_TRACE(DeprecatedPaintLayerScrollableArea::ScrollbarManager)
1565 {
1566 visitor->trace(m_hBar);
1567 visitor->trace(m_vBar);
1568 }
1569
1511 } // namespace blink 1570 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/paint/DeprecatedPaintLayerScrollableArea.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698