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:
smolnar
2020-12-15 06:22:49 +02:00
parent 53c124fe30
commit f11b3172ce
7 changed files with 36 additions and 133 deletions

View File

@@ -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&quotFX7wpo&mK`</><details class="a"><summary>cx.6W</>.2;3\52A

View File

@@ -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">

View File

@@ -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>

View File

@@ -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

View File

@@ -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();

View File

@@ -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));
} }
} }

View File

@@ -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