Bug 1576355 - Don't try to optimize position style changes for rel.pos. grid items. r=dholbert

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

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Mats Palmgren 2019-08-26 20:00:35 +00:00
Родитель 2826398670
Коммит 9adf43a616
7 изменённых файлов: 160 добавлений и 0 удалений

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

@ -722,6 +722,11 @@ static bool RecomputePosition(nsIFrame* aFrame) {
// For relative positioning, we can simply update the frame rect
if (display->IsRelativelyPositionedStyle()) {
if (aFrame->IsGridItem()) {
// A grid item's CB is its grid area, not the parent frame content area
// as is assumed below.
return false;
}
// Move the frame
if (display->mPosition == NS_STYLE_POSITION_STICKY) {
// Update sticky positioning for an entire element at once, starting with

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

@ -3944,6 +3944,10 @@ class nsIFrame : public nsQueryFrame {
* Is this a flex item? (i.e. a non-abs-pos child of a flex container)
*/
inline bool IsFlexItem() const;
/**
* Is this a grid item? (i.e. a non-abs-pos child of a grid container)
*/
inline bool IsGridItem() const;
/**
* Is this a flex or grid item? (i.e. a non-abs-pos child of a flex/grid
* container)

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

@ -19,6 +19,11 @@ bool nsIFrame::IsFlexItem() const {
!(GetStateBits() & NS_FRAME_OUT_OF_FLOW);
}
bool nsIFrame::IsGridItem() const {
return GetParent() && GetParent()->IsGridContainerFrame() &&
!(GetStateBits() & NS_FRAME_OUT_OF_FLOW);
}
bool nsIFrame::IsFlexOrGridContainer() const {
return IsFlexContainerFrame() || IsGridContainerFrame();
}

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

@ -0,0 +1,30 @@
<!DOCTYPE HTML>
<meta charset="utf-8">
<title>Reference: Rel.pos. grid item with style change.</title>
<link rel="author" title="James0x57" href="mailto:James0x57@gmail.com">
<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
<style>
.grid {
margin: 40px;
display: grid;
grid: auto / repeat(3,100px);
grid-gap: 20px;
}
span, even {
position: relative;
min-height: 20px;
background: grey;
left: 0px;
}
.offset even {
left: 50%;
}
</style>
<div class="grid offset">
<span></span><span></span><span></span>
<even></even><even></even><even></even>
<span></span><span></span><span></span>
</div>

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

@ -0,0 +1,42 @@
<!DOCTYPE HTML>
<meta charset="utf-8">
<title>CSS Grid Layout Test: Rel.pos. grid item with style change.</title>
<link rel="author" title="James0x57" href="mailto:James0x57@gmail.com">
<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
<link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-items" title="Grid Items">
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1576355">
<link rel="match" href="grid-item-rel-pos-001-ref.html">
<meta name="assert" content="Checks that the rel.pos. grid items are positioned correctly after a 'left' style change.">
<style>
.grid {
margin: 40px;
display: grid;
grid: auto / repeat(3,100px);
grid-gap: 20px;
}
span, even {
position: relative;
min-height: 20px;
background: grey;
left: 0px;
}
.offset even {
left: 50%;
}
</style>
<div class="grid offset">
<span></span><span></span><span></span>
<even></even><even></even><even></even>
<span></span><span></span><span></span>
</div>
<script>
document.body.offsetHeight;
let grid = document.querySelector('.grid');
grid.classList.remove('offset')
document.body.offsetHeight;
grid.classList.add('offset')
</script>

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

@ -0,0 +1,31 @@
<!DOCTYPE HTML>
<meta charset="utf-8">
<title>Reference: Rel.pos. centered grid item with style change.</title>
<link rel="author" title="James0x57" href="mailto:James0x57@gmail.com">
<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
<style>
.grid {
margin: 40px;
display: grid;
grid: auto / repeat(3,100px);
grid-gap: 20px;
}
span, even {
position: relative;
min-height: 20px;
background: grey;
left: 0px;
width: 30px;
justify-self: center;
}
.offset even {
left: 20%;
}
</style>
<div class="grid offset">
<span></span><span></span><span></span>
<even></even><even></even><even></even>
<span></span><span></span><span></span>
</div>

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

@ -0,0 +1,43 @@
<!DOCTYPE HTML>
<meta charset="utf-8">
<title>CSS Grid Layout Test: Rel.pos. centered grid item with style change.</title>
<link rel="author" title="James0x57" href="mailto:James0x57@gmail.com">
<link rel="author" title="Mats Palmgren" href="mailto:mats@mozilla.com">
<link rel="help" href="http://www.w3.org/TR/css-grid-1/#grid-items" title="Grid Items">
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1576355">
<link rel="match" href="grid-item-rel-pos-002-ref.html">
<meta name="assert" content="Checks that the rel.pos. grid items are positioned correctly after a 'left' style change.">
<style>
.grid {
margin: 40px;
display: grid;
grid: auto / repeat(3,100px);
grid-gap: 20px;
}
span, even {
position: relative;
min-height: 20px;
background: grey;
left: 0px;
width: 30px;
justify-self: center;
}
.offset even {
left: 20%;
}
</style>
<div class="grid offset">
<span></span><span></span><span></span>
<even></even><even></even><even></even>
<span></span><span></span><span></span>
</div>
<script>
document.body.offsetHeight;
let grid = document.querySelector('.grid');
grid.classList.remove('offset')
document.body.offsetHeight;
grid.classList.add('offset')
</script>