diff --git a/layout/generic/nsHTMLReflowState.cpp b/layout/generic/nsHTMLReflowState.cpp index 3e4b0a3f3cf..381212fd26a 100644 --- a/layout/generic/nsHTMLReflowState.cpp +++ b/layout/generic/nsHTMLReflowState.cpp @@ -740,7 +740,7 @@ nsHTMLReflowState::InitConstraints(nsIPresContext& aPresContext) (computedMargin.right < 200000), "oy"); #endif ComputeBorderFor(frame, mComputedBorderPadding); - ComputePaddingFor(frame, parentReflowState, mComputedPadding); + ComputePadding(containingBlockWidth); mComputedBorderPadding += mComputedPadding; nsStyleUnit widthUnit = mStylePosition->mWidth.GetUnit(); @@ -1265,6 +1265,46 @@ nsHTMLReflowState::ComputeMargin(nscoord aContainingBlockWidth) } } +void +nsHTMLReflowState::ComputePadding(nscoord aContainingBlockWidth) +{ + // If style can provide us the padding directly, then use it. +#if 0 + if (!mStyleSpacing->GetPadding(mComputedPadding)) +#else + mStyleSpacing->CalcPaddingFor(frame, mComputedPadding); + if ((eStyleUnit_Percent == mStyleSpacing->mPadding.GetTopUnit()) || + (eStyleUnit_Percent == mStyleSpacing->mPadding.GetRightUnit()) || + (eStyleUnit_Percent == mStyleSpacing->mPadding.GetBottomUnit()) || + (eStyleUnit_Percent == mStyleSpacing->mPadding.GetLeftUnit())) +#endif + { + // We have to compute the value (because it's uncomputable by + // the style code). + nsStyleCoord left, right, top, bottom; + ComputeHorizontalValue(aContainingBlockWidth, + mStyleSpacing->mPadding.GetLeftUnit(), + mStyleSpacing->mPadding.GetLeft(left), + mComputedPadding.left); + ComputeHorizontalValue(aContainingBlockWidth, + mStyleSpacing->mPadding.GetRightUnit(), + mStyleSpacing->mPadding.GetRight(right), + mComputedPadding.right); + + // According to the CSS2 spec, padding percentages are + // calculated with respect to the *width* of the containing + // block, even for padding-top and padding-bottom. + ComputeHorizontalValue(aContainingBlockWidth, + mStyleSpacing->mPadding.GetTopUnit(), + mStyleSpacing->mPadding.GetTop(top), + mComputedPadding.top); + ComputeHorizontalValue(aContainingBlockWidth, + mStyleSpacing->mPadding.GetBottomUnit(), + mStyleSpacing->mPadding.GetBottom(bottom), + mComputedPadding.bottom); + } +} + void nsHTMLReflowState::ComputePaddingFor(nsIFrame* aFrame, const nsReflowState* aParentRS, diff --git a/layout/html/base/src/nsHTMLReflowState.cpp b/layout/html/base/src/nsHTMLReflowState.cpp index 3e4b0a3f3cf..381212fd26a 100644 --- a/layout/html/base/src/nsHTMLReflowState.cpp +++ b/layout/html/base/src/nsHTMLReflowState.cpp @@ -740,7 +740,7 @@ nsHTMLReflowState::InitConstraints(nsIPresContext& aPresContext) (computedMargin.right < 200000), "oy"); #endif ComputeBorderFor(frame, mComputedBorderPadding); - ComputePaddingFor(frame, parentReflowState, mComputedPadding); + ComputePadding(containingBlockWidth); mComputedBorderPadding += mComputedPadding; nsStyleUnit widthUnit = mStylePosition->mWidth.GetUnit(); @@ -1265,6 +1265,46 @@ nsHTMLReflowState::ComputeMargin(nscoord aContainingBlockWidth) } } +void +nsHTMLReflowState::ComputePadding(nscoord aContainingBlockWidth) +{ + // If style can provide us the padding directly, then use it. +#if 0 + if (!mStyleSpacing->GetPadding(mComputedPadding)) +#else + mStyleSpacing->CalcPaddingFor(frame, mComputedPadding); + if ((eStyleUnit_Percent == mStyleSpacing->mPadding.GetTopUnit()) || + (eStyleUnit_Percent == mStyleSpacing->mPadding.GetRightUnit()) || + (eStyleUnit_Percent == mStyleSpacing->mPadding.GetBottomUnit()) || + (eStyleUnit_Percent == mStyleSpacing->mPadding.GetLeftUnit())) +#endif + { + // We have to compute the value (because it's uncomputable by + // the style code). + nsStyleCoord left, right, top, bottom; + ComputeHorizontalValue(aContainingBlockWidth, + mStyleSpacing->mPadding.GetLeftUnit(), + mStyleSpacing->mPadding.GetLeft(left), + mComputedPadding.left); + ComputeHorizontalValue(aContainingBlockWidth, + mStyleSpacing->mPadding.GetRightUnit(), + mStyleSpacing->mPadding.GetRight(right), + mComputedPadding.right); + + // According to the CSS2 spec, padding percentages are + // calculated with respect to the *width* of the containing + // block, even for padding-top and padding-bottom. + ComputeHorizontalValue(aContainingBlockWidth, + mStyleSpacing->mPadding.GetTopUnit(), + mStyleSpacing->mPadding.GetTop(top), + mComputedPadding.top); + ComputeHorizontalValue(aContainingBlockWidth, + mStyleSpacing->mPadding.GetBottomUnit(), + mStyleSpacing->mPadding.GetBottom(bottom), + mComputedPadding.bottom); + } +} + void nsHTMLReflowState::ComputePaddingFor(nsIFrame* aFrame, const nsReflowState* aParentRS, diff --git a/layout/html/base/src/nsIHTMLReflow.h b/layout/html/base/src/nsIHTMLReflow.h index 8e7d84b2287..e1c8d98bf46 100644 --- a/layout/html/base/src/nsIHTMLReflow.h +++ b/layout/html/base/src/nsIHTMLReflow.h @@ -345,9 +345,13 @@ protected: const nsStylePosition* aPosition, const nsStyleDisplay* aDisplay); - // Computes margins from the specified margin style information, and + // Computes margin values from the specified margin style information, and // fills in the mComputedMargin member void ComputeMargin(nscoord aContainingBlockWidth); + + // Computes padding values from the specified padding style information, and + // fills in the mComputedPadding member + void ComputePadding(nscoord aContainingBlockWidth); }; //----------------------------------------------------------------------