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

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

Issue 1295933003: Add overflow:auto scrollbars to child flex basis. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Add entries to SlowTests Created 5 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « 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 632 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 void DeprecatedPaintLayerScrollableArea::scrollToOffset(const DoubleSize& scroll Offset, ScrollOffsetClamping clamp, ScrollBehavior scrollBehavior) 643 void DeprecatedPaintLayerScrollableArea::scrollToOffset(const DoubleSize& scroll Offset, ScrollOffsetClamping clamp, ScrollBehavior scrollBehavior)
644 { 644 {
645 cancelProgrammaticScrollAnimation(); 645 cancelProgrammaticScrollAnimation();
646 DoubleSize newScrollOffset = clamp == ScrollOffsetClamped ? clampScrollOffse t(scrollOffset) : scrollOffset; 646 DoubleSize newScrollOffset = clamp == ScrollOffsetClamped ? clampScrollOffse t(scrollOffset) : scrollOffset;
647 if (newScrollOffset != adjustedScrollOffset()) { 647 if (newScrollOffset != adjustedScrollOffset()) {
648 DoublePoint origin(scrollOrigin()); 648 DoublePoint origin(scrollOrigin());
649 ScrollableArea::setScrollPosition(-origin + newScrollOffset, Programmati cScroll, scrollBehavior); 649 ScrollableArea::setScrollPosition(-origin + newScrollOffset, Programmati cScroll, scrollBehavior);
650 } 650 }
651 } 651 }
652 652
653 void DeprecatedPaintLayerScrollableArea::updateAfterLayout() 653 void DeprecatedPaintLayerScrollableArea::updateScrollDimensions(DoubleSize& scro llOffset, bool& autoHorizontalScrollBarChanged, bool& autoVerticalScrollBarChang ed)
654 { 654 {
655 ASSERT(box().hasOverflowClip()); 655 ASSERT(box().hasOverflowClip());
656 656
657 if (needsScrollbarReconstruction()) { 657 if (needsScrollbarReconstruction()) {
658 if (m_hBar) 658 if (m_hBar)
659 destroyScrollbar(HorizontalScrollbar); 659 destroyScrollbar(HorizontalScrollbar);
660 if (m_vBar) 660 if (m_vBar)
661 destroyScrollbar(VerticalScrollbar); 661 destroyScrollbar(VerticalScrollbar);
662 } 662 }
663 663
664 DoubleSize originalScrollOffset = adjustedScrollOffset(); 664 scrollOffset = adjustedScrollOffset();
665 computeScrollDimensions(); 665 computeScrollDimensions();
666 bool hasHorizontalOverflow = this->hasHorizontalOverflow();
667 bool hasVerticalOverflow = this->hasVerticalOverflow();
668 if (hasOverlayScrollbars()) {
669 if (!scrollSize(HorizontalScrollbar))
670 setHasHorizontalScrollbar(false);
671 if (!scrollSize(VerticalScrollbar))
672 setHasVerticalScrollbar(false);
673 }
674
675 // overflow:auto may need to lay out again if scrollbars got added/removed.
676 autoHorizontalScrollBarChanged = (box().hasAutoHorizontalScrollbar() && (has HorizontalScrollbar() != hasHorizontalOverflow)) || (box().style()->overflowX() == OSCROLL && !horizontalScrollbar());
677 autoVerticalScrollBarChanged = (box().hasAutoVerticalScrollbar() && (hasVert icalScrollbar() != hasVerticalOverflow)) || (box().style()->overflowY() == OSCRO LL && !verticalScrollbar());
678 if (!visualViewportSuppliesScrollbars() && (autoHorizontalScrollBarChanged | | autoVerticalScrollBarChanged)) {
679 if (box().hasAutoHorizontalScrollbar() || (box().style()->overflowX() == OSCROLL && !horizontalScrollbar()))
680 setHasHorizontalScrollbar(box().style()->overflowX() == OSCROLL ? tr ue : hasHorizontalOverflow);
681 if (box().hasAutoVerticalScrollbar() || (box().style()->overflowY() == O SCROLL && !verticalScrollbar()))
682 setHasVerticalScrollbar(box().style()->overflowY() == OSCROLL ? true : hasVerticalOverflow);
683 }
684 }
685
686 void DeprecatedPaintLayerScrollableArea::finalizeScrollDimensions(const DoubleSi ze& originalScrollOffset, bool autoHorizontalScrollBarChanged, bool autoVertical ScrollBarChanged)
687 {
688 ASSERT(box().hasOverflowClip());
666 689
667 // Layout may cause us to be at an invalid scroll position. In this case we need 690 // Layout may cause us to be at an invalid scroll position. In this case we need
668 // to pull our scroll offsets back to the max (or push them up to the min). 691 // to pull our scroll offsets back to the max (or push them up to the min).
669 DoubleSize clampedScrollOffset = clampScrollOffset(adjustedScrollOffset()); 692 DoubleSize clampedScrollOffset = clampScrollOffset(adjustedScrollOffset());
670 if (clampedScrollOffset != adjustedScrollOffset()) 693 if (clampedScrollOffset != adjustedScrollOffset())
671 scrollToOffset(clampedScrollOffset); 694 scrollToOffset(clampedScrollOffset);
672 695
673 if (originalScrollOffset != adjustedScrollOffset()) { 696 if (originalScrollOffset != adjustedScrollOffset()) {
674 DoublePoint origin(scrollOrigin()); 697 DoublePoint origin(scrollOrigin());
675 scrollPositionChanged(-origin + adjustedScrollOffset(), ProgrammaticScro ll); 698 scrollPositionChanged(-origin + adjustedScrollOffset(), ProgrammaticScro ll);
676 } 699 }
677 700
678 bool hasHorizontalOverflow = this->hasHorizontalOverflow(); 701 bool hasHorizontalOverflow = this->hasHorizontalOverflow();
679 bool hasVerticalOverflow = this->hasVerticalOverflow(); 702 bool hasVerticalOverflow = this->hasVerticalOverflow();
680 703
681 { 704 {
682 // Hits in compositing/overflow/automatically-opt-into-composited-scroll ing-after-style-change.html. 705 // Hits in compositing/overflow/automatically-opt-into-composited-scroll ing-after-style-change.html.
683 DisableCompositingQueryAsserts disabler; 706 DisableCompositingQueryAsserts disabler;
684 707
685 // overflow:scroll should just enable/disable. 708 // overflow:scroll should just enable/disable.
686 if (box().style()->overflowX() == OSCROLL && horizontalScrollbar()) 709 if (box().style()->overflowX() == OSCROLL && horizontalScrollbar())
687 horizontalScrollbar()->setEnabled(hasHorizontalOverflow); 710 horizontalScrollbar()->setEnabled(hasHorizontalOverflow);
688 if (box().style()->overflowY() == OSCROLL && verticalScrollbar()) 711 if (box().style()->overflowY() == OSCROLL && verticalScrollbar())
689 verticalScrollbar()->setEnabled(hasVerticalOverflow); 712 verticalScrollbar()->setEnabled(hasVerticalOverflow);
690 } 713 }
691 714
692 // We need to layout again if scrollbars are added or removed by overflow:au to, 715 if (!visualViewportSuppliesScrollbars() && (autoHorizontalScrollBarChanged | | autoVerticalScrollBarChanged)) {
693 // or by changing between native and custom.
694 bool horizontalScrollBarChanged = (box().hasAutoHorizontalScrollbar() && (ha sHorizontalScrollbar() != hasHorizontalOverflow))
695 || (box().style()->overflowX() == OSCROLL && !horizontalScrollbar());
696 bool verticalScrollBarChanged = (box().hasAutoVerticalScrollbar() && (hasVer ticalScrollbar() != hasVerticalOverflow))
697 || (box().style()->overflowY() == OSCROLL && !verticalScrollbar());
698 if (!visualViewportSuppliesScrollbars() && (horizontalScrollBarChanged || ve rticalScrollBarChanged)) {
699 if (box().hasAutoHorizontalScrollbar() || (box().style()->overflowX() == OSCROLL && !horizontalScrollbar()))
700 setHasHorizontalScrollbar(box().style()->overflowX() == OSCROLL ? tr ue : hasHorizontalOverflow);
701 if (box().hasAutoVerticalScrollbar() || (box().style()->overflowY() == O SCROLL && !verticalScrollbar()))
702 setHasVerticalScrollbar(box().style()->overflowY() == OSCROLL ? true : hasVerticalOverflow);
703
704 if (hasVerticalOverflow || hasHorizontalOverflow) 716 if (hasVerticalOverflow || hasHorizontalOverflow)
705 updateScrollCornerStyle(); 717 updateScrollCornerStyle();
706 718
707 layer()->updateSelfPaintingLayer(); 719 layer()->updateSelfPaintingLayer();
708 720
709 // Force an update since we know the scrollbars have changed things. 721 // Force an update since we know the scrollbars have changed things.
710 if (box().document().hasAnnotatedRegions()) 722 if (box().document().hasAnnotatedRegions())
711 box().document().setAnnotatedRegionsDirty(true); 723 box().document().setAnnotatedRegionsDirty(true);
712 724
713 // Our proprietary overflow: overlay value doesn't trigger a layout. 725 // Our proprietary overflow: overlay value doesn't trigger a layout.
714 if ((horizontalScrollBarChanged && box().style()->overflowX() != OOVERLA Y) || (verticalScrollBarChanged && box().style()->overflowY() != OOVERLAY)) { 726 if ((autoHorizontalScrollBarChanged && box().style()->overflowX() != OOV ERLAY) || (autoVerticalScrollBarChanged && box().style()->overflowY() != OOVERLA Y)) {
715 if (!m_inOverflowRelayout) { 727 if (!m_inOverflowRelayout) {
716 m_inOverflowRelayout = true; 728 m_inOverflowRelayout = true;
717 SubtreeLayoutScope layoutScope(box()); 729 SubtreeLayoutScope layoutScope(box());
718 layoutScope.setNeedsLayout(&box(), LayoutInvalidationReason::Scr ollbarChanged); 730 layoutScope.setNeedsLayout(&box(), LayoutInvalidationReason::Scr ollbarChanged);
719 if (box().isLayoutBlock()) { 731 if (box().isLayoutBlock()) {
720 LayoutBlock& block = toLayoutBlock(box()); 732 LayoutBlock& block = toLayoutBlock(box());
721 block.scrollbarsChanged(horizontalScrollBarChanged, vertical ScrollBarChanged); 733 block.scrollbarsChanged(autoHorizontalScrollBarChanged, auto VerticalScrollBarChanged);
722 block.layoutBlock(true); 734 block.layoutBlock(true);
723 } else { 735 } else {
724 box().layout(); 736 box().layout();
725 } 737 }
726 m_inOverflowRelayout = false; 738 m_inOverflowRelayout = false;
727 } 739 }
728 } 740 }
729 } 741 }
730 742
731 { 743 {
(...skipping 18 matching lines...) Expand all
750 setHasVerticalScrollbar(false); 762 setHasVerticalScrollbar(false);
751 } 763 }
752 764
753 bool hasOverflow = hasScrollableHorizontalOverflow() || hasScrollableVertica lOverflow(); 765 bool hasOverflow = hasScrollableHorizontalOverflow() || hasScrollableVertica lOverflow();
754 updateScrollableAreaSet(hasOverflow); 766 updateScrollableAreaSet(hasOverflow);
755 767
756 DisableCompositingQueryAsserts disabler; 768 DisableCompositingQueryAsserts disabler;
757 positionOverflowControls(); 769 positionOverflowControls();
758 } 770 }
759 771
772 void DeprecatedPaintLayerScrollableArea::updateAfterLayout()
773 {
774 DoubleSize originalScrollOffset;
775 bool autoHorizontalScrollBarChanged;
776 bool autoVerticalScrollBarChanged;
777 updateScrollDimensions(originalScrollOffset, autoHorizontalScrollBarChanged, autoVerticalScrollBarChanged);
778 finalizeScrollDimensions(originalScrollOffset, autoHorizontalScrollBarChange d, autoVerticalScrollBarChanged);
779 }
780
760 ScrollBehavior DeprecatedPaintLayerScrollableArea::scrollBehaviorStyle() const 781 ScrollBehavior DeprecatedPaintLayerScrollableArea::scrollBehaviorStyle() const
761 { 782 {
762 return box().style()->scrollBehavior(); 783 return box().style()->scrollBehavior();
763 } 784 }
764 785
765 bool DeprecatedPaintLayerScrollableArea::hasHorizontalOverflow() const 786 bool DeprecatedPaintLayerScrollableArea::hasHorizontalOverflow() const
766 { 787 {
767 return pixelSnappedScrollWidth() > box().pixelSnappedClientWidth(); 788 return pixelSnappedScrollWidth() > box().pixelSnappedClientWidth();
768 } 789 }
769 790
(...skipping 709 matching lines...) Expand 10 before | Expand all | Expand 10 after
1479 return false; 1500 return false;
1480 1501
1481 LocalFrame* frame = box().frame(); 1502 LocalFrame* frame = box().frame();
1482 if (!frame || !frame->isMainFrame() || !frame->settings()) 1503 if (!frame || !frame->isMainFrame() || !frame->settings())
1483 return false; 1504 return false;
1484 1505
1485 return frame->settings()->viewportMetaEnabled(); 1506 return frame->settings()->viewportMetaEnabled();
1486 } 1507 }
1487 1508
1488 } // namespace blink 1509 } // namespace blink
OLDNEW
« no previous file with comments | « Source/core/paint/DeprecatedPaintLayerScrollableArea.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698