Backed out 2 changesets (bug 1680406, bug 1663222) for causing mochitest failures. CLOSED TREE
Backed out changeset 6de49379342e (bug 1663222)
Backed out changeset 0ad0d59dbeec (bug 1680406)
This commit is contained in:
@@ -1,19 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<style>
|
|
||||||
.a {
|
|
||||||
letter-spacing: 0.635em;
|
|
||||||
float: left;
|
|
||||||
}
|
|
||||||
.b {
|
|
||||||
column-span: all;
|
|
||||||
line-height: 89vmax;
|
|
||||||
padding-bottom: 6vmax;
|
|
||||||
}
|
|
||||||
:not(animateTransform) {
|
|
||||||
word-break: break-word;
|
|
||||||
columns: 15px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<legend class="b">
|
|
||||||
<input itemprop="">
|
|
||||||
<o>s.ykED*-U6p]6</>8"FX7wpo&mK`</><details class="a"><summary>cx.6W</>.2;3\52A
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<style>
|
|
||||||
.c1 {
|
|
||||||
column-span: all;
|
|
||||||
border-bottom-style: groove;
|
|
||||||
float: left;
|
|
||||||
border-width: 0em 0em 9em 1em;
|
|
||||||
box-decoration-break: clone;
|
|
||||||
height: 21vmin;
|
|
||||||
}
|
|
||||||
.c2 {
|
|
||||||
height: 74vmin;
|
|
||||||
}
|
|
||||||
:not(param) {
|
|
||||||
column-width: 1px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<script>
|
|
||||||
function go() {
|
|
||||||
a.lastElementChild.appendChild(b)
|
|
||||||
window.requestIdleCallback(window.close)
|
|
||||||
}
|
|
||||||
function fuzz() {
|
|
||||||
var x = document.createElementNS("", "f")
|
|
||||||
x.prepend("1")
|
|
||||||
b.insertAdjacentHTML("afterEnd", x.outerHTML)
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
<body onload=go()>
|
|
||||||
<aside id="a">
|
|
||||||
<data id="b" class="c1">U-.9zA</shadow>
|
|
||||||
</aside>
|
|
||||||
<details ontoggle="fuzz()" open="" class="c2">
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
<style>
|
|
||||||
.a {
|
|
||||||
column-count: 4;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
* {
|
|
||||||
height: 1vmax;
|
|
||||||
grid-row-gap: 7em;
|
|
||||||
display: -webkit-flex;
|
|
||||||
-webkit-flex-direction: column
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<time class="a"></x>
|
|
||||||
<label>
|
|
||||||
x
|
|
||||||
<q>
|
|
||||||
@@ -785,8 +785,5 @@ load 1648577.html
|
|||||||
load 1652618.html
|
load 1652618.html
|
||||||
load 1652897.html
|
load 1652897.html
|
||||||
asserts(0-7) load 1654925.html
|
asserts(0-7) load 1654925.html
|
||||||
load 1663222.html
|
|
||||||
load 1666592.html
|
load 1666592.html
|
||||||
load 1670336.html
|
|
||||||
HTTP load 1677518-1.html
|
HTTP load 1677518-1.html
|
||||||
load 1680406.html
|
|
||||||
|
|||||||
@@ -5167,22 +5167,25 @@ bool nsBlockFrame::DrainOverflowLines() {
|
|||||||
// Make all the frames on the overflow line list mine.
|
// Make all the frames on the overflow line list mine.
|
||||||
ReparentFrames(overflowLines->mFrames, prevBlock, this);
|
ReparentFrames(overflowLines->mFrames, prevBlock, this);
|
||||||
|
|
||||||
// Collect overflow containers from our OverflowContainers list that are
|
// Collect overflow containers from our [Excess]OverflowContainers lists
|
||||||
// continuations from the frames we picked up from our prev-in-flow, then
|
// that are continuations from the frames we picked up from our
|
||||||
// prepend those to ExcessOverflowContainers to ensure the continuations
|
// prev-in-flow. We'll append these to mFrames to ensure the continuations
|
||||||
// are ordered.
|
// are ordered.
|
||||||
if (GetOverflowContainers()) {
|
auto HasOverflowContainers = [this]() -> bool {
|
||||||
nsFrameList ocContinuations;
|
return GetOverflowContainers() || GetExcessOverflowContainers();
|
||||||
|
};
|
||||||
|
nsFrameList ocContinuations;
|
||||||
|
if (HasOverflowContainers()) {
|
||||||
for (auto* f : overflowLines->mFrames) {
|
for (auto* f : overflowLines->mFrames) {
|
||||||
auto* cont = f;
|
auto* cont = f;
|
||||||
bool done = false;
|
bool done = false;
|
||||||
while (!done && (cont = cont->GetNextContinuation()) &&
|
while (!done && (cont = cont->GetNextContinuation()) &&
|
||||||
cont->GetParent() == this) {
|
cont->GetParent() == this) {
|
||||||
bool onlyChild = !cont->GetPrevSibling() && !cont->GetNextSibling();
|
bool onlyChild = !cont->GetPrevSibling() && !cont->GetNextSibling();
|
||||||
if (cont->HasAnyStateBits(NS_FRAME_IS_OVERFLOW_CONTAINER) &&
|
if (MaybeStealOverflowContainerFrame(cont)) {
|
||||||
TryRemoveFrame(OverflowContainersProperty(), cont)) {
|
cont->RemoveStateBits(NS_FRAME_IS_OVERFLOW_CONTAINER);
|
||||||
ocContinuations.AppendFrame(nullptr, cont);
|
ocContinuations.AppendFrame(nullptr, cont);
|
||||||
done = onlyChild;
|
done = onlyChild && !HasOverflowContainers();
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -5191,13 +5194,6 @@ bool nsBlockFrame::DrainOverflowLines() {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!ocContinuations.IsEmpty()) {
|
|
||||||
if (nsFrameList* eoc = GetExcessOverflowContainers()) {
|
|
||||||
eoc->InsertFrames(nullptr, nullptr, ocContinuations);
|
|
||||||
} else {
|
|
||||||
SetExcessOverflowContainers(std::move(ocContinuations));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Make the overflow out-of-flow frames mine too.
|
// Make the overflow out-of-flow frames mine too.
|
||||||
@@ -5235,6 +5231,7 @@ bool nsBlockFrame::DrainOverflowLines() {
|
|||||||
mLines.splice(mLines.begin(), overflowLines->mLines);
|
mLines.splice(mLines.begin(), overflowLines->mLines);
|
||||||
NS_ASSERTION(overflowLines->mLines.empty(), "splice should empty list");
|
NS_ASSERTION(overflowLines->mLines.empty(), "splice should empty list");
|
||||||
delete overflowLines;
|
delete overflowLines;
|
||||||
|
AddFrames(ocContinuations, mFrames.LastChild(), nullptr);
|
||||||
didFindOverflow = true;
|
didFindOverflow = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6224,8 +6221,8 @@ void nsBlockFrame::DoRemoveFrameInternal(nsIFrame* aDeletedFrame,
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (line != line_end && aDeletedFrame) {
|
while (line != line_end && aDeletedFrame) {
|
||||||
MOZ_ASSERT(this == aDeletedFrame->GetParent(), "messed up delete code");
|
NS_ASSERTION(this == aDeletedFrame->GetParent(), "messed up delete code");
|
||||||
MOZ_ASSERT(line->Contains(aDeletedFrame), "frame not in line");
|
NS_ASSERTION(line->Contains(aDeletedFrame), "frame not in line");
|
||||||
|
|
||||||
if (!(aFlags & FRAMES_ARE_EMPTY)) {
|
if (!(aFlags & FRAMES_ARE_EMPTY)) {
|
||||||
line->MarkDirty();
|
line->MarkDirty();
|
||||||
|
|||||||
@@ -1406,14 +1406,15 @@ void nsContainerFrame::DisplayOverflowContainers(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool nsContainerFrame::TryRemoveFrame(FrameListPropertyDescriptor aProp,
|
static bool TryRemoveFrame(nsIFrame* aFrame,
|
||||||
nsIFrame* aChildToRemove) {
|
nsContainerFrame::FrameListPropertyDescriptor aProp,
|
||||||
nsFrameList* list = GetProperty(aProp);
|
nsIFrame* aChildToRemove) {
|
||||||
|
nsFrameList* list = aFrame->GetProperty(aProp);
|
||||||
if (list && list->StartRemoveFrame(aChildToRemove)) {
|
if (list && list->StartRemoveFrame(aChildToRemove)) {
|
||||||
// aChildToRemove *may* have been removed from this list.
|
// aChildToRemove *may* have been removed from this list.
|
||||||
if (list->IsEmpty()) {
|
if (list->IsEmpty()) {
|
||||||
Unused << TakeProperty(aProp);
|
Unused << aFrame->TakeProperty(aProp);
|
||||||
list->Delete(PresShell());
|
list->Delete(aFrame->PresShell());
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1424,10 +1425,11 @@ bool nsContainerFrame::MaybeStealOverflowContainerFrame(nsIFrame* aChild) {
|
|||||||
bool removed = false;
|
bool removed = false;
|
||||||
if (MOZ_UNLIKELY(aChild->HasAnyStateBits(NS_FRAME_IS_OVERFLOW_CONTAINER))) {
|
if (MOZ_UNLIKELY(aChild->HasAnyStateBits(NS_FRAME_IS_OVERFLOW_CONTAINER))) {
|
||||||
// Try removing from the overflow container list.
|
// Try removing from the overflow container list.
|
||||||
removed = TryRemoveFrame(OverflowContainersProperty(), aChild);
|
removed = ::TryRemoveFrame(this, OverflowContainersProperty(), aChild);
|
||||||
if (!removed) {
|
if (!removed) {
|
||||||
// It might be in the excess overflow container list.
|
// It might be in the excess overflow container list.
|
||||||
removed = TryRemoveFrame(ExcessOverflowContainersProperty(), aChild);
|
removed =
|
||||||
|
::TryRemoveFrame(this, ExcessOverflowContainersProperty(), aChild);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return removed;
|
return removed;
|
||||||
@@ -2223,19 +2225,19 @@ nsFrameList* nsContainerFrame::DrainExcessOverflowContainersList(
|
|||||||
ChildFrameMerger aMergeFunc) {
|
ChildFrameMerger aMergeFunc) {
|
||||||
nsFrameList* overflowContainers = GetOverflowContainers();
|
nsFrameList* overflowContainers = GetOverflowContainers();
|
||||||
|
|
||||||
// Drain excess overflow containers from our prev-in-flow.
|
NS_ASSERTION(!(overflowContainers && GetPrevInFlow() &&
|
||||||
if (auto* prev = static_cast<nsContainerFrame*>(GetPrevInFlow())) {
|
static_cast<nsContainerFrame*>(GetPrevInFlow())
|
||||||
AutoFrameListPtr excessFrames(PresContext(),
|
->GetExcessOverflowContainers()),
|
||||||
prev->StealExcessOverflowContainers());
|
"conflicting overflow containers lists");
|
||||||
if (excessFrames) {
|
|
||||||
excessFrames->ApplySetParent(this);
|
if (!overflowContainers) {
|
||||||
nsContainerFrame::ReparentFrameViewList(*excessFrames, prev, this);
|
// Drain excess overflow containers from our prev-in-flow.
|
||||||
if (overflowContainers) {
|
if (auto* prev = static_cast<nsContainerFrame*>(GetPrevInFlow())) {
|
||||||
// The default merge function is AppendFrames, so we use excessFrames as
|
AutoFrameListPtr excessFrames(PresContext(),
|
||||||
// the destination and then assign the result to overflowContainers.
|
prev->StealExcessOverflowContainers());
|
||||||
aMergeFunc(*excessFrames, *overflowContainers, this);
|
if (excessFrames) {
|
||||||
*overflowContainers = std::move(*excessFrames);
|
excessFrames->ApplySetParent(this);
|
||||||
} else {
|
nsContainerFrame::ReparentFrameViewList(*excessFrames, prev, this);
|
||||||
overflowContainers = SetOverflowContainers(std::move(*excessFrames));
|
overflowContainers = SetOverflowContainers(std::move(*excessFrames));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -327,18 +327,6 @@ class nsContainerFrame : public nsSplittableFrame {
|
|||||||
* See nsBlockFrame::Reflow for a sample implementation.
|
* See nsBlockFrame::Reflow for a sample implementation.
|
||||||
*
|
*
|
||||||
* For more information, see https://wiki.mozilla.org/Gecko:Continuation_Model
|
* For more information, see https://wiki.mozilla.org/Gecko:Continuation_Model
|
||||||
*
|
|
||||||
* Note that Flex/GridContainerFrame doesn't use nsOverflowContinuationTracker
|
|
||||||
* so the above doesn't apply. Flex/Grid containers may have items that
|
|
||||||
* aren't in document order between fragments, due to the 'order' property,
|
|
||||||
* but they do maintain the invariant that children in the same nsFrameList
|
|
||||||
* are in document order. This means that when pushing/pulling items or
|
|
||||||
* merging lists, the result needs to be sorted to restore the order.
|
|
||||||
* However, given that lists are individually sorted, it's a simple merge
|
|
||||||
* operation of the two lists to make the result sorted.
|
|
||||||
* DrainExcessOverflowContainersList takes a merging function to perform that
|
|
||||||
* operation. (By "document order" here we mean normal frame tree order,
|
|
||||||
* which is approximately flattened DOM tree order.)
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
friend class nsOverflowContinuationTracker;
|
friend class nsOverflowContinuationTracker;
|
||||||
@@ -806,19 +794,6 @@ class nsContainerFrame : public nsSplittableFrame {
|
|||||||
nsIFrame* aFrame,
|
nsIFrame* aFrame,
|
||||||
bool aReparentSiblings);
|
bool aReparentSiblings);
|
||||||
|
|
||||||
/**
|
|
||||||
* Try to remove aChildToRemove from the frame list stored in aProp.
|
|
||||||
* If aChildToRemove was removed from the aProp list and that list became
|
|
||||||
* empty, then aProp is removed from this frame and deleted.
|
|
||||||
* @note if aChildToRemove isn't on the aProp frame list, it might still be
|
|
||||||
* removed from whatever list it happens to be on, so use this method
|
|
||||||
* carefully. This method is primarily meant for removing frames from the
|
|
||||||
* [Excess]OverflowContainers lists.
|
|
||||||
* @return true if aChildToRemove was removed from some list
|
|
||||||
*/
|
|
||||||
bool TryRemoveFrame(FrameListPropertyDescriptor aProp,
|
|
||||||
nsIFrame* aChildToRemove);
|
|
||||||
|
|
||||||
// ==========================================================================
|
// ==========================================================================
|
||||||
/*
|
/*
|
||||||
* Convenience methods for traversing continuations
|
* Convenience methods for traversing continuations
|
||||||
|
|||||||
Reference in New Issue
Block a user