From 828b7077b95a8ce6cd340cdfee6bd8d9340f207e Mon Sep 17 00:00:00 2001 From: Daniel Holbert Date: Fri, 20 Oct 2017 16:40:43 -0700 Subject: [PATCH] Bug 1379332: When computing abspos CB content-box size, don't bother subtracting borderpadding if CB is a 0-sized child of a XUL-collapsed frame. r=mats If border & padding were ignored for sizing the containing block (which can happen, if the containing block is a chlid of a XUL-collapsed frame), then we don't need to subtract border & padding when computing the frame's content-box size for its abspos descendants. MozReview-Commit-ID: JGnzShl8m67 --HG-- extra : rebase_source : 1cead4ce6b403af634c8f9bde0852dce4ee7edc5 --- layout/generic/ReflowInput.cpp | 28 ++++++++++++++++++++++++--- layout/xul/crashtests/1379332-1.xul | 9 +++++++++ layout/xul/crashtests/1379332-2.xul | 9 +++++++++ layout/xul/crashtests/crashtests.list | 6 ++++++ 4 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 layout/xul/crashtests/1379332-1.xul create mode 100644 layout/xul/crashtests/1379332-2.xul diff --git a/layout/generic/ReflowInput.cpp b/layout/generic/ReflowInput.cpp index 133c2702bc2c..058b79aab133 100644 --- a/layout/generic/ReflowInput.cpp +++ b/layout/generic/ReflowInput.cpp @@ -1093,6 +1093,14 @@ ReflowInput::ApplyRelativePositioning(nsIFrame* aFrame, } } +// Returns true if aFrame is non-null, a XUL frame, and "XUL-collapsed" (which +// only becomes a valid question to ask if we know it's a XUL frame). +static bool +IsXULCollapsedXULFrame(nsIFrame* aFrame) +{ + return aFrame && aFrame->IsXULBoxFrame() && aFrame->IsXULCollapsed(); +} + nsIFrame* ReflowInput::GetHypotheticalBoxContainer(nsIFrame* aFrame, nscoord& aCBIStartEdge, @@ -1128,9 +1136,23 @@ ReflowInput::GetHypotheticalBoxContainer(nsIFrame* aFrame, NS_ASSERTION(!(aFrame->GetStateBits() & NS_FRAME_IN_REFLOW), "aFrame shouldn't be in reflow; we'll lie if it is"); WritingMode wm = aFrame->GetWritingMode(); - LogicalMargin borderPadding = aFrame->GetLogicalUsedBorderAndPadding(wm); - aCBIStartEdge = borderPadding.IStart(wm); - aCBSize = aFrame->GetLogicalSize(wm) - borderPadding.Size(wm); + // Compute CB's offset & content-box size by subtracting borderpadding from + // frame size. Exception: if the CB is 0-sized, it *might* be a child of a + // XUL-collapsed frame and might have nonzero borderpadding that was simply + // discarded during its layout. (See the child-zero-sizing in + // nsSprocketLayout::XULLayout()). In that case, we ignore the + // borderpadding here (just like we did when laying it out), or else we'd + // produce a bogus negative content-box size. + aCBIStartEdge = 0; + aCBSize = aFrame->GetLogicalSize(wm); + if (!aCBSize.IsAllZero() || + (!IsXULCollapsedXULFrame(aFrame->GetParent()))) { + // aFrame is not XUL-collapsed (nor is it a child of a XUL-collapsed + // frame), so we can go ahead and subtract out border padding. + LogicalMargin borderPadding = aFrame->GetLogicalUsedBorderAndPadding(wm); + aCBIStartEdge += borderPadding.IStart(wm); + aCBSize -= borderPadding.Size(wm); + } } return aFrame; diff --git a/layout/xul/crashtests/1379332-1.xul b/layout/xul/crashtests/1379332-1.xul new file mode 100644 index 000000000000..97288d5955aa --- /dev/null +++ b/layout/xul/crashtests/1379332-1.xul @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/layout/xul/crashtests/1379332-2.xul b/layout/xul/crashtests/1379332-2.xul new file mode 100644 index 000000000000..230afca124fe --- /dev/null +++ b/layout/xul/crashtests/1379332-2.xul @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/layout/xul/crashtests/crashtests.list b/layout/xul/crashtests/crashtests.list index d5d43e7e54cf..f62f192f19e2 100644 --- a/layout/xul/crashtests/crashtests.list +++ b/layout/xul/crashtests/crashtests.list @@ -97,3 +97,9 @@ load 583957-1.html load 617089.html load menulist-focused.xhtml load 716503.html + +# Bug 1379332's tests need stylo to be disabled in order for the +# 'visiblity:collapse' to take effect (which is needed to trigger the assertion +# that these tests are screening for, in unpatched builds): +pref(layout.css.servo.enabled,false) load 1379332-1.xul +pref(layout.css.servo.enabled,false) load 1379332-2.xul