From f935d48612e7d4c5b5ff3836772a375e363031a8 Mon Sep 17 00:00:00 2001 From: Robert O'Callahan Date: Tue, 19 Mar 2013 09:08:28 -0400 Subject: [PATCH] Bug 846901 - Skip nsDisplayWrapList construction if there's only one item to wrap and it already has the right frame. r=mattwoodrow --- layout/generic/nsFrame.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index 5d887e755f4..196333b4745 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -2054,6 +2054,18 @@ IsRootScrollFrameActive(nsIPresShell* aPresShell) return sf && sf->IsScrollingActive(); } +static nsDisplayItem* +WrapInWrapList(nsDisplayListBuilder* aBuilder, + nsIFrame* aFrame, nsDisplayList* aList) +{ + nsDisplayItem* item = aList->GetBottom(); + if (!item || item->GetAbove() || item->GetUnderlyingFrame() != aFrame) { + return new (aBuilder) nsDisplayWrapList(aBuilder, aFrame, aList); + } + aList->RemoveBottom(); + return item; +} + void nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder, nsIFrame* aChild, @@ -2288,7 +2300,7 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder, if (buildFixedPositionItem) { item = new (aBuilder) nsDisplayFixedPosition(aBuilder, child, child, &list); } else { - item = new (aBuilder) nsDisplayWrapList(aBuilder, child, &list); + item = WrapInWrapList(aBuilder, child, &list); } if (isSVG) { aLists.Content()->AppendNewToTop(item); @@ -2311,8 +2323,7 @@ nsIFrame::BuildDisplayListForChild(nsDisplayListBuilder* aBuilder, } } else if (!isSVG && disp->IsFloating(child)) { if (!list.IsEmpty()) { - aLists.Floats()->AppendNewToTop(new (aBuilder) - nsDisplayWrapList(aBuilder, child, &list)); + aLists.Floats()->AppendNewToTop(WrapInWrapList(aBuilder, child, &list)); } } else { aLists.Content()->AppendToTop(&list);