Handle the special case of a flex frame being the absolute containing block correctly from the CSS align code
parent
88427f4eeb
commit
2f95386dbb
|
@ -409,14 +409,30 @@ OffsetToAlignedStaticPos(const ReflowInput& aKidReflowInput,
|
||||||
? GetOrthogonalAxis(aAbsPosCBAxis)
|
? GetOrthogonalAxis(aAbsPosCBAxis)
|
||||||
: aAbsPosCBAxis);
|
: aAbsPosCBAxis);
|
||||||
|
|
||||||
|
const bool placeholderContainerIsContainingBlock =
|
||||||
|
aPlaceholderContainer == aKidReflowInput.mCBReflowInput->mFrame;
|
||||||
|
|
||||||
nsIAtom* parentType = aPlaceholderContainer->GetType();
|
nsIAtom* parentType = aPlaceholderContainer->GetType();
|
||||||
LogicalSize alignAreaSize(pcWM);
|
LogicalSize alignAreaSize(pcWM);
|
||||||
if (parentType == nsGkAtoms::flexContainerFrame) {
|
if (parentType == nsGkAtoms::flexContainerFrame) {
|
||||||
// The alignment container is the flex container's content box:
|
// We store the frame rect in FinishAndStoreOverflow, which runs _after_
|
||||||
alignAreaSize = aPlaceholderContainer->GetLogicalSize(pcWM);
|
// reflowing the absolute frames, so handle the special case of the frame
|
||||||
LogicalMargin pcBorderPadding =
|
// being the actual containing block here, by getting the size from
|
||||||
aPlaceholderContainer->GetLogicalUsedBorderAndPadding(pcWM);
|
// aAbsPosCBSize.
|
||||||
alignAreaSize -= pcBorderPadding.Size(pcWM);
|
//
|
||||||
|
// 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 == nsGkAtoms::gridContainerFrame) {
|
} else if (parentType == nsGkAtoms::gridContainerFrame) {
|
||||||
// This abspos elem's parent is a grid container. Per CSS Grid 10.1 & 10.2:
|
// 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
|
// - If the grid container *also* generates the abspos containing block (a
|
||||||
|
@ -424,7 +440,7 @@ OffsetToAlignedStaticPos(const ReflowInput& aKidReflowInput,
|
||||||
// the alignment container, too. (And its size is aAbsPosCBSize.)
|
// the alignment container, too. (And its size is aAbsPosCBSize.)
|
||||||
// - Otherwise, we use the grid's padding box as the alignment container.
|
// - Otherwise, we use the grid's padding box as the alignment container.
|
||||||
// https://drafts.csswg.org/css-grid/#static-position
|
// 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
|
// The alignment container is the grid area that we're using as the
|
||||||
// absolute containing block.
|
// absolute containing block.
|
||||||
alignAreaSize = aAbsPosCBSize.ConvertTo(pcWM, aAbsPosCBWM);
|
alignAreaSize = aAbsPosCBSize.ConvertTo(pcWM, aAbsPosCBWM);
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html><head>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8"><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>
|
||||||
|
</head><body><div class="parent"><div class="child"></div></div>
|
||||||
|
</body></html>
|
|
@ -0,0 +1,30 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html><head>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8"><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="https://hg.mozilla.org/mozilla-central/raw-file/6538de3b6137/layout/reftests/w3c-css/submitted/flexbox/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>
|
||||||
|
</head><body><div class="parent"><div class="child"></div></div>
|
||||||
|
</body></html>
|
|
@ -0,0 +1,27 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html><head>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8"><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>
|
||||||
|
</head><body><div class="parent"><div class="child"></div></div>
|
||||||
|
</body></html>
|
|
@ -0,0 +1,38 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html><head>
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8"><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="https://hg.mozilla.org/mozilla-central/raw-file/6538de3b6137/layout/reftests/w3c-css/submitted/flexbox/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>
|
||||||
|
</head><body><div class="parent"><div class="child"></div></div>
|
||||||
|
</body></html>
|
|
@ -211,3 +211,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-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-2.html flexbox-single-line-clamp-2-ref.html
|
||||||
== flexbox-single-line-clamp-3.html flexbox-single-line-clamp-3-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
|
||||||
|
|
Loading…
Reference in New Issue