# HG changeset patch # User Robert O'Callahan # Date 1419217772 -46800 # Mon Dec 22 16:09:32 2014 +1300 # Node ID 2057ac9b035e6b746b80da4ece1867b48d265eb9 # Parent b30f55f7f94cf1c3f1be50e90d90c9fa79c2145c Bug 1111753. Don't restrict the dirty rect stored for display items for out-of-flow elements to their visual overflow areas. r=tn diff --git a/layout/base/nsDisplayList.cpp b/layout/base/nsDisplayList.cpp --- a/layout/base/nsDisplayList.cpp +++ b/layout/base/nsDisplayList.cpp @@ -3387,16 +3387,18 @@ nsDisplayBoxShadowInner::ComputeVisibili nsDisplayWrapList::nsDisplayWrapList(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame, nsDisplayList* aList) : nsDisplayItem(aBuilder, aFrame) , mOverrideZIndex(0) , mHasZIndexOverride(false) { MOZ_COUNT_CTOR(nsDisplayWrapList); + mBaseVisibleRect = mVisibleRect; + mList.AppendToTop(aList); UpdateBounds(aBuilder); if (!aFrame || !aFrame->IsTransformed()) { return; } // If the frame is a preserve-3d parent, then we will create transforms @@ -3435,16 +3437,18 @@ nsDisplayWrapList::nsDisplayWrapList(nsD nsDisplayWrapList::nsDisplayWrapList(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame, nsDisplayItem* aItem) : nsDisplayItem(aBuilder, aFrame) , mOverrideZIndex(0) , mHasZIndexOverride(false) { MOZ_COUNT_CTOR(nsDisplayWrapList); + mBaseVisibleRect = mVisibleRect; + mList.AppendToTop(aItem); UpdateBounds(aBuilder); if (!aFrame || !aFrame->IsTransformed()) { return; } if (aFrame->Preserves3DChildren()) { diff --git a/layout/base/nsDisplayList.h b/layout/base/nsDisplayList.h --- a/layout/base/nsDisplayList.h +++ b/layout/base/nsDisplayList.h @@ -2680,24 +2680,33 @@ public: nsDisplayWrapList(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame, nsDisplayList* aList); nsDisplayWrapList(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame, nsDisplayItem* aItem); nsDisplayWrapList(nsDisplayListBuilder* aBuilder, nsIFrame* aFrame) : nsDisplayItem(aBuilder, aFrame), mOverrideZIndex(0), mHasZIndexOverride(false) { MOZ_COUNT_CTOR(nsDisplayWrapList); + mBaseVisibleRect = mVisibleRect; } virtual ~nsDisplayWrapList(); /** * Call this if the wrapped list is changed. */ virtual void UpdateBounds(nsDisplayListBuilder* aBuilder) MOZ_OVERRIDE { mBounds = mList.GetBounds(aBuilder); + // The display list may contain content that's visible outside the visible + // rect (i.e. the current dirty rect) passed in when the item was created. + // This happens when the dirty rect has been restricted to the visual + // overflow rect of a frame for some reason (e.g. when setting up dirty + // rects in nsDisplayListBuilder::MarkOutOfFlowFrameForDisplay), but that + // frame contains placeholders for out-of-flows that aren't descendants of + // the frame. + mVisibleRect.UnionRect(mBaseVisibleRect, mList.GetVisibleRect()); } virtual void HitTest(nsDisplayListBuilder* aBuilder, const nsRect& aRect, HitTestState* aState, nsTArray *aOutFrames) MOZ_OVERRIDE; virtual nsRect GetBounds(nsDisplayListBuilder* aBuilder, bool* aSnap) MOZ_OVERRIDE; virtual nsRegion GetOpaqueRegion(nsDisplayListBuilder* aBuilder, bool* aSnap) MOZ_OVERRIDE; virtual bool IsUniform(nsDisplayListBuilder* aBuilder, nscolor* aColor) MOZ_OVERRIDE; virtual void Paint(nsDisplayListBuilder* aBuilder, nsRenderingContext* aCtx) MOZ_OVERRIDE; @@ -2782,16 +2791,19 @@ protected: mMergedFrames.MoveElementsFrom(aOther->mMergedFrames); } nsDisplayList mList; // The frames from items that have been merged into this item, excluding // this item's own frame. nsTArray mMergedFrames; nsRect mBounds; + // Visible rect contributed by this display item itself. + // Our mVisibleRect may include the visible areas of children. + nsRect mBaseVisibleRect; int32_t mOverrideZIndex; bool mHasZIndexOverride; }; /** * We call WrapDisplayList on the in-flow lists: BorderBackground(), * BlockBorderBackgrounds() and Content(). * We call WrapDisplayItem on each item of Outlines(), PositionedDescendants(), diff --git a/layout/reftests/bugs/1111753-1.html b/layout/reftests/bugs/1111753-1.html new file mode 100644 --- /dev/null +++ b/layout/reftests/bugs/1111753-1.html @@ -0,0 +1,38 @@ + + + + + + +
+
+

ABCDEFG

+
+ + + diff --git a/layout/reftests/bugs/reftest.list b/layout/reftests/bugs/reftest.list --- a/layout/reftests/bugs/reftest.list +++ b/layout/reftests/bugs/reftest.list @@ -1847,8 +1847,9 @@ test-pref(dom.webcomponents.enabled,true == 1069716-1.html 1069716-1-ref.html == 1078262-1.html about:blank test-pref(layout.testing.overlay-scrollbars.always-visible,false) == 1081072-1.html 1081072-1-ref.html fuzzy-if(winWidget&&!layersGPUAccelerated,1,31) fuzzy-if(B2G,128,75) == 1081185-1.html 1081185-1-ref.html # fuzzy with event-regions, see bug 1107843 == 1097437-1.html 1097437-1-ref.html == 1103258-1.html 1103258-1-ref.html # assertion crash test with layers culling test == 1105137-1.html 1105137-1-ref.html fuzzy-if(d2d,36,304) HTTP(..) == 1116480-1-fakeitalic-overflow.html 1116480-1-fakeitalic-overflow-ref.html +== 1111753-1.html about:blank