Skip to content

Commit

Permalink
Bug 1679819 Part 2 - Compute abs-pos elements' available block-size, …
Browse files Browse the repository at this point in the history
…and pass it to ReflowInput's constructor. r=layout-reviewers,emilio

This ensures abs-pos frame with size containment is monolithic because
ReflowInput::Init() can override available block-size to an
unconstrained size if the frame has size containment (Bug 1470329).

Differential Revision: https://phabricator.services.mozilla.com/D98227
  • Loading branch information
aethanyc committed Dec 1, 2020
1 parent 28ddd5d commit c72f25a
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 7 deletions.
19 changes: 12 additions & 7 deletions layout/generic/nsAbsoluteContainingBlock.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -712,9 +712,6 @@ void nsAbsoluteContainingBlock::ReflowAbsoluteFrame(
initFlags += ReflowInput::InitFlag::StaticPosIsCBOrigin;
}
}
ReflowInput kidReflowInput(aPresContext, aReflowInput, aKidFrame,
LogicalSize(wm, availISize, NS_UNCONSTRAINEDSIZE),
Some(logicalCBSize), initFlags);

bool constrainBSize =
(aReflowInput.AvailableBSize() != NS_UNCONSTRAINEDSIZE) &&
Expand All @@ -739,10 +736,18 @@ void nsAbsoluteContainingBlock::ReflowAbsoluteFrame(
const WritingMode outerWM = aReflowInput.GetWritingMode();
const LogicalMargin border = aDelegatingFrame->GetLogicalUsedBorder(outerWM);

if (constrainBSize) {
kidReflowInput.AvailableBSize() =
aReflowInput.AvailableBSize() -
border.ConvertTo(wm, outerWM).BStart(wm) -
const nscoord availBSize = constrainBSize
? aReflowInput.AvailableBSize() -
border.ConvertTo(wm, outerWM).BStart(wm)
: NS_UNCONSTRAINEDSIZE;

ReflowInput kidReflowInput(aPresContext, aReflowInput, aKidFrame,
LogicalSize(wm, availISize, availBSize),
Some(logicalCBSize), initFlags);

if (kidReflowInput.AvailableBSize() != NS_UNCONSTRAINEDSIZE) {
// Shrink available block-size if it's constrained.
kidReflowInput.AvailableBSize() -=
kidReflowInput.ComputedLogicalMargin(wm).BStart(wm);
const nscoord kidOffsetBStart =
kidReflowInput.ComputedLogicalOffsets(wm).BStart(wm);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<!DOCTYPE html>
<html>
<meta charset="UTF-8">
<title>CSS Containment Test: absolute positioned 'contain: size' element is monolithic</title>
<link rel="author" title="Ting-Yu Lin" href="mailto:[email protected]">
<link rel="author" title="Mozilla" href="https://www.mozilla.org/">
<link rel="help" href="https://drafts.csswg.org/css-contain-1/#containment-size">
<link rel="match" href="../reference/ref-filled-green-100px-square-only.html">
<meta name="assert" content="This test checks that an absolute positioned element with size containment is monolithic.">

<style>
#multicol {
width: 300px;
column-count: 3;
}
#container {
position: relative;
}
#abs-size-contain {
position: absolute;
contain: size;
width: 100px;
height: 100px;
background: green;
}
</style>

<p>Test passes if there is a filled green square.</p>
<div id="multicol">
<div id="container">
<div id="abs-size-contain"></div>
</div>
</div>
</html>

0 comments on commit c72f25a

Please sign in to comment.