if ((nsIReflowCommand::FrameAppended == reflowType) || (nsIReflowCommand::FrameInserted == reflowType)) {
switch (reflowType) { case nsIReflowCommand::FrameAppended: case nsIReflowCommand::FrameInserted:
RootFrame::Reflow(nsIPresContext&          aPresContext,                  nsHTMLReflowMetrics&     aDesiredSize,                  const nsHTMLReflowState& aReflowState,                  nsReflowStatus&          aStatus){  NS_FRAME_TRACE_REFLOW_IN("RootFrame::Reflow");  NS_PRECONDITION(nsnull == aDesiredSize.maxElementSize, "unexpected request");  // Initialize OUT parameter  aStatus = NS_FRAME_COMPLETE;  PRBool  isChildInitialReflow = PR_FALSE;  // Check for an incremental reflow  if (eReflowReason_Incremental == aReflowState.reason) {    // See if we're the target frame    nsIFrame* targetFrame;    aReflowState.reflowCommand->GetTarget(targetFrame);    if (this == targetFrame) {      nsIReflowCommand::ReflowType  reflowType;      nsIFrame*                     childFrame;      // Get the reflow type      aReflowState.reflowCommand->GetType(reflowType);      if ((nsIReflowCommand::FrameAppended == reflowType) ||          (nsIReflowCommand::FrameInserted == reflowType)) {        NS_ASSERTION(mFrames.IsEmpty(), "only one child frame allowed");        // Insert the frame into the child list        aReflowState.reflowCommand->GetChildFrame(childFrame);        mFrames.SetFrames(childFrame);        // It's the child frame's initial reflow        isChildInitialReflow = PR_TRUE;      } else if (nsIReflowCommand::FrameRemoved == reflowType) {        nsIFrame* deletedFrame;        // Get the child frame we should delete        aReflowState.reflowCommand->GetChildFrame(deletedFrame);        NS_ASSERTION(deletedFrame == mFrames.FirstChild(), "not a child frame");        // Remove it from the child list        if (deletedFrame == mFrames.FirstChild()) {          // Damage the area occupied by the deleted frame          nsRect  damageRect;          deletedFrame->GetRect(damageRect);          Invalidate(damageRect, PR_FALSE);          mFrames.DeleteFrame(aPresContext, deletedFrame);        }      }    } else {      nsIFrame* nextFrame;      // Get the next frame in the reflow chain      aReflowState.reflowCommand->GetNext(nextFrame);      NS_ASSERTION(nextFrame == mFrames.FirstChild(), "unexpected next reflow command frame");    }  }  // Reflow our one and only child frame  nsHTMLReflowMetrics kidDesiredSize(nsnull);  if (mFrames.IsEmpty()) {    // Return our desired size    aDesiredSize.width = aDesiredSize.height = 0;    aDesiredSize.ascent = aDesiredSize.descent = 0;  } else {    nsIFrame* kidFrame = mFrames.FirstChild();    // We must pass in that the available height is unconstrained, because    // constrained is only for when we're paginated...    nsHTMLReflowState kidReflowState(aPresContext, aReflowState, kidFrame,                                     nsSize(aReflowState.availableWidth,                                            NS_UNCONSTRAINEDSIZE));    if (isChildInitialReflow) {      kidReflowState.reason = eReflowReason_Initial;      kidReflowState.reflowCommand = nsnull;    }    // Reflow the frame    nsIHTMLReflow* htmlReflow;    if (NS_OK == kidFrame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow)) {      ReflowChild(kidFrame, aPresContext, kidDesiredSize, kidReflowState,                  aStatus);      // Get the total size including any space needed for absolute positioned      // elements      // XXX It would be nice if this were part of the reflow metrics...      nsIAreaFrame* areaFrame;      if (NS_SUCCEEDED(kidFrame->QueryInterface(kAreaFrameIID, (void**)&areaFrame))) {        nscoord xMost, yMost;        areaFrame->GetPositionedInfo(xMost, yMost);        if (xMost > kidDesiredSize.width) {          kidDesiredSize.width = xMost;        }        if (yMost > kidDesiredSize.height) {          kidDesiredSize.height = yMost;        }      }      // If our height is fixed, then make sure the child frame plus its top and      // bottom margin is at least that high as well...      if (NS_AUTOHEIGHT != aReflowState.computedHeight) {        nscoord totalHeight = kidDesiredSize.height + kidReflowState.computedMargin.top +          kidReflowState.computedMargin.bottom;        if (totalHeight < aReflowState.computedHeight) {          kidDesiredSize.height += aReflowState.computedHeight - totalHeight;        }      }      nsRect  rect(kidReflowState.computedMargin.left, kidReflowState.computedMargin.top,                   kidDesiredSize.width, kidDesiredSize.height);      kidFrame->SetRect(rect);    }    // If this is a resize reflow then do a repaint    if (eReflowReason_Resize == aReflowState.reason) {      nsRect  damageRect(0, 0, aReflowState.availableWidth, aReflowState.availableHeight);      Invalidate(damageRect, PR_FALSE);    }    // Return our desired size    aDesiredSize.width = kidDesiredSize.width + kidReflowState.computedMargin.left +      kidReflowState.computedMargin.right;    aDesiredSize.height = kidDesiredSize.height + kidReflowState.computedMargin.top +      kidReflowState.computedMargin.bottom;    aDesiredSize.ascent = aDesiredSize.height;    aDesiredSize.descent = 0;    // Set NS_FRAME_OUTSIDE_CHILDREN flag, or reset it, as appropriate    nsFrameState  kidState;    kidFrame->GetFrameState(&kidState);    if (NS_FRAME_OUTSIDE_CHILDREN & kidState) {      nscoord kidXMost = kidReflowState.computedMargin.left +                         kidDesiredSize.mCombinedArea.XMost();      nscoord kidYMost = kidReflowState.computedMargin.top +                         kidDesiredSize.mCombinedArea.YMost();      if ((kidXMost > aDesiredSize.width) || (kidYMost > aDesiredSize.height)) {        aDesiredSize.mCombinedArea.x = 0;        aDesiredSize.mCombinedArea.y = 0;        aDesiredSize.mCombinedArea.width = PR_MAX(aDesiredSize.width, kidXMost);        aDesiredSize.mCombinedArea.height = PR_MAX(aDesiredSize.height, kidYMost);        mState |= NS_FRAME_OUTSIDE_CHILDREN;      } else {        mState &= ~NS_FRAME_OUTSIDE_CHILDREN;      }    } else {      mState &= ~NS_FRAME_OUTSIDE_CHILDREN;    }    // XXX Temporary hack. Remember this for later when our parent resizes us    mNaturalHeight = aDesiredSize.height;  }  NS_FRAME_TRACE_REFLOW_OUT("RootFrame::Reflow", aStatus);  return NS_OK;}