diff --git a/layout/html/base/src/nsScrollFrame.cpp b/layout/html/base/src/nsScrollFrame.cpp
index 10198c6ddc5..e5c894a334c 100644
--- a/layout/html/base/src/nsScrollFrame.cpp
+++ b/layout/html/base/src/nsScrollFrame.cpp
@@ -212,7 +212,6 @@ nsScrollFrame::CreateScrollingView()
return rv;
}
-//XXX incremental reflow pass through
NS_IMETHODIMP
nsScrollFrame::Reflow(nsIPresContext& aPresContext,
nsHTMLReflowMetrics& aDesiredSize,
@@ -224,17 +223,35 @@ nsScrollFrame::Reflow(nsIPresContext& aPresContext,
aReflowState.maxSize.width,
aReflowState.maxSize.height));
- // If it's out initial reflow then create a scrolling view
- if (eReflowReason_Initial == aReflowState.reason) {
+ nsIFrame* targetFrame;
+ nsIFrame* nextFrame;
+
+ // Special handling for the initial reflow and incremental reflow
+ switch (aReflowState.reason) {
+ case eReflowReason_Initial:
+ // Create the scrolling view and the scrolled view
CreateScrollingView();
+ break;
+
+ case eReflowReason_Incremental:
+#ifdef NS_DEBUG
+ // We should never be the target of the reflow command
+ aReflowState.reflowCommand->GetTarget(targetFrame);
+ NS_ASSERTION(targetFrame != this, "bad reflow command target-frame");
+#endif
+
+ // Get the next frame in the reflow chain, and verify that it's our
+ // child frame
+ aReflowState.reflowCommand->GetNext(nextFrame);
+ NS_ASSERTION(nextFrame == mFirstChild, "unexpected reflow command next-frame");
+ break;
}
+ // Calculate the amount of space needed for borders
const nsStyleSpacing* spacing = (const nsStyleSpacing*)
mStyleContext->GetStyleData(eStyleStruct_Spacing);
nsMargin border;
spacing->CalcBorderFor(this, border);
- nscoord lr = border.left + border.right;
- nscoord tb = border.top + border.bottom;
// Compute the scroll view frame's max size taking into account our
// borders
@@ -247,7 +264,7 @@ nsScrollFrame::Reflow(nsIPresContext& aPresContext,
else {
kidMaxSize.width = aReflowState.maxSize.width;
if (NS_UNCONSTRAINEDSIZE != kidMaxSize.width) {
- kidMaxSize.width -= lr;
+ kidMaxSize.width -= border.left + border.right;
}
}
if (aReflowState.HaveConstrainedHeight()) {
@@ -258,7 +275,7 @@ nsScrollFrame::Reflow(nsIPresContext& aPresContext,
else {
kidMaxSize.height = aReflowState.maxSize.height;
if (NS_UNCONSTRAINEDSIZE != kidMaxSize.height) {
- kidMaxSize.height -= tb;
+ kidMaxSize.height -= border.top + border.bottom;
}
}
@@ -301,15 +318,15 @@ nsScrollFrame::Reflow(nsIPresContext& aPresContext,
}
// Compute our desired size
- aDesiredSize.width = kidMaxSize.width + lr;
+ aDesiredSize.width = kidMaxSize.width + border.left + border.right;
if (NS_UNCONSTRAINEDSIZE == kidMaxSize.height) {
// Use the scroll view's desired height plus any borders
- aDesiredSize.height += tb;
+ aDesiredSize.height += border.top + border.bottom;
} else {
// XXX This isn't correct. If our height is fixed, then use the fixed height;
// otherwise use the MIN of the constrained height and the scroll view's height
// plus borders...
- aDesiredSize.height = kidMaxSize.height + tb;
+ aDesiredSize.height = kidMaxSize.height + border.top + border.bottom;
}
aDesiredSize.ascent = aDesiredSize.height;
aDesiredSize.descent = 0;