--- a/layout/base/nsCSSFrameConstructor.cpp
+++ b/layout/base/nsCSSFrameConstructor.cpp
@@ -7519,27 +7519,27 @@ nsCSSFrameConstructor::GetRangeInsertion
}
return insertionPoint;
}
bool
nsCSSFrameConstructor::MaybeRecreateForFrameset(nsIFrame* aParentFrame,
nsIContent* aStartChild,
- nsIContent* aEndChild,
- InsertionKind aInsertionKind)
+ nsIContent* aEndChild)
{
if (aParentFrame->IsFrameSetFrame()) {
// Check whether we have any kids we care about.
for (nsIContent* cur = aStartChild;
cur != aEndChild;
cur = cur->GetNextSibling()) {
if (IsSpecialFramesetChild(cur)) {
// Just reframe the parent, since framesets are weird like that.
- RecreateFramesForContent(aParentFrame->GetContent(), aInsertionKind);
+ RecreateFramesForContent(aParentFrame->GetContent(),
+ InsertionKind::Async);
return true;
}
}
}
return false;
}
void
@@ -7585,17 +7585,18 @@ nsCSSFrameConstructor::StyleNewChildRang
void
nsCSSFrameConstructor::ContentAppended(nsIContent* aContainer,
nsIContent* aFirstNewContent,
InsertionKind aInsertionKind,
TreeMatchContext* aProvidedTreeMatchContext)
{
MOZ_ASSERT(!aProvidedTreeMatchContext ||
aInsertionKind == InsertionKind::Sync);
- MOZ_ASSERT(aInsertionKind == InsertionKind::Sync || !RestyleManager()->IsInStyleRefresh());
+ MOZ_ASSERT(aInsertionKind == InsertionKind::Sync ||
+ !RestyleManager()->IsInStyleRefresh());
AUTO_LAYOUT_PHASE_ENTRY_POINT(mPresShell->GetPresContext(), FrameC);
NS_PRECONDITION(mUpdateCount != 0,
"Should be in an update while creating frames");
#ifdef DEBUG
if (gNoisyContentUpdates) {
printf("nsCSSFrameConstructor::ContentAppended container=%p "
@@ -7688,17 +7689,17 @@ nsCSSFrameConstructor::ContentAppended(n
aInsertionKind);
nsContainerFrame*& parentFrame = insertion.mParentFrame;
LAYOUT_PHASE_TEMP_REENTER();
if (!parentFrame) {
return;
}
LAYOUT_PHASE_TEMP_EXIT();
- if (MaybeRecreateForFrameset(parentFrame, aFirstNewContent, nullptr, aInsertionKind)) {
+ if (MaybeRecreateForFrameset(parentFrame, aFirstNewContent, nullptr)) {
LAYOUT_PHASE_TEMP_REENTER();
return;
}
LAYOUT_PHASE_TEMP_REENTER();
if (parentFrame->IsLeaf()) {
// Nothing to do here; we shouldn't be constructing kids of leaves
// Clear lazy bits so we don't try to construct again.
@@ -7808,17 +7809,17 @@ nsCSSFrameConstructor::ContentAppended(n
nsIFrame* prevSibling = ::FindAppendPrevSibling(parentFrame, parentAfterFrame);
// Perform special check for diddling around with the frames in
// a ib-split inline frame.
// If we're appending before :after content, then we're not really
// appending, so let WipeContainingBlock know that.
LAYOUT_PHASE_TEMP_EXIT();
if (WipeContainingBlock(state, containingBlock, parentFrame, items,
- true, prevSibling, aInsertionKind)) {
+ true, prevSibling)) {
LAYOUT_PHASE_TEMP_REENTER();
return;
}
LAYOUT_PHASE_TEMP_REENTER();
// If the parent is a block frame, and we're not in a special case
// where frames can be moved around, determine if the list is for the
// start or end of the block.
@@ -7992,17 +7993,18 @@ nsCSSFrameConstructor::ContentRangeInser
nsIContent* aStartChild,
nsIContent* aEndChild,
nsILayoutHistoryState* aFrameState,
InsertionKind aInsertionKind,
TreeMatchContext* aProvidedTreeMatchContext)
{
MOZ_ASSERT(!aProvidedTreeMatchContext ||
aInsertionKind == InsertionKind::Sync);
- MOZ_ASSERT(aInsertionKind == InsertionKind::Sync || !RestyleManager()->IsInStyleRefresh());
+ MOZ_ASSERT(aInsertionKind == InsertionKind::Sync ||
+ !RestyleManager()->IsInStyleRefresh());
AUTO_LAYOUT_PHASE_ENTRY_POINT(mPresShell->GetPresContext(), FrameC);
NS_PRECONDITION(mUpdateCount != 0,
"Should be in an update while creating frames");
NS_PRECONDITION(aStartChild, "must always pass a child");
#ifdef DEBUG
@@ -8191,17 +8193,17 @@ nsCSSFrameConstructor::ContentRangeInser
LAYOUT_PHASE_TEMP_REENTER();
return;
}
nsIContent* container = insertion.mParentFrame->GetContent();
LayoutFrameType frameType = insertion.mParentFrame->Type();
LAYOUT_PHASE_TEMP_EXIT();
- if (MaybeRecreateForFrameset(insertion.mParentFrame, aStartChild, aEndChild, aInsertionKind)) {
+ if (MaybeRecreateForFrameset(insertion.mParentFrame, aStartChild, aEndChild)) {
LAYOUT_PHASE_TEMP_REENTER();
return;
}
LAYOUT_PHASE_TEMP_REENTER();
// We should only get here with fieldsets when doing a single insert, because
// fieldsets have multiple insertion points.
NS_ASSERTION(isSingleInsert || frameType != LayoutFrameType::FieldSet,
@@ -8389,17 +8391,17 @@ nsCSSFrameConstructor::ContentRangeInser
}
// Perform special check for diddling around with the frames in
// a special inline frame.
// If we're appending before :after content, then we're not really
// appending, so let WipeContainingBlock know that.
LAYOUT_PHASE_TEMP_EXIT();
if (WipeContainingBlock(state, containingBlock, insertion.mParentFrame, items,
- isAppend, prevSibling, aInsertionKind)) {
+ isAppend, prevSibling)) {
LAYOUT_PHASE_TEMP_REENTER();
return;
}
LAYOUT_PHASE_TEMP_REENTER();
// If the container is a table and a caption will be appended, it needs to be
// put in the table wrapper frame's additional child list.
// We make no attempt here to set flags to indicate whether the list
@@ -8582,28 +8584,22 @@ nsCSSFrameConstructor::ContentRangeInser
}
#endif
}
bool
nsCSSFrameConstructor::ContentRemoved(nsIContent* aContainer,
nsIContent* aChild,
nsIContent* aOldNextSibling,
- InsertionKind aInsertionKind,
RemoveFlags aFlags)
{
MOZ_ASSERT(aChild);
AUTO_LAYOUT_PHASE_ENTRY_POINT(mPresShell->GetPresContext(), FrameC);
NS_PRECONDITION(mUpdateCount != 0,
"Should be in an update while destroying frames");
- // We only want to recreate sync if we're already in frame construction, that
- // is, recreate async for XBL DOM changes, and normal content removals.
- MOZ_ASSERT(aFlags == REMOVE_FOR_RECONSTRUCTION ||
- aInsertionKind == InsertionKind::Async);
-
nsPresContext* presContext = mPresShell->GetPresContext();
MOZ_ASSERT(presContext, "Our presShell should have a valid presContext");
if (aChild->IsHTMLElement(nsGkAtoms::body) ||
(!aContainer && aChild->IsElement())) {
// We might be removing the element that we propagated viewport scrollbar
// styles from. Recompute those. (This clause covers two of the three
// possible scrollbar-propagation sources: the <body> [as aChild or a
@@ -8643,28 +8639,27 @@ nsCSSFrameConstructor::ContentRemoved(ns
MOZ_ASSERT(ancestor, "we can't have a display: contents subtree root!");
}
nsIFrame* ancestorFrame = ancestor->GetPrimaryFrame();
if (ancestorFrame->GetProperty(nsIFrame::GenConProperty())) {
// XXXmats Can we recreate frames only for the ::after/::before content?
// XXX Perhaps even only those that belong to the aChild sub-tree?
LAYOUT_PHASE_TEMP_EXIT();
- RecreateFramesForContent(ancestor, aInsertionKind);
+ RecreateFramesForContent(ancestor, InsertionKind::Async);
LAYOUT_PHASE_TEMP_REENTER();
return true;
}
FlattenedChildIterator iter(aChild);
for (nsIContent* c = iter.GetNextChild(); c; c = iter.GetNextChild()) {
if (c->GetPrimaryFrame() || GetDisplayContentsStyleFor(c)) {
LAYOUT_PHASE_TEMP_EXIT();
bool didReconstruct =
- ContentRemoved(aChild, c, nullptr, aInsertionKind,
- REMOVE_FOR_RECONSTRUCTION);
+ ContentRemoved(aChild, c, nullptr, REMOVE_FOR_RECONSTRUCTION);
LAYOUT_PHASE_TEMP_REENTER();
if (didReconstruct) {
return true;
}
}
}
UnregisterDisplayContentsStyleFor(aChild, aContainer);
return false;
@@ -8704,69 +8699,70 @@ nsCSSFrameConstructor::ContentRemoved(ns
!aContainer->IsInNativeAnonymousSubtree() &&
!aChild->IsInNativeAnonymousSubtree()) {
// Recreate frames if content is removed from a ShadowRoot because it may
// contain an insertion point which can change how the host is rendered.
//
// XXXsmaug This is super unefficient!
nsIContent* bindingParent = aContainer->GetBindingParent();
LAYOUT_PHASE_TEMP_EXIT();
- RecreateFramesForContent(bindingParent, aInsertionKind);
+ RecreateFramesForContent(bindingParent, InsertionKind::Async);
LAYOUT_PHASE_TEMP_REENTER();
return true;
}
if (childFrame) {
InvalidateCanvasIfNeeded(mPresShell, aChild);
// See whether we need to remove more than just childFrame
LAYOUT_PHASE_TEMP_EXIT();
- if (MaybeRecreateContainerForFrameRemoval(childFrame, aInsertionKind)) {
+ if (MaybeRecreateContainerForFrameRemoval(childFrame)) {
LAYOUT_PHASE_TEMP_REENTER();
return true;
}
LAYOUT_PHASE_TEMP_REENTER();
// Get the childFrame's parent frame
nsIFrame* parentFrame = childFrame->GetParent();
LayoutFrameType parentType = parentFrame->Type();
if (parentType == LayoutFrameType::FrameSet &&
IsSpecialFramesetChild(aChild)) {
// Just reframe the parent, since framesets are weird like that.
LAYOUT_PHASE_TEMP_EXIT();
- RecreateFramesForContent(parentFrame->GetContent(), aInsertionKind);
+ RecreateFramesForContent(parentFrame->GetContent(), InsertionKind::Async);
LAYOUT_PHASE_TEMP_REENTER();
return true;
}
// If we're a child of MathML, then we should reframe the MathML content.
// If we're non-MathML, then we would be wrapped in a block so we need to
// check our grandparent in that case.
nsIFrame* possibleMathMLAncestor = parentType == LayoutFrameType::Block
? parentFrame->GetParent()
: parentFrame;
if (possibleMathMLAncestor->IsFrameOfType(nsIFrame::eMathML)) {
LAYOUT_PHASE_TEMP_EXIT();
- RecreateFramesForContent(parentFrame->GetContent(), aInsertionKind);
+ RecreateFramesForContent(parentFrame->GetContent(), InsertionKind::Async);
LAYOUT_PHASE_TEMP_REENTER();
return true;
}
// Undo XUL wrapping if it's no longer needed.
// (If we're in the XUL block-wrapping situation, parentFrame is the
// wrapper frame.)
nsIFrame* grandparentFrame = parentFrame->GetParent();
if (grandparentFrame && grandparentFrame->IsXULBoxFrame() &&
(grandparentFrame->GetStateBits() & NS_STATE_BOX_WRAPS_KIDS_IN_BLOCK) &&
// check if this frame is the only one needing wrapping
aChild == AnyKidsNeedBlockParent(parentFrame->PrincipalChildList().FirstChild()) &&
!AnyKidsNeedBlockParent(childFrame->GetNextSibling())) {
LAYOUT_PHASE_TEMP_EXIT();
- RecreateFramesForContent(grandparentFrame->GetContent(), aInsertionKind);
+ RecreateFramesForContent(grandparentFrame->GetContent(),
+ InsertionKind::Async);
LAYOUT_PHASE_TEMP_REENTER();
return true;
}
#ifdef ACCESSIBILITY
if (nsAccessibilityService* accService = nsIPresShell::AccService()) {
accService->ContentRemoved(mPresShell, aChild);
}
@@ -9688,19 +9684,17 @@ FindPreviousNonWhitespaceSibling(nsIFram
nsIFrame* f = aFrame;
do {
f = f->GetPrevSibling();
} while (f && IsWhitespaceFrame(f));
return f;
}
bool
-nsCSSFrameConstructor::MaybeRecreateContainerForFrameRemoval(
- nsIFrame* aFrame,
- InsertionKind aInsertionKind)
+nsCSSFrameConstructor::MaybeRecreateContainerForFrameRemoval(nsIFrame* aFrame)
{
NS_PRECONDITION(aFrame, "Must have a frame");
NS_PRECONDITION(aFrame->GetParent(), "Frame shouldn't be root");
NS_PRECONDITION(aFrame == aFrame->FirstContinuation(),
"aFrame not the result of GetPrimaryFrame()?");
if (IsFramePartOfIBSplit(aFrame)) {
// The removal functions can't handle removal of an {ib} split directly; we
@@ -9709,24 +9703,25 @@ nsCSSFrameConstructor::MaybeRecreateCont
if (gNoisyContentUpdates) {
printf("nsCSSFrameConstructor::MaybeRecreateContainerForFrameRemoval: "
"frame=");
nsFrame::ListTag(stdout, aFrame);
printf(" is ib-split\n");
}
#endif
- ReframeContainingBlock(aFrame, aInsertionKind);
+ ReframeContainingBlock(aFrame);
return true;
}
nsContainerFrame* insertionFrame = aFrame->GetContentInsertionFrame();
if (insertionFrame && insertionFrame->IsLegendFrame() &&
aFrame->GetParent()->IsFieldSetFrame()) {
- RecreateFramesForContent(aFrame->GetParent()->GetContent(), aInsertionKind);
+ RecreateFramesForContent(aFrame->GetParent()->GetContent(),
+ InsertionKind::Async);
return true;
}
nsIFrame* inFlowFrame =
(aFrame->GetStateBits() & NS_FRAME_OUT_OF_FLOW) ?
aFrame->GetPlaceholderFrame() : aFrame;
MOZ_ASSERT(inFlowFrame, "How did that happen?");
MOZ_ASSERT(inFlowFrame == inFlowFrame->FirstContinuation(),
@@ -9740,17 +9735,17 @@ nsCSSFrameConstructor::MaybeRecreateCont
// Unlike adding summary element cases, we need to check children of the
// parent details frame since at this moment the summary element has been
// already removed from the parent details element's child list.
if (summary && detailsFrame->HasMainSummaryFrame(aFrame)) {
// When removing a summary, we should reframe the parent details frame to
// ensure that another summary is used or the default summary is
// generated.
- RecreateFramesForContent(parent->GetContent(), aInsertionKind);
+ RecreateFramesForContent(parent->GetContent(), InsertionKind::Async);
return true;
}
}
// Now check for possibly needing to reconstruct due to a pseudo parent
// For the case of ruby pseudo parent, effectively, only pseudo rb/rt frame
// need to be checked here, since all other types of parent will be catched
// by "Check ruby containers" section below.
@@ -9763,17 +9758,17 @@ nsCSSFrameConstructor::MaybeRecreateCont
parent->PrincipalChildList().OnlyChild()) ||
// If we're a table-column-group, then the OnlyChild check above is
// not going to catch cases when we're the first child.
(inFlowFrame->IsTableColGroupFrame() &&
parent->GetChildList(nsIFrame::kColGroupList).FirstChild() == inFlowFrame) ||
// Similar if we're a table-caption.
(inFlowFrame->IsTableCaption() &&
parent->GetChildList(nsIFrame::kCaptionList).FirstChild() == inFlowFrame)) {
- RecreateFramesForContent(parent->GetContent(), aInsertionKind);
+ RecreateFramesForContent(parent->GetContent(), InsertionKind::Async);
return true;
}
}
// Might need to reconstruct things if this frame's nextSibling is a table
// or ruby pseudo, since removal of this frame might mean that this pseudo
// needs to get merged with the frame's prevSibling if that's also a table
// or ruby pseudo.
@@ -9792,33 +9787,33 @@ nsCSSFrameConstructor::MaybeRecreateCont
"frame=");
nsFrame::ListTag(stdout, aFrame);
printf(" has a table pseudo next sibling of different type and a "
"table pseudo prevsibling\n");
}
#endif
// Good enough to recreate frames for aFrame's parent's content; even if
// aFrame's parent is a pseudo, that'll be the right content node.
- RecreateFramesForContent(parent->GetContent(), aInsertionKind);
+ RecreateFramesForContent(parent->GetContent(), InsertionKind::Async);
return true;
}
}
// Check ruby containers
LayoutFrameType parentType = parent->Type();
if (parentType == LayoutFrameType::Ruby ||
RubyUtils::IsRubyContainerBox(parentType)) {
// In ruby containers, pseudo frames may be created from
// whitespaces or even nothing. There are two cases we actually
// need to handle here, but hard to check exactly:
// 1. Status of spaces beside the frame may vary, and related
// frames may be constructed or destroyed accordingly.
// 2. The type of the first child of a ruby frame determines
// whether a pseudo ruby base container should exist.
- RecreateFramesForContent(parent->GetContent(), aInsertionKind);
+ RecreateFramesForContent(parent->GetContent(), InsertionKind::Async);
return true;
}
// Might need to reconstruct things if the removed frame's nextSibling is an
// anonymous flex item. The removed frame might've been what divided two
// runs of inline content into two anonymous flex items, which would now
// need to be merged.
// NOTE: It's fine that we've advanced nextSibling past whitespace (up above);
@@ -9831,17 +9826,17 @@ nsCSSFrameConstructor::MaybeRecreateCont
if (gNoisyContentUpdates) {
printf("nsCSSFrameConstructor::MaybeRecreateContainerForFrameRemoval: "
"frame=");
nsFrame::ListTag(stdout, aFrame);
printf(" has an anonymous flex item as its next sibling\n");
}
#endif // DEBUG
// Recreate frames for the flex container (the removed frame's parent)
- RecreateFramesForContent(parent->GetContent(), aInsertionKind);
+ RecreateFramesForContent(parent->GetContent(), InsertionKind::Async);
return true;
}
// Might need to reconstruct things if the removed frame's nextSibling is
// null and its parent is an anonymous flex item. (This might be the last
// remaining child of that anonymous flex item, which can then go away.)
if (!nextSibling && IsAnonymousFlexOrGridItem(parent)) {
AssertAnonymousFlexOrGridItemParent(parent, parent->GetParent());
@@ -9849,37 +9844,38 @@ nsCSSFrameConstructor::MaybeRecreateCont
if (gNoisyContentUpdates) {
printf("nsCSSFrameConstructor::MaybeRecreateContainerForFrameRemoval: "
"frame=");
nsFrame::ListTag(stdout, aFrame);
printf(" has an anonymous flex item as its parent\n");
}
#endif // DEBUG
// Recreate frames for the flex container (the removed frame's grandparent)
- RecreateFramesForContent(parent->GetParent()->GetContent(), aInsertionKind);
+ RecreateFramesForContent(parent->GetParent()->GetContent(),
+ InsertionKind::Async);
return true;
}
#ifdef MOZ_XUL
if (aFrame->IsPopupSetFrame()) {
nsIRootBox* rootBox = nsIRootBox::GetRootBox(mPresShell);
if (rootBox && rootBox->GetPopupSetFrame() == aFrame) {
- ReconstructDocElementHierarchy(aInsertionKind);
+ ReconstructDocElementHierarchy(InsertionKind::Async);
return true;
}
}
#endif
// Reconstruct if inflowFrame is parent's only child, and parent is, or has,
// a non-fluid continuation, i.e. it was split by bidi resolution
if (!inFlowFrame->GetPrevSibling() &&
!inFlowFrame->GetNextSibling() &&
((parent->GetPrevContinuation() && !parent->GetPrevInFlow()) ||
(parent->GetNextContinuation() && !parent->GetNextInFlow()))) {
- RecreateFramesForContent(parent->GetContent(), aInsertionKind);
+ RecreateFramesForContent(parent->GetContent(), InsertionKind::Async);
return true;
}
// We might still need to reconstruct things if the parent of inFlowFrame is
// ib-split, since in that case the removal of aFrame might affect the
// splitting of its parent.
if (!IsFramePartOfIBSplit(parent)) {
return false;
@@ -9905,17 +9901,17 @@ nsCSSFrameConstructor::MaybeRecreateCont
if (gNoisyContentUpdates) {
printf("nsCSSFrameConstructor::MaybeRecreateContainerForFrameRemoval: "
"frame=");
nsFrame::ListTag(stdout, parent);
printf(" is ib-split\n");
}
#endif
- ReframeContainingBlock(parent, aInsertionKind);
+ ReframeContainingBlock(parent);
return true;
}
void
nsCSSFrameConstructor::UpdateTableCellSpans(nsIContent* aContent)
{
nsTableCellFrame* cellFrame = do_QueryFrame(aContent->GetPrimaryFrame());
@@ -9964,17 +9960,17 @@ nsCSSFrameConstructor::RecreateFramesFor
frame = parentContentFrame;
}
}
if (frame) {
nsIFrame* nonGeneratedAncestor = nsLayoutUtils::GetNonGeneratedAncestor(frame);
if (nonGeneratedAncestor->GetContent() != aContent) {
return RecreateFramesForContent(nonGeneratedAncestor->GetContent(),
- aInsertionKind);
+ InsertionKind::Async);
}
if (frame->GetStateBits() & NS_FRAME_ANONYMOUSCONTENTCREATOR_CONTENT) {
// Recreate the frames for the entire nsIAnonymousContentCreator tree
// since |frame| or one of its descendants may need an nsStyleContext
// that associates it to a CSS pseudo-element, and only the
// nsIAnonymousContentCreator that created this content knows how to make
// that happen.
@@ -9984,32 +9980,33 @@ nsCSSFrameConstructor::RecreateFramesFor
ancestor = nsLayoutUtils::GetParentOrPlaceholderFor(ancestor);
}
NS_ASSERTION(acc, "Where is the nsIAnonymousContentCreator? We may fail "
"to recreate its content correctly");
// nsSVGUseFrame is special, and we know this is unnecessary for it.
if (!ancestor->IsSVGUseFrame()) {
NS_ASSERTION(aContent->IsInNativeAnonymousSubtree(),
"Why is NS_FRAME_ANONYMOUSCONTENTCREATOR_CONTENT set?");
- return RecreateFramesForContent(ancestor->GetContent(), aInsertionKind);
+ return RecreateFramesForContent(ancestor->GetContent(),
+ InsertionKind::Async);
}
}
nsIFrame* parent = frame->GetParent();
nsIContent* parentContent = parent ? parent->GetContent() : nullptr;
// If the parent frame is a leaf then the subsequent insert will fail to
// create a frame, so we need to recreate the parent content. This happens
// with native anonymous content from the editor.
if (parent && parent->IsLeaf() && parentContent &&
parentContent != aContent) {
- return RecreateFramesForContent(parentContent, aInsertionKind);
- }
- }
-
- if (frame && MaybeRecreateContainerForFrameRemoval(frame, aInsertionKind)) {
+ return RecreateFramesForContent(parentContent, InsertionKind::Async);
+ }
+ }
+
+ if (frame && MaybeRecreateContainerForFrameRemoval(frame)) {
return;
}
nsINode* containerNode = aContent->GetParentNode();
// XXXbz how can containerNode be null here?
if (containerNode) {
// Before removing the frames associated with the content object,
// ask them to save their state onto a temporary state object.
@@ -10018,17 +10015,17 @@ nsCSSFrameConstructor::RecreateFramesFor
// Need the nsIContent parent, which might be null here, since we need to
// pass it to ContentInserted and ContentRemoved.
nsIContent* container = aContent->GetParent();
// Remove the frames associated with the content object.
nsIContent* nextSibling = aContent->IsRootOfAnonymousSubtree() ?
nullptr : aContent->GetNextSibling();
bool didReconstruct =
- ContentRemoved(container, aContent, nextSibling, aInsertionKind,
+ ContentRemoved(container, aContent, nextSibling,
REMOVE_FOR_RECONSTRUCTION);
if (!didReconstruct) {
if (aInsertionKind == InsertionKind::Async && aContent->IsElement()) {
// FIXME(emilio, bug 1397239): There's nothing removing the frame state
// for elements that go away before we come back to the frame
// constructor.
//
@@ -10058,17 +10055,16 @@ nsCSSFrameConstructor::DestroyFramesFor(
nsIContent* nextSibling =
aElement->IsRootOfAnonymousSubtree() ? nullptr : aElement->GetNextSibling();
CaptureStateForFramesOf(aElement, mTempFrameTreeState);
return ContentRemoved(aElement->GetParent(),
aElement,
nextSibling,
- InsertionKind::Async,
REMOVE_FOR_RECONSTRUCTION);
}
//////////////////////////////////////////////////////////////////////
// Block frame construction code
already_AddRefed<nsStyleContext>
@@ -12737,32 +12733,31 @@ IsSafeToAppendToIBSplitInline(nsIFrame*
}
bool
nsCSSFrameConstructor::WipeContainingBlock(nsFrameConstructorState& aState,
nsIFrame* aContainingBlock,
nsIFrame* aFrame,
FrameConstructionItemList& aItems,
bool aIsAppend,
- nsIFrame* aPrevSibling,
- InsertionKind aInsertionKind)
+ nsIFrame* aPrevSibling)
{
if (aItems.IsEmpty()) {
return false;
}
// Before we go and append the frames, we must check for several
// special situations.
// Situation #1 is a XUL frame that contains frames that are required
// to be wrapped in blocks.
if (aFrame->IsXULBoxFrame() &&
!(aFrame->GetStateBits() & NS_STATE_BOX_WRAPS_KIDS_IN_BLOCK) &&
aItems.AnyItemsNeedBlockParent()) {
- RecreateFramesForContent(aFrame->GetContent(), aInsertionKind);
+ RecreateFramesForContent(aFrame->GetContent(), InsertionKind::Async);
return true;
}
nsIFrame* nextSibling = ::GetInsertNextSibling(aFrame, aPrevSibling);
// Situation #2 is a flex or grid container frame into which we're inserting
// new inline non-replaced children, adjacent to an existing anonymous
// flex or grid item.
@@ -12771,28 +12766,28 @@ nsCSSFrameConstructor::WipeContainingBlo
frameType == LayoutFrameType::GridContainer) {
FCItemIterator iter(aItems);
// Check if we're adding to-be-wrapped content right *after* an existing
// anonymous flex or grid item (which would need to absorb this content).
const bool isWebkitBox = IsFlexContainerForLegacyBox(aFrame);
if (aPrevSibling && IsAnonymousFlexOrGridItem(aPrevSibling) &&
iter.item().NeedsAnonFlexOrGridItem(aState, isWebkitBox)) {
- RecreateFramesForContent(aFrame->GetContent(), aInsertionKind);
+ RecreateFramesForContent(aFrame->GetContent(), InsertionKind::Async);
return true;
}
// Check if we're adding to-be-wrapped content right *before* an existing
// anonymous flex or grid item (which would need to absorb this content).
if (nextSibling && IsAnonymousFlexOrGridItem(nextSibling)) {
// Jump to the last entry in the list
iter.SetToEnd();
iter.Prev();
if (iter.item().NeedsAnonFlexOrGridItem(aState, isWebkitBox)) {
- RecreateFramesForContent(aFrame->GetContent(), aInsertionKind);
+ RecreateFramesForContent(aFrame->GetContent(), InsertionKind::Async);
return true;
}
}
}
// Situation #3 is an anonymous flex or grid item that's getting new children
// who don't want to be wrapped.
if (IsAnonymousFlexOrGridItem(aFrame)) {
@@ -12810,17 +12805,17 @@ nsCSSFrameConstructor::WipeContainingBlo
FCItemIterator iter(aItems);
// Skip over things that _do_ need an anonymous flex item, because
// they're perfectly happy to go here -- they won't cause a reframe.
nsIFrame* containerFrame = aFrame->GetParent();
const bool isWebkitBox = IsFlexContainerForLegacyBox(containerFrame);
if (!iter.SkipItemsThatNeedAnonFlexOrGridItem(aState, isWebkitBox)) {
// We hit something that _doesn't_ need an anonymous flex item!
// Rebuild the flex container to bust it out.
- RecreateFramesForContent(containerFrame->GetContent(), aInsertionKind);
+ RecreateFramesForContent(containerFrame->GetContent(), InsertionKind::Async);
return true;
}
// If we get here, then everything in |aItems| needs to be wrapped in
// an anonymous flex or grid item. That's where it's already going - good!
}
// Situation #4 is a ruby-related frame that's getting new children.
@@ -12833,17 +12828,17 @@ nsCSSFrameConstructor::WipeContainingBlo
// their sibling changes.
// 2) The first effective child of a ruby frame must always be a ruby
// base container. It should be created or destroyed accordingly.
if (IsRubyPseudo(aFrame) || frameType == LayoutFrameType::Ruby ||
RubyUtils::IsRubyContainerBox(frameType)) {
// We want to optimize it better, and avoid reframing as much as
// possible. But given the cases above, and the fact that a ruby
// usually won't be very large, it should be fine to reframe it.
- RecreateFramesForContent(aFrame->GetContent(), aInsertionKind);
+ RecreateFramesForContent(aFrame->GetContent(), InsertionKind::Async);
return true;
}
// Situation #5 is a case when table pseudo-frames don't work out right
ParentType parentType = GetParentType(aFrame);
// If all the kids want a parent of the type that aFrame is, then we're all
// set to go. Indeed, there won't be any table pseudo-frames created between
// aFrame and the kids, so those won't need to be merged with any table
@@ -12999,17 +12994,17 @@ nsCSSFrameConstructor::WipeContainingBlo
// it might be empty, so recheck that too.
if (aItems.IsEmpty()) {
return false;
}
if (!aItems.AllWantParentType(parentType)) {
// Reframing aFrame->GetContent() is good enough, since the content of
// table pseudo-frames is the ancestor content.
- RecreateFramesForContent(aFrame->GetContent(), aInsertionKind);
+ RecreateFramesForContent(aFrame->GetContent(), InsertionKind::Async);
return true;
}
}
// Now we have several cases involving {ib} splits. Put them all in a
// do/while with breaks to take us to the "go and reconstruct" code.
do {
if (IsInlineFrame(aFrame)) {
@@ -13087,23 +13082,22 @@ nsCSSFrameConstructor::WipeContainingBlo
nsIContent* blockContent = aContainingBlock->GetContent();
#ifdef DEBUG
if (gNoisyContentUpdates) {
printf("nsCSSFrameConstructor::WipeContainingBlock: blockContent=%p\n",
static_cast<void*>(blockContent));
}
#endif
- RecreateFramesForContent(blockContent, aInsertionKind);
+ RecreateFramesForContent(blockContent, InsertionKind::Async);
return true;
}
void
-nsCSSFrameConstructor::ReframeContainingBlock(nsIFrame* aFrame,
- InsertionKind aInsertionKind)
+nsCSSFrameConstructor::ReframeContainingBlock(nsIFrame* aFrame)
{
#ifdef DEBUG
// ReframeContainingBlock is a NASTY routine, it causes terrible performance problems
// so I want to see when it is happening! Unfortunately, it is happening way to often because
// so much content on the web causes block-in-inline frame situations and we handle them
// very poorly
if (gNoisyContentUpdates) {
@@ -13135,24 +13129,24 @@ nsCSSFrameConstructor::ReframeContaining
// And get the containingBlock's content
if (nsIContent* blockContent = containingBlock->GetContent()) {
#ifdef DEBUG
if (gNoisyContentUpdates) {
printf(" ==> blockContent=%p\n", static_cast<void*>(blockContent));
}
#endif
- RecreateFramesForContent(blockContent->AsElement(), aInsertionKind);
+ RecreateFramesForContent(blockContent->AsElement(), InsertionKind::Async);
return;
}
}
// If we get here, we're screwed!
RecreateFramesForContent(mPresShell->GetDocument()->GetRootElement(),
- aInsertionKind);
+ InsertionKind::Async);
}
void
nsCSSFrameConstructor::GenerateChildFrames(nsContainerFrame* aFrame)
{
{
nsAutoScriptBlocker scriptBlocker;
BeginUpdate();