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

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

Issue 13427009: Replace the current contiguity check for composited scrolling (Closed) Base URL: svn://svn.chromium.org/blink/trunk
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 | Annotate | Revision Log
« no previous file with comments | « Source/WebCore/rendering/RenderLayer.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 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 147
148 RenderLayer::RenderLayer(RenderLayerModelObject* renderer) 148 RenderLayer::RenderLayer(RenderLayerModelObject* renderer)
149 : m_inResizeMode(false) 149 : m_inResizeMode(false)
150 , m_scrollDimensionsDirty(true) 150 , m_scrollDimensionsDirty(true)
151 , m_normalFlowListDirty(true) 151 , m_normalFlowListDirty(true)
152 , m_hasSelfPaintingLayerDescendant(false) 152 , m_hasSelfPaintingLayerDescendant(false)
153 , m_hasSelfPaintingLayerDescendantDirty(false) 153 , m_hasSelfPaintingLayerDescendantDirty(false)
154 , m_hasOutOfFlowPositionedDescendant(false) 154 , m_hasOutOfFlowPositionedDescendant(false)
155 , m_hasOutOfFlowPositionedDescendantDirty(true) 155 , m_hasOutOfFlowPositionedDescendantDirty(true)
156 , m_needsCompositedScrolling(false) 156 , m_needsCompositedScrolling(false)
157 , m_descendantsAreContiguousInStackingOrder(false) 157 , m_canBePromotedToStackingContainer(false)
158 , m_isRootLayer(renderer->isRenderView()) 158 , m_isRootLayer(renderer->isRenderView())
159 , m_usedTransparency(false) 159 , m_usedTransparency(false)
160 , m_paintingInsideReflection(false) 160 , m_paintingInsideReflection(false)
161 , m_inOverflowRelayout(false) 161 , m_inOverflowRelayout(false)
162 , m_repaintStatus(NeedsNormalRepaint) 162 , m_repaintStatus(NeedsNormalRepaint)
163 , m_visibleContentStatusDirty(true) 163 , m_visibleContentStatusDirty(true)
164 , m_hasVisibleContent(false) 164 , m_hasVisibleContent(false)
165 , m_visibleDescendantStatusDirty(false) 165 , m_visibleDescendantStatusDirty(false)
166 , m_hasVisibleDescendant(false) 166 , m_hasVisibleDescendant(false)
167 , m_isPaginated(false) 167 , m_isPaginated(false)
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after
515 } 515 }
516 } 516 }
517 517
518 bool RenderLayer::acceleratedCompositingForOverflowScrollEnabled() const 518 bool RenderLayer::acceleratedCompositingForOverflowScrollEnabled() const
519 { 519 {
520 return renderer()->frame() 520 return renderer()->frame()
521 && renderer()->frame()->page() 521 && renderer()->frame()->page()
522 && renderer()->frame()->page()->settings()->acceleratedCompositingForOve rflowScrollEnabled(); 522 && renderer()->frame()->page()->settings()->acceleratedCompositingForOve rflowScrollEnabled();
523 } 523 }
524 524
525 // If we are a stacking container, then this function will determine if our
526 // descendants for a contiguous block in stacking order. This is required in
527 // order for an element to be safely promoted to a stacking container. It is saf e
528 // to become a stacking container if this change would not alter the stacking
529 // order of layers on the page. That can only happen if a non-descendant appear
530 // between us and our descendants in stacking order. Here's an example:
531 //
532 // this
533 // / | \.
534 // A B C
535 // /\ | /\.
536 // 0 -8 D 2 7
537 // |
538 // 5
539 //
540 // I've labeled our normal flow descendants A, B, C, and D, our stacking
541 // container descendants with their z indices, and us with 'this' (we're a
542 // stacking container and our zIndex doesn't matter here). These nodes appear in
543 // three lists: posZOrder, negZOrder, and normal flow (keep in mind that normal
544 // flow layers don't overlap). So if we arrange these lists in order we get our
545 // stacking order:
546 //
547 // [-8], [A-D], [0, 2, 5, 7]--> pos z-order.
548 // | |
549 // Neg z-order. <-+ +--> Normal flow descendants.
550 //
551 // We can then assign new, 'stacking' order indices to these elements as follows :
552 //
553 // [-8], [A-D], [0, 2, 5, 7]
554 // 'Stacking' indices: -1 0 1 2 3 4
555 //
556 // Note that the normal flow descendants can share an index because they don't
557 // stack/overlap. Now our problem becomes very simple: a layer can safely become
558 // a stacking container if the stacking-order indices of it and its descendants
559 // appear in a contiguous block in the list of stacking indices. This problem
560 // can be solved very efficiently by calculating the min/max stacking indices in
561 // the subtree, and the number stacking container descendants. Once we have this
562 // information, we know that the subtree's indices form a contiguous block if:
563 //
564 // maxStackIndex - minStackIndex == numSCDescendants
565 //
566 // So for node A in the example above we would have:
567 // maxStackIndex = 1
568 // minStackIndex = -1
569 // numSCDecendants = 2
570 //
571 // and so,
572 // maxStackIndex - minStackIndex == numSCDescendants
573 // ===> 1 - (-1) == 2
574 // ===> 2 == 2
575 //
576 // Since this is true, A can safely become a stacking container.
577 // Now, for node C we have:
578 //
579 // maxStackIndex = 4
580 // minStackIndex = 0 <-- because C has stacking index 0.
581 // numSCDecendants = 2
582 //
583 // and so,
584 // maxStackIndex - minStackIndex == numSCDescendants
585 // ===> 4 - 0 == 2
586 // ===> 4 == 2
587 //
588 // Since this is false, C cannot be safely promoted to a stacking container. Thi s
589 // happened because of the elements with z-index 5 and 0. Now if 5 had been a
590 // child of C rather than D, and A had no child with Z index 0, we would have ha d:
591 //
592 // maxStackIndex = 3
593 // minStackIndex = 0 <-- because C has stacking index 0.
594 // numSCDecendants = 3
595 //
596 // and so,
597 // maxStackIndex - minStackIndex == numSCDescendants
598 // ===> 3 - 0 == 3
599 // ===> 3 == 3
600 //
601 // And we would conclude that C could be promoted.
602 void RenderLayer::updateDescendantsAreContiguousInStackingOrder()
603 {
604 if (!isStackingContext() || !acceleratedCompositingForOverflowScrollEnabled( ))
605 return;
606
607 ASSERT(!m_normalFlowListDirty);
608 ASSERT(!m_zOrderListsDirty);
609
610 OwnPtr<Vector<RenderLayer*> > posZOrderList;
611 OwnPtr<Vector<RenderLayer*> > negZOrderList;
612 rebuildZOrderLists(StopAtStackingContexts, posZOrderList, negZOrderList);
613
614 // Create a reverse lookup.
615 HashMap<const RenderLayer*, int> lookup;
616
617 if (negZOrderList) {
618 int stackingOrderIndex = -1;
619 size_t listSize = negZOrderList->size();
620 for (size_t i = 0; i < listSize; ++i) {
621 RenderLayer* currentLayer = negZOrderList->at(listSize - i - 1);
622 if (!currentLayer->isStackingContext())
623 continue;
624 lookup.set(currentLayer, stackingOrderIndex--);
625 }
626 }
627
628 if (posZOrderList) {
629 size_t listSize = posZOrderList->size();
630 int stackingOrderIndex = 1;
631 for (size_t i = 0; i < listSize; ++i) {
632 RenderLayer* currentLayer = posZOrderList->at(i);
633 if (!currentLayer->isStackingContext())
634 continue;
635 lookup.set(currentLayer, stackingOrderIndex++);
636 }
637 }
638
639 int minIndex = 0;
640 int maxIndex = 0;
641 int count = 0;
642 bool firstIteration = true;
643 updateDescendantsAreContiguousInStackingOrderRecursive(lookup, minIndex, max Index, count, firstIteration);
644 }
645
646 void RenderLayer::updateDescendantsAreContiguousInStackingOrderRecursive(const H ashMap<const RenderLayer*, int>& lookup, int& minIndex, int& maxIndex, int& coun t, bool firstIteration)
647 {
648 if (isStackingContext() && !firstIteration) {
649 if (lookup.contains(this)) {
650 minIndex = std::min(minIndex, lookup.get(this));
651 maxIndex = std::max(maxIndex, lookup.get(this));
652 count++;
653 }
654 return;
655 }
656
657 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) {
658 int childMinIndex = 0;
659 int childMaxIndex = 0;
660 int childCount = 0;
661 child->updateDescendantsAreContiguousInStackingOrderRecursive(lookup, ch ildMinIndex, childMaxIndex, childCount, false);
662 if (childCount) {
663 count += childCount;
664 minIndex = std::min(minIndex, childMinIndex);
665 maxIndex = std::max(maxIndex, childMaxIndex);
666 }
667 }
668
669 if (!isStackingContext()) {
670 bool newValue = maxIndex - minIndex == count;
671 bool didUpdate = newValue != m_descendantsAreContiguousInStackingOrder;
672 m_descendantsAreContiguousInStackingOrder = newValue;
673 if (didUpdate)
674 updateNeedsCompositedScrolling();
675 }
676 }
677
678 static inline bool isPositionedContainer(const RenderLayer* layer) 525 static inline bool isPositionedContainer(const RenderLayer* layer)
679 { 526 {
680 // FIXME: This is not in sync with containingBlock. 527 // FIXME: This is not in sync with containingBlock.
681 // RenderObject::canContainFixedPositionedObject() should probably be used 528 // RenderObject::canContainFixedPositionedObject() should probably be used
682 // instead. 529 // instead.
683 RenderLayerModelObject* layerRenderer = layer->renderer(); 530 RenderLayerModelObject* layerRenderer = layer->renderer();
684 return layer->isRootLayer() || layerRenderer->isPositioned() || layer->hasTr ansform(); 531 return layer->isRootLayer() || layerRenderer->isPositioned() || layer->hasTr ansform();
685 } 532 }
686 533
687 enum StackingOrderDirection { FromBackground, FromForeground }; 534 enum StackingOrderDirection { FromBackground, FromForeground };
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
812 if (posZOrderListBeforePromote->at(index) == positionedAncestor) { 659 if (posZOrderListBeforePromote->at(index) == positionedAncestor) {
813 posZOrderListBeforePromote->insert(index + 1, this); 660 posZOrderListBeforePromote->insert(index + 1, this);
814 posZOrderListSizeBeforePromote++; 661 posZOrderListSizeBeforePromote++;
815 break; 662 break;
816 } 663 }
817 } 664 }
818 } 665 }
819 } 666 }
820 } 667 }
821 668
669 // After promotion, the paint order consists of
670 // a) the non-descendants which precede the promoted layer,
671 // b) the promoted layer, and
672 // c) the non-descendants which succeed the promoted layer.
673 //
674 // If the current layer's descendants form a contiguous block in paint order
675 // before promotion, the paint order will consist of
676 // a) the non-descendants which precede the current layer and its descendants,
677 // b) the current layer and its descendants
678 // c) The non-descendants which succeed the current layer and its descendants.
679 //
680 // Sub-lists (a) and (c) should be identical in both paint order lists if
681 // and only if the descendants form a contiguous block. In fact, this is the
682 // only check we need to perform since the order of the descendants with
683 // respect to each other cannot be affected by promotion (i.e., we don't
684 // need to worry about sub-list (b)).
685 //
686 // Some examples:
687 // C = currentLayer
688 // - = negative z-order child of currentLayer
689 // + = positive z-order child of currentLayer
690 // A = positioned ancestor of currentLayer
691 // x = any other RenderLayer in the list
692 //
693 // original | zOrderListBeforePromote | zOrderLi stAfterPromote
694 // zOrderListBeforePromote | after inserting C as above |
695 // ------------------------------------------------------------------------- --------------
696 // (1) x---+++x | x---C+++x | xCx
697 // (2) x---+A++x | x---+AC++x | xACx
698 // (3) x-x--+++x | x-x--C+++x | xxCx
699 // (4) xxA++x | xxAC++x | xxACx
700 //
701 // In example (1), we compare sub-list (a) by marching from the left of both
702 // lists (zOrderListBeforePromote after inserting C and
703 // zOrderListAfterPromote). The first mismatch is at index 1 when we hit '-'
704 // and 'C'. That means we have neg z-order descendants. This is a problem if
705 // we have a background. Before promotion, this bg would get painted with
706 // the current layer (i.e., after the neg z-order descendants), but after
707 // promotion the bg would get painted before them. This is a stacking order
708 // violation and we can't promote. However, if we don't have a background,
709 // we would continue on to the second pass. When comparing from the right,
710 // we mismatch on '+' and 'C'. Since we hit 'C' on zOrderListAfterPromote,
711 // we know that the children are contiguous, and we will promote.
712 //
713 // In example (2), when marching from the left, we'll hit a mismatch again
714 // on the second element we look at. This time, since this element is an 'A'
715 // in zOrderListAfterPromote, this indicates that there is an extra layer
716 // (the 'A') mixed in with the children. This could cause a change in paint
717 // order if we promote, so we decide not to and break out of the loop. Note
718 // that if the current layer has a background, this would provide a second
719 // reason not to opt in, since again we have negative z-order children who
720 // would change paint order with respect to our background if we promoted.
721 //
722 // In example (3), the discontiguity of the negative z-order children causes
723 // us to fail early in our "FromBackground" pass when we try to compare '-'
724 // from zOrderListBeforePromote with 'x' in zOrderListAfterPromote.
725 //
726 // Finally in example (4), we would match 'xxAC' from the left, then stop
727 // since we hit 'C'. Then we would match 'x' from the right, and mismatch
728 // on '+' and 'C'. Since we're at 'C' on the zOrderListAfterPromote, we
729 // conclude that all the children are contiguous. Since there are no
730 // negative z-order children, a background layer is irrelevant in this case.
731 // We will opt in, keeping paint order constant.
732 static bool compareLayerListsBeforeAndAfterPromote(const RenderLayer* currentLay er,
733 const Vector<RenderLayer*>* posZOrderListBeforePromote,
734 const Vector<RenderLayer*>* negZOrderListBeforePromote,
735 const Vector<RenderLayer*>* posZOrderListAfterPromote,
736 const Vector<RenderLayer*>* negZOrderListAfterPromote,
737 const size_t sizeBeforePromote,
738 const size_t sizeAfterPromote,
739 const StackingOrderDirection direction)
740 {
741 for (size_t index = 0; index < sizeBeforePromote && index < sizeAfterPromote ; index++) {
742 const RenderLayer* layerBeforePromote = getStackingOrderElementAt(posZOr derListBeforePromote, negZOrderListBeforePromote, direction, index);
743 const RenderLayer* layerAfterPromote = getStackingOrderElementAt(posZOrd erListAfterPromote, negZOrderListAfterPromote, direction, index);
744
745 if (layerBeforePromote != layerAfterPromote) {
746 // If we find a mismatch, the only situation where we haven't
747 // necessarily changed paint order yet is if layerAfterPromote
748 // is currentLayer.
749 if (layerAfterPromote != currentLayer)
750 return false;
751
752 // Also, if the current layer has a background, then any
753 // negative z-order children will get between the background
754 // and the rest of the layer.
755 if (direction == FromBackground && currentLayer->renderer()->hasBack ground())
756 return false;
757 }
758
759 // To compare the sub-lists (a) and (c) from the comment above, we only
760 // need to march until we hit the currentLayer in the
761 // zOrderListAfterPromote from each direction.
762 if (layerAfterPromote == currentLayer)
763 break;
764 }
765
766 return true;
767 }
768
769 // Determine whether the current layer can be promoted to a stacking container,
770 // given its closest stacking context ancestor. We do this by computing what
771 // positive and negative z-order lists would look like before and after
772 // promotion, and ensuring that proper stacking order is preserved between the
773 // two sets of lists.
774 //
775 // For more details on how the lists will be compared, see the comment and
776 // examples for compareLayerListsBeforeAndAfterPromote().
777 void RenderLayer::updateCanBeStackingContainer(RenderLayer* ancestorStackingCont ext)
778 {
779 ASSERT(!isStackingContext());
780
781 // FIXME: We can early-out of this function more
782 // often if we maintain a dirty bit for the
783 // m_canBePromotedToStackingContainer property
784 // (https://bugs.webkit.org/show_bug.cgi?id=109966)
Ian Vollick 2013/04/16 19:24:33 That patch is a prereq for this, so we don't need
hartmanng 2013/04/17 20:21:53 Done.
785
786 OwnPtr<Vector<RenderLayer*> > posZOrderListBeforePromote;
787 OwnPtr<Vector<RenderLayer*> > negZOrderListBeforePromote;
788 OwnPtr<Vector<RenderLayer*> > posZOrderListAfterPromote;
789 OwnPtr<Vector<RenderLayer*> > negZOrderListAfterPromote;
790
791 getPaintOrderLists(ancestorStackingContext,
792 posZOrderListBeforePromote, negZOrderListBeforePromote,
793 posZOrderListAfterPromote, negZOrderListAfterPromote);
794
795 size_t posZOrderListSizeBeforePromote = posZOrderListBeforePromote ? posZOrd erListBeforePromote->size() : 0;
796 size_t negZOrderListSizeBeforePromote = negZOrderListBeforePromote ? negZOrd erListBeforePromote->size() : 0;
797 size_t posZOrderListSizeAfterPromote = posZOrderListAfterPromote ? posZOrder ListAfterPromote->size() : 0;
798 size_t negZOrderListSizeAfterPromote = negZOrderListAfterPromote ? negZOrder ListAfterPromote->size() : 0;
799
800 size_t sizeBeforePromote = posZOrderListSizeBeforePromote + negZOrderListSiz eBeforePromote;
801 size_t sizeAfterPromote = posZOrderListSizeAfterPromote + negZOrderListSizeA fterPromote;
802
803 bool canPromote = compareLayerListsBeforeAndAfterPromote(this, posZOrderList BeforePromote.get(), negZOrderListBeforePromote.get(),
804 posZOrderListAfterPromote.get(), negZOrderListAfterPromote.get(),
805 sizeBeforePromote, sizeAfterPromote, FromBackground)
806 && compareLayerListsBeforeAndAfterPromote(this, posZOrderListBeforePromo te.get(), negZOrderListBeforePromote.get(),
807 posZOrderListAfterPromote.get(), negZOrderListAfterPromote.get(),
808 sizeBeforePromote, sizeAfterPromote, FromForeground);
809
810 #if USE(ACCELERATED_COMPOSITING)
Ian Vollick 2013/04/16 19:24:33 These guards can go now.
hartmanng 2013/04/17 20:21:53 Done.
811 bool didUpdate = (canPromote != m_canBePromotedToStackingContainer);
812 #endif
813
814 m_canBePromotedToStackingContainer = canPromote;
815
816 #if USE(ACCELERATED_COMPOSITING)
817 if (didUpdate)
818 updateNeedsCompositedScrolling();
819 #endif
820 }
821
822 void RenderLayer::updateCanBeStackingContainerRecursively(RenderLayer* ancestorS tackingContext)
823 {
824 if (this != ancestorStackingContext) {
825 if (isStackingContext())
826 return;
827
828 updateCanBeStackingContainer(ancestorStackingContext);
829 }
830
831 if (m_hasVisibleDescendant) {
832 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin g()) {
833 // Ignore reflections.
834 if (!m_reflection || reflectionLayer() != child)
835 child->updateCanBeStackingContainerRecursively(ancestorStackingC ontext);
836 }
837 }
838 }
839
822 String RenderLayer::paintOrderListsAsText() 840 String RenderLayer::paintOrderListsAsText()
823 { 841 {
824 OwnPtr<Vector<RenderLayer*> > posZOrderListBeforePromote; 842 OwnPtr<Vector<RenderLayer*> > posZOrderListBeforePromote;
825 OwnPtr<Vector<RenderLayer*> > negZOrderListBeforePromote; 843 OwnPtr<Vector<RenderLayer*> > negZOrderListBeforePromote;
826 OwnPtr<Vector<RenderLayer*> > posZOrderListAfterPromote; 844 OwnPtr<Vector<RenderLayer*> > posZOrderListAfterPromote;
827 OwnPtr<Vector<RenderLayer*> > negZOrderListAfterPromote; 845 OwnPtr<Vector<RenderLayer*> > negZOrderListAfterPromote;
828 846
829 RenderLayer* ancestorStackingContext = this; 847 RenderLayer* ancestorStackingContext = this;
830 848
831 while (ancestorStackingContext) { 849 while (ancestorStackingContext) {
(...skipping 378 matching lines...) Expand 10 before | Expand all | Expand 10 after
1210 if (curr == ancestorStackingContainer) 1228 if (curr == ancestorStackingContainer)
1211 return; 1229 return;
1212 } 1230 }
1213 } 1231 }
1214 1232
1215 bool RenderLayer::canBeStackingContainer() const 1233 bool RenderLayer::canBeStackingContainer() const
1216 { 1234 {
1217 if (isStackingContext() || !stackingContainer()) 1235 if (isStackingContext() || !stackingContainer())
1218 return true; 1236 return true;
1219 1237
1220 return m_descendantsAreContiguousInStackingOrder; 1238 return m_canBePromotedToStackingContainer;
1221 } 1239 }
1222 1240
1223 void RenderLayer::setHasVisibleContent() 1241 void RenderLayer::setHasVisibleContent()
1224 { 1242 {
1225 if (m_hasVisibleContent && !m_visibleContentStatusDirty) { 1243 if (m_hasVisibleContent && !m_visibleContentStatusDirty) {
1226 ASSERT(!parent() || parent()->hasVisibleDescendant()); 1244 ASSERT(!parent() || parent()->hasVisibleDescendant());
1227 return; 1245 return;
1228 } 1246 }
1229 1247
1230 m_visibleContentStatusDirty = false; 1248 m_visibleContentStatusDirty = false;
(...skipping 4658 matching lines...) Expand 10 before | Expand all | Expand 10 after
5889 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin g()) { 5907 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin g()) {
5890 // Ignore reflections. 5908 // Ignore reflections.
5891 if (!m_reflection || reflectionLayer() != child) 5909 if (!m_reflection || reflectionLayer() != child)
5892 child->collectLayers(includeHiddenLayers, behavior, posBuffer, n egBuffer, layerToForceAsStackingContext); 5910 child->collectLayers(includeHiddenLayers, behavior, posBuffer, n egBuffer, layerToForceAsStackingContext);
5893 } 5911 }
5894 } 5912 }
5895 } 5913 }
5896 5914
5897 void RenderLayer::updateLayerListsIfNeeded() 5915 void RenderLayer::updateLayerListsIfNeeded()
5898 { 5916 {
5899 bool shouldUpdateDescendantsAreContiguousInStackingOrder = isStackingContext () && (m_zOrderListsDirty || m_normalFlowListDirty); 5917 bool shouldUpdateCanBeStackingContainer = acceleratedCompositingForOverflowS crollEnabled() && isStackingContext() && (m_zOrderListsDirty || m_normalFlowList Dirty);
5900 updateZOrderLists(); 5918 updateZOrderLists();
5901 updateNormalFlowList(); 5919 updateNormalFlowList();
5902 5920
5903 if (RenderLayer* reflectionLayer = this->reflectionLayer()) { 5921 if (RenderLayer* reflectionLayer = this->reflectionLayer()) {
5904 reflectionLayer->updateZOrderLists(); 5922 reflectionLayer->updateZOrderLists();
5905 reflectionLayer->updateNormalFlowList(); 5923 reflectionLayer->updateNormalFlowList();
5906 } 5924 }
5907 5925
5908 if (shouldUpdateDescendantsAreContiguousInStackingOrder) { 5926 if (shouldUpdateCanBeStackingContainer) {
5909 updateDescendantsAreContiguousInStackingOrder(); 5927 // call UpdateCanBeStackingContainer for all descendants,
5928 // passing self in as ancestor stacking context.
5929 updateCanBeStackingContainerRecursively(this);
5930
5910 // The above function can cause us to update m_needsCompositedScrolling 5931 // The above function can cause us to update m_needsCompositedScrolling
5911 // and dirty our layer lists. Refresh them if necessary. 5932 // and dirty our layer lists. Refresh them if necessary.
5912 updateZOrderLists(); 5933 updateZOrderLists();
5913 updateNormalFlowList(); 5934 updateNormalFlowList();
5914 } 5935 }
5915 } 5936 }
5916 5937
5917 void RenderLayer::updateCompositingAndLayerListsIfNeeded() 5938 void RenderLayer::updateCompositingAndLayerListsIfNeeded()
5918 { 5939 {
5919 if (compositor()->inCompositingMode()) { 5940 if (compositor()->inCompositingMode()) {
(...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after
6599 } 6620 }
6600 } 6621 }
6601 6622
6602 void showLayerTree(const WebCore::RenderObject* renderer) 6623 void showLayerTree(const WebCore::RenderObject* renderer)
6603 { 6624 {
6604 if (!renderer) 6625 if (!renderer)
6605 return; 6626 return;
6606 showLayerTree(renderer->enclosingLayer()); 6627 showLayerTree(renderer->enclosingLayer());
6607 } 6628 }
6608 #endif 6629 #endif
OLDNEW
« no previous file with comments | « Source/WebCore/rendering/RenderLayer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698