diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index a1ba61304ac2..a12fe1de0b27 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -3647,10 +3647,7 @@ nsIFrame::InlineMinWidthData::ForceBreak(nsRenderingContext *aRenderingContext) currentLine = trailingWhitespace = 0; for (PRUint32 i = 0, i_end = floats.Length(); i != i_end; ++i) { - nsIFrame *floatFrame = floats[i]; - nscoord float_min = - nsLayoutUtils::IntrinsicForContainer(aRenderingContext, floatFrame, - nsLayoutUtils::MIN_WIDTH); + nscoord float_min = floats[i].Width(); if (float_min > prevLines) prevLines = float_min; } @@ -3689,8 +3686,8 @@ nsIFrame::InlinePrefWidthData::ForceBreak(nsRenderingContext *aRenderingContext) floats_cur_right = 0; for (PRUint32 i = 0, i_end = floats.Length(); i != i_end; ++i) { - nsIFrame *floatFrame = floats[i]; - const nsStyleDisplay *floatDisp = floatFrame->GetStyleDisplay(); + const FloatInfo& floatInfo = floats[i]; + const nsStyleDisplay *floatDisp = floatInfo.Frame()->GetStyleDisplay(); if (floatDisp->mBreakType == NS_STYLE_CLEAR_LEFT || floatDisp->mBreakType == NS_STYLE_CLEAR_RIGHT || floatDisp->mBreakType == NS_STYLE_CLEAR_LEFT_AND_RIGHT) { @@ -3706,10 +3703,7 @@ nsIFrame::InlinePrefWidthData::ForceBreak(nsRenderingContext *aRenderingContext) nscoord &floats_cur = floatDisp->mFloats == NS_STYLE_FLOAT_LEFT ? floats_cur_left : floats_cur_right; - nscoord floatWidth = - nsLayoutUtils::IntrinsicForContainer(aRenderingContext, - floatFrame, - nsLayoutUtils::PREF_WIDTH); + nscoord floatWidth = floatInfo.Width(); // Negative-width floats don't change the available space so they // shouldn't change our intrinsic line width either. floats_cur = diff --git a/layout/generic/nsIFrame.h b/layout/generic/nsIFrame.h index ab86d667bebe..335ba0eed48c 100644 --- a/layout/generic/nsIFrame.h +++ b/layout/generic/nsIFrame.h @@ -1542,7 +1542,20 @@ public: nscoord trailingWhitespace; // Floats encountered in the lines. - nsTArray floats; + class FloatInfo { + public: + FloatInfo(const nsIFrame* aFrame, nscoord aWidth) + : mFrame(aFrame), mWidth(aWidth) + { } + const nsIFrame* Frame() const { return mFrame; } + nscoord Width() const { return mWidth; } + + private: + const nsIFrame* mFrame; + nscoord mWidth; + }; + + nsTArray floats; }; struct InlineMinWidthData : public InlineIntrinsicWidthData { diff --git a/layout/generic/nsPlaceholderFrame.cpp b/layout/generic/nsPlaceholderFrame.cpp index d7102b48f28f..392104a87490 100644 --- a/layout/generic/nsPlaceholderFrame.cpp +++ b/layout/generic/nsPlaceholderFrame.cpp @@ -82,8 +82,14 @@ nsPlaceholderFrame::AddInlineMinWidth(nsRenderingContext *aRenderingContext, // false. // ...but push floats onto the list - if (mOutOfFlowFrame->IsFloating()) - aData->floats.AppendElement(mOutOfFlowFrame); + if (mOutOfFlowFrame->IsFloating()) { + nscoord floatWidth = + nsLayoutUtils::IntrinsicForContainer(aRenderingContext, + mOutOfFlowFrame, + nsLayoutUtils::MIN_WIDTH); + aData->floats.AppendElement( + InlineIntrinsicWidthData::FloatInfo(mOutOfFlowFrame, floatWidth)); + } } /* virtual */ void @@ -97,8 +103,14 @@ nsPlaceholderFrame::AddInlinePrefWidth(nsRenderingContext *aRenderingContext, // false. // ...but push floats onto the list - if (mOutOfFlowFrame->IsFloating()) - aData->floats.AppendElement(mOutOfFlowFrame); + if (mOutOfFlowFrame->IsFloating()) { + nscoord floatWidth = + nsLayoutUtils::IntrinsicForContainer(aRenderingContext, + mOutOfFlowFrame, + nsLayoutUtils::PREF_WIDTH); + aData->floats.AppendElement( + InlineIntrinsicWidthData::FloatInfo(mOutOfFlowFrame, floatWidth)); + } } NS_IMETHODIMP