From 261b24d58ff9ca304bc7f88d51341430c13f5f9b Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 15 Jul 2010 00:38:20 -0400 Subject: [PATCH] Bug 577309 part 2. Change the ContentRangeInserted signature to take the end child in addition to the start child. r=tnikkel --- layout/base/nsCSSFrameConstructor.cpp | 51 +++++++++++++++------------ layout/base/nsCSSFrameConstructor.h | 16 ++++----- 2 files changed, 37 insertions(+), 30 deletions(-) diff --git a/layout/base/nsCSSFrameConstructor.cpp b/layout/base/nsCSSFrameConstructor.cpp index 38df4ca4e96..fb9fb77860c 100644 --- a/layout/base/nsCSSFrameConstructor.cpp +++ b/layout/base/nsCSSFrameConstructor.cpp @@ -6388,7 +6388,7 @@ nsCSSFrameConstructor::CreateNeededFrames(nsIContent* aContent) if (inRun) { inRun = PR_FALSE; // generate a ContentRangeInserted for [startOfRun,i) - ContentRangeInserted(aContent, firstChildInRun, startOfRun, i, + ContentRangeInserted(aContent, firstChildInRun, child, startOfRun, i, nsnull, PR_FALSE); } } @@ -6857,6 +6857,7 @@ nsCSSFrameConstructor::ContentInserted(nsIContent* aContainer, { return ContentRangeInserted(aContainer, aChild, + aChild->GetNextSibling(), aIndexInContainer, aIndexInContainer+1, aFrameState, @@ -6883,7 +6884,8 @@ nsCSSFrameConstructor::ContentInserted(nsIContent* aContainer, // frames constructed but not yet inserted into the frame tree). nsresult nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, - nsIContent* aChild, + nsIContent* aStartChild, + nsIContent* aEndChild, PRInt32 aIndexInContainer, PRInt32 aEndIndexInContainer, nsILayoutHistoryState* aFrameState, @@ -6893,21 +6895,23 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, NS_PRECONDITION(mUpdateCount != 0, "Should be in an update while creating frames"); - NS_PRECONDITION(aChild, "must always pass a child"); + NS_PRECONDITION(aStartChild, "must always pass a child"); // XXXldb Do we need to re-resolve style to handle the CSS2 + combinator and // the :empty pseudo-class? #ifdef DEBUG if (gNoisyContentUpdates) { - printf("nsCSSFrameConstructor::ContentRangeInserted container=%p child=%p" + printf("nsCSSFrameConstructor::ContentRangeInserted container=%p " + "start-child=%p end-child=%p " "index=%d endindex=%d lazy=%d\n", - static_cast(aContainer), static_cast(aChild), + static_cast(aContainer), + static_cast(aStartChild), static_cast(aEndChild), aIndexInContainer, aEndIndexInContainer, aAllowLazyConstruction); if (gReallyNoisyContentUpdates) { if (aContainer) { aContainer->List(stdout,0); } else { - aChild->List(stdout, 0); + aStartChild->List(stdout, 0); } } } @@ -6927,8 +6931,8 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, if (isSingleInsert) { // aIndexInContainer might be bogus here, but it's not used by // NotifyListBoxBody's CONTENT_INSERTED handling in any case. - if (NotifyListBoxBody(mPresShell->GetPresContext(), aContainer, aChild, - aIndexInContainer, + if (NotifyListBoxBody(mPresShell->GetPresContext(), aContainer, + aStartChild, aIndexInContainer, mDocument, nsnull, CONTENT_INSERTED)) { return NS_OK; } @@ -6953,7 +6957,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, "root node insertion should be a single insertion"); Element *docElement = mDocument->GetRootElement(); - if (aChild != docElement) { + if (aStartChild != docElement) { // Not the root element; just bail out return NS_OK; } @@ -6966,7 +6970,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, rv = ConstructDocElementFrame(docElement, aFrameState, &docElementFrame); if (NS_SUCCEEDED(rv) && docElementFrame) { - InvalidateCanvasIfNeeded(mPresShell, aChild); + InvalidateCanvasIfNeeded(mPresShell, aStartChild); #ifdef DEBUG if (gReallyNoisyContentUpdates) { printf("nsCSSFrameConstructor::ContentRangeInserted: resulting frame " @@ -6985,7 +6989,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, return NS_OK; if (aAllowLazyConstruction && - MaybeConstructLazily(CONTENTINSERT, aContainer, aChild, + MaybeConstructLazily(CONTENTINSERT, aContainer, aStartChild, aIndexInContainer)) { return NS_OK; } @@ -6995,7 +6999,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, // real parent frame; if not, then the frame hasn't been built yet // and we just bail. nsIFrame* insertionPoint; - GetInsertionPoint(parentFrame, aChild, &insertionPoint); + GetInsertionPoint(parentFrame, aStartChild, &insertionPoint); if (! insertionPoint) return NS_OK; // Don't build the frames. @@ -7014,7 +7018,8 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, PRBool isAppend, isRangeInsertSafe; nsIFrame* prevSibling = - GetInsertionPrevSibling(parentFrame, aContainer, aChild, aIndexInContainer, + GetInsertionPrevSibling(parentFrame, aContainer, + aStartChild, aIndexInContainer, &isAppend, &isRangeInsertSafe); // check if range insert is safe @@ -7032,7 +7037,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, nsIAtom* frameType = parentFrame->GetType(); if (isSingleInsert) { if (frameType == nsGkAtoms::frameSetFrame && - IsSpecialFramesetChild(aChild)) { + IsSpecialFramesetChild(aStartChild)) { // Just reframe the parent, since framesets are weird like that. LAYOUT_PHASE_TEMP_EXIT(); nsresult rv = RecreateFramesForContent(parentFrame->GetContent(), PR_FALSE); @@ -7054,7 +7059,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, NS_ASSERTION(isSingleInsert || frameType != nsGkAtoms::fieldSetFrame, "Unexpected parent"); if (frameType == nsGkAtoms::fieldSetFrame && - aChild->Tag() == nsGkAtoms::legend) { + aStartChild->Tag() == nsGkAtoms::legend) { // Just reframe the parent, since figuring out whether this // should be the new legend and then handling it is too complex. // We could do a little better here --- check if the fieldset already @@ -7071,7 +7076,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, if (parentFrame->IsLeaf()) { // Clear lazy bits so we don't try to construct again. if (isSingleInsert) { - aChild->UnsetFlags(NODE_DESCENDANTS_NEED_FRAMES | NODE_NEEDS_FRAME); + aStartChild->UnsetFlags(NODE_DESCENDANTS_NEED_FRAMES | NODE_NEEDS_FRAME); } else { ClearLazyBitsInChildren(aContainer, aIndexInContainer, aEndIndexInContainer); @@ -7148,8 +7153,9 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, // Removing the letterframes messes around with the frame tree, removing // and creating frames. We need to reget our prevsibling, parent frame, // etc. - prevSibling = GetInsertionPrevSibling(parentFrame, aContainer, aChild, - aIndexInContainer, &isAppend, &isRangeInsertSafe); + prevSibling = GetInsertionPrevSibling(parentFrame, aContainer, + aStartChild, aIndexInContainer, + &isAppend, &isRangeInsertSafe); // Need check whether a range insert is still safe. if (!isSingleInsert && !isRangeInsertSafe) { @@ -7201,7 +7207,8 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, } if (isSingleInsert) { - AddFrameConstructionItems(state, aChild, aIndexInContainer, parentFrame, items); + AddFrameConstructionItems(state, aStartChild, aIndexInContainer, + parentFrame, items); } else { for (PRUint32 i = aIndexInContainer; i < (PRUint32)aEndIndexInContainer; @@ -7243,7 +7250,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, if (frameItems.NotEmpty()) { if (isSingleInsert) { - InvalidateCanvasIfNeeded(mPresShell, aChild); + InvalidateCanvasIfNeeded(mPresShell, aStartChild); } else { for (PRUint32 i = aIndexInContainer; i < (PRUint32)aEndIndexInContainer; @@ -7336,7 +7343,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, PRBool ignored; if (isSingleInsert) { captionPrevSibling = - GetInsertionPrevSibling(captionParent, aContainer, aChild, + GetInsertionPrevSibling(captionParent, aContainer, aStartChild, aIndexInContainer, &captionIsAppend, &ignored); } else { nsIContent* firstCaption = captionItems.FirstChild()->GetContent(); @@ -7346,7 +7353,7 @@ nsCSSFrameConstructor::ContentRangeInserted(nsIContent* aContainer, captionPrevSibling = GetInsertionPrevSibling(captionParent, aContainer, firstCaption, aContainer->IndexOf(firstCaption), &captionIsAppend, &ignored, - aIndexInContainer, aChild, + aIndexInContainer, aStartChild, aEndIndexInContainer, aContainer->GetChildAt(aEndIndexInContainer)); } diff --git a/layout/base/nsCSSFrameConstructor.h b/layout/base/nsCSSFrameConstructor.h index b6e640f0da5..13ba14e87ad 100644 --- a/layout/base/nsCSSFrameConstructor.h +++ b/layout/base/nsCSSFrameConstructor.h @@ -228,15 +228,15 @@ public: PRBool aAllowLazyConstruction); // Like ContentInserted but handles inserting the children of aContainer in - // the range [aIndexInContainer, aEndIndexInContainer). - // aChild must be non-null. For inserting a single node it should be that - // node. For inserting more than one node, aChild must be the first child - // being inserted. - // If aAllowLazyConstruction is true then frame construction of the new - // children can be done lazily. It is only allowed to be true when inserting - // a single node. + // the range [aIndexInContainer, aEndIndexInContainer). aStartChild is the + // child at aIndexInContainer, and must be non-null. aEndChild is the node at + // aEndIndexInContainer (which may be null if the range is at the end of the + // child list). If aAllowLazyConstruction is true then frame construction of + // the new children can be done lazily. It is only allowed to be true when + // inserting a single node. nsresult ContentRangeInserted(nsIContent* aContainer, - nsIContent* aChild, + nsIContent* aStartChild, + nsIContent* aEndChild, PRInt32 aIndexInContainer, PRInt32 aEndIndexInContainer, nsILayoutHistoryState* aFrameState,