Bug 1386654: Handle the special case of a flex frame being the absolute containing block correctly from the CSS align code. r=dholbert

MozReview-Commit-ID: 4fJtyX55Ig9

--HG--
extra : rebase_source : 83af05b1f55fdaed9323dd1e7cea1cf11f56160f
This commit is contained in:
Emilio Cobos Álvarez 2018-01-09 23:50:47 +01:00
Родитель d7ac201163
Коммит 54036c1eca
6 изменённых файлов: 140 добавлений и 6 удалений

Просмотреть файл

@ -443,14 +443,30 @@ OffsetToAlignedStaticPos(const ReflowInput& aKidReflowInput,
? GetOrthogonalAxis(aAbsPosCBAxis)
: aAbsPosCBAxis);
const bool placeholderContainerIsContainingBlock =
aPlaceholderContainer == aKidReflowInput.mCBReflowInput->mFrame;
LayoutFrameType parentType = aPlaceholderContainer->Type();
LogicalSize alignAreaSize(pcWM);
if (parentType == LayoutFrameType::FlexContainer) {
// The alignment container is the flex container's content box:
alignAreaSize = aPlaceholderContainer->GetLogicalSize(pcWM);
LogicalMargin pcBorderPadding =
aPlaceholderContainer->GetLogicalUsedBorderAndPadding(pcWM);
alignAreaSize -= pcBorderPadding.Size(pcWM);
// We store the frame rect in FinishAndStoreOverflow, which runs _after_
// reflowing the absolute frames, so handle the special case of the frame
// being the actual containing block here, by getting the size from
// aAbsPosCBSize.
//
// The alignment container is the flex container's content box.
if (placeholderContainerIsContainingBlock) {
alignAreaSize = aAbsPosCBSize.ConvertTo(pcWM, aAbsPosCBWM);
// aAbsPosCBSize is the padding-box, so substract the padding to get the
// content box.
alignAreaSize -=
aPlaceholderContainer->GetLogicalUsedPadding(pcWM).Size(pcWM);
} else {
alignAreaSize = aPlaceholderContainer->GetLogicalSize(pcWM);
LogicalMargin pcBorderPadding =
aPlaceholderContainer->GetLogicalUsedBorderAndPadding(pcWM);
alignAreaSize -= pcBorderPadding.Size(pcWM);
}
} else if (parentType == LayoutFrameType::GridContainer) {
// This abspos elem's parent is a grid container. Per CSS Grid 10.1 & 10.2:
// - If the grid container *also* generates the abspos containing block (a
@ -458,7 +474,7 @@ OffsetToAlignedStaticPos(const ReflowInput& aKidReflowInput,
// the alignment container, too. (And its size is aAbsPosCBSize.)
// - Otherwise, we use the grid's padding box as the alignment container.
// https://drafts.csswg.org/css-grid/#static-position
if (aPlaceholderContainer == aKidReflowInput.mCBReflowInput->mFrame) {
if (placeholderContainerIsContainingBlock) {
// The alignment container is the grid area that we're using as the
// absolute containing block.
alignAreaSize = aAbsPosCBSize.ConvertTo(pcWM, aAbsPosCBWM);

Просмотреть файл

@ -0,0 +1,25 @@
<!doctype html>
<title>CSS Test Reference</title>
<meta charset="utf-8">
<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
<style>
.parent {
position: fixed;
top: 0;
left: 0;
display: block;
width: 200px;
height: 200px;
background: yellow;
}
.child {
position: absolute;
left: 50px;
top: 50px;
width: 100px;
height: 100px;
background: green;
}
</style>
<div class="parent"><div class="child"></div></div>

Просмотреть файл

@ -0,0 +1,28 @@
<!doctype html>
<title>CSS Test: Absolutely positioned children of flex container with CSS align</title>
<meta charset="utf-8">
<link rel="help" href="https://drafts.csswg.org/css-flexbox/#abspos-items">
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1386654">
<link rel="match" href="position-absolute-containing-block-001-ref.html">
<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
<style>
.parent {
position: fixed;
top: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
width: 200px;
height: 200px;
background: yellow;
}
.child {
position: absolute;
width: 100px;
height: 100px;
background: green;
}
</style>
<div class="parent"><div class="child"></div></div>

Просмотреть файл

@ -0,0 +1,25 @@
<!doctype html>
<title>CSS Test Reference</title>
<meta charset="utf-8">
<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
<style>
.parent {
position: fixed;
top: 0;
left: 0;
display: block;
width: 200px;
height: 200px;
background: yellow;
}
.child {
position: absolute;
left: 60px;
top: 60px;
width: 100px;
height: 100px;
background: green;
}
</style>
<div class="parent"><div class="child"></div></div>

Просмотреть файл

@ -0,0 +1,36 @@
<!doctype html>
<title>CSS Test: Absolutely positioned children of flex container with CSS align</title>
<meta charset="utf-8">
<link rel="help" href="https://drafts.csswg.org/css-flexbox/#abspos-items">
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1386654">
<link rel="match" href="position-absolute-containing-block-002-ref.html">
<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
<style>
.parent {
position: fixed;
top: 0;
left: 0;
display: flex;
align-items: center;
justify-content: center;
width: 180px;
height: 180px;
/* Expand the background area to 200px, without touching the content-box,
which is what flex absolute children should be aligned relative to. */
border-top: 5px solid yellow;
padding-top: 15px;
border-left: 5px solid yellow;
padding-left: 15px;
background: yellow;
}
.child {
position: absolute;
width: 100px;
height: 100px;
background: green;
}
</style>
<div class="parent"><div class="child"></div></div>

Просмотреть файл

@ -213,3 +213,7 @@ fails == flexbox-min-height-auto-002b.html flexbox-min-height-auto-002-ref.html
== flexbox-single-line-clamp-1.html flexbox-single-line-clamp-1-ref.html
== flexbox-single-line-clamp-2.html flexbox-single-line-clamp-2-ref.html
== flexbox-single-line-clamp-3.html flexbox-single-line-clamp-3-ref.html
# Flexbox as an absolute containing block.
== position-absolute-containing-block-001.html position-absolute-containing-block-001-ref.html
== position-absolute-containing-block-002.html position-absolute-containing-block-002-ref.html