Bug 559241. Reflow non-dirty overflow container children if we're supposed to reflow all kids. r=dbaron
authorRobert O'Callahan <robert@ocallahan.org>
Wed, 19 May 2010 15:04:33 +1200
changeset 42437 a55765a1c2f576b5c73f8cd25b88d3a717419e76
parent 42436 eaea9e3806a3f428ce8c687eb1ef1ad6cd299ffb
child 42438 e530c2b50c0a9588233dadb85278cad49cf1e100
push id13342
push userrocallahan@mozilla.com
push dateWed, 19 May 2010 03:06:53 +0000
treeherdermozilla-central@f2c78e370b43 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersdbaron
bugs559241
milestone1.9.3a5pre
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
Bug 559241. Reflow non-dirty overflow container children if we're supposed to reflow all kids. r=dbaron
layout/generic/nsColumnSetFrame.cpp
layout/generic/nsContainerFrame.cpp
--- a/layout/generic/nsColumnSetFrame.cpp
+++ b/layout/generic/nsColumnSetFrame.cpp
@@ -1066,17 +1066,17 @@ nsColumnSetFrame::Reflow(nsPresContext* 
   
   CheckInvalidateSizeChange(aDesiredSize);
 
   FinishAndStoreOverflow(&aDesiredSize);
   aDesiredSize.mCarriedOutBottomMargin = carriedOutBottomMargin;
 
   NS_FRAME_SET_TRUNCATION(aStatus, aReflowState, aDesiredSize);
 
-  NS_ASSERTION(NS_FRAME_IS_COMPLETE(aStatus) ||
+  NS_ASSERTION(NS_FRAME_IS_FULLY_COMPLETE(aStatus) ||
                aReflowState.availableHeight != NS_UNCONSTRAINEDSIZE,
                "Column set should be complete if the available height is unconstrained");
 
   return NS_OK;
 }
 
 NS_IMETHODIMP
 nsColumnSetFrame::BuildDisplayList(nsDisplayListBuilder*   aBuilder,
--- a/layout/generic/nsContainerFrame.cpp
+++ b/layout/generic/nsContainerFrame.cpp
@@ -894,24 +894,28 @@ nsContainerFrame::ReflowOverflowContaine
       }
     }
   }
 
   if (!overflowContainers)
     return NS_OK; // nothing to reflow
 
   nsOverflowContinuationTracker tracker(aPresContext, this, PR_FALSE, PR_FALSE);
+  PRBool shouldReflowAllKids = aReflowState.ShouldReflowAllKids();
+
   for (nsIFrame* frame = overflowContainers->FirstChild(); frame;
        frame = frame->GetNextSibling()) {
     if (frame->GetPrevInFlow()->GetParent() != GetPrevInFlow()) {
       // frame's prevInFlow has moved, skip reflowing this frame;
       // it will get reflowed once it's been placed
       continue;
     }
-    if (NS_SUBTREE_DIRTY(frame)) {
+    // If the available vertical height has changed, we need to reflow
+    // even if the frame isn't dirty.
+    if (shouldReflowAllKids || NS_SUBTREE_DIRTY(frame)) {
       // Get prev-in-flow
       nsIFrame* prevInFlow = frame->GetPrevInFlow();
       NS_ASSERTION(prevInFlow,
                    "overflow container frame must have a prev-in-flow");
       NS_ASSERTION(frame->GetStateBits() & NS_FRAME_IS_OVERFLOW_CONTAINER,
                    "overflow container frame must have overflow container bit set");
       nsRect prevRect = prevInFlow->GetRect();