diff --git a/layout/base/DisplayListClipState.cpp b/layout/base/DisplayListClipState.cpp index 13f3add2f2f6..3b6e7bb05523 100644 --- a/layout/base/DisplayListClipState.cpp +++ b/layout/base/DisplayListClipState.cpp @@ -53,9 +53,14 @@ DisplayListClipState::ClipContainingBlockDescendants(const nsRect& aRect, void DisplayListClipState::ClipContentDescendants(const nsRect& aRect, + const nscoord* aRadii, DisplayItemClip& aClipOnStack) { - aClipOnStack.SetTo(aRect); + if (aRadii) { + aClipOnStack.SetTo(aRect, aRadii); + } else { + aClipOnStack.SetTo(aRect); + } if (mClipContentDescendants) { aClipOnStack.IntersectWith(*mClipContentDescendants); } diff --git a/layout/base/DisplayListClipState.h b/layout/base/DisplayListClipState.h index dcc839ba1d89..54155cd9ab58 100644 --- a/layout/base/DisplayListClipState.h +++ b/layout/base/DisplayListClipState.h @@ -79,6 +79,7 @@ private: DisplayItemClip& aClipOnStack); void ClipContentDescendants(const nsRect& aRect, + const nscoord* aRadii, DisplayItemClip& aClipOnStack); /** @@ -150,7 +151,7 @@ public: * the result, stored in aClipOnStack. */ void ClipContainingBlockDescendants(const nsRect& aRect, - const nscoord* aRadii) + const nscoord* aRadii = nullptr) { NS_ASSERTION(!mRestored, "Already restored!"); NS_ASSERTION(!mClipUsed, "mClip already used"); @@ -158,12 +159,13 @@ public: mState.ClipContainingBlockDescendants(aRect, aRadii, mClip); } - void ClipContentDescendants(const nsRect& aRect) + void ClipContentDescendants(const nsRect& aRect, + const nscoord* aRadii = nullptr) { NS_ASSERTION(!mRestored, "Already restored!"); NS_ASSERTION(!mClipUsed, "mClip already used"); mClipUsed = true; - mState.ClipContentDescendants(aRect, mClip); + mState.ClipContentDescendants(aRect, aRadii, mClip); } /** diff --git a/layout/generic/crashtests/885009-1.html b/layout/generic/crashtests/885009-1.html new file mode 100644 index 000000000000..2403f71820ea --- /dev/null +++ b/layout/generic/crashtests/885009-1.html @@ -0,0 +1,7 @@ + + + + + + + diff --git a/layout/generic/crashtests/crashtests.list b/layout/generic/crashtests/crashtests.list index 01b71931d6bd..ee9f19283811 100644 --- a/layout/generic/crashtests/crashtests.list +++ b/layout/generic/crashtests/crashtests.list @@ -497,3 +497,4 @@ test-pref(layout.css.flexbox.enabled,true) load 862947-1.html needs-focus pref(accessibility.browsewithcaret,true) load 868906.html test-pref(layout.css.flexbox.enabled,true) load 866547-1.html asserts(1-4) test-pref(layout.css.flexbox.enabled,true) load 876074-1.html # bug 876749 +load 885009-1.html diff --git a/layout/generic/nsGfxScrollFrame.cpp b/layout/generic/nsGfxScrollFrame.cpp index f996cf56a1ce..e4aef81dca07 100644 --- a/layout/generic/nsGfxScrollFrame.cpp +++ b/layout/generic/nsGfxScrollFrame.cpp @@ -2251,18 +2251,13 @@ nsGfxScrollFrameInner::BuildDisplayList(nsDisplayListBuilder* aBuilder, } } else { nsRect clip = mScrollPort + aBuilder->ToReferenceFrame(mOuter); + nscoord radii[8]; + bool haveRadii = mOuter->GetPaddingBoxBorderRadii(radii); // Our override of GetBorderRadii ensures we never have a radius at // the corners where we have a scrollbar. if (mClipAllDescendants) { -#ifdef DEBUG - nscoord radii[8]; -#endif - NS_ASSERTION(!mOuter->GetPaddingBoxBorderRadii(radii), - "Roots with radii not supported"); - clipState.ClipContentDescendants(clip); + clipState.ClipContentDescendants(clip, haveRadii ? radii : nullptr); } else { - nscoord radii[8]; - bool haveRadii = mOuter->GetPaddingBoxBorderRadii(radii); clipState.ClipContainingBlockDescendants(clip, haveRadii ? radii : nullptr); } }