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

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

Issue 14999005: Fix RenderLayer::collectLayers logic bug. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: rebase Created 7 years, 7 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
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 691 matching lines...) Expand 10 before | Expand all | Expand 10 after
702 { 702 {
703 // FIXME: This is not in sync with containingBlock. 703 // FIXME: This is not in sync with containingBlock.
704 // RenderObject::canContainFixedPositionedObject() should probably be used 704 // RenderObject::canContainFixedPositionedObject() should probably be used
705 // instead. 705 // instead.
706 RenderLayerModelObject* layerRenderer = layer->renderer(); 706 RenderLayerModelObject* layerRenderer = layer->renderer();
707 return layer->isRootLayer() || layerRenderer->isPositioned() || layer->hasTr ansform(); 707 return layer->isRootLayer() || layerRenderer->isPositioned() || layer->hasTr ansform();
708 } 708 }
709 709
710 void RenderLayer::collectBeforePromotionZOrderList(RenderLayer* ancestorStacking Context, OwnPtr<Vector<RenderLayer*> >& posZOrderListBeforePromote, OwnPtr<Vecto r<RenderLayer*> >& negZOrderListBeforePromote) 710 void RenderLayer::collectBeforePromotionZOrderList(RenderLayer* ancestorStacking Context, OwnPtr<Vector<RenderLayer*> >& posZOrderListBeforePromote, OwnPtr<Vecto r<RenderLayer*> >& negZOrderListBeforePromote)
711 { 711 {
712 // FIXME: TemporaryChange should support bit fields. 712 ancestorStackingContext->rebuildZOrderLists(posZOrderListBeforePromote, negZ OrderListBeforePromote, this, ForceCompositedScrollingOff);
713 bool oldNeedsCompositedScrolling = m_needsCompositedScrolling;
714 bool oldIsNormalFlowOnly = m_isNormalFlowOnly;
715
716 m_needsCompositedScrolling = false;
717 m_isNormalFlowOnly = shouldBeNormalFlowOnly();
718
719 ancestorStackingContext->rebuildZOrderLists(StopAtStackingContexts, posZOrde rListBeforePromote, negZOrderListBeforePromote, 0);
720
721 m_needsCompositedScrolling = oldNeedsCompositedScrolling;
722 m_isNormalFlowOnly = oldIsNormalFlowOnly;
723 713
724 const RenderLayer* positionedAncestor = parent(); 714 const RenderLayer* positionedAncestor = parent();
725 while (positionedAncestor && !isPositionedContainer(positionedAncestor) && ! positionedAncestor->isStackingContext()) 715 while (positionedAncestor && !isPositionedContainer(positionedAncestor) && ! positionedAncestor->isStackingContext())
726 positionedAncestor = positionedAncestor->parent(); 716 positionedAncestor = positionedAncestor->parent();
727 if (positionedAncestor && (!isPositionedContainer(positionedAncestor) || pos itionedAncestor->isStackingContext())) 717 if (positionedAncestor && (!isPositionedContainer(positionedAncestor) || pos itionedAncestor->isStackingContext()))
728 positionedAncestor = 0; 718 positionedAncestor = 0;
729 719
730 if (!posZOrderListBeforePromote) 720 if (!posZOrderListBeforePromote)
731 posZOrderListBeforePromote = adoptPtr(new Vector<RenderLayer*>()); 721 posZOrderListBeforePromote = adoptPtr(new Vector<RenderLayer*>());
732 else if (posZOrderListBeforePromote->find(this) != notFound) 722 else if (posZOrderListBeforePromote->find(this) != notFound)
(...skipping 10 matching lines...) Expand all
743 for (size_t index = 0; index < posZOrderListBeforePromote->size(); index++) { 733 for (size_t index = 0; index < posZOrderListBeforePromote->size(); index++) {
744 if (posZOrderListBeforePromote->at(index) == positionedAncestor) { 734 if (posZOrderListBeforePromote->at(index) == positionedAncestor) {
745 posZOrderListBeforePromote->insert(index + 1, this); 735 posZOrderListBeforePromote->insert(index + 1, this);
746 return; 736 return;
747 } 737 }
748 } 738 }
749 } 739 }
750 740
751 void RenderLayer::collectAfterPromotionZOrderList(RenderLayer* ancestorStackingC ontext, OwnPtr<Vector<RenderLayer*> >& posZOrderListAfterPromote, OwnPtr<Vector< RenderLayer*> >& negZOrderListAfterPromote) 741 void RenderLayer::collectAfterPromotionZOrderList(RenderLayer* ancestorStackingC ontext, OwnPtr<Vector<RenderLayer*> >& posZOrderListAfterPromote, OwnPtr<Vector< RenderLayer*> >& negZOrderListAfterPromote)
752 { 742 {
753 // FIXME: TemporaryChange should support bit fields. 743 ancestorStackingContext->rebuildZOrderLists(posZOrderListAfterPromote, negZO rderListAfterPromote, this, ForceCompositedScrollingOn);
754 bool oldNeedsCompositedScrolling = m_needsCompositedScrolling;
755 bool oldIsNormalFlowOnly = m_isNormalFlowOnly;
756
757 m_isNormalFlowOnly = false;
758 m_needsCompositedScrolling = true;
759
760 ancestorStackingContext->rebuildZOrderLists(StopAtStackingContexts, posZOrde rListAfterPromote, negZOrderListAfterPromote, this);
761
762 m_needsCompositedScrolling = oldNeedsCompositedScrolling;
763 m_isNormalFlowOnly = oldIsNormalFlowOnly;
764 } 744 }
765 745
766 // Compute what positive and negative z-order lists would look like before and 746 // Compute what positive and negative z-order lists would look like before and
767 // after promotion, so we can later ensure that proper stacking order is 747 // after promotion, so we can later ensure that proper stacking order is
768 // preserved between the two sets of lists. 748 // preserved between the two sets of lists.
769 // 749 //
770 // A few examples: 750 // A few examples:
771 // c = currentLayer 751 // c = currentLayer
772 // - = negative z-order child of currentLayer 752 // - = negative z-order child of currentLayer
773 // + = positive z-order child of currentLayer 753 // + = positive z-order child of currentLayer
(...skipping 4934 matching lines...) Expand 10 before | Expand all | Expand 10 after
5708 compositor()->setCompositingLayersNeedRebuild(); 5688 compositor()->setCompositingLayersNeedRebuild();
5709 if (acceleratedCompositingForOverflowScrollEnabled()) 5689 if (acceleratedCompositingForOverflowScrollEnabled())
5710 compositor()->setShouldReevaluateCompositingAfterLayout(); 5690 compositor()->setShouldReevaluateCompositingAfterLayout();
5711 } 5691 }
5712 } 5692 }
5713 5693
5714 void RenderLayer::rebuildZOrderLists() 5694 void RenderLayer::rebuildZOrderLists()
5715 { 5695 {
5716 ASSERT(m_layerListMutationAllowed); 5696 ASSERT(m_layerListMutationAllowed);
5717 ASSERT(isDirtyStackingContainer()); 5697 ASSERT(isDirtyStackingContainer());
5718 rebuildZOrderLists(StopAtStackingContainers, m_posZOrderList, m_negZOrderLis t); 5698 rebuildZOrderLists(m_posZOrderList, m_negZOrderList);
5719 m_zOrderListsDirty = false; 5699 m_zOrderListsDirty = false;
5720 } 5700 }
5721 5701
5722 void RenderLayer::rebuildZOrderLists(CollectLayersBehavior behavior, OwnPtr<Vect or<RenderLayer*> >& posZOrderList, OwnPtr<Vector<RenderLayer*> >& negZOrderList, const RenderLayer* layerToForceAsStackingContainer) 5702 void RenderLayer::rebuildZOrderLists(OwnPtr<Vector<RenderLayer*> >& posZOrderLis t, OwnPtr<Vector<RenderLayer*> >& negZOrderList, const RenderLayer* layerToForce AsStackingContainer, ForceNeedsCompositedScrollingMode forceMode)
5723 { 5703 {
5724 bool includeHiddenLayers = compositor()->inCompositingMode(); 5704 bool includeHiddenLayers = compositor()->inCompositingMode();
5725 for (RenderLayer* child = firstChild(); child; child = child->nextSibling()) 5705 for (RenderLayer* child = firstChild(); child; child = child->nextSibling())
5726 if (!m_reflection || reflectionLayer() != child) 5706 if (!m_reflection || reflectionLayer() != child)
5727 child->collectLayers(includeHiddenLayers, behavior, posZOrderList, n egZOrderList, layerToForceAsStackingContainer); 5707 child->collectLayers(includeHiddenLayers, posZOrderList, negZOrderLi st, layerToForceAsStackingContainer, forceMode);
5728 5708
5729 // Sort the two lists. 5709 // Sort the two lists.
5730 if (posZOrderList) 5710 if (posZOrderList)
5731 std::stable_sort(posZOrderList->begin(), posZOrderList->end(), compareZI ndex); 5711 std::stable_sort(posZOrderList->begin(), posZOrderList->end(), compareZI ndex);
5732 5712
5733 if (negZOrderList) 5713 if (negZOrderList)
5734 std::stable_sort(negZOrderList->begin(), negZOrderList->end(), compareZI ndex); 5714 std::stable_sort(negZOrderList->begin(), negZOrderList->end(), compareZI ndex);
5735 5715
5736 // Append layers for top layer elements after normal layer collection, to en sure they are on top regardless of z-indexes. 5716 // Append layers for top layer elements after normal layer collection, to en sure they are on top regardless of z-indexes.
5737 // The renderers of top layer elements are children of the view, sorted in t op layer stacking order. 5717 // The renderers of top layer elements are children of the view, sorted in t op layer stacking order.
(...skipping 21 matching lines...) Expand all
5759 if (child->isNormalFlowOnly() && (!m_reflection || reflectionLayer() != child)) { 5739 if (child->isNormalFlowOnly() && (!m_reflection || reflectionLayer() != child)) {
5760 if (!m_normalFlowList) 5740 if (!m_normalFlowList)
5761 m_normalFlowList = adoptPtr(new Vector<RenderLayer*>); 5741 m_normalFlowList = adoptPtr(new Vector<RenderLayer*>);
5762 m_normalFlowList->append(child); 5742 m_normalFlowList->append(child);
5763 } 5743 }
5764 } 5744 }
5765 5745
5766 m_normalFlowListDirty = false; 5746 m_normalFlowListDirty = false;
5767 } 5747 }
5768 5748
5769 void RenderLayer::collectLayers(bool includeHiddenLayers, CollectLayersBehavior behavior, OwnPtr<Vector<RenderLayer*> >& posBuffer, OwnPtr<Vector<RenderLayer*> >& negBuffer, const RenderLayer* layerToForceAsStackingContainer) 5749 void RenderLayer::collectLayers(bool includeHiddenLayers, OwnPtr<Vector<RenderLa yer*> >& posBuffer, OwnPtr<Vector<RenderLayer*> >& negBuffer, const RenderLayer* layerToForceAsStackingContainer, ForceNeedsCompositedScrollingMode forceMode)
5770 { 5750 {
5771 if (isInTopLayer()) 5751 if (isInTopLayer())
5772 return; 5752 return;
5773 5753
5774 updateDescendantDependentFlags(); 5754 updateDescendantDependentFlags();
5775 5755
5776 bool isStacking = false; 5756 bool isStacking = false;
5757 bool isNormalFlow = false;
5777 5758
5778 switch (behavior) { 5759 // To decide whether to treat the current layers as a stacking context or
5779 case StopAtStackingContexts: 5760 // normal flow only, we have to take the current state of
5780 isStacking = (this == layerToForceAsStackingContainer) || isStacking Context(); 5761 // ForceNeedsCompositedScrollingMode into account.
5762 if (this == layerToForceAsStackingContainer) {
5763 switch (forceMode) {
5764 case ForceCompositedScrollingOn:
5765 isStacking = true;
5766 isNormalFlow = false;
5781 break; 5767 break;
5782 5768 case ForceCompositedScrollingOff:
5783 case StopAtStackingContainers: 5769 isStacking = isStackingContext();
5784 isStacking = (this == layerToForceAsStackingContainer) || isStacking Container(); 5770 isNormalFlow = shouldBeNormalFlowOnly(ForceCompositedScrollingOff);
5785 break; 5771 break;
5772 case DoNotForceCompositedScrolling:
shawnsingh 2013/05/07 00:47:42 It might be more robust to future code changes to
hartmanng 2013/05/13 19:27:06 Based on https://codereview.chromium.org/14458008/
5773 // If we've supplied a layer to force, we should either be forcing o n or off.
5774 ASSERT_NOT_REACHED();
5775 break;
5776 }
5777 } else if (forceMode == DoNotForceCompositedScrolling) {
5778 isStacking = isStackingContainer();
5779 isNormalFlow = isNormalFlowOnly();
5780 } else {
5781 // If we get to this case, we need to descend to stacking containers,
5782 // and therefore composited-ness should not be taken into account at
5783 // all.
5784 isStacking = isStackingContext();
5785 isNormalFlow = shouldBeNormalFlowOnly(ForceCompositedScrollingOff);
5786 } 5786 }
5787 5787
5788 // Overflow layers are just painted by their enclosing layers, so they don't get put in zorder lists. 5788 // Overflow layers are just painted by their enclosing layers, so they don't get put in zorder lists.
5789 bool includeHiddenLayer = includeHiddenLayers || (m_hasVisibleContent || (m_ hasVisibleDescendant && isStacking)); 5789 bool includeHiddenLayer = includeHiddenLayers || (m_hasVisibleContent || (m_ hasVisibleDescendant && isStacking));
5790 if (includeHiddenLayer && !isNormalFlowOnly() && !isOutOfFlowRenderFlowThrea d()) { 5790 if (includeHiddenLayer && !isNormalFlow && !isOutOfFlowRenderFlowThread()) {
5791 // Determine which buffer the child should be in. 5791 // Determine which buffer the child should be in.
5792 OwnPtr<Vector<RenderLayer*> >& buffer = (zIndex() >= 0) ? posBuffer : ne gBuffer; 5792 OwnPtr<Vector<RenderLayer*> >& buffer = (zIndex() >= 0) ? posBuffer : ne gBuffer;
5793 5793
5794 // Create the buffer if it doesn't exist yet. 5794 // Create the buffer if it doesn't exist yet.
5795 if (!buffer) 5795 if (!buffer)
5796 buffer = adoptPtr(new Vector<RenderLayer*>); 5796 buffer = adoptPtr(new Vector<RenderLayer*>);
5797 5797
5798 // Append ourselves at the end of the appropriate buffer. 5798 // Append ourselves at the end of the appropriate buffer.
5799 buffer->append(this); 5799 buffer->append(this);
5800 } 5800 }
5801 5801
5802 // Recur into our children to collect more layers, but only if we don't esta blish 5802 // Recur into our children to collect more layers, but only if we don't esta blish
5803 // a stacking context/container. 5803 // a stacking context/container.
5804 if ((includeHiddenLayers || m_hasVisibleDescendant) && !isStacking) { 5804 if ((includeHiddenLayers || m_hasVisibleDescendant) && !isStacking) {
5805 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin g()) { 5805 for (RenderLayer* child = firstChild(); child; child = child->nextSiblin g()) {
5806 // Ignore reflections. 5806 // Ignore reflections.
5807 if (!m_reflection || reflectionLayer() != child) 5807 if (!m_reflection || reflectionLayer() != child)
5808 child->collectLayers(includeHiddenLayers, behavior, posBuffer, n egBuffer, layerToForceAsStackingContainer); 5808 child->collectLayers(includeHiddenLayers, posBuffer, negBuffer, layerToForceAsStackingContainer, forceMode);
5809 } 5809 }
5810 } 5810 }
5811 } 5811 }
5812 5812
5813 void RenderLayer::updateLayerListsIfNeeded() 5813 void RenderLayer::updateLayerListsIfNeeded()
5814 { 5814 {
5815 updateZOrderLists(); 5815 updateZOrderLists();
5816 updateNormalFlowList(); 5816 updateNormalFlowList();
5817 5817
5818 if (RenderLayer* reflectionLayer = this->reflectionLayer()) { 5818 if (RenderLayer* reflectionLayer = this->reflectionLayer()) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
5865 void RenderLayer::repaintIncludingNonCompositingDescendants(RenderLayerModelObje ct* repaintContainer) 5865 void RenderLayer::repaintIncludingNonCompositingDescendants(RenderLayerModelObje ct* repaintContainer)
5866 { 5866 {
5867 renderer()->repaintUsingContainer(repaintContainer, pixelSnappedIntRect(rend erer()->clippedOverflowRectForRepaint(repaintContainer))); 5867 renderer()->repaintUsingContainer(repaintContainer, pixelSnappedIntRect(rend erer()->clippedOverflowRectForRepaint(repaintContainer)));
5868 5868
5869 for (RenderLayer* curr = firstChild(); curr; curr = curr->nextSibling()) { 5869 for (RenderLayer* curr = firstChild(); curr; curr = curr->nextSibling()) {
5870 if (!curr->isComposited()) 5870 if (!curr->isComposited())
5871 curr->repaintIncludingNonCompositingDescendants(repaintContainer); 5871 curr->repaintIncludingNonCompositingDescendants(repaintContainer);
5872 } 5872 }
5873 } 5873 }
5874 5874
5875 bool RenderLayer::shouldBeNormalFlowOnly() const 5875 bool RenderLayer::shouldBeNormalFlowOnly(ForceNeedsCompositedScrollingMode force Mode) const
5876 { 5876 {
5877 const bool needsCompositedScrollingGivenForceMode = ((forceMode == ForceComp ositedScrollingOff) || !needsCompositedScrolling());
shawnsingh 2013/05/07 00:47:42 I think this variable name is a little unclear --
hartmanng 2013/05/13 19:27:06 Good point, it is a bit confusing. I was trying to
5877 return (renderer()->hasOverflowClip() 5878 return (renderer()->hasOverflowClip()
5878 || renderer()->hasReflection() 5879 || renderer()->hasReflection()
5879 || renderer()->hasMask() 5880 || renderer()->hasMask()
5880 || renderer()->isCanvas() 5881 || renderer()->isCanvas()
5881 || renderer()->isVideo() 5882 || renderer()->isVideo()
5882 || renderer()->isEmbeddedObject() 5883 || renderer()->isEmbeddedObject()
5883 || renderer()->isRenderIFrame() 5884 || renderer()->isRenderIFrame()
5884 || (renderer()->style()->specifiesColumns() && !isRootLayer())) 5885 || (renderer()->style()->specifiesColumns() && !isRootLayer()))
5885 && !renderer()->isPositioned() 5886 && !renderer()->isPositioned()
5886 && !renderer()->hasTransform() 5887 && !renderer()->hasTransform()
5887 && !renderer()->hasClipPath() 5888 && !renderer()->hasClipPath()
5888 && !renderer()->hasFilter() 5889 && !renderer()->hasFilter()
5889 #if ENABLE(CSS_COMPOSITING) 5890 #if ENABLE(CSS_COMPOSITING)
5890 && !renderer()->hasBlendMode() 5891 && !renderer()->hasBlendMode()
5891 #endif 5892 #endif
5892 && !isTransparent() 5893 && !isTransparent()
5893 && !needsCompositedScrolling() 5894 && needsCompositedScrollingGivenForceMode
5894 && !renderer()->isFloatingWithShapeOutside() 5895 && !renderer()->isFloatingWithShapeOutside()
5895 ; 5896 ;
5896 } 5897 }
5897 5898
5898 void RenderLayer::updateIsNormalFlowOnly() 5899 void RenderLayer::updateIsNormalFlowOnly()
5899 { 5900 {
5900 bool isNormalFlowOnly = shouldBeNormalFlowOnly(); 5901 bool isNormalFlowOnly = shouldBeNormalFlowOnly();
5901 if (isNormalFlowOnly == m_isNormalFlowOnly) 5902 if (isNormalFlowOnly == m_isNormalFlowOnly)
5902 return; 5903 return;
5903 5904
(...skipping 589 matching lines...) Expand 10 before | Expand all | Expand 10 after
6493 } 6494 }
6494 } 6495 }
6495 6496
6496 void showLayerTree(const WebCore::RenderObject* renderer) 6497 void showLayerTree(const WebCore::RenderObject* renderer)
6497 { 6498 {
6498 if (!renderer) 6499 if (!renderer)
6499 return; 6500 return;
6500 showLayerTree(renderer->enclosingLayer()); 6501 showLayerTree(renderer->enclosingLayer());
6501 } 6502 }
6502 #endif 6503 #endif
OLDNEW
« Source/core/rendering/RenderLayer.h ('K') | « Source/core/rendering/RenderLayer.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698