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

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

Issue 13427009: Replace the current contiguity check for composited scrolling (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: rebase 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/core/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 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
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(true)
150 , m_needsCompositedScrolling(false) 150 , m_needsCompositedScrolling(false)
151 , m_descendantsAreContiguousInStackingOrder(false) 151 , m_canBePromotedToStackingContainer(false)
152 , m_descendantsAreContiguousInStackingOrderDirty(true) 152 , m_canBePromotedToStackingContainerDirty(true)
153 , m_isRootLayer(renderer->isRenderView()) 153 , m_isRootLayer(renderer->isRenderView())
154 , m_usedTransparency(false) 154 , m_usedTransparency(false)
155 , m_paintingInsideReflection(false) 155 , m_paintingInsideReflection(false)
156 , m_inOverflowRelayout(false) 156 , m_inOverflowRelayout(false)
157 , m_repaintStatus(NeedsNormalRepaint) 157 , m_repaintStatus(NeedsNormalRepaint)
158 , m_visibleContentStatusDirty(true) 158 , m_visibleContentStatusDirty(true)
159 , m_hasVisibleContent(false) 159 , m_hasVisibleContent(false)
160 , m_visibleDescendantStatusDirty(false) 160 , m_visibleDescendantStatusDirty(false)
161 , m_hasVisibleDescendant(false) 161 , m_hasVisibleDescendant(false)
162 , m_isPaginated(false) 162 , m_isPaginated(false)
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
478 } 478 }
479 } 479 }
480 480
481 bool RenderLayer::acceleratedCompositingForOverflowScrollEnabled() const 481 bool RenderLayer::acceleratedCompositingForOverflowScrollEnabled() const
482 { 482 {
483 return renderer()->frame() 483 return renderer()->frame()
484 && renderer()->frame()->page() 484 && renderer()->frame()->page()
485 && renderer()->frame()->page()->settings()->acceleratedCompositingForOve rflowScrollEnabled(); 485 && renderer()->frame()->page()->settings()->acceleratedCompositingForOve rflowScrollEnabled();
486 } 486 }
487 487
488 // If we are a stacking container, then this function will determine if our
489 // descendants for a contiguous block in stacking order. This is required in
490 // order for an element to be safely promoted to a stacking container. It is saf e
491 // to become a stacking container if this change would not alter the stacking
492 // order of layers on the page. That can only happen if a non-descendant appear
493 // between us and our descendants in stacking order. Here's an example:
494 //
495 // this
496 // / | \.
497 // A B C
498 // /\ | /\.
499 // 0 -8 D 2 7
500 // |
501 // 5
502 //
503 // I've labeled our normal flow descendants A, B, C, and D, our stacking
504 // container descendants with their z indices, and us with 'this' (we're a
505 // stacking container and our zIndex doesn't matter here). These nodes appear in
506 // three lists: posZOrder, negZOrder, and normal flow (keep in mind that normal
507 // flow layers don't overlap). So if we arrange these lists in order we get our
508 // stacking order:
509 //
510 // [-8], [A-D], [0, 2, 5, 7]--> pos z-order.
511 // | |
512 // Neg z-order. <-+ +--> Normal flow descendants.
513 //
514 // We can then assign new, 'stacking' order indices to these elements as follows :
515 //
516 // [-8], [A-D], [0, 2, 5, 7]
517 // 'Stacking' indices: -1 0 1 2 3 4
518 //
519 // Note that the normal flow descendants can share an index because they don't
520 // stack/overlap. Now our problem becomes very simple: a layer can safely become
521 // a stacking container if the stacking-order indices of it and its descendants
522 // appear in a contiguous block in the list of stacking indices. This problem
523 // can be solved very efficiently by calculating the min/max stacking indices in
524 // the subtree, and the number stacking container descendants. Once we have this
525 // information, we know that the subtree's indices form a contiguous block if:
526 //
527 // maxStackIndex - minStackIndex == numSCDescendants
528 //
529 // So for node A in the example above we would have:
530 // maxStackIndex = 1
531 // minStackIndex = -1
532 // numSCDecendants = 2
533 //
534 // and so,
535 // maxStackIndex - minStackIndex == numSCDescendants
536 // ===> 1 - (-1) == 2
537 // ===> 2 == 2
538 //
539 // Since this is true, A can safely become a stacking container.
540 // Now, for node C we have:
541 //
542 // maxStackIndex = 4
543 // minStackIndex = 0 <-- because C has stacking index 0.
544 // numSCDecendants = 2
545 //
546 // and so,
547 // maxStackIndex - minStackIndex == numSCDescendants
548 // ===> 4 - 0 == 2
549 // ===> 4 == 2
550 //
551 // Since this is false, C cannot be safely promoted to a stacking container. Thi s
552 // happened because of the elements with z-index 5 and 0. Now if 5 had been a
553 // child of C rather than D, and A had no child with Z index 0, we would have ha d:
554 //
555 // maxStackIndex = 3
556 // minStackIndex = 0 <-- because C has stacking index 0.
557 // numSCDecendants = 3
558 //
559 // and so,
560 // maxStackIndex - minStackIndex == numSCDescendants
561 // ===> 3 - 0 == 3
562 // ===> 3 == 3
563 //
564 // And we would conclude that C could be promoted.
565 void RenderLayer::updateDescendantsAreContiguousInStackingOrder()
566 {
567 if (!m_descendantsAreContiguousInStackingOrderDirty || !isStackingContext() || !acceleratedCompositingForOverflowScrollEnabled())
568 return;
569
570 ASSERT(!m_normalFlowListDirty);
571 ASSERT(!m_zOrderListsDirty);
572
573 OwnPtr<Vector<RenderLayer*> > posZOrderList;
574 OwnPtr<Vector<RenderLayer*> > negZOrderList;
575 rebuildZOrderLists(StopAtStackingContexts, posZOrderList, negZOrderList);
576
577 // Create a reverse lookup.
578 HashMap<const RenderLayer*, int> lookup;
579
580 if (negZOrderList) {
581 int stackingOrderIndex = -1;
582 size_t listSize = negZOrderList->size();
583 for (size_t i = 0; i < listSize; ++i) {
584 RenderLayer* currentLayer = negZOrderList->at(listSize - i - 1);
585 if (!currentLayer->isStackingContext())
586 continue;
587 lookup.set(currentLayer, stackingOrderIndex--);
588 }
589 }
590
591 if (posZOrderList) {
592 size_t listSize = posZOrderList->size();
593 int stackingOrderIndex = 1;
594 for (size_t i = 0; i < listSize; ++i) {
595 RenderLayer* currentLayer = posZOrderList->at(i);
596 if (!currentLayer->isStackingContext())
597 continue;
598 lookup.set(currentLayer, stackingOrderIndex++);
599 }
600 }
601
602 int minIndex = 0;
603 int maxIndex = 0;
604 int count = 0;
605 bool firstIteration = true;
606 updateDescendantsAreContiguousInStackingOrderRecursive(lookup, minIndex, max Index, count, firstIteration);
607
608 m_descendantsAreContiguousInStackingOrderDirty = false;
609 }
610
611 void RenderLayer::updateDescendantsAreContiguousInStackingOrderRecursive(const H ashMap<const RenderLayer*, int>& lookup, int& minIndex, int& maxIndex, int& coun t, bool firstIteration)
612 {
613 if (isStackingContext() && !firstIteration) {
614 if (lookup.contains(this)) {
615 minIndex = std::min(minIndex, lookup.get(this));
616 maxIndex = std::max(maxIndex, lookup.get(this));
617 count++;
618 }
619 return;
620 }
621
622 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) {
623 int childMinIndex = 0;
624 int childMaxIndex = 0;
625 int childCount = 0;
626 child->updateDescendantsAreContiguousInStackingOrderRecursive(lookup, ch ildMinIndex, childMaxIndex, childCount, false);
627 if (childCount) {
628 count += childCount;
629 minIndex = std::min(minIndex, childMinIndex);
630 maxIndex = std::max(maxIndex, childMaxIndex);
631 }
632 }
633
634 if (!isStackingContext()) {
635 bool newValue = maxIndex - minIndex == count;
636 bool didUpdate = newValue != m_descendantsAreContiguousInStackingOrder;
637 m_descendantsAreContiguousInStackingOrder = newValue;
638 if (didUpdate)
639 updateNeedsCompositedScrolling();
640 }
641 }
642
643 static inline bool isPositionedContainer(const RenderLayer* layer) 488 static inline bool isPositionedContainer(const RenderLayer* layer)
644 { 489 {
645 // FIXME: This is not in sync with containingBlock. 490 // FIXME: This is not in sync with containingBlock.
646 // RenderObject::canContainFixedPositionedObject() should probably be used 491 // RenderObject::canContainFixedPositionedObject() should probably be used
647 // instead. 492 // instead.
648 RenderLayerModelObject* layerRenderer = layer->renderer(); 493 RenderLayerModelObject* layerRenderer = layer->renderer();
649 return layer->isRootLayer() || layerRenderer->isPositioned() || layer->hasTr ansform(); 494 return layer->isRootLayer() || layerRenderer->isPositioned() || layer->hasTr ansform();
650 } 495 }
651 496
652 enum StackingOrderDirection { FromBackground, FromForeground }; 497 enum StackingOrderDirection { FromBackground, FromForeground };
(...skipping 16 matching lines...) Expand all
669 } 514 }
670 515
671 size_t posZOrderListSize = posZOrderList ? posZOrderList->size() : 0; 516 size_t posZOrderListSize = posZOrderList ? posZOrderList->size() : 0;
672 517
673 if (index < posZOrderListSize) 518 if (index < posZOrderListSize)
674 return posZOrderList->at(posZOrderListSize - index - 1); 519 return posZOrderList->at(posZOrderListSize - index - 1);
675 520
676 return negZOrderList->at(negZOrderListSize - (index - posZOrderListSize) - 1 ); 521 return negZOrderList->at(negZOrderListSize - (index - posZOrderListSize) - 1 );
677 } 522 }
678 523
524
525 // After promotion, the paint order consists of
526 // a) the non-descendants which precede the promoted layer,
527 // b) the promoted layer, and
528 // c) the non-descendants which succeed the promoted layer.
529 //
530 // If the current layer's descendants form a contiguous block in paint order
531 // before promotion, the paint order will consist of
532 // a) the non-descendants which precede the current layer and its descendants,
533 // b) the current layer and its descendants
534 // c) The non-descendants which succeed the current layer and its descendants.
535 //
536 // Sub-lists (a) and (c) should be identical in both paint order lists if
537 // and only if the descendants form a contiguous block. In fact, this is the
538 // only check we need to perform since the order of the descendants with
539 // respect to each other cannot be affected by promotion (i.e., we don't
540 // need to worry about sub-list (b)).
541 //
542 // Some examples:
543 // C = currentLayer
544 // - = negative z-order child of currentLayer
545 // + = positive z-order child of currentLayer
546 // A = positioned ancestor of currentLayer
Julien - ping for review 2013/04/25 21:09:04 A as in Positioned?
hartmanng 2013/05/06 21:41:52 Done.
547 // x = any other RenderLayer in the list
548 //
549 // original | zOrderListBeforePromote | zOrderLi stAfterPromote
550 // zOrderListBeforePromote | after inserting C as above |
551 // ------------------------------------------------------------------------- --------------
552 // (1) x---+++x | x---C+++x | xCx
553 // (2) x---+A++x | x---+AC++x | xACx
554 // (3) x-x--+++x | x-x--C+++x | xxCx
555 // (4) xxA++x | xxAC++x | xxACx
556 //
557 // In example (1), we compare sub-list (a) by marching from the left of both
558 // lists (zOrderListBeforePromote after inserting C and
559 // zOrderListAfterPromote). The first mismatch is at index 1 when we hit '-'
560 // and 'C'. That means we have neg z-order descendants. This is a problem if
561 // we have a background. Before promotion, this bg would get painted with
562 // the current layer (i.e., after the neg z-order descendants), but after
563 // promotion the bg would get painted before them. This is a stacking order
564 // violation and we can't promote. However, if we don't have a background,
565 // we would continue on to the second pass. When comparing from the right,
566 // we mismatch on '+' and 'C'. Since we hit 'C' on zOrderListAfterPromote,
567 // we know that the children are contiguous, and we will promote.
568 //
569 // In example (2), when marching from the left, we'll hit a mismatch again
570 // on the second element we look at. This time, since this element is an 'A'
571 // in zOrderListAfterPromote, this indicates that there is an extra layer
572 // (the 'A') mixed in with the children. This could cause a change in paint
573 // order if we promote, so we decide not to and break out of the loop. Note
574 // that if the current layer has a background, this would provide a second
575 // reason not to opt in, since again we have negative z-order children who
576 // would change paint order with respect to our background if we promoted.
577 //
578 // In example (3), the discontiguity of the negative z-order children causes
579 // us to fail early in our "FromBackground" pass when we try to compare '-'
580 // from zOrderListBeforePromote with 'x' in zOrderListAfterPromote.
581 //
582 // Finally in example (4), we would match 'xxAC' from the left, then stop
583 // since we hit 'C'. Then we would match 'x' from the right, and mismatch
584 // on '+' and 'C'. Since we're at 'C' on the zOrderListAfterPromote, we
585 // conclude that all the children are contiguous. Since there are no
586 // negative z-order children, a background layer is irrelevant in this case.
587 // We will opt in, keeping paint order constant.
588 static bool compareLayerListsBeforeAndAfterPromote(const RenderLayer* currentLay er,
589 const Vector<RenderLayer*>* posZOrderListBeforePromote,
590 const Vector<RenderLayer*>* negZOrderListBeforePromote,
591 const Vector<RenderLayer*>* posZOrderListAfterPromote,
592 const Vector<RenderLayer*>* negZOrderListAfterPromote,
593 const size_t sizeBeforePromote,
594 const size_t sizeAfterPromote,
595 const StackingOrderDirection direction)
596 {
597 for (size_t index = 0; index < sizeBeforePromote && index < sizeAfterPromote ; index++) {
598 const RenderLayer* layerBeforePromote = getStackingOrderElementAt(posZOr derListBeforePromote, negZOrderListBeforePromote, direction, index);
599 const RenderLayer* layerAfterPromote = getStackingOrderElementAt(posZOrd erListAfterPromote, negZOrderListAfterPromote, direction, index);
600
601 if (layerBeforePromote != layerAfterPromote) {
602 // If we find a mismatch, the only situation where we haven't
603 // necessarily changed paint order yet is if layerAfterPromote
604 // is currentLayer.
605 if (layerAfterPromote != currentLayer)
606 return false;
607
608 // Also, if the current layer has a background, then any
609 // negative z-order children will get between the background
610 // and the rest of the layer.
611 if (direction == FromBackground && currentLayer->renderer()->hasBack ground())
612 return false;
613 }
614
615 // To compare the sub-lists (a) and (c) from the comment above, we only
616 // need to march until we hit the currentLayer in the
617 // zOrderListAfterPromote from each direction.
618 if (layerAfterPromote == currentLayer)
619 break;
620 }
621
622 return true;
623 }
624
625 // Determine whether the current layer can be promoted to a stacking container,
626 // given its closest stacking context ancestor. We do this by computing what
627 // positive and negative z-order lists would look like before and after
628 // promotion, and ensuring that proper stacking order is preserved between the
629 // two sets of lists.
630 //
631 // For more details on how the lists will be compared, see the comment and
632 // examples for compareLayerListsBeforeAndAfterPromote().
633 void RenderLayer::updateCanBeStackingContainer(RenderLayer* ancestorStackingCont ext)
634 {
635 ASSERT(!isStackingContext());
636
637 if (!m_canBePromotedToStackingContainerDirty || !acceleratedCompositingForOv erflowScrollEnabled())
638 return;
639
640 OwnPtr<Vector<RenderLayer*> > posZOrderListBeforePromote;
641 OwnPtr<Vector<RenderLayer*> > negZOrderListBeforePromote;
642 OwnPtr<Vector<RenderLayer*> > posZOrderListAfterPromote;
643 OwnPtr<Vector<RenderLayer*> > negZOrderListAfterPromote;
644 size_t posZOrderListSizeBeforePromote, negZOrderListSizeBeforePromote, posZO rderListSizeAfterPromote, negZOrderListSizeAfterPromote;
Julien - ping for review 2013/04/25 21:09:04 It's not really in the style guide but it's usuall
hartmanng 2013/05/06 21:41:52 Removed these variables, no longer relevant.
645
646 collectBeforePromotionZOrderList(ancestorStackingContext, posZOrderListBefor ePromote, negZOrderListBeforePromote, posZOrderListSizeBeforePromote, negZOrderL istSizeBeforePromote);
647 collectAfterPromotionZOrderList(ancestorStackingContext, posZOrderListAfterP romote, negZOrderListAfterPromote, posZOrderListSizeAfterPromote, negZOrderListS izeAfterPromote);
648
649 size_t sizeBeforePromote = posZOrderListSizeBeforePromote + negZOrderListSiz eBeforePromote;
650 size_t sizeAfterPromote = posZOrderListSizeAfterPromote + negZOrderListSizeA fterPromote;
651
652 bool canPromote = compareLayerListsBeforeAndAfterPromote(this, posZOrderList BeforePromote.get(), negZOrderListBeforePromote.get(),
653 posZOrderListAfterPromote.get(), negZOrderListAfterPromote.get(),
654 sizeBeforePromote, sizeAfterPromote, FromBackground)
655 && compareLayerListsBeforeAndAfterPromote(this, posZOrderListBeforePromo te.get(), negZOrderListBeforePromote.get(),
656 posZOrderListAfterPromote.get(), negZOrderListAfterPromote.get(),
657 sizeBeforePromote, sizeAfterPromote, FromForeground);
658
659 bool didUpdate = (canPromote != m_canBePromotedToStackingContainer);
Julien - ping for review 2013/04/25 21:09:04 You changed tense here which makes it hard to see.
hartmanng 2013/05/06 21:41:52 Done.
660
661 m_canBePromotedToStackingContainer = canPromote;
662
663 if (didUpdate)
664 updateNeedsCompositedScrolling();
665
666 m_canBePromotedToStackingContainerDirty = false;
667 }
668
669 void RenderLayer::updateCanBeStackingContainerRecursively(RenderLayer* ancestorS tackingContext)
670 {
671 if (this != ancestorStackingContext) {
672 if (isStackingContext())
673 return;
674
675 updateCanBeStackingContainer(ancestorStackingContext);
676 }
677
678 if (m_hasVisibleDescendant) {
679 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin g()) {
680 // Ignore reflections.
681 if (!m_reflection || reflectionLayer() != child)
682 child->updateCanBeStackingContainerRecursively(ancestorStackingC ontext);
683 }
684 }
685 }
686
679 // Compute what positive and negative z-order lists would look like before and 687 // Compute what positive and negative z-order lists would look like before and
680 // after promotion, so we can later ensure that proper stacking order is 688 // after promotion, so we can later ensure that proper stacking order is
681 // preserved between the two sets of lists. 689 // preserved between the two sets of lists.
682 // 690 //
683 // A few examples: 691 // A few examples:
684 // c = currentLayer 692 // c = currentLayer
685 // - = negative z-order child of currentLayer 693 // - = negative z-order child of currentLayer
686 // + = positive z-order child of currentLayer 694 // + = positive z-order child of currentLayer
687 // a = positioned ancestor of currentLayer 695 // a = positioned ancestor of currentLayer
688 // x = any other RenderLayer in the list 696 // x = any other RenderLayer in the list
(...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after
1159 if (curr == ancestorStackingContainer) 1167 if (curr == ancestorStackingContainer)
1160 return; 1168 return;
1161 } 1169 }
1162 } 1170 }
1163 1171
1164 bool RenderLayer::canBeStackingContainer() const 1172 bool RenderLayer::canBeStackingContainer() const
1165 { 1173 {
1166 if (isStackingContext() || !ancestorStackingContainer()) 1174 if (isStackingContext() || !ancestorStackingContainer())
1167 return true; 1175 return true;
1168 1176
1169 return m_descendantsAreContiguousInStackingOrder; 1177 return m_canBePromotedToStackingContainer;
Julien - ping for review 2013/04/25 21:09:04 ASSERT(!m_canBePromotedToStackingContainerDirty);
hartmanng 2013/05/06 21:41:52 Done.
1170 } 1178 }
1171 1179
1172 void RenderLayer::setHasVisibleContent() 1180 void RenderLayer::setHasVisibleContent()
1173 { 1181 {
1174 if (m_hasVisibleContent && !m_visibleContentStatusDirty) { 1182 if (m_hasVisibleContent && !m_visibleContentStatusDirty) {
1175 ASSERT(!parent() || parent()->hasVisibleDescendant()); 1183 ASSERT(!parent() || parent()->hasVisibleDescendant());
1176 return; 1184 return;
1177 } 1185 }
1178 1186
1179 m_visibleContentStatusDirty = false; 1187 m_visibleContentStatusDirty = false;
(...skipping 4524 matching lines...) Expand 10 before | Expand all | Expand 10 after
5704 { 5712 {
5705 ASSERT(m_layerListMutationAllowed); 5713 ASSERT(m_layerListMutationAllowed);
5706 ASSERT(isStackingContainer()); 5714 ASSERT(isStackingContainer());
5707 5715
5708 if (m_posZOrderList) 5716 if (m_posZOrderList)
5709 m_posZOrderList->clear(); 5717 m_posZOrderList->clear();
5710 if (m_negZOrderList) 5718 if (m_negZOrderList)
5711 m_negZOrderList->clear(); 5719 m_negZOrderList->clear();
5712 m_zOrderListsDirty = true; 5720 m_zOrderListsDirty = true;
5713 5721
5714 m_descendantsAreContiguousInStackingOrderDirty = true; 5722 m_canBePromotedToStackingContainerDirty = true;
5715 5723
5716 if (!renderer()->documentBeingDestroyed()) { 5724 if (!renderer()->documentBeingDestroyed()) {
5717 compositor()->setCompositingLayersNeedRebuild(); 5725 compositor()->setCompositingLayersNeedRebuild();
5718 if (acceleratedCompositingForOverflowScrollEnabled()) 5726 if (acceleratedCompositingForOverflowScrollEnabled())
5719 compositor()->setShouldReevaluateCompositingAfterLayout(); 5727 compositor()->setShouldReevaluateCompositingAfterLayout();
5720 } 5728 }
5721 } 5729 }
5722 5730
5723 void RenderLayer::dirtyStackingContainerZOrderLists() 5731 void RenderLayer::dirtyStackingContainerZOrderLists()
5724 { 5732 {
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
5850 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin g()) { 5858 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin g()) {
5851 // Ignore reflections. 5859 // Ignore reflections.
5852 if (!m_reflection || reflectionLayer() != child) 5860 if (!m_reflection || reflectionLayer() != child)
5853 child->collectLayers(includeHiddenLayers, behavior, posBuffer, n egBuffer, layerToForceAsStackingContainer); 5861 child->collectLayers(includeHiddenLayers, behavior, posBuffer, n egBuffer, layerToForceAsStackingContainer);
5854 } 5862 }
5855 } 5863 }
5856 } 5864 }
5857 5865
5858 void RenderLayer::updateLayerListsIfNeeded() 5866 void RenderLayer::updateLayerListsIfNeeded()
5859 { 5867 {
5860 bool shouldUpdateDescendantsAreContiguousInStackingOrder = acceleratedCompos itingForOverflowScrollEnabled() && isStackingContext() && (m_zOrderListsDirty || m_normalFlowListDirty) && m_descendantsAreContiguousInStackingOrderDirty; 5868 bool shouldUpdateCanBeStackingContainer = acceleratedCompositingForOverflowS crollEnabled() && isStackingContext() && (m_zOrderListsDirty || m_normalFlowList Dirty) && m_canBePromotedToStackingContainerDirty;
5861 updateZOrderLists(); 5869 updateZOrderLists();
5862 updateNormalFlowList(); 5870 updateNormalFlowList();
5863 5871
5864 if (RenderLayer* reflectionLayer = this->reflectionLayer()) { 5872 if (RenderLayer* reflectionLayer = this->reflectionLayer()) {
5865 reflectionLayer->updateZOrderLists(); 5873 reflectionLayer->updateZOrderLists();
5866 reflectionLayer->updateNormalFlowList(); 5874 reflectionLayer->updateNormalFlowList();
5867 } 5875 }
5868 5876
5869 if (shouldUpdateDescendantsAreContiguousInStackingOrder) { 5877 if (shouldUpdateCanBeStackingContainer) {
5870 updateDescendantsAreContiguousInStackingOrder(); 5878 // call UpdateCanBeStackingContainer for all descendants,
Julien - ping for review 2013/04/25 21:09:04 Sentences start with a capital so "Call ..."
hartmanng 2013/05/06 21:41:52 Done.
5879 // passing self in as ancestor stacking context.
5880 updateCanBeStackingContainerRecursively(this);
5881
5871 // The above function can cause us to update m_needsCompositedScrolling 5882 // The above function can cause us to update m_needsCompositedScrolling
5872 // and dirty our layer lists. Refresh them if necessary. 5883 // and dirty our layer lists. Refresh them if necessary.
5873 updateZOrderLists(); 5884 updateZOrderLists();
5874 updateNormalFlowList(); 5885 updateNormalFlowList();
5875 } 5886 }
5876 } 5887 }
5877 5888
5878 void RenderLayer::repaintIncludingDescendants() 5889 void RenderLayer::repaintIncludingDescendants()
5879 { 5890 {
5880 renderer()->repaint(); 5891 renderer()->repaint();
(...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after
6564 } 6575 }
6565 } 6576 }
6566 6577
6567 void showLayerTree(const WebCore::RenderObject* renderer) 6578 void showLayerTree(const WebCore::RenderObject* renderer)
6568 { 6579 {
6569 if (!renderer) 6580 if (!renderer)
6570 return; 6581 return;
6571 showLayerTree(renderer->enclosingLayer()); 6582 showLayerTree(renderer->enclosingLayer());
6572 } 6583 }
6573 #endif 6584 #endif
OLDNEW
« no previous file with comments | « Source/core/rendering/RenderLayer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698