forked from mirrors/gecko-dev
Bug 1850834 - Don't reframe containing block on insertion when empty. r=jwatt
This is also actually needed to avoid the perf cliff in Perf-Dashboard. Differential Revision: https://phabricator.services.mozilla.com/D212373
This commit is contained in:
parent
cce3bdefa5
commit
8467fcc705
2 changed files with 31 additions and 5 deletions
|
|
@ -7057,6 +7057,11 @@ void nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aStartChild,
|
||||||
if (LayoutFrameType::Table == frameType ||
|
if (LayoutFrameType::Table == frameType ||
|
||||||
LayoutFrameType::TableWrapper == frameType) {
|
LayoutFrameType::TableWrapper == frameType) {
|
||||||
PullOutCaptionFrames(frameList, captionList);
|
PullOutCaptionFrames(frameList, captionList);
|
||||||
|
if (prevSibling && prevSibling->IsTableCaption()) {
|
||||||
|
// This can happen, but only if the table is empty (otherwise
|
||||||
|
// SafeToInsertPseudoNeedingChildren bails).
|
||||||
|
prevSibling = nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -11156,6 +11161,25 @@ bool nsCSSFrameConstructor::WipeInsertionParent(nsContainerFrame* aFrame) {
|
||||||
#undef TRACE
|
#undef TRACE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool SafeToInsertPseudoNeedingChildren(nsIFrame* aFrame) {
|
||||||
|
for (auto& [list, listID] : aFrame->ChildLists()) {
|
||||||
|
if (list.IsEmpty()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// We have some existing frame, usually it would be unsafe to insert. But
|
||||||
|
// let's make an exception for the synthetic colgroup that tables have,
|
||||||
|
// since that gets created unconditionally.
|
||||||
|
if (listID == FrameChildListID::ColGroup) {
|
||||||
|
if (nsIFrame* f = list.OnlyChild();
|
||||||
|
f && static_cast<nsTableColGroupFrame*>(f)->IsSynthetic()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool nsCSSFrameConstructor::WipeContainingBlock(
|
bool nsCSSFrameConstructor::WipeContainingBlock(
|
||||||
nsFrameConstructorState& aState, nsIFrame* aContainingBlock,
|
nsFrameConstructorState& aState, nsIFrame* aContainingBlock,
|
||||||
nsIFrame* aFrame, FrameConstructionItemList& aItems, bool aIsAppend,
|
nsIFrame* aFrame, FrameConstructionItemList& aItems, bool aIsAppend,
|
||||||
|
|
@ -11419,7 +11443,10 @@ bool nsCSSFrameConstructor::WipeContainingBlock(
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!aItems.AllWantParentType(parentType)) {
|
// If aFrame is empty, the insertion process will be able to take care of
|
||||||
|
// creating any needed pseudo-parents.
|
||||||
|
if (!aItems.AllWantParentType(parentType) &&
|
||||||
|
!SafeToInsertPseudoNeedingChildren(aFrame)) {
|
||||||
// Reframing aFrame->GetContent() is good enough, since the content of
|
// Reframing aFrame->GetContent() is good enough, since the content of
|
||||||
// table pseudo-frames is the ancestor content.
|
// table pseudo-frames is the ancestor content.
|
||||||
TRACE("Pseudo-frames going wrong");
|
TRACE("Pseudo-frames going wrong");
|
||||||
|
|
|
||||||
|
|
@ -20,11 +20,10 @@
|
||||||
|
|
||||||
const frameCountBeforeReframe = utils.framesConstructed;
|
const frameCountBeforeReframe = utils.framesConstructed;
|
||||||
|
|
||||||
// We expect to construct one newly appended block, and reconstruct the
|
// We expect to construct one newly appended block, and the relevant pseudo
|
||||||
// display:table <body>, which consists of 8 frames including TableWrapper,
|
// parents: TableRowGroup, TableRow, TableColGroup, TableCol, TableCell, and
|
||||||
// Table, TableRowGroup, TableRow, TableColGroup, TableCol, TableCell, and
|
|
||||||
// TableCell's inner block.
|
// TableCell's inner block.
|
||||||
const expectedFrameConstructionCount = 1 + 8;
|
const expectedFrameConstructionCount = 1 + 6;
|
||||||
|
|
||||||
let div = document.createElement("div");
|
let div = document.createElement("div");
|
||||||
document.body.appendChild(div);
|
document.body.appendChild(div);
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue