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

Side by Side Diff: Source/WebCore/rendering/RenderLayer.cpp

Issue 13859006: Rework composited scrolling updates. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@early-out2
Patch Set: . Created 7 years, 8 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
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 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
139 return hitTestLocation.intersects(m_rect); 139 return hitTestLocation.intersects(m_rect);
140 } 140 }
141 141
142 RenderLayer::RenderLayer(RenderLayerModelObject* renderer) 142 RenderLayer::RenderLayer(RenderLayerModelObject* renderer)
143 : m_inResizeMode(false) 143 : m_inResizeMode(false)
144 , m_scrollDimensionsDirty(true) 144 , m_scrollDimensionsDirty(true)
145 , m_normalFlowListDirty(true) 145 , m_normalFlowListDirty(true)
146 , m_hasSelfPaintingLayerDescendant(false) 146 , m_hasSelfPaintingLayerDescendant(false)
147 , m_hasSelfPaintingLayerDescendantDirty(false) 147 , m_hasSelfPaintingLayerDescendantDirty(false)
148 , m_hasOutOfFlowPositionedDescendant(false) 148 , m_hasOutOfFlowPositionedDescendant(false)
149 , m_hasOutOfFlowPositionedDescendantDirty(true) 149 , m_hasOutOfFlowPositionedDescendantDirty(false)
150 , m_needsCompositedScrolling(false) 150 , m_needsCompositedScrolling(false)
151 , m_descendantsAreContiguousInStackingOrder(false) 151 , m_descendantsAreContiguousInStackingOrder(false)
hartmanng 2013/04/10 17:34:05 should be true by default
Ian Vollick 2013/04/11 16:36:03 Done.
152 , m_descendantsAreContiguousInStackingOrderDirty(false)
152 , m_isRootLayer(renderer->isRenderView()) 153 , m_isRootLayer(renderer->isRenderView())
153 , m_usedTransparency(false) 154 , m_usedTransparency(false)
154 , m_paintingInsideReflection(false) 155 , m_paintingInsideReflection(false)
155 , m_inOverflowRelayout(false) 156 , m_inOverflowRelayout(false)
156 , m_repaintStatus(NeedsNormalRepaint) 157 , m_repaintStatus(NeedsNormalRepaint)
157 , m_visibleContentStatusDirty(true) 158 , m_visibleContentStatusDirty(true)
158 , m_hasVisibleContent(false) 159 , m_hasVisibleContent(false)
159 , m_visibleDescendantStatusDirty(false) 160 , m_visibleDescendantStatusDirty(false)
160 , m_hasVisibleDescendant(false) 161 , m_hasVisibleDescendant(false)
161 , m_isPaginated(false) 162 , m_isPaginated(false)
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after
588 // numSCDecendants = 3 589 // numSCDecendants = 3
589 // 590 //
590 // and so, 591 // and so,
591 // maxStackIndex - minStackIndex == numSCDescendants 592 // maxStackIndex - minStackIndex == numSCDescendants
592 // ===> 3 - 0 == 3 593 // ===> 3 - 0 == 3
593 // ===> 3 == 3 594 // ===> 3 == 3
594 // 595 //
595 // And we would conclude that C could be promoted. 596 // And we would conclude that C could be promoted.
596 void RenderLayer::updateDescendantsAreContiguousInStackingOrder() 597 void RenderLayer::updateDescendantsAreContiguousInStackingOrder()
597 { 598 {
598 if (!isStackingContext() || !acceleratedCompositingForOverflowScrollEnabled( )) 599 if (!m_descendantsAreContiguousInStackingOrderDirty || !isStackingContext() || !acceleratedCompositingForOverflowScrollEnabled()) {
600 m_descendantsAreContiguousInStackingOrderDirty = false;
599 return; 601 return;
600 602 }
601 ASSERT(!m_normalFlowListDirty);
602 ASSERT(!m_zOrderListsDirty);
603 603
604 OwnPtr<Vector<RenderLayer*> > posZOrderList; 604 OwnPtr<Vector<RenderLayer*> > posZOrderList;
605 OwnPtr<Vector<RenderLayer*> > negZOrderList; 605 OwnPtr<Vector<RenderLayer*> > negZOrderList;
606 rebuildZOrderLists(StopAtStackingContexts, posZOrderList, negZOrderList); 606 rebuildZOrderLists(StopAtStackingContexts, posZOrderList, negZOrderList);
607 607
608 // Create a reverse lookup. 608 // Create a reverse lookup.
609 HashMap<const RenderLayer*, int> lookup; 609 HashMap<const RenderLayer*, int> lookup;
610 610
611 if (negZOrderList) { 611 if (negZOrderList) {
612 int stackingOrderIndex = -1; 612 int stackingOrderIndex = -1;
(...skipping 15 matching lines...) Expand all
628 continue; 628 continue;
629 lookup.set(currentLayer, stackingOrderIndex++); 629 lookup.set(currentLayer, stackingOrderIndex++);
630 } 630 }
631 } 631 }
632 632
633 int minIndex = 0; 633 int minIndex = 0;
634 int maxIndex = 0; 634 int maxIndex = 0;
635 int count = 0; 635 int count = 0;
636 bool firstIteration = true; 636 bool firstIteration = true;
637 updateDescendantsAreContiguousInStackingOrderRecursive(lookup, minIndex, max Index, count, firstIteration); 637 updateDescendantsAreContiguousInStackingOrderRecursive(lookup, minIndex, max Index, count, firstIteration);
638
639 m_descendantsAreContiguousInStackingOrderDirty = false;
638 } 640 }
639 641
640 void RenderLayer::updateDescendantsAreContiguousInStackingOrderRecursive(const H ashMap<const RenderLayer*, int>& lookup, int& minIndex, int& maxIndex, int& coun t, bool firstIteration) 642 void RenderLayer::updateDescendantsAreContiguousInStackingOrderRecursive(const H ashMap<const RenderLayer*, int>& lookup, int& minIndex, int& maxIndex, int& coun t, bool firstIteration)
641 { 643 {
644 m_descendantsAreContiguousInStackingOrderDirty = false;
645
642 if (isStackingContext() && !firstIteration) { 646 if (isStackingContext() && !firstIteration) {
643 if (lookup.contains(this)) { 647 if (lookup.contains(this)) {
644 minIndex = std::min(minIndex, lookup.get(this)); 648 minIndex = std::min(minIndex, lookup.get(this));
645 maxIndex = std::max(maxIndex, lookup.get(this)); 649 maxIndex = std::max(maxIndex, lookup.get(this));
646 count++; 650 count++;
647 } 651 }
648 return; 652 return;
649 } 653 }
650 654
651 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) { 655 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) {
652 int childMinIndex = 0; 656 int childMinIndex = 0;
653 int childMaxIndex = 0; 657 int childMaxIndex = 0;
654 int childCount = 0; 658 int childCount = 0;
655 child->updateDescendantsAreContiguousInStackingOrderRecursive(lookup, ch ildMinIndex, childMaxIndex, childCount, false); 659 child->updateDescendantsAreContiguousInStackingOrderRecursive(lookup, ch ildMinIndex, childMaxIndex, childCount, false);
656 if (childCount) { 660 if (childCount) {
657 count += childCount; 661 count += childCount;
658 minIndex = std::min(minIndex, childMinIndex); 662 minIndex = std::min(minIndex, childMinIndex);
659 maxIndex = std::max(maxIndex, childMaxIndex); 663 maxIndex = std::max(maxIndex, childMaxIndex);
660 } 664 }
661 } 665 }
662 666
663 if (!isStackingContext()) { 667 if (!isStackingContext()) {
664 bool newValue = maxIndex - minIndex == count; 668 m_descendantsAreContiguousInStackingOrder = maxIndex - minIndex == count ;
665 bool didUpdate = newValue != m_descendantsAreContiguousInStackingOrder;
666 m_descendantsAreContiguousInStackingOrder = newValue;
667 if (didUpdate)
668 updateNeedsCompositedScrolling();
669 } 669 }
670 } 670 }
671 671
672 void RenderLayer::computeRepaintRects(const RenderLayerModelObject* repaintConta iner, const RenderGeometryMap* geometryMap) 672 void RenderLayer::computeRepaintRects(const RenderLayerModelObject* repaintConta iner, const RenderGeometryMap* geometryMap)
673 { 673 {
674 ASSERT(!m_visibleContentStatusDirty); 674 ASSERT(!m_visibleContentStatusDirty);
675 675
676 m_repaintRect = renderer()->clippedOverflowRectForRepaint(repaintContainer); 676 m_repaintRect = renderer()->clippedOverflowRectForRepaint(repaintContainer);
677 m_outlineBox = renderer()->outlineBoundsForRepaint(repaintContainer, geometr yMap); 677 m_outlineBox = renderer()->outlineBoundsForRepaint(repaintContainer, geometr yMap);
678 } 678 }
(...skipping 285 matching lines...) Expand 10 before | Expand all | Expand 10 after
964 if (curr == ancestorStackingContainer) 964 if (curr == ancestorStackingContainer)
965 return; 965 return;
966 } 966 }
967 } 967 }
968 968
969 bool RenderLayer::canBeStackingContainer() const 969 bool RenderLayer::canBeStackingContainer() const
970 { 970 {
971 if (isStackingContext() || !stackingContainer()) 971 if (isStackingContext() || !stackingContainer())
972 return true; 972 return true;
973 973
974 ASSERT(!m_descendantsAreContiguousInStackingOrderDirty);
974 return m_descendantsAreContiguousInStackingOrder; 975 return m_descendantsAreContiguousInStackingOrder;
975 } 976 }
976 977
977 void RenderLayer::setHasVisibleContent() 978 void RenderLayer::setHasVisibleContent()
978 { 979 {
979 if (m_hasVisibleContent && !m_visibleContentStatusDirty) { 980 if (m_hasVisibleContent && !m_visibleContentStatusDirty) {
980 ASSERT(!parent() || parent()->hasVisibleDescendant()); 981 ASSERT(!parent() || parent()->hasVisibleDescendant());
981 return; 982 return;
982 } 983 }
983 984
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
1044 childOutOfFlowDescendantContainingBlocks.add(child->renderer()-> containingBlock()); 1045 childOutOfFlowDescendantContainingBlocks.add(child->renderer()-> containingBlock());
1045 1046
1046 if (outOfFlowDescendantContainingBlocks) { 1047 if (outOfFlowDescendantContainingBlocks) {
1047 HashSet<const RenderObject*>::const_iterator it = childOutOfFlow DescendantContainingBlocks.begin(); 1048 HashSet<const RenderObject*>::const_iterator it = childOutOfFlow DescendantContainingBlocks.begin();
1048 for (; it != childOutOfFlowDescendantContainingBlocks.end(); ++i t) 1049 for (; it != childOutOfFlowDescendantContainingBlocks.end(); ++i t)
1049 outOfFlowDescendantContainingBlocks->add(*it); 1050 outOfFlowDescendantContainingBlocks->add(*it);
1050 } 1051 }
1051 1052
1052 bool hasVisibleDescendant = child->m_hasVisibleContent || child->m_h asVisibleDescendant; 1053 bool hasVisibleDescendant = child->m_hasVisibleContent || child->m_h asVisibleDescendant;
1053 bool hasSelfPaintingLayerDescendant = child->isSelfPaintingLayer() | | child->hasSelfPaintingLayerDescendant(); 1054 bool hasSelfPaintingLayerDescendant = child->isSelfPaintingLayer() | | child->hasSelfPaintingLayerDescendant();
1054 bool hasOutOfFlowPositionedDescendant = !childOutOfFlowDescendantCon tainingBlocks.isEmpty(); 1055 bool hasOutOfFlowPositionedDescendant = !childOutOfFlowDescendantCon tainingBlocks.isEmpty() || child->hasOutOfFlowPositionedDescendant();
1055 1056
1056 m_hasVisibleDescendant |= hasVisibleDescendant; 1057 m_hasVisibleDescendant |= hasVisibleDescendant;
1057 m_hasSelfPaintingLayerDescendant |= hasSelfPaintingLayerDescendant; 1058 m_hasSelfPaintingLayerDescendant |= hasSelfPaintingLayerDescendant;
1058 m_hasOutOfFlowPositionedDescendant |= hasOutOfFlowPositionedDescenda nt; 1059 m_hasOutOfFlowPositionedDescendant |= hasOutOfFlowPositionedDescenda nt;
1059 1060
1060 if (m_hasVisibleDescendant && m_hasSelfPaintingLayerDescendant && m_ hasOutOfFlowPositionedDescendant) 1061 if (m_hasVisibleDescendant && m_hasSelfPaintingLayerDescendant && m_ hasOutOfFlowPositionedDescendant)
1061 break; 1062 break;
1062 } 1063 }
1063 1064
1064 if (outOfFlowDescendantContainingBlocks && renderer()) 1065 if (outOfFlowDescendantContainingBlocks && renderer())
1065 outOfFlowDescendantContainingBlocks->remove(renderer()); 1066 outOfFlowDescendantContainingBlocks->remove(renderer());
1066 1067
1067 m_visibleDescendantStatusDirty = false; 1068 m_visibleDescendantStatusDirty = false;
1068 m_hasSelfPaintingLayerDescendantDirty = false; 1069 m_hasSelfPaintingLayerDescendantDirty = false;
1069
1070 if (m_hasOutOfFlowPositionedDescendantDirty)
1071 updateNeedsCompositedScrolling();
1072
1073 m_hasOutOfFlowPositionedDescendantDirty = false; 1070 m_hasOutOfFlowPositionedDescendantDirty = false;
1074 } 1071 }
1075 1072
1076 if (m_visibleContentStatusDirty) { 1073 if (m_visibleContentStatusDirty) {
1077 if (renderer()->style()->visibility() == VISIBLE) 1074 if (renderer()->style()->visibility() == VISIBLE)
1078 m_hasVisibleContent = true; 1075 m_hasVisibleContent = true;
1079 else { 1076 else {
1080 // layer may be hidden but still have some visible content, check fo r this 1077 // layer may be hidden but still have some visible content, check fo r this
1081 m_hasVisibleContent = false; 1078 m_hasVisibleContent = false;
1082 RenderObject* r = renderer()->firstChild(); 1079 RenderObject* r = renderer()->firstChild();
(...skipping 587 matching lines...) Expand 10 before | Expand all | Expand 10 after
1670 child->setParent(this); 1667 child->setParent(this);
1671 1668
1672 if (child->isNormalFlowOnly()) 1669 if (child->isNormalFlowOnly())
1673 dirtyNormalFlowList(); 1670 dirtyNormalFlowList();
1674 1671
1675 if (!child->isNormalFlowOnly() || child->firstChild()) { 1672 if (!child->isNormalFlowOnly() || child->firstChild()) {
1676 // Dirty the z-order list in which we are contained. The stackingContain er() can be null in the 1673 // Dirty the z-order list in which we are contained. The stackingContain er() can be null in the
1677 // case where we're building up generated content layers. This is ok, si nce the lists will start 1674 // case where we're building up generated content layers. This is ok, si nce the lists will start
1678 // off dirty in that case anyway. 1675 // off dirty in that case anyway.
1679 child->dirtyStackingContainerZOrderLists(); 1676 child->dirtyStackingContainerZOrderLists();
1677 child->m_descendantsAreContiguousInStackingOrderDirty = true;
1680 } 1678 }
1681 1679
1682 child->updateDescendantDependentFlags(); 1680 child->updateDescendantDependentFlags();
1683 if (child->m_hasVisibleContent || child->m_hasVisibleDescendant) 1681 if (child->m_hasVisibleContent || child->m_hasVisibleDescendant)
1684 setAncestorChainHasVisibleDescendant(); 1682 setAncestorChainHasVisibleDescendant();
1685 1683
1686 if (child->isSelfPaintingLayer() || child->hasSelfPaintingLayerDescendant()) 1684 if (child->isSelfPaintingLayer() || child->hasSelfPaintingLayerDescendant())
1687 setAncestorChainHasSelfPaintingLayerDescendant(); 1685 setAncestorChainHasSelfPaintingLayerDescendant();
1688 1686
1689 if (child->renderer() && (child->renderer()->isOutOfFlowPositioned() || chil d->hasOutOfFlowPositionedDescendant())) 1687 if (child->renderer() && (child->renderer()->isOutOfFlowPositioned() || chil d->hasOutOfFlowPositionedDescendant()))
(...skipping 13 matching lines...) Expand all
1703 if (oldChild->nextSibling()) 1701 if (oldChild->nextSibling())
1704 oldChild->nextSibling()->setPreviousSibling(oldChild->previousSibling()) ; 1702 oldChild->nextSibling()->setPreviousSibling(oldChild->previousSibling()) ;
1705 1703
1706 if (m_first == oldChild) 1704 if (m_first == oldChild)
1707 m_first = oldChild->nextSibling(); 1705 m_first = oldChild->nextSibling();
1708 if (m_last == oldChild) 1706 if (m_last == oldChild)
1709 m_last = oldChild->previousSibling(); 1707 m_last = oldChild->previousSibling();
1710 1708
1711 if (oldChild->isNormalFlowOnly()) 1709 if (oldChild->isNormalFlowOnly())
1712 dirtyNormalFlowList(); 1710 dirtyNormalFlowList();
1713 if (!oldChild->isNormalFlowOnly() || oldChild->firstChild()) { 1711 if (!oldChild->isNormalFlowOnly() || oldChild->firstChild()) {
1714 // Dirty the z-order list in which we are contained. When called via th e 1712 // Dirty the z-order list in which we are contained. When called via th e
1715 // reattachment process in removeOnlyThisLayer, the layer may already be disconnected 1713 // reattachment process in removeOnlyThisLayer, the layer may already be disconnected
1716 // from the main layer tree, so we need to null-check the |stackingConta iner| value. 1714 // from the main layer tree, so we need to null-check the |stackingConta iner| value.
1717 oldChild->dirtyStackingContainerZOrderLists(); 1715 oldChild->dirtyStackingContainerZOrderLists();
1716 m_descendantsAreContiguousInStackingOrderDirty = true;
1718 } 1717 }
1719 1718
1720 if ((oldChild->renderer() && oldChild->renderer()->isOutOfFlowPositioned()) || oldChild->hasOutOfFlowPositionedDescendant()) 1719 if ((oldChild->renderer() && oldChild->renderer()->isOutOfFlowPositioned()) || oldChild->hasOutOfFlowPositionedDescendant())
1721 dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus(); 1720 dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus();
1722 1721
1723 oldChild->setPreviousSibling(0); 1722 oldChild->setPreviousSibling(0);
1724 oldChild->setNextSibling(0); 1723 oldChild->setNextSibling(0);
1725 oldChild->setParent(0); 1724 oldChild->setParent(0);
1726 1725
1727 oldChild->updateDescendantDependentFlags(); 1726 oldChild->updateDescendantDependentFlags();
1728 if (oldChild->m_hasVisibleContent || oldChild->m_hasVisibleDescendant) 1727 if (oldChild->m_hasVisibleContent || oldChild->m_hasVisibleDescendant)
1729 dirtyAncestorChainVisibleDescendantStatus(); 1728 dirtyAncestorChainVisibleDescendantStatus();
1730 1729
1731 if (oldChild->isSelfPaintingLayer() || oldChild->hasSelfPaintingLayerDescend ant()) 1730 if (oldChild->isSelfPaintingLayer() || oldChild->hasSelfPaintingLayerDescend ant())
1732 dirtyAncestorChainHasSelfPaintingLayerDescendantStatus(); 1731 dirtyAncestorChainHasSelfPaintingLayerDescendantStatus();
1733 1732
1734 return oldChild; 1733 return oldChild;
1735 } 1734 }
1736 1735
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
1932 rect.move(-delta.x(), -delta.y()); 1931 rect.move(-delta.x(), -delta.y());
1933 } 1932 }
1934 1933
1935 bool RenderLayer::usesCompositedScrolling() const 1934 bool RenderLayer::usesCompositedScrolling() const
1936 { 1935 {
1937 return isComposited() && backing()->scrollingLayer(); 1936 return isComposited() && backing()->scrollingLayer();
1938 } 1937 }
1939 1938
1940 bool RenderLayer::needsCompositedScrolling() const 1939 bool RenderLayer::needsCompositedScrolling() const
1941 { 1940 {
1941 ASSERT(!m_descendantsAreContiguousInStackingOrderDirty);
1942 ASSERT(!m_hasOutOfFlowPositionedDescendantDirty);
1942 return m_needsCompositedScrolling; 1943 return m_needsCompositedScrolling;
1943 } 1944 }
1944 1945
1945 void RenderLayer::updateNeedsCompositedScrolling() 1946 void RenderLayer::updateNeedsCompositedScrolling()
1946 { 1947 {
1947 bool oldNeedsCompositedScrolling = m_needsCompositedScrolling; 1948 bool needsCompositedScrolling = false;
1948 1949
1949 FrameView* frameView = renderer()->view()->frameView(); 1950 FrameView* frameView = renderer()->view()->frameView();
1950 if (!frameView || !frameView->containsScrollableArea(this)) 1951 if (frameView && frameView->containsScrollableArea(this)) {
1951 m_needsCompositedScrolling = false;
1952 else {
1953 bool forceUseCompositedScrolling = acceleratedCompositingForOverflowScro llEnabled() 1952 bool forceUseCompositedScrolling = acceleratedCompositingForOverflowScro llEnabled()
1954 && canBeStackingContainer() 1953 && canBeStackingContainer()
1955 && !hasOutOfFlowPositionedDescendant(); 1954 && !hasOutOfFlowPositionedDescendant();
1956 1955
1957 #if ENABLE(ACCELERATED_OVERFLOW_SCROLLING) 1956 #if ENABLE(ACCELERATED_OVERFLOW_SCROLLING)
1958 m_needsCompositedScrolling = forceUseCompositedScrolling || renderer()-> style()->useTouchOverflowScrolling(); 1957 needsCompositedScrolling = forceUseCompositedScrolling || renderer()->st yle()->useTouchOverflowScrolling();
1959 #else 1958 #else
1960 m_needsCompositedScrolling = forceUseCompositedScrolling; 1959 needsCompositedScrolling = forceUseCompositedScrolling;
1961 #endif 1960 #endif
1962 // We gather a boolean value for use with Google UMA histograms to
1963 // quantify the actual effects of a set of patches attempting to
1964 // relax composited scrolling requirements, thereby increasing the
1965 // number of composited overflow divs.
1966 if (acceleratedCompositingForOverflowScrollEnabled())
1967 HistogramSupport::histogramEnumeration("Renderer.NeedsCompositedScro lling", m_needsCompositedScrolling, 2);
1968 } 1961 }
1969 1962
1970 if (oldNeedsCompositedScrolling != m_needsCompositedScrolling) { 1963 setNeedsCompositedScrolling(needsCompositedScrolling);
1971 updateSelfPaintingLayer(); 1964 }
1972 if (isStackingContainer())
1973 dirtyZOrderLists();
1974 else
1975 clearZOrderLists();
1976 1965
1977 dirtyStackingContainerZOrderLists(); 1966 void RenderLayer::setNeedsCompositedScrolling(bool needsCompositedScrolling)
1967 {
1968 // We gather a boolean value for use with Google UMA histograms to
1969 // quantify the actual effects of a set of patches attempting to
1970 // relax composited scrolling requirements, thereby increasing the
1971 // number of composited overflow divs.
1972 if (acceleratedCompositingForOverflowScrollEnabled())
1973 HistogramSupport::histogramEnumeration("Renderer.NeedsCompositedScrollin g", needsCompositedScrolling, 2);
hartmanng 2013/04/10 17:34:05 this should only be set for scrollable divs, not a
Ian Vollick 2013/04/11 16:36:03 Done.
1978 1974
1979 compositor()->setShouldReevaluateCompositingAfterLayout(); 1975 if (m_needsCompositedScrolling == needsCompositedScrolling)
1980 compositor()->setCompositingLayersNeedRebuild(); 1976 return;
1981 } 1977
1978 m_needsCompositedScrolling = needsCompositedScrolling;
1979
1980 updateIsNormalFlowOnly();
1981 updateSelfPaintingLayer();
1982
1983 if (isStackingContainer())
1984 dirtyZOrderLists();
1985 else
1986 clearZOrderLists();
1987
1988 dirtyStackingContainerZOrderLists();
1989
1990 compositor()->setShouldReevaluateCompositingAfterLayout();
1991 compositor()->setCompositingLayersNeedRebuild();
1982 } 1992 }
1983 1993
1984 static inline int adjustedScrollDelta(int beginningDelta) { 1994 static inline int adjustedScrollDelta(int beginningDelta) {
1985 // This implemention matches Firefox's. 1995 // This implemention matches Firefox's.
1986 // http://mxr.mozilla.org/firefox/source/toolkit/content/widgets/browser.xml #856. 1996 // http://mxr.mozilla.org/firefox/source/toolkit/content/widgets/browser.xml #856.
1987 const int speedReducer = 12; 1997 const int speedReducer = 12;
1988 1998
1989 int adjustedDelta = beginningDelta / speedReducer; 1999 int adjustedDelta = beginningDelta / speedReducer;
1990 if (adjustedDelta > 1) 2000 if (adjustedDelta > 1)
1991 adjustedDelta = static_cast<int>(adjustedDelta * sqrt(static_cast<double >(adjustedDelta))) - 1; 2001 adjustedDelta = static_cast<int>(adjustedDelta * sqrt(static_cast<double >(adjustedDelta))) - 1;
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
2266 frameView->resumeScheduledEvents(); 2276 frameView->resumeScheduledEvents();
2267 } 2277 }
2268 2278
2269 void RenderLayer::updateCompositingLayersAfterScroll() 2279 void RenderLayer::updateCompositingLayersAfterScroll()
2270 { 2280 {
2271 if (compositor()->inCompositingMode()) { 2281 if (compositor()->inCompositingMode()) {
2272 // Our stacking container is guaranteed to contain all of our descendant s that may need 2282 // Our stacking container is guaranteed to contain all of our descendant s that may need
2273 // repositioning, so update compositing layers from there. 2283 // repositioning, so update compositing layers from there.
2274 if (RenderLayer* compositingAncestor = stackingContainer()->enclosingCom positingLayer()) { 2284 if (RenderLayer* compositingAncestor = stackingContainer()->enclosingCom positingLayer()) {
2275 if (compositor()->compositingConsultsOverlap()) { 2285 if (compositor()->compositingConsultsOverlap()) {
2276 if (usesCompositedScrolling() && !hasOutOfFlowPositionedDescenda nt()) 2286 if (usesCompositedScrolling())
2277 compositor()->updateCompositingLayers(CompositingUpdateOnCom positedScroll, compositingAncestor); 2287 compositor()->updateCompositingLayers(CompositingUpdateOnCom positedScroll, compositingAncestor);
2278 else 2288 else
2279 compositor()->updateCompositingLayers(CompositingUpdateOnScr oll, compositingAncestor); 2289 compositor()->updateCompositingLayers(CompositingUpdateOnScr oll, compositingAncestor);
2280 } else 2290 } else
2281 compositingAncestor->backing()->updateAfterLayout(RenderLayerBac king::IsUpdateRoot); 2291 compositingAncestor->backing()->updateAfterLayout(RenderLayerBac king::IsUpdateRoot);
2282 } 2292 }
2283 } 2293 }
2284 } 2294 }
2285 2295
2286 LayoutRect RenderLayer::getRectToExpose(const LayoutRect &visibleRect, const Lay outRect &exposeRect, const ScrollAlignment& alignX, const ScrollAlignment& align Y) 2296 LayoutRect RenderLayer::getRectToExpose(const LayoutRect &visibleRect, const Lay outRect &exposeRect, const ScrollAlignment& alignX, const ScrollAlignment& align Y)
(...skipping 814 matching lines...) Expand 10 before | Expand all | Expand 10 after
3101 // to pull our scroll offsets back to the max (or push them up to the mi n). 3111 // to pull our scroll offsets back to the max (or push them up to the mi n).
3102 IntSize clampedScrollOffset = clampScrollOffset(scrollOffset()); 3112 IntSize clampedScrollOffset = clampScrollOffset(scrollOffset());
3103 if (clampedScrollOffset != scrollOffset()) 3113 if (clampedScrollOffset != scrollOffset())
3104 scrollToOffset(clampedScrollOffset); 3114 scrollToOffset(clampedScrollOffset);
3105 } 3115 }
3106 3116
3107 updateScrollbarsAfterLayout(); 3117 updateScrollbarsAfterLayout();
3108 3118
3109 if (originalScrollOffset != scrollOffset()) 3119 if (originalScrollOffset != scrollOffset())
3110 scrollToOffsetWithoutAnimation(IntPoint(scrollOffset())); 3120 scrollToOffsetWithoutAnimation(IntPoint(scrollOffset()));
3111
3112 // Composited scrolling may need to be enabled or disabled if the amount of overflow changed.
3113 if (renderer()->view() && compositor()->updateLayerCompositingState(this))
3114 compositor()->setCompositingLayersNeedRebuild();
3115 } 3121 }
3116 3122
3117 bool RenderLayer::overflowControlsIntersectRect(const IntRect& localRect) const 3123 bool RenderLayer::overflowControlsIntersectRect(const IntRect& localRect) const
3118 { 3124 {
3119 const IntRect borderBox = renderBox()->pixelSnappedBorderBoxRect(); 3125 const IntRect borderBox = renderBox()->pixelSnappedBorderBoxRect();
3120 3126
3121 if (rectForHorizontalScrollbar(borderBox).intersects(localRect)) 3127 if (rectForHorizontalScrollbar(borderBox).intersects(localRect))
3122 return true; 3128 return true;
3123 3129
3124 if (rectForVerticalScrollbar(borderBox).intersects(localRect)) 3130 if (rectForVerticalScrollbar(borderBox).intersects(localRect))
(...skipping 2364 matching lines...) Expand 10 before | Expand all | Expand 10 after
5489 5495
5490 // Helper for the sorting of layers by z-index. 5496 // Helper for the sorting of layers by z-index.
5491 static inline bool compareZIndex(RenderLayer* first, RenderLayer* second) 5497 static inline bool compareZIndex(RenderLayer* first, RenderLayer* second)
5492 { 5498 {
5493 return first->zIndex() < second->zIndex(); 5499 return first->zIndex() < second->zIndex();
5494 } 5500 }
5495 5501
5496 void RenderLayer::dirtyZOrderLists() 5502 void RenderLayer::dirtyZOrderLists()
5497 { 5503 {
5498 ASSERT(m_layerListMutationAllowed); 5504 ASSERT(m_layerListMutationAllowed);
5499 ASSERT(isStackingContainer());
5500 5505
5501 if (m_posZOrderList) 5506 if (m_posZOrderList)
5502 m_posZOrderList->clear(); 5507 m_posZOrderList->clear();
5503 if (m_negZOrderList) 5508 if (m_negZOrderList)
5504 m_negZOrderList->clear(); 5509 m_negZOrderList->clear();
5505 m_zOrderListsDirty = true; 5510 m_zOrderListsDirty = true;
5506 5511
5512 m_descendantsAreContiguousInStackingOrderDirty = true;
5513
5507 if (!renderer()->documentBeingDestroyed()) { 5514 if (!renderer()->documentBeingDestroyed()) {
5508 compositor()->setCompositingLayersNeedRebuild(); 5515 compositor()->setCompositingLayersNeedRebuild();
5509 if (acceleratedCompositingForOverflowScrollEnabled()) 5516 if (acceleratedCompositingForOverflowScrollEnabled())
5510 compositor()->setShouldReevaluateCompositingAfterLayout(); 5517 compositor()->setShouldReevaluateCompositingAfterLayout();
5511 } 5518 }
5512 } 5519 }
5513 5520
5514 void RenderLayer::dirtyStackingContainerZOrderLists() 5521 void RenderLayer::dirtyStackingContainerZOrderLists()
hartmanng 2013/04/10 17:34:05 rename to dirtyStackingContextZOrderLists. Also ad
Ian Vollick 2013/04/11 16:36:03 I think the function name still works, but I expla
5515 { 5522 {
5516 RenderLayer* sc = stackingContainer(); 5523 for (RenderLayer* layer = parent(); layer; layer = layer->parent()) {
5517 if (sc) 5524 layer->dirtyZOrderLists();
5518 sc->dirtyZOrderLists(); 5525 if (layer->isStackingContext())
5526 break;
5527 }
5519 } 5528 }
5520 5529
5521 void RenderLayer::dirtyNormalFlowList() 5530 void RenderLayer::dirtyNormalFlowList()
5522 { 5531 {
5523 ASSERT(m_layerListMutationAllowed); 5532 ASSERT(m_layerListMutationAllowed);
5524 5533
5525 if (m_normalFlowList) 5534 if (m_normalFlowList)
5526 m_normalFlowList->clear(); 5535 m_normalFlowList->clear();
5527 m_normalFlowListDirty = true; 5536 m_normalFlowListDirty = true;
5528 5537
5538 m_descendantsAreContiguousInStackingOrderDirty = true;
5529 if (!renderer()->documentBeingDestroyed()) { 5539 if (!renderer()->documentBeingDestroyed()) {
5530 compositor()->setCompositingLayersNeedRebuild(); 5540 compositor()->setCompositingLayersNeedRebuild();
5531 if (acceleratedCompositingForOverflowScrollEnabled()) 5541 if (acceleratedCompositingForOverflowScrollEnabled())
5532 compositor()->setShouldReevaluateCompositingAfterLayout(); 5542 compositor()->setShouldReevaluateCompositingAfterLayout();
5533 } 5543 }
5534 } 5544 }
5535 5545
5536 void RenderLayer::rebuildZOrderLists() 5546 void RenderLayer::rebuildZOrderLists()
5537 { 5547 {
5538 ASSERT(m_layerListMutationAllowed); 5548 ASSERT(m_layerListMutationAllowed);
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
5621 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin g()) { 5631 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin g()) {
5622 // Ignore reflections. 5632 // Ignore reflections.
5623 if (!m_reflection || reflectionLayer() != child) 5633 if (!m_reflection || reflectionLayer() != child)
5624 child->collectLayers(includeHiddenLayers, behavior, posBuffer, n egBuffer); 5634 child->collectLayers(includeHiddenLayers, behavior, posBuffer, n egBuffer);
5625 } 5635 }
5626 } 5636 }
5627 } 5637 }
5628 5638
5629 void RenderLayer::updateLayerListsIfNeeded() 5639 void RenderLayer::updateLayerListsIfNeeded()
5630 { 5640 {
5631 bool shouldUpdateDescendantsAreContiguousInStackingOrder = isStackingContext () && (m_zOrderListsDirty || m_normalFlowListDirty); 5641 bool shouldUpdateDescendantsAreContiguousInStackingOrder = acceleratedCompos itingForOverflowScrollEnabled() && isStackingContext() && (m_zOrderListsDirty || m_normalFlowListDirty) && m_descendantsAreContiguousInStackingOrderDirty;
5632 updateZOrderLists(); 5642 updateZOrderLists();
5633 updateNormalFlowList(); 5643 updateNormalFlowList();
5634 5644
5635 if (RenderLayer* reflectionLayer = this->reflectionLayer()) { 5645 if (RenderLayer* reflectionLayer = this->reflectionLayer()) {
5636 reflectionLayer->updateZOrderLists(); 5646 reflectionLayer->updateZOrderLists();
5637 reflectionLayer->updateNormalFlowList(); 5647 reflectionLayer->updateNormalFlowList();
5638 } 5648 }
5639 5649
5640 if (shouldUpdateDescendantsAreContiguousInStackingOrder) { 5650 if (shouldUpdateDescendantsAreContiguousInStackingOrder) {
5641 updateDescendantsAreContiguousInStackingOrder(); 5651 updateDescendantsAreContiguousInStackingOrder();
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
5717 && !renderer()->hasBlendMode() 5727 && !renderer()->hasBlendMode()
5718 #endif 5728 #endif
5719 && !isTransparent() 5729 && !isTransparent()
5720 && !needsCompositedScrolling() 5730 && !needsCompositedScrolling()
5721 #if ENABLE(CSS_EXCLUSIONS) 5731 #if ENABLE(CSS_EXCLUSIONS)
5722 && !renderer()->isFloatingWithShapeOutside() 5732 && !renderer()->isFloatingWithShapeOutside()
5723 #endif 5733 #endif
5724 ; 5734 ;
5725 } 5735 }
5726 5736
5737 void RenderLayer::updateIsNormalFlowOnly()
5738 {
5739 bool isNormalFlowOnly = shouldBeNormalFlowOnly();
5740 if (isNormalFlowOnly == m_isNormalFlowOnly)
5741 return;
5742
5743 m_isNormalFlowOnly = isNormalFlowOnly;
5744 RenderLayer* p = parent();
5745 if (p)
5746 p->dirtyNormalFlowList();
5747 dirtyStackingContainerZOrderLists();
5748 }
5749
5727 bool RenderLayer::shouldBeSelfPaintingLayer() const 5750 bool RenderLayer::shouldBeSelfPaintingLayer() const
5728 { 5751 {
5729 return !isNormalFlowOnly() 5752 return !isNormalFlowOnly()
5730 || hasOverlayScrollbars() 5753 || hasOverlayScrollbars()
5731 || needsCompositedScrolling() 5754 || needsCompositedScrolling()
5732 || renderer()->hasReflection() 5755 || renderer()->hasReflection()
5733 || renderer()->hasMask() 5756 || renderer()->hasMask()
5734 || renderer()->isTableRow() 5757 || renderer()->isTableRow()
5735 || renderer()->isCanvas() 5758 || renderer()->isCanvas()
5736 || renderer()->isVideo() 5759 || renderer()->isVideo()
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
5801 return true; 5824 return true;
5802 5825
5803 if (hasVisibleBoxDecorations()) 5826 if (hasVisibleBoxDecorations())
5804 return true; 5827 return true;
5805 5828
5806 return false; 5829 return false;
5807 } 5830 }
5808 5831
5809 void RenderLayer::updateStackingContextsAfterStyleChange(const RenderStyle* oldS tyle) 5832 void RenderLayer::updateStackingContextsAfterStyleChange(const RenderStyle* oldS tyle)
5810 { 5833 {
5811 if (!oldStyle) 5834 bool wasStackingContext = oldStyle ? isStackingContext(oldStyle) : false;
5812 return; 5835 EVisibility oldVisibility = oldStyle ? oldStyle->visibility() : VISIBLE;
5813 5836 int oldZIndex = oldStyle ? oldStyle->zIndex() : 0;
5814 bool wasStackingContext = isStackingContext(oldStyle);
5815 bool isStackingContext = this->isStackingContext();
5816 if (isStackingContext != wasStackingContext) {
5817 dirtyStackingContainerZOrderLists();
5818 if (isStackingContext)
5819 dirtyZOrderLists();
5820 else
5821 clearZOrderLists();
5822 return;
5823 }
5824 5837
5825 // FIXME: RenderLayer already handles visibility changes through our visibli ty dirty bits. This logic could 5838 // FIXME: RenderLayer already handles visibility changes through our visibli ty dirty bits. This logic could
5826 // likely be folded along with the rest. 5839 // likely be folded along with the rest.
5827 if (oldStyle->zIndex() != renderer()->style()->zIndex() || oldStyle->visibil ity() != renderer()->style()->visibility()) { 5840 bool isStackingContext = this->isStackingContext();
5828 dirtyStackingContainerZOrderLists(); 5841 if (isStackingContext == wasStackingContext && oldVisibility == renderer()-> style()->visibility() && oldZIndex == renderer()->style()->zIndex())
5829 if (isStackingContext) 5842 return;
5830 dirtyZOrderLists(); 5843
5831 } 5844 dirtyStackingContainerZOrderLists();
5845 if (isStackingContainer())
5846 dirtyZOrderLists();
5832 } 5847 }
5833 5848
5834 static bool overflowRequiresScrollbar(EOverflow overflow) 5849 static bool overflowRequiresScrollbar(EOverflow overflow)
5835 { 5850 {
5836 return overflow == OSCROLL; 5851 return overflow == OSCROLL;
5837 } 5852 }
5838 5853
5839 static bool overflowDefinesAutomaticScrollbar(EOverflow overflow) 5854 static bool overflowDefinesAutomaticScrollbar(EOverflow overflow)
5840 { 5855 {
5841 return overflow == OAUTO || overflow == OOVERLAY; 5856 return overflow == OAUTO || overflow == OOVERLAY;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
5878 } 5893 }
5879 5894
5880 void RenderLayer::setAncestorChainHasOutOfFlowPositionedDescendant(RenderObject* containingBlock) 5895 void RenderLayer::setAncestorChainHasOutOfFlowPositionedDescendant(RenderObject* containingBlock)
5881 { 5896 {
5882 for (RenderLayer* layer = this; layer; layer = layer->parent()) { 5897 for (RenderLayer* layer = this; layer; layer = layer->parent()) {
5883 if (!layer->m_hasOutOfFlowPositionedDescendantDirty && layer->hasOutOfFl owPositionedDescendant()) 5898 if (!layer->m_hasOutOfFlowPositionedDescendantDirty && layer->hasOutOfFl owPositionedDescendant())
5884 break; 5899 break;
5885 5900
5886 layer->m_hasOutOfFlowPositionedDescendantDirty = false; 5901 layer->m_hasOutOfFlowPositionedDescendantDirty = false;
5887 layer->m_hasOutOfFlowPositionedDescendant = true; 5902 layer->m_hasOutOfFlowPositionedDescendant = true;
5888 layer->updateNeedsCompositedScrolling();
5889 5903
5890 if (layer->renderer() && layer->renderer() == containingBlock) 5904 if (layer->renderer() && layer->renderer() == containingBlock)
5891 break; 5905 break;
5892 } 5906 }
5893 } 5907 }
5894 5908
5895 void RenderLayer::dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus() 5909 void RenderLayer::dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus()
5896 { 5910 {
5897 m_hasOutOfFlowPositionedDescendantDirty = true; 5911 if (m_hasOutOfFlowPositionedDescendant)
5912 m_hasOutOfFlowPositionedDescendantDirty = true;
5913
5898 if (parent()) 5914 if (parent())
5899 parent()->dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus(); 5915 parent()->dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus();
5900 } 5916 }
5901 5917
5902 void RenderLayer::updateOutOfFlowPositioned(const RenderStyle* oldStyle) 5918 void RenderLayer::updateOutOfFlowPositioned(const RenderStyle* oldStyle)
5903 { 5919 {
5904 bool wasOutOfFlowPositioned = oldStyle && (oldStyle->position() == AbsoluteP osition || oldStyle->position() == FixedPosition); 5920 bool wasOutOfFlowPositioned = oldStyle && (oldStyle->position() == AbsoluteP osition || oldStyle->position() == FixedPosition);
5905 if (parent() && ((renderer() && renderer()->isOutOfFlowPositioned()) != wasO utOfFlowPositioned)) { 5921 bool isOutOfFlowPositioned = renderer()->isOutOfFlowPositioned();
5906 parent()->dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus(); 5922 if (parent() && isOutOfFlowPositioned != wasOutOfFlowPositioned) {
5907 if (!renderer()->documentBeingDestroyed() && acceleratedCompositingForOv erflowScrollEnabled()) 5923 if (isOutOfFlowPositioned)
5908 compositor()->setShouldReevaluateCompositingAfterLayout(); 5924 parent()->setAncestorChainHasOutOfFlowPositionedDescendant(renderer( )->containingBlock());
5925 else
5926 parent()->dirtyAncestorChainHasOutOfFlowPositionedDescendantStatus() ;
5909 } 5927 }
5910 } 5928 }
5911 5929
5912 #if ENABLE(CSS_FILTERS) 5930 #if ENABLE(CSS_FILTERS)
5913 static bool hasOrHadFilters(const RenderStyle* oldStyle, const RenderStyle* newS tyle) 5931 static bool hasOrHadFilters(const RenderStyle* oldStyle, const RenderStyle* newS tyle)
5914 { 5932 {
5915 ASSERT(newStyle); 5933 ASSERT(newStyle);
5916 return (oldStyle && oldStyle->hasFilter()) || newStyle->hasFilter(); 5934 return (oldStyle && oldStyle->hasFilter()) || newStyle->hasFilter();
5917 } 5935 }
5918 #endif 5936 #endif
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
5982 // FilterEffectRenderer is intended to render software filters and shouldn't be needed for accelerated filters. 6000 // FilterEffectRenderer is intended to render software filters and shouldn't be needed for accelerated filters.
5983 // We should extract the SVG graph building functionality out of FilterEffec tRenderer, and it should happen in RenderLayer::computeFilterOperations. 6001 // We should extract the SVG graph building functionality out of FilterEffec tRenderer, and it should happen in RenderLayer::computeFilterOperations.
5984 // https://bugs.webkit.org/show_bug.cgi?id=114051 6002 // https://bugs.webkit.org/show_bug.cgi?id=114051
5985 if (shouldUpdateFilters && newStyle->filter().hasReferenceFilter()) 6003 if (shouldUpdateFilters && newStyle->filter().hasReferenceFilter())
5986 backing()->updateFilters(renderer()->style()); 6004 backing()->updateFilters(renderer()->style());
5987 } 6005 }
5988 #endif 6006 #endif
5989 6007
5990 void RenderLayer::styleChanged(StyleDifference, const RenderStyle* oldStyle) 6008 void RenderLayer::styleChanged(StyleDifference, const RenderStyle* oldStyle)
5991 { 6009 {
5992 bool isNormalFlowOnly = shouldBeNormalFlowOnly();
5993 if (isNormalFlowOnly != m_isNormalFlowOnly) {
5994 m_isNormalFlowOnly = isNormalFlowOnly;
5995 RenderLayer* p = parent();
5996 if (p)
5997 p->dirtyNormalFlowList();
5998 dirtyStackingContainerZOrderLists();
5999 }
6000
6001 if (renderer()->style()->overflowX() == OMARQUEE && renderer()->style()->mar queeBehavior() != MNONE && renderer()->isBox()) { 6010 if (renderer()->style()->overflowX() == OMARQUEE && renderer()->style()->mar queeBehavior() != MNONE && renderer()->isBox()) {
6002 if (!m_marquee) 6011 if (!m_marquee)
6003 m_marquee = adoptPtr(new RenderMarquee(this)); 6012 m_marquee = adoptPtr(new RenderMarquee(this));
6004 FeatureObserver::observe(renderer()->document(), renderer()->isHTMLMarqu ee() ? FeatureObserver::HTMLMarqueeElement : FeatureObserver::CSSOverflowMarquee ); 6013 FeatureObserver::observe(renderer()->document(), renderer()->isHTMLMarqu ee() ? FeatureObserver::HTMLMarqueeElement : FeatureObserver::CSSOverflowMarquee );
6005 m_marquee->updateMarqueeStyle(); 6014 m_marquee->updateMarqueeStyle();
6006 } 6015 }
6007 else if (m_marquee) { 6016 else if (m_marquee) {
6008 m_marquee.clear(); 6017 m_marquee.clear();
6009 } 6018 }
6010 6019
6011 updateScrollbarsAfterStyleChange(oldStyle); 6020 updateScrollbarsAfterStyleChange(oldStyle);
6012 updateStackingContextsAfterStyleChange(oldStyle); 6021 updateStackingContextsAfterStyleChange(oldStyle);
6022
6013 // Overlay scrollbars can make this layer self-painting so we need 6023 // Overlay scrollbars can make this layer self-painting so we need
6014 // to recompute the bit once scrollbars have been updated. 6024 // to recompute the bit once scrollbars have been updated.
6015 updateSelfPaintingLayer(); 6025 updateSelfPaintingLayer();
6016 updateOutOfFlowPositioned(oldStyle); 6026 updateOutOfFlowPositioned(oldStyle);
6017 6027
6018 if (!hasReflection() && m_reflection) 6028 if (!hasReflection() && m_reflection)
6019 removeReflection(); 6029 removeReflection();
6020 else if (hasReflection()) { 6030 else if (hasReflection()) {
6021 if (!m_reflection) 6031 if (!m_reflection)
6022 createReflection(); 6032 createReflection();
(...skipping 17 matching lines...) Expand all
6040 #endif 6050 #endif
6041 6051
6042 bool didPaintWithFilters = false; 6052 bool didPaintWithFilters = false;
6043 6053
6044 #if ENABLE(CSS_FILTERS) 6054 #if ENABLE(CSS_FILTERS)
6045 if (paintsWithFilters()) 6055 if (paintsWithFilters())
6046 didPaintWithFilters = true; 6056 didPaintWithFilters = true;
6047 updateFilters(oldStyle, renderer()->style()); 6057 updateFilters(oldStyle, renderer()->style());
6048 #endif 6058 #endif
6049 6059
6050 updateNeedsCompositedScrolling(); 6060 // FIXME(vollick) this requires updates that won't happen until after layout.
6051 6061 // Will this just fall out of the updateCompositingLayers call that will be
6052 const RenderStyle* newStyle = renderer()->style(); 6062 // coming anyway?
6053 if (compositor()->updateLayerCompositingState(this) 6063 // const RenderStyle* newStyle = renderer()->style();
6054 || needsCompositingLayersRebuiltForClip(oldStyle, newStyle) 6064 // if (compositor()->updateLayerCompositingState(this)
6055 || needsCompositingLayersRebuiltForOverflow(oldStyle, newStyle) 6065 // || needsCompositingLayersRebuiltForClip(oldStyle, newStyle)
6056 || needsCompositingLayersRebuiltForFilters(oldStyle, newStyle, didPaintW ithFilters)) 6066 // || needsCompositingLayersRebuiltForOverflow(oldStyle, newStyle)
6057 compositor()->setCompositingLayersNeedRebuild(); 6067 // || needsCompositingLayersRebuiltForFilters(oldStyle, newStyle, didPain tWithFilters))
6058 else if (isComposited()) 6068 // compositor()->setCompositingLayersNeedRebuild();
6059 backing()->updateGraphicsLayerGeometry(); 6069 // else if (isComposited())
6070 // backing()->updateGraphicsLayerGeometry();
6071 //
6060 } 6072 }
6061 6073
6062 void RenderLayer::updateScrollableAreaSet(bool hasOverflow) 6074 void RenderLayer::updateScrollableAreaSet(bool hasOverflow)
6063 { 6075 {
6064 Frame* frame = renderer()->frame(); 6076 Frame* frame = renderer()->frame();
6065 if (!frame) 6077 if (!frame)
6066 return; 6078 return;
6067 6079
6068 FrameView* frameView = frame->view(); 6080 FrameView* frameView = frame->view();
6069 if (!frameView) 6081 if (!frameView)
6070 return; 6082 return;
6071 6083
6072 bool isVisibleToHitTest = renderer()->visibleToHitTesting(); 6084 bool isVisibleToHitTest = renderer()->visibleToHitTesting();
6073 if (HTMLFrameOwnerElement* owner = frame->ownerElement()) 6085 if (HTMLFrameOwnerElement* owner = frame->ownerElement())
6074 isVisibleToHitTest &= owner->renderer() && owner->renderer()->visibleToH itTesting(); 6086 isVisibleToHitTest &= owner->renderer() && owner->renderer()->visibleToH itTesting();
6075 6087
6076 if (hasOverflow && isVisibleToHitTest ? frameView->addScrollableArea(this) : frameView->removeScrollableArea(this)) 6088 if (hasOverflow && isVisibleToHitTest)
hartmanng 2013/04/10 17:34:05 frameView->{add,remove}ScrollableArea() no longer
hartmanng 2013/04/12 03:51:42 I think you missed this comment
6077 updateNeedsCompositedScrolling(); 6089 frameView->addScrollableArea(this);
6090 else
6091 frameView->removeScrollableArea(this);
6078 } 6092 }
6079 6093
6080 void RenderLayer::updateScrollCornerStyle() 6094 void RenderLayer::updateScrollCornerStyle()
6081 { 6095 {
6082 RenderObject* actualRenderer = rendererForScrollbar(renderer()); 6096 RenderObject* actualRenderer = rendererForScrollbar(renderer());
6083 RefPtr<RenderStyle> corner = renderer()->hasOverflowClip() ? actualRenderer- >getUncachedPseudoStyle(PseudoStyleRequest(SCROLLBAR_CORNER), actualRenderer->st yle()) : PassRefPtr<RenderStyle>(0); 6097 RefPtr<RenderStyle> corner = renderer()->hasOverflowClip() ? actualRenderer- >getUncachedPseudoStyle(PseudoStyleRequest(SCROLLBAR_CORNER), actualRenderer->st yle()) : PassRefPtr<RenderStyle>(0);
6084 if (corner) { 6098 if (corner) {
6085 if (!m_scrollCorner) { 6099 if (!m_scrollCorner) {
6086 m_scrollCorner = RenderScrollbarPart::createAnonymous(renderer()->do cument()); 6100 m_scrollCorner = RenderScrollbarPart::createAnonymous(renderer()->do cument());
6087 m_scrollCorner->setParent(renderer()); 6101 m_scrollCorner->setParent(renderer());
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
6320 } 6334 }
6321 } 6335 }
6322 6336
6323 void showLayerTree(const WebCore::RenderObject* renderer) 6337 void showLayerTree(const WebCore::RenderObject* renderer)
6324 { 6338 {
6325 if (!renderer) 6339 if (!renderer)
6326 return; 6340 return;
6327 showLayerTree(renderer->enclosingLayer()); 6341 showLayerTree(renderer->enclosingLayer());
6328 } 6342 }
6329 #endif 6343 #endif
OLDNEW
« no previous file with comments | « Source/WebCore/rendering/RenderLayer.h ('k') | Source/WebCore/rendering/RenderLayerCompositor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698