From f06792a6ef3c93a3bef181221c587c3ed2476dd9 Mon Sep 17 00:00:00 2001 From: Mats Palmgren Date: Wed, 24 Aug 2011 22:54:29 +0200 Subject: [PATCH] Bug 653649 - New way of getting child lists from frames. (part 3/5) r=roc Update GetAdditionalChildListName consumers to use the new child list iterator instead. --- layout/base/FrameLayerBuilder.cpp | 32 +++++---- layout/base/nsCSSFrameConstructor.cpp | 18 ++--- layout/base/nsFrameManager.cpp | 84 ++++++++--------------- layout/base/nsLayoutUtils.cpp | 50 +++++++------- layout/base/nsPresShell.cpp | 66 +++++++----------- layout/generic/nsBlockFrame.cpp | 39 ++++------- layout/generic/nsContainerFrame.cpp | 91 ++++++++++--------------- layout/generic/nsFrame.cpp | 62 +++++++---------- layout/generic/nsGfxScrollFrame.cpp | 28 +++----- layout/generic/nsSubDocumentFrame.cpp | 15 ++-- layout/printing/nsPrintEngine.cpp | 17 +++-- layout/printing/nsPrintEngine.h | 7 +- layout/tables/nsTableFrame.cpp | 1 + layout/xul/base/src/nsPopupSetFrame.cpp | 47 +++++-------- 14 files changed, 226 insertions(+), 331 deletions(-) diff --git a/layout/base/FrameLayerBuilder.cpp b/layout/base/FrameLayerBuilder.cpp index 33001895179..d3cf9a7f9bf 100644 --- a/layout/base/FrameLayerBuilder.cpp +++ b/layout/base/FrameLayerBuilder.cpp @@ -1903,25 +1903,27 @@ InternalInvalidateThebesLayersInSubtree(nsIFrame* aFrame) foundContainerLayer = PR_TRUE; } - PRInt32 listIndex = 0; - nsIAtom* childList = nsnull; - do { - nsIFrame* child = aFrame->GetFirstChild(childList); - if (!child && !childList) { - nsSubDocumentFrame* subdocumentFrame = do_QueryFrame(aFrame); + nsIFrame* frame = aFrame; + while (frame) { + nsIFrame::ChildListIterator lists(frame); + for (; !lists.IsDone(); lists.Next()) { + nsFrameList::Enumerator childFrames(lists.CurrentList()); + for (; !childFrames.AtEnd(); childFrames.Next()) { + if (InternalInvalidateThebesLayersInSubtree(childFrames.get())) { + foundContainerLayer = PR_TRUE; + } + } + } + if (frame == aFrame && !frame->GetFirstPrincipalChild()) { + nsSubDocumentFrame* subdocumentFrame = do_QueryFrame(frame); if (subdocumentFrame) { // Descend into the subdocument - child = subdocumentFrame->GetSubdocumentRootFrame(); + frame = subdocumentFrame->GetSubdocumentRootFrame(); + continue; } } - while (child) { - if (InternalInvalidateThebesLayersInSubtree(child)) { - foundContainerLayer = PR_TRUE; - } - child = child->GetNextSibling(); - } - childList = aFrame->GetAdditionalChildListName(listIndex++); - } while (childList); + break; + } if (!foundContainerLayer) { aFrame->RemoveStateBits(NS_FRAME_HAS_CONTAINER_LAYER_DESCENDANT); diff --git a/layout/base/nsCSSFrameConstructor.cpp b/layout/base/nsCSSFrameConstructor.cpp index ec3607ffeda..283e6340159 100644 --- a/layout/base/nsCSSFrameConstructor.cpp +++ b/layout/base/nsCSSFrameConstructor.cpp @@ -7595,13 +7595,11 @@ UpdateViewsForTree(nsIFrame* aFrame, nsIViewManager* aViewManager, } } - // now do children of frame - PRInt32 listIndex = 0; - nsIAtom* childList = nsnull; - - do { - nsIFrame* child = aFrame->GetFirstChild(childList); - while (child) { + nsIFrame::ChildListIterator lists(aFrame); + for (; !lists.IsDone(); lists.Next()) { + nsFrameList::Enumerator childFrames(lists.CurrentList()); + for (; !childFrames.AtEnd(); childFrames.Next()) { + nsIFrame* child = childFrames.get(); if (!(child->GetStateBits() & NS_FRAME_OUT_OF_FLOW)) { // only do frames that don't have placeholders if (nsGkAtoms::placeholderFrame == child->GetType()) { @@ -7612,7 +7610,7 @@ UpdateViewsForTree(nsIFrame* aFrame, nsIViewManager* aViewManager, DoApplyRenderingChangeToTree(outOfFlowFrame, aViewManager, aFrameManager, aChange); } while ((outOfFlowFrame = outOfFlowFrame->GetNextContinuation())); - } else if (childList == nsGkAtoms::popupList) { + } else if (lists.CurrentID() == nsIFrame::kPopupList) { DoApplyRenderingChangeToTree(child, aViewManager, aFrameManager, aChange); } else { // regular frame @@ -7624,10 +7622,8 @@ UpdateViewsForTree(nsIFrame* aFrame, nsIViewManager* aViewManager, UpdateViewsForTree(child, aViewManager, aFrameManager, aChange); } } - child = child->GetNextSibling(); } - childList = aFrame->GetAdditionalChildListName(listIndex++); - } while (childList); + } } static void diff --git a/layout/base/nsFrameManager.cpp b/layout/base/nsFrameManager.cpp index 1d2c0b5a857..c930b8348aa 100644 --- a/layout/base/nsFrameManager.cpp +++ b/layout/base/nsFrameManager.cpp @@ -649,13 +649,11 @@ VerifyStyleTree(nsPresContext* aPresContext, nsIFrame* aFrame, nsStyleContext* context = aFrame->GetStyleContext(); VerifyContextParent(aPresContext, aFrame, context, nsnull); - PRInt32 listIndex = 0; - nsIAtom* childList = nsnull; - nsIFrame* child; - - do { - child = aFrame->GetFirstChild(childList); - while (child) { + nsIFrame::ChildListIterator lists(aFrame); + for (; !lists.IsDone(); lists.Next()) { + nsFrameList::Enumerator childFrames(lists.CurrentList()); + for (; !childFrames.AtEnd(); childFrames.Next()) { + nsIFrame* child = childFrames.get(); if (!(child->GetStateBits() & NS_FRAME_OUT_OF_FLOW) || (child->GetStateBits() & NS_FRAME_IS_OVERFLOW_CONTAINER)) { // only do frames that don't have placeholders @@ -676,11 +674,8 @@ VerifyStyleTree(nsPresContext* aPresContext, nsIFrame* aFrame, VerifyStyleTree(aPresContext, child, nsnull); } } - child = child->GetNextSibling(); } - - childList = aFrame->GetAdditionalChildListName(listIndex++); - } while (childList); + } // do additional contexts PRInt32 contextIndex = -1; @@ -908,15 +903,13 @@ nsFrameManager::ReparentStyleContext(nsIFrame* aFrame) NS_ASSERTION(!(styleChange & nsChangeHint_ReconstructFrame), "Our frame tree is likely to be bogus!"); - PRInt32 listIndex = 0; - nsIAtom* childList = nsnull; - nsIFrame* child; - aFrame->SetStyleContext(newContext); - do { - child = aFrame->GetFirstChild(childList); - while (child) { + nsIFrame::ChildListIterator lists(aFrame); + for (; !lists.IsDone(); lists.Next()) { + nsFrameList::Enumerator childFrames(lists.CurrentList()); + for (; !childFrames.AtEnd(); childFrames.Next()) { + nsIFrame* child = childFrames.get(); // only do frames that don't have placeholders if ((!(child->GetStateBits() & NS_FRAME_OUT_OF_FLOW) || (child->GetStateBits() & NS_FRAME_IS_OVERFLOW_CONTAINER)) && @@ -931,15 +924,10 @@ nsFrameManager::ReparentStyleContext(nsIFrame* aFrame) "Out of flow provider?"); } #endif - ReparentStyleContext(child); } - - child = child->GetNextSibling(); } - - childList = aFrame->GetAdditionalChildListName(listIndex++); - } while (childList); + } // If this frame is part of an IB split, then the style context of // the next part of the split might be a child of our style context. @@ -1526,12 +1514,11 @@ nsFrameManager::ReResolveStyleContext(nsPresContext *aPresContext, // style contexts that we're just going to throw away anyway. - dwh // now do children - PRInt32 listIndex = 0; - nsIAtom* childList = nsnull; - - do { - nsIFrame* child = aFrame->GetFirstChild(childList); - while (child) { + nsIFrame::ChildListIterator lists(aFrame); + for (; !lists.IsDone(); lists.Next()) { + nsFrameList::Enumerator childFrames(lists.CurrentList()); + for (; !childFrames.AtEnd(); childFrames.Next()) { + nsIFrame* child = childFrames.get(); if (!(child->GetStateBits() & NS_FRAME_OUT_OF_FLOW) || (child->GetStateBits() & NS_FRAME_IS_OVERFLOW_CONTAINER)) { // only do frames that don't have placeholders @@ -1592,11 +1579,8 @@ nsFrameManager::ReResolveStyleContext(nsPresContext *aPresContext, } } } - child = child->GetNextSibling(); } - - childList = aFrame->GetAdditionalChildListName(listIndex++); - } while (childList); + } // XXX need to do overflow frames??? #ifdef ACCESSIBILITY @@ -1754,17 +1738,13 @@ nsFrameManager::CaptureFrameState(nsIFrame* aFrame, CaptureFrameStateFor(aFrame, aState); // Now capture state recursively for the frame hierarchy rooted at aFrame - nsIAtom* childListName = nsnull; - PRInt32 childListIndex = 0; - do { - nsIFrame* childFrame = aFrame->GetFirstChild(childListName); - while (childFrame) { - CaptureFrameState(childFrame, aState); - // Get the next sibling child frame - childFrame = childFrame->GetNextSibling(); + nsIFrame::ChildListIterator lists(aFrame); + for (; !lists.IsDone(); lists.Next()) { + nsFrameList::Enumerator childFrames(lists.CurrentList()); + for (; !childFrames.AtEnd(); childFrames.Next()) { + CaptureFrameState(childFrames.get(), aState); } - childListName = aFrame->GetAdditionalChildListName(childListIndex++); - } while (childListName); + } } // Restore state for a given frame. @@ -1827,17 +1807,13 @@ nsFrameManager::RestoreFrameState(nsIFrame* aFrame, RestoreFrameStateFor(aFrame, aState); // Now restore state recursively for the frame hierarchy rooted at aFrame - nsIAtom* childListName = nsnull; - PRInt32 childListIndex = 0; - do { - nsIFrame* childFrame = aFrame->GetFirstChild(childListName); - while (childFrame) { - RestoreFrameState(childFrame, aState); - // Get the next sibling child frame - childFrame = childFrame->GetNextSibling(); + nsIFrame::ChildListIterator lists(aFrame); + for (; !lists.IsDone(); lists.Next()) { + nsFrameList::Enumerator childFrames(lists.CurrentList()); + for (; !childFrames.AtEnd(); childFrames.Next()) { + RestoreFrameState(childFrames.get(), aState); } - childListName = aFrame->GetAdditionalChildListName(childListIndex++); - } while (childListName); + } } //---------------------------------------------------------------------- diff --git a/layout/base/nsLayoutUtils.cpp b/layout/base/nsLayoutUtils.cpp index d1610b2f34c..faa7c888195 100644 --- a/layout/base/nsLayoutUtils.cpp +++ b/layout/base/nsLayoutUtils.cpp @@ -3179,31 +3179,28 @@ nsLayoutUtils::CalculateContentBottom(nsIFrame* aFrame) // We want scrollable overflow rather than visual because this // calculation is intended to affect layout. if (aFrame->GetScrollableOverflowRect().height > contentBottom) { + nsIFrame::ChildListIDs skip(nsIFrame::kOverflowList | + nsIFrame::kExcessOverflowContainersList | + nsIFrame::kOverflowOutOfFlowList); nsBlockFrame* blockFrame = GetAsBlock(aFrame); - nsIAtom* childList = nsnull; - PRIntn nextListID = 0; - do { - if (childList == nsnull && blockFrame) { - contentBottom = NS_MAX(contentBottom, CalculateBlockContentBottom(blockFrame)); - } - else if (childList != nsGkAtoms::overflowList && - childList != nsGkAtoms::excessOverflowContainersList && - childList != nsGkAtoms::overflowOutOfFlowList) - { - for (nsIFrame* child = aFrame->GetFirstChild(childList); - child; child = child->GetNextSibling()) - { + if (blockFrame) { + contentBottom = + NS_MAX(contentBottom, CalculateBlockContentBottom(blockFrame)); + skip |= nsIFrame::kPrincipalList; + } + nsIFrame::ChildListIterator lists(aFrame); + for (; !lists.IsDone(); lists.Next()) { + if (!skip.Contains(lists.CurrentID())) { + nsFrameList::Enumerator childFrames(lists.CurrentList()); + for (; !childFrames.AtEnd(); childFrames.Next()) { + nsIFrame* child = childFrames.get(); nscoord offset = child->GetRect().y - child->GetRelativeOffset().y; contentBottom = NS_MAX(contentBottom, CalculateContentBottom(child) + offset); } } - - childList = aFrame->GetAdditionalChildListName(nextListID); - nextListID++; - } while (childList); + } } - return contentBottom; } @@ -4214,15 +4211,13 @@ nsLayoutUtils::AssertTreeOnlyEmptyNextInFlows(nsIFrame *aSubtreeRoot) NS_ASSERTION(start == end || IsInLetterFrame(aSubtreeRoot), "frame tree not empty, but caller reported complete status"); - PRInt32 listIndex = 0; - nsIAtom* childList = nsnull; - do { - for (nsIFrame* child = aSubtreeRoot->GetFirstChild(childList); child; - child = child->GetNextSibling()) { - nsLayoutUtils::AssertTreeOnlyEmptyNextInFlows(child); + nsIFrame::ChildListIterator lists(aSubtreeRoot); + for (; !lists.IsDone(); lists.Next()) { + nsFrameList::Enumerator childFrames(lists.CurrentList()); + for (; !childFrames.AtEnd(); childFrames.Next()) { + nsLayoutUtils::AssertTreeOnlyEmptyNextInFlows(childFrames.get()); } - childList = aSubtreeRoot->GetAdditionalChildListName(listIndex++); - } while (childList); + } } #endif @@ -4239,7 +4234,8 @@ nsLayoutUtils::GetFontFacesForFrames(nsIFrame* aFrame, } while (aFrame) { - nsIAtom* childLists[] = { nsnull, nsGkAtoms::popupList }; + nsIFrame::ChildListID childLists[] = { nsIFrame::kPrincipalList, + nsIFrame::kPopupList }; for (int i = 0; i < NS_ARRAY_LENGTH(childLists); ++i) { nsFrameList children(aFrame->GetChildList(childLists[i])); for (nsFrameList::Enumerator e(children); !e.AtEnd(); e.Next()) { diff --git a/layout/base/nsPresShell.cpp b/layout/base/nsPresShell.cpp index 4d22b44f078..b702004d500 100644 --- a/layout/base/nsPresShell.cpp +++ b/layout/base/nsPresShell.cpp @@ -3599,16 +3599,15 @@ PresShell::FrameNeedsReflow(nsIFrame *aFrame, IntrinsicDirty aIntrinsicDirty, } } - PRInt32 childListIndex = 0; - nsIAtom *childListName; - do { - childListName = f->GetAdditionalChildListName(childListIndex++); - for (nsIFrame *kid = f->GetFirstChild(childListName); kid; - kid = kid->GetNextSibling()) { + nsIFrame::ChildListIterator lists(f); + for (; !lists.IsDone(); lists.Next()) { + nsFrameList::Enumerator childFrames(lists.CurrentList()); + for (; !childFrames.AtEnd(); childFrames.Next()) { + nsIFrame* kid = childFrames.get(); kid->MarkIntrinsicWidthsDirty(); stack.AppendElement(kid); } - } while (childListName); + } } while (stack.Length() != 0); } @@ -8139,12 +8138,11 @@ WalkFramesThroughPlaceholders(nsPresContext *aPresContext, nsIFrame *aFrame, if (!walkChildren) return; - PRInt32 listIndex = 0; - nsIAtom* childList = nsnull; - - do { - nsIFrame *child = aFrame->GetFirstChild(childList); - while (child) { + nsIFrame::ChildListIterator lists(aFrame); + for (; !lists.IsDone(); lists.Next()) { + nsFrameList::Enumerator childFrames(lists.CurrentList()); + for (; !childFrames.AtEnd(); childFrames.Next()) { + nsIFrame* child = childFrames.get(); if (!(child->GetStateBits() & NS_FRAME_OUT_OF_FLOW)) { // only do frames that are in flow, and recur through the // out-of-flows of placeholders. @@ -8152,11 +8150,8 @@ WalkFramesThroughPlaceholders(nsPresContext *aPresContext, nsIFrame *aFrame, nsPlaceholderFrame::GetRealFrameFor(child), aFunc, aClosure); } - child = child->GetNextSibling(); } - - childList = aFrame->GetAdditionalChildListName(listIndex++); - } while (childList); + } } #endif @@ -8347,11 +8342,11 @@ CompareTrees(nsPresContext* aFirstPresContext, nsIFrame* aFirstFrame, //if (aFirstFrame->GetType() == nsGkAtoms::scrollbarFrame) // return PR_TRUE; PRBool ok = PR_TRUE; - nsIAtom* listName = nsnull; - PRInt32 listIndex = 0; + nsIFrame::ChildListIterator lists1(aFirstFrame); + nsIFrame::ChildListIterator lists2(aSecondFrame); do { - const nsFrameList& kids1 = aFirstFrame->GetChildList(listName); - const nsFrameList& kids2 = aSecondFrame->GetChildList(listName); + const nsFrameList& kids1 = !lists1.IsDone() ? lists1.CurrentList() : nsFrameList(); + const nsFrameList& kids2 = !lists2.IsDone() ? lists2.CurrentList() : nsFrameList(); PRInt32 l1 = kids1.GetLength(); PRInt32 l2 = kids2.GetLength();; if (l1 != l2) { @@ -8437,34 +8432,21 @@ CompareTrees(nsPresContext* aFirstPresContext, nsIFrame* aFirstFrame, break; } - nsIAtom* listName1 = aFirstFrame->GetAdditionalChildListName(listIndex); - nsIAtom* listName2 = aSecondFrame->GetAdditionalChildListName(listIndex); - listIndex++; - if (listName1 != listName2) { + lists1.Next(); + lists2.Next(); + if (lists1.IsDone() != lists2.IsDone() || + (!lists1.IsDone() && lists1.CurrentID() != lists2.CurrentID())) { if (0 == (VERIFY_REFLOW_ALL & gVerifyReflowFlags)) { ok = PR_FALSE; } LogVerifyMessage(kids1.FirstChild(), kids2.FirstChild(), "child list names are not matched: "); - nsAutoString tmp; - if (nsnull != listName1) { - listName1->ToString(tmp); - fputs(NS_LossyConvertUTF16toASCII(tmp).get(), stdout); - } - else - fputs("(null)", stdout); - printf(" != "); - if (nsnull != listName2) { - listName2->ToString(tmp); - fputs(NS_LossyConvertUTF16toASCII(tmp).get(), stdout); - } - else - fputs("(null)", stdout); - printf("\n"); + fprintf(stdout, "%s != %s\n", + !lists1.IsDone() ? mozilla::layout::ChildListName(lists1.CurrentID()) : "(null)", + !lists2.IsDone() ? mozilla::layout::ChildListName(lists2.CurrentID()) : "(null)"); break; } - listName = listName1; - } while (ok && (listName != nsnull)); + } while (ok && !lists1.IsDone()); return ok; } diff --git a/layout/generic/nsBlockFrame.cpp b/layout/generic/nsBlockFrame.cpp index 3fe49aea3cf..c7ec2f57f0f 100644 --- a/layout/generic/nsBlockFrame.cpp +++ b/layout/generic/nsBlockFrame.cpp @@ -467,32 +467,23 @@ nsBlockFrame::List(FILE* out, PRInt32 aIndent) const fputs(">\n", out); } - nsIAtom* listName = nsnull; - PRInt32 listIndex = 0; - for (;;) { - listName = GetAdditionalChildListName(listIndex++); - if (nsGkAtoms::overflowList == listName) { - continue; // skip the overflow list - we printed the overflow lines above + // skip the principal list - we printed the lines above + // skip the overflow list - we printed the overflow lines above + ChildListIterator lists(this); + ChildListIDs skip(kPrincipalList | kOverflowList); + for (; !lists.IsDone(); lists.Next()) { + if (skip.Contains(lists.CurrentID())) { + continue; } - if (nsnull == listName) { - break; - } - nsIFrame* kid = GetFirstChild(listName); - if (kid) { - IndentBy(out, aIndent); - nsAutoString tmp; - if (nsnull != listName) { - listName->ToString(tmp); - fputs(NS_LossyConvertUTF16toASCII(tmp).get(), out); - } - fputs("<\n", out); - while (kid) { - kid->List(out, aIndent + 1); - kid = kid->GetNextSibling(); - } - IndentBy(out, aIndent); - fputs(">\n", out); + IndentBy(out, aIndent); + fprintf(out, "%s<\n", mozilla::layout::ChildListName(lists.CurrentID())); + nsFrameList::Enumerator childFrames(lists.CurrentList()); + for (; !childFrames.AtEnd(); childFrames.Next()) { + nsIFrame* kid = childFrames.get(); + kid->List(out, aIndent + 1); } + IndentBy(out, aIndent); + fputs(">\n", out); } aIndent--; diff --git a/layout/generic/nsContainerFrame.cpp b/layout/generic/nsContainerFrame.cpp index a290356e9dc..2653cfe9653 100644 --- a/layout/generic/nsContainerFrame.cpp +++ b/layout/generic/nsContainerFrame.cpp @@ -440,20 +440,16 @@ ReparentFrameViewTo(nsIFrame* aFrame, nsIView* insertBefore = nsLayoutUtils::FindSiblingViewFor(aNewParentView, aFrame); aViewManager->InsertChild(aNewParentView, view, insertBefore, insertBefore != nsnull); } else { - PRInt32 listIndex = 0; - nsIAtom* listName = nsnull; - // This loop iterates through every child list name, and also - // executes once with listName == nsnull. - do { + nsIFrame::ChildListIterator lists(aFrame); + for (; !lists.IsDone(); lists.Next()) { // Iterate the child frames, and check each child frame to see if it has // a view - nsIFrame* childFrame = aFrame->GetFirstChild(listName); - for (; childFrame; childFrame = childFrame->GetNextSibling()) { - ReparentFrameViewTo(childFrame, aViewManager, + nsFrameList::Enumerator childFrames(lists.CurrentList()); + for (; !childFrames.AtEnd(); childFrames.Next()) { + ReparentFrameViewTo(childFrames.get(), aViewManager, aNewParentView, aOldParentView); } - listName = aFrame->GetAdditionalChildListName(listIndex++); - } while (listName); + } } return NS_OK; @@ -991,32 +987,27 @@ nsContainerFrame::PositionChildViews(nsIFrame* aFrame) return; } - nsIAtom* childListName = nsnull; - PRInt32 childListIndex = 0; - - do { - // Recursively walk aFrame's child frames - nsIFrame* childFrame = aFrame->GetFirstChild(childListName); - while (childFrame) { + // Recursively walk aFrame's child frames. + // Process the additional child lists, but skip the popup list as the + // view for popups is managed by the parent. Currently only nsMenuFrame + // has a popupList and during layout will call nsMenuPopupFrame::AdjustView. + ChildListIterator lists(aFrame); + for (; !lists.IsDone(); lists.Next()) { + if (lists.CurrentID() == kPopupList) { + continue; + } + nsFrameList::Enumerator childFrames(lists.CurrentList()); + for (; !childFrames.AtEnd(); childFrames.Next()) { // Position the frame's view (if it has one) otherwise recursively // process its children + nsIFrame* childFrame = childFrames.get(); if (childFrame->HasView()) { PositionFrameView(childFrame); } else { PositionChildViews(childFrame); } - - // Get the next sibling child frame - childFrame = childFrame->GetNextSibling(); } - - // also process the additional child lists, but skip the popup list as the - // view for popups is managed by the parent. Currently only nsMenuFrame - // has a popupList and during layout will call nsMenuPopupFrame::AdjustView. - do { - childListName = aFrame->GetAdditionalChildListName(childListIndex++); - } while (childListName == nsGkAtoms::popupList); - } while (childListName); + } } /** @@ -1791,35 +1782,27 @@ nsContainerFrame::List(FILE* out, PRInt32 aIndent) const } // Output the children - nsIAtom* listName = nsnull; - PRInt32 listIndex = 0; PRBool outputOneList = PR_FALSE; - do { - nsIFrame* kid = GetFirstChild(listName); - if (nsnull != kid) { - if (outputOneList) { - IndentBy(out, aIndent); - } - outputOneList = PR_TRUE; - nsAutoString tmp; - if (nsnull != listName) { - listName->ToString(tmp); - fputs(NS_LossyConvertUTF16toASCII(tmp).get(), out); - } - fputs("<\n", out); - while (nsnull != kid) { - // Verify the child frame's parent frame pointer is correct - NS_ASSERTION(kid->GetParent() == (nsIFrame*)this, "bad parent frame pointer"); - - // Have the child frame list - kid->List(out, aIndent + 1); - kid = kid->GetNextSibling(); - } + ChildListIterator lists(this); + for (; !lists.IsDone(); lists.Next()) { + if (outputOneList) { IndentBy(out, aIndent); - fputs(">\n", out); } - listName = GetAdditionalChildListName(listIndex++); - } while(nsnull != listName); + outputOneList = PR_TRUE; + fputs(mozilla::layout::ChildListName(lists.CurrentID()), out); + fputs("<\n", out); + nsFrameList::Enumerator childFrames(lists.CurrentList()); + for (; !childFrames.AtEnd(); childFrames.Next()) { + nsIFrame* kid = childFrames.get(); + // Verify the child frame's parent frame pointer is correct + NS_ASSERTION(kid->GetParent() == this, "bad parent frame pointer"); + + // Have the child frame list + kid->List(out, aIndent + 1); + } + IndentBy(out, aIndent); + fputs(">\n", out); + } if (!outputOneList) { fputs("<>\n", out); diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index 528df05bb3d..3dfbf1f091e 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -3481,16 +3481,14 @@ nsFrame::ComputeSimpleTightBounds(gfxContext* aContext) const } nsRect r(0, 0, 0, 0); - PRInt32 listIndex = 0; - nsIAtom* childList = nsnull; - do { - nsIFrame* child = GetFirstChild(childList); - while (child) { - r.UnionRect(r, child->ComputeTightBounds(aContext) + child->GetPosition()); - child = child->GetNextSibling(); + ChildListIterator lists(this); + for (; !lists.IsDone(); lists.Next()) { + nsFrameList::Enumerator childFrames(lists.CurrentList()); + for (; !childFrames.AtEnd(); childFrames.Next()) { + nsIFrame* child = childFrames.get(); + r.UnionRect(r, child->ComputeTightBounds(aContext) + child->GetPosition()); } - childList = GetAdditionalChildListName(listIndex++); - } while (childList); + } return r; } @@ -4942,35 +4940,25 @@ nsFrame::DumpBaseRegressionData(nsPresContext* aPresContext, FILE* out, PRInt32 mRect.x, mRect.y, mRect.width, mRect.height); // Now dump all of the children on all of the child lists - nsIFrame* kid; - nsIAtom* list = nsnull; - PRInt32 listIndex = 0; - do { - kid = GetFirstChild(list); - if (kid) { - IndentBy(out, aIndent); - if (nsnull != list) { - nsAutoString listName; - list->ToString(listName); - fprintf(out, "\n"); - } - else { - fprintf(out, "\n"); - } - aIndent++; - while (kid) { - kid->DumpRegressionData(aPresContext, out, aIndent); - kid = kid->GetNextSibling(); - } - aIndent--; - IndentBy(out, aIndent); - fprintf(out, "\n"); + ChildListIterator lists(this); + for (; !lists.IsDone(); lists.Next()) { + IndentBy(out, aIndent); + if (lists.CurrentID() != kPrincipalList) { + fprintf(out, "\n", mozilla::layout::ChildListName(lists.CurrentID())); } - list = GetAdditionalChildListName(listIndex++); - } while (nsnull != list); + else { + fprintf(out, "\n"); + } + aIndent++; + nsFrameList::Enumerator childFrames(lists.CurrentList()); + for (; !childFrames.AtEnd(); childFrames.Next()) { + nsIFrame* kid = childFrames.get(); + kid->DumpRegressionData(aPresContext, out, aIndent); + } + aIndent--; + IndentBy(out, aIndent); + fprintf(out, "\n"); + } } #endif diff --git a/layout/generic/nsGfxScrollFrame.cpp b/layout/generic/nsGfxScrollFrame.cpp index f293ad6e0f2..4d7fba1735a 100644 --- a/layout/generic/nsGfxScrollFrame.cpp +++ b/layout/generic/nsGfxScrollFrame.cpp @@ -1604,24 +1604,18 @@ static void AdjustViews(nsIFrame* aFrame) return; } - nsIAtom* childListName = nsnull; - PRInt32 childListIndex = 0; - do { - // Recursively walk aFrame's child frames - nsIFrame* childFrame = aFrame->GetFirstChild(childListName); - while (childFrame) { - AdjustViews(childFrame); - - // Get the next sibling child frame - childFrame = childFrame->GetNextSibling(); + // Call AdjustViews recursively for all child frames except the popup list as + // the views for popups are not scrolled. + nsIFrame::ChildListIterator lists(aFrame); + for (; !lists.IsDone(); lists.Next()) { + if (lists.CurrentID() == nsIFrame::kPopupList) { + continue; } - - // also process the additional child lists, but skip the popup list as the - // views for popups are not scrolled. - do { - childListName = aFrame->GetAdditionalChildListName(childListIndex++); - } while (childListName == nsGkAtoms::popupList); - } while (childListName); + nsFrameList::Enumerator childFrames(lists.CurrentList()); + for (; !childFrames.AtEnd(); childFrames.Next()) { + AdjustViews(childFrames.get()); + } + } } static PRBool diff --git a/layout/generic/nsSubDocumentFrame.cpp b/layout/generic/nsSubDocumentFrame.cpp index 2f1ae4ac864..bac09e9aa74 100644 --- a/layout/generic/nsSubDocumentFrame.cpp +++ b/layout/generic/nsSubDocumentFrame.cpp @@ -863,16 +863,13 @@ DestroyDisplayItemDataForFrames(nsIFrame* aFrame) { FrameLayerBuilder::DestroyDisplayItemDataFor(aFrame); - PRInt32 listIndex = 0; - nsIAtom* childList = nsnull; - do { - nsIFrame* child = aFrame->GetFirstChild(childList); - while (child) { - DestroyDisplayItemDataForFrames(child); - child = child->GetNextSibling(); + nsIFrame::ChildListIterator lists(aFrame); + for (; !lists.IsDone(); lists.Next()) { + nsFrameList::Enumerator childFrames(lists.CurrentList()); + for (; !childFrames.AtEnd(); childFrames.Next()) { + DestroyDisplayItemDataForFrames(childFrames.get()); } - childList = aFrame->GetAdditionalChildListName(listIndex++); - } while (childList); + } } static PRBool diff --git a/layout/printing/nsPrintEngine.cpp b/layout/printing/nsPrintEngine.cpp index 1edaae4bcde..3c3749a6ecd 100644 --- a/layout/printing/nsPrintEngine.cpp +++ b/layout/printing/nsPrintEngine.cpp @@ -2532,7 +2532,7 @@ nsPrintEngine::PrintPage(nsPrintObject* aPO, nsresult nsPrintEngine::FindSelectionBoundsWithList(nsPresContext* aPresContext, nsRenderingContext& aRC, - nsIAtom* aList, + nsFrameList::Enumerator& aChildFrames, nsIFrame * aParentFrame, nsRect& aRect, nsIFrame *& aStartFrame, @@ -2543,9 +2543,9 @@ nsPrintEngine::FindSelectionBoundsWithList(nsPresContext* aPresContext, NS_ASSERTION(aPresContext, "Pointer is null!"); NS_ASSERTION(aParentFrame, "Pointer is null!"); - nsIFrame* child = aParentFrame->GetFirstChild(aList); aRect += aParentFrame->GetPosition(); - while (child) { + for (; !aChildFrames.AtEnd(); aChildFrames.Next()) { + nsIFrame* child = aChildFrames.get(); // only leaf frames have this bit flipped // then check the hard way PRBool isSelected = (child->GetStateBits() & NS_FRAME_SELECTED_CONTENT) @@ -2587,13 +2587,12 @@ nsPrintEngine::FindSelectionBounds(nsPresContext* aPresContext, NS_ASSERTION(aParentFrame, "Pointer is null!"); // loop through named child lists - nsIAtom* childListName = nsnull; - PRInt32 childListIndex = 0; - do { - nsresult rv = FindSelectionBoundsWithList(aPresContext, aRC, childListName, aParentFrame, aRect, aStartFrame, aStartRect, aEndFrame, aEndRect); + nsIFrame::ChildListIterator lists(aParentFrame); + for (; !lists.IsDone(); lists.Next()) { + nsFrameList::Enumerator childFrames(lists.CurrentList()); + nsresult rv = FindSelectionBoundsWithList(aPresContext, aRC, childFrames, aParentFrame, aRect, aStartFrame, aStartRect, aEndFrame, aEndRect); NS_ENSURE_SUCCESS(rv, rv); - childListName = aParentFrame->GetAdditionalChildListName(childListIndex++); - } while (childListName); + } return NS_OK; } diff --git a/layout/printing/nsPrintEngine.h b/layout/printing/nsPrintEngine.h index 86fe19e3471..ee0032e56f6 100644 --- a/layout/printing/nsPrintEngine.h +++ b/layout/printing/nsPrintEngine.h @@ -41,6 +41,7 @@ #include "nsPrintObject.h" #include "nsPrintData.h" +#include "nsFrameList.h" // Interfaces #include "nsIDocument.h" @@ -239,7 +240,7 @@ protected: static nsresult FindSelectionBoundsWithList(nsPresContext* aPresContext, nsRenderingContext& aRC, - nsIAtom* aList, + nsFrameList::Enumerator& aChildFrames, nsIFrame * aParentFrame, nsRect& aRect, nsIFrame *& aStartFrame, @@ -257,8 +258,8 @@ protected: nsRect& aEndRect); static nsresult GetPageRangeForSelection(nsIPresShell * aPresShell, - nsPresContext* aPresContext, - nsRenderingContext& aRC, + nsPresContext* aPresContext, + nsRenderingContext& aRC, nsISelection* aSelection, nsIPageSequenceFrame* aPageSeqFrame, nsIFrame** aStartFrame, diff --git a/layout/tables/nsTableFrame.cpp b/layout/tables/nsTableFrame.cpp index 6b498c11944..811ebe5b554 100644 --- a/layout/tables/nsTableFrame.cpp +++ b/layout/tables/nsTableFrame.cpp @@ -1067,6 +1067,7 @@ nsTableFrame::InsertRowGroups(const nsFrameList::Slice& aRowGroups) ///////////////////////////////////////////////////////////////////////////// // Child frame enumeration +nsFrameList nsTableFrame::GetChildList(ChildListID aListID) const { if (aListID == kColGroupList) { diff --git a/layout/xul/base/src/nsPopupSetFrame.cpp b/layout/xul/base/src/nsPopupSetFrame.cpp index 82e7aa99394..a1483e809e1 100644 --- a/layout/xul/base/src/nsPopupSetFrame.cpp +++ b/layout/xul/base/src/nsPopupSetFrame.cpp @@ -231,35 +231,26 @@ nsPopupSetFrame::List(FILE* out, PRInt32 aIndent) const } // Output the children - nsIAtom* listName = nsnull; - PRInt32 listIndex = 0; PRBool outputOneList = PR_FALSE; - do { - nsIFrame* kid = GetFirstChild(listName); - if (nsnull != kid) { - if (outputOneList) { - IndentBy(out, aIndent); - } - outputOneList = PR_TRUE; - nsAutoString tmp; - if (nsnull != listName) { - listName->ToString(tmp); - fputs(NS_LossyConvertUTF16toASCII(tmp).get(), out); - } - fputs("<\n", out); - while (nsnull != kid) { - // Verify the child frame's parent frame pointer is correct - NS_ASSERTION(kid->GetParent() == (nsIFrame*)this, "bad parent frame pointer"); - - // Have the child frame list - kid->List(out, aIndent + 1); - kid = kid->GetNextSibling(); - } + ChildListIterator lists(this); + for (; !lists.IsDone(); lists.Next()) { + if (outputOneList) { IndentBy(out, aIndent); - fputs(">\n", out); } - listName = GetAdditionalChildListName(listIndex++); - } while(nsnull != listName); + outputOneList = PR_TRUE; + fprintf(out, "%s<\n", mozilla::layout::ChildListName(lists.CurrentID())); + nsFrameList::Enumerator childFrames(lists.CurrentList()); + for (; !childFrames.AtEnd(); childFrames.Next()) { + nsIFrame* kid = childFrames.get(); + // Verify the child frame's parent frame pointer is correct + NS_ASSERTION(kid->GetParent() == this, "bad parent frame pointer"); + + // Have the child frame list + kid->List(out, aIndent + 1); + } + IndentBy(out, aIndent); + fputs(">\n", out); + } // XXXmats the above is copy-pasted from nsContainerFrame::List which is lame, // clean this up after bug 399111 is implemented. @@ -268,9 +259,7 @@ nsPopupSetFrame::List(FILE* out, PRInt32 aIndent) const fputs("<\n", out); ++aIndent; IndentBy(out, aIndent); - nsAutoString tmp; - nsGkAtoms::popupList->ToString(tmp); - fputs(NS_LossyConvertUTF16toASCII(tmp).get(), out); + fputs(mozilla::layout::ChildListName(kPopupList), out); fputs(" for ", out); ListTag(out); fputs(" <\n", out);