зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
d7ac201163
Коммит
54036c1eca
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче