Bug 1498873 - Simplify a check. r=bzbarsky

And make will-change: position properly create an abspos cb while at it, since the check was missing the `mWillChangeBitfield & ABSPOS_CB` bit.

Differential Revision: https://phabricator.services.mozilla.com/D8743

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Emilio Cobos Álvarez 2018-10-17 20:40:08 +00:00
Родитель 9ac840bc86
Коммит a780cefe07
3 изменённых файлов: 55 добавлений и 11 удалений

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

@ -3832,7 +3832,6 @@ nsCSSFrameConstructor::ConstructFrameFromItemInternal(FrameConstructionItem& aIt
// If we need to create a block formatting context to wrap our
// kids, do it now.
const nsStyleDisplay* maybeAbsoluteContainingBlockDisplay = display;
nsIFrame* maybeAbsoluteContainingBlockStyleFrame = primaryFrame;
nsIFrame* maybeAbsoluteContainingBlock = newFrame;
nsIFrame* possiblyLeafFrame = newFrame;
@ -3882,7 +3881,6 @@ nsCSSFrameConstructor::ConstructFrameFromItemInternal(FrameConstructionItem& aIt
// absolute container.
auto outerDisplay = outerSC->StyleDisplay();
if (outerDisplay->IsAbsPosContainingBlock(outerFrame)) {
maybeAbsoluteContainingBlockDisplay = outerDisplay;
maybeAbsoluteContainingBlock = outerFrame;
maybeAbsoluteContainingBlockStyleFrame = outerFrame;
innerFrame->AddStateBits(NS_FRAME_CAN_HAVE_ABSPOS_CHILDREN);
@ -3918,15 +3916,7 @@ nsCSSFrameConstructor::ConstructFrameFromItemInternal(FrameConstructionItem& aIt
aState.PushAbsoluteContainingBlock(nullptr, nullptr, absoluteSaveState);
} else if (!(bits & FCDATA_SKIP_ABSPOS_PUSH)) {
maybeAbsoluteContainingBlock->AddStateBits(NS_FRAME_CAN_HAVE_ABSPOS_CHILDREN);
// This check is identical to nsStyleDisplay::IsAbsPosContainingBlock
// except without the assertion that the style display and frame match.
// When constructing scroll frames we intentionally use the style
// display for the outer, but make the inner the containing block.
if ((maybeAbsoluteContainingBlockDisplay->IsAbsolutelyPositionedStyle() ||
maybeAbsoluteContainingBlockDisplay->IsRelativelyPositionedStyle() ||
maybeAbsoluteContainingBlockDisplay->IsFixedPosContainingBlock(
maybeAbsoluteContainingBlockStyleFrame)) &&
!nsSVGUtils::IsInSVGTextSubtree(maybeAbsoluteContainingBlockStyleFrame)) {
if (maybeAbsoluteContainingBlockStyleFrame->IsAbsPosContainingBlock()) {
auto* cf = static_cast<nsContainerFrame*>(maybeAbsoluteContainingBlock);
aState.PushAbsoluteContainingBlock(cf, maybeAbsoluteContainingBlockStyleFrame, absoluteSaveState);
}

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

@ -0,0 +1,24 @@
<!doctype html>
<meta charset="utf-8">
<title>CSS Test Reference</title>
<style>
.container {
border: 1px solid green;
width: 100px;
height: 100px;
margin-top: 100px;
display: flex;
position: relative;
}
.abspos {
position: absolute;
top: 0;
left: 0;
background: orange;
height: 20px;
width: 20px;
}
</style>
<div class="container">
<div class="abspos"></div>
</div>

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

@ -0,0 +1,30 @@
<!doctype html>
<meta charset="utf-8">
<title>CSS Test: will-change: position turns an element in an abspos containing block.</title>
<link rel="author" title="Emilio Cobos Álvarez" href="mailto:emilio@crisal.io">
<link rel="author" title="Boris Zbarsky" href="mailto:bzbarsky@mit.edu">
<link rel="author" title="Mozilla" href="https://mozilla.org">
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1498873">
<link rel="help" href="https://drafts.csswg.org/css-will-change/#will-change">
<link rel="match" href="will-change-abspos-cb-001-ref.html">
<style>
.container {
border: 1px solid green;
width: 100px;
height: 100px;
margin-top: 100px;
display: flex;
will-change: position;
}
.abspos {
position: absolute;
top: 0;
left: 0;
background: orange;
height: 20px;
width: 20px;
}
</style>
<div class="container">
<div class="abspos"></div>
</div>