diff --git a/mozilla/layout/html/base/src/nsInlineReflow.cpp b/mozilla/layout/html/base/src/nsInlineReflow.cpp
index 28e1af6d873..33f4d6fddea 100644
--- a/mozilla/layout/html/base/src/nsInlineReflow.cpp
+++ b/mozilla/layout/html/base/src/nsInlineReflow.cpp
@@ -265,15 +265,14 @@ nsInlineReflow::ReflowFrame(nsIFrame* aFrame)
// Reflow the frame. If the frame must be placed somewhere else
// then we return immediately.
- nsRect bounds;
- if (ReflowFrame(metrics, bounds, result)) {
+ if (ReflowFrame(metrics, result)) {
// See if we can place the frame. If we can't fit it, then we
// return now.
- if (CanPlaceFrame(metrics, bounds, result)) {
+ if (CanPlaceFrame(metrics, result)) {
// Place the frame, updating aBounds with the final size and
// location. Then apply the bottom+right margins (as
// appropriate) to the frame.
- PlaceFrame(metrics, bounds);
+ PlaceFrame(metrics);
}
}
@@ -332,18 +331,16 @@ nsInlineReflow::CalculateBlockMarginsFor(nsIPresContext& aPresContext,
return rv;
}
-// XXX doesn't apply top margin; it should for inlines, yes? should
-// top margins for inlines end up in the ascent and bottom margins in
-// the descent?
+// XXX doesn't apply top margin
void
nsInlineReflow::ApplyTopLeftMargins()
{
- mFrameX = mX;
- mFrameY = mTopEdge;
+ PerFrameData* pfd = mFrameData;
+ pfd->mBounds.x = mX;
+ pfd->mBounds.y = mTopEdge;
// Compute left margin
- nscoord leftMargin = 0;
const nsStyleDisplay* display = GetDisplay();
switch (display->mFloats) {
default:
@@ -357,10 +354,9 @@ nsInlineReflow::ApplyTopLeftMargins()
break;
case NS_STYLE_FLOAT_NONE:
- leftMargin = mFrameData->mMargin.left;
+ pfd->mBounds.x += pfd->mMargin.left;
break;
}
- mFrameX += leftMargin;
}
PRBool
@@ -373,13 +369,15 @@ nsInlineReflow::ComputeAvailableSize()
mFrameAvailSize.width = NS_UNCONSTRAINEDSIZE;
}
else {
- mFrameAvailSize.width = mRightEdge - mFrameX - pfd->mMargin.right;
+ // XXX What does a negative right margin mean here?
+ mFrameAvailSize.width = mRightEdge - pfd->mBounds.x - pfd->mMargin.right;
}
if (NS_UNCONSTRAINEDSIZE == mBottomEdge) {
mFrameAvailSize.height = NS_UNCONSTRAINEDSIZE;
}
else {
- mFrameAvailSize.height = mBottomEdge - mFrameY - pfd->mMargin.bottom;
+ mFrameAvailSize.height = mBottomEdge - pfd->mBounds.y -
+ pfd->mMargin.bottom;
}
// Give up now if there is no chance. Note that we allow a reflow if
@@ -399,16 +397,17 @@ nsInlineReflow::ComputeAvailableSize()
*/
PRBool
nsInlineReflow::ReflowFrame(nsHTMLReflowMetrics& aMetrics,
- nsRect& aBounds,
nsReflowStatus& aStatus)
{
+ PerFrameData* pfd = mFrameData;
+
// Get reflow reason set correctly. It's possible that a child was
// created and then it was decided that it could not be reflowed
// (for example, a block frame that isn't at the start of a
// line). In this case the reason will be wrong so we need to check
// the frame state.
nsReflowReason reason = eReflowReason_Resize;
- nsIFrame* frame = mFrameData->mFrame;
+ nsIFrame* frame = pfd->mFrame;
nsFrameState state;
frame->GetFrameState(state);
if (NS_FRAME_FIRST_REFLOW & state) {
@@ -425,22 +424,18 @@ nsInlineReflow::ReflowFrame(nsHTMLReflowMetrics& aMetrics,
mFrameAvailSize);
if (!mTreatFrameAsBlock) {
mIsInlineAware = PR_TRUE;
-//XX reflowState.frameType = eReflowType_Inline;
reflowState.lineLayout = &mLineLayout;
}
reflowState.reason = reason;
// Let frame know that are reflowing it
- nscoord x = mFrameX;
- nscoord y = mFrameY;
+ nscoord x = pfd->mBounds.x;
+ nscoord y = pfd->mBounds.y;
nsIHTMLReflow* htmlReflow;
frame->QueryInterface(kIHTMLReflowIID, (void**)&htmlReflow);
htmlReflow->WillReflow(mPresContext);
- aBounds.x = x;
- aBounds.y = y;
-
// Adjust spacemanager coordinate system for the frame. The
// spacemanager coordinates are inside the mOuterFrame's
// border+padding, but the x/y coordinates are not (recall that
@@ -453,8 +448,8 @@ nsInlineReflow::ReflowFrame(nsHTMLReflowMetrics& aMetrics,
mSpaceManager->Translate(tx, ty);
htmlReflow->Reflow(mPresContext, aMetrics, reflowState, aStatus);
- aBounds.width = aMetrics.width;
- aBounds.height = aMetrics.height;
+ pfd->mBounds.width = aMetrics.width;
+ pfd->mBounds.height = aMetrics.height;
mSpaceManager->Translate(-tx, -ty);
@@ -504,14 +499,13 @@ nsInlineReflow::ReflowFrame(nsHTMLReflowMetrics& aMetrics,
*/
PRBool
nsInlineReflow::CanPlaceFrame(nsHTMLReflowMetrics& aMetrics,
- nsRect& aBounds,
nsReflowStatus& aStatus)
{
PerFrameData* pfd = mFrameData;
// Compute right margin to use
mRightMargin = 0;
- if (0 != aBounds.width) {
+ if (0 != pfd->mBounds.width) {
const nsStyleDisplay* display = GetDisplay();
switch (display->mFloats) {
default:
@@ -559,7 +553,7 @@ nsInlineReflow::CanPlaceFrame(nsHTMLReflowMetrics& aMetrics,
// See if the frame fits. If it doesn't then we fabricate up a
// break-before status.
- if (aBounds.XMost() + mRightMargin > mRightEdge) {
+ if (pfd->mBounds.XMost() + mRightMargin > mRightEdge) {
// Retain the completion status of the frame that was reflowed in
// case the caller cares.
aStatus = NS_INLINE_LINE_BREAK_BEFORE();
@@ -573,7 +567,7 @@ nsInlineReflow::CanPlaceFrame(nsHTMLReflowMetrics& aMetrics,
* Place the frame. Update running counters.
*/
void
-nsInlineReflow::PlaceFrame(nsHTMLReflowMetrics& aMetrics, nsRect& aBounds)
+nsInlineReflow::PlaceFrame(nsHTMLReflowMetrics& aMetrics)
{
PerFrameData* pfd = mFrameData;
@@ -582,14 +576,16 @@ nsInlineReflow::PlaceFrame(nsHTMLReflowMetrics& aMetrics, nsRect& aBounds)
mIsBlock = PR_TRUE;
}
+//XXX disabled: css2 spec claims otherwise; the problem is we need to
+//handle continuations differently so that empty continuations disappear
+
// If frame is zero width then do not apply its left and right margins.
PRBool emptyFrame = PR_FALSE;
- if ((0 == aBounds.width) || (0 == aBounds.height)) {
- aBounds.x = mX;
- aBounds.y = 0;
+ if ((0 == pfd->mBounds.width) || (0 == pfd->mBounds.height)) {
+ pfd->mBounds.x = mX;
+ pfd->mBounds.y = mTopEdge;
emptyFrame = PR_TRUE;
}
- pfd->mBounds = aBounds;
// Record ascent and update max-ascent and max-descent values
pfd->mAscent = aMetrics.ascent;
@@ -609,7 +605,7 @@ nsInlineReflow::PlaceFrame(nsHTMLReflowMetrics& aMetrics, nsRect& aBounds)
mCarriedOutMarginFlags = aMetrics.mCarriedOutMarginFlags;
// Advance to next X coordinate
- mX = aBounds.XMost() + mRightMargin;
+ mX = pfd->mBounds.XMost() + mRightMargin;
// If the frame is a not inline aware and it takes up some area
// disable leading white-space compression for the next frame to
@@ -654,17 +650,20 @@ nsInlineReflow::VerticalAlignFrames(nsRect& aLineBox,
// Short circuit 99% of this when this code has reflowed a single
// block frame.
- aLineBox.x = mLeftEdge;
- aLineBox.y = mTopEdge;
- aLineBox.width = mX - mLeftEdge;
if (mTreatFrameAsBlock) {
- aLineBox.height = pfd0->mBounds.height;
+ aLineBox = pfd0->mBounds;
aMaxAscent = pfd0->mAscent;
aMaxDescent = pfd0->mDescent;
pfd0->mFrame->SetRect(aLineBox);
return;
}
+ // XXX I think that the line box should wrap around the children,
+ // even if they have negative margins, right?
+ aLineBox.x = mLeftEdge;
+ aLineBox.y = mTopEdge;
+ aLineBox.width = mX - mLeftEdge;
+
// Get the parent elements font in case we need it
const nsStyleFont* font;
mOuterFrame->GetStyleData(eStyleStruct_Font,