Fix for bug #10395. Now we recalculate margins when we use the minimum or

maximum value for the computed width/height. This applies to positioned
elements only
This commit is contained in:
troy%netscape.com 1999-07-27 00:48:47 +00:00
Родитель 0e998cd14e
Коммит 105a009fb5
4 изменённых файлов: 80 добавлений и 48 удалений

Просмотреть файл

@ -169,8 +169,6 @@ nsAbsoluteContainingBlock::IncrementalReflow(nsIFrame* aDelegatin
if (isAbsoluteChild) {
nsIReflowCommand::ReflowType type;
nsIFrame* newFrames;
PRInt32 numFrames = 0;
// Get the type of reflow command
aReflowState.reflowCommand->GetType(type);
@ -187,7 +185,7 @@ nsAbsoluteContainingBlock::IncrementalReflow(nsIFrame* aDelegatin
if (frameState & NS_FRAME_IS_DIRTY) {
nsReflowStatus status;
ReflowAbsoluteFrame(aDelegatingFrame, aPresContext, aReflowState,
newFrames, PR_TRUE, status);
f, PR_TRUE, status);
}
}
@ -263,8 +261,21 @@ nsAbsoluteContainingBlock::ReflowAbsoluteFrame(nsIFrame* aDelegat
rv = htmlReflow->Reflow(aPresContext, kidDesiredSize, kidReflowState, aStatus);
// Because we don't know the size of a replaced element until after we reflow
// it 'auto' margins must be computed now
// it 'auto' margins must be computed now, and we need to take into account
// min-max information
if (NS_FRAME_IS_REPLACED(kidReflowState.mFrameType)) {
// Factor in any minimum and maximum size information
if (kidDesiredSize.width > kidReflowState.mComputedMaxWidth) {
kidDesiredSize.width = kidReflowState.mComputedMaxWidth;
} else if (kidDesiredSize.width < kidReflowState.mComputedMinWidth) {
kidDesiredSize.width = kidReflowState.mComputedMinWidth;
}
if (kidDesiredSize.height > kidReflowState.mComputedMaxHeight) {
kidDesiredSize.height = kidReflowState.mComputedMaxHeight;
} else if (kidDesiredSize.height < kidReflowState.mComputedMinHeight) {
kidDesiredSize.height = kidReflowState.mComputedMinHeight;
}
// Get the containing block width/height
nscoord containingBlockWidth, containingBlockHeight;
kidReflowState.ComputeContainingBlockRectangle(&aReflowState,

Просмотреть файл

@ -479,22 +479,25 @@ nsHTMLReflowState::InitAbsoluteConstraints(nsIPresContext& aPresContext,
} else {
// Any remaining 'auto' values for 'left', 'right', 'margin-left', or
// 'margin-right' are replaced with 0 (their default value)
leftIsAuto = PR_FALSE;
rightIsAuto = PR_FALSE;
marginLeftIsAuto = PR_FALSE;
marginRightIsAuto = PR_FALSE;
mComputedWidth = containingBlockWidth - mComputedOffsets.left -
mComputedMargin.left - mComputedBorderPadding.left -
mComputedBorderPadding.right -
mComputedMargin.right - mComputedOffsets.right;
}
// Factor in any minimum and maximum size information
if (mComputedWidth > mComputedMaxWidth) {
mComputedWidth = mComputedMaxWidth;
} else if (mComputedWidth < mComputedMinWidth) {
mComputedWidth = mComputedMinWidth;
// Factor in any minimum and maximum size information
if (mComputedWidth > mComputedMaxWidth) {
mComputedWidth = mComputedMaxWidth;
} else if (mComputedWidth < mComputedMinWidth) {
mComputedWidth = mComputedMinWidth;
} else {
// Note that we wait until after checkin minimum and maximum size
// information, because if we use the minimum or maximum value instead
// then the rules are applied again and that means margin recalculation
leftIsAuto = PR_FALSE;
rightIsAuto = PR_FALSE;
marginLeftIsAuto = PR_FALSE;
marginRightIsAuto = PR_FALSE;
}
}
} else {
@ -505,7 +508,7 @@ nsHTMLReflowState::InitAbsoluteConstraints(nsIPresContext& aPresContext,
ComputeHorizontalValue(containingBlockWidth, widthUnit,
mStylePosition->mWidth, mComputedWidth);
}
// Factor in any minimum and maximum size information
if (mComputedWidth > mComputedMaxWidth) {
mComputedWidth = mComputedMaxWidth;
@ -617,14 +620,6 @@ nsHTMLReflowState::InitAbsoluteConstraints(nsIPresContext& aPresContext,
if (NS_FRAME_IS_REPLACED(mFrameType)) {
mComputedHeight = NS_INTRINSICSIZE;
} else {
// Replace any 'auto' on 'margin-top' or 'margin-bottom' with 0 (their
// default values)
marginTopIsAuto = PR_FALSE;
marginBottomIsAuto = PR_FALSE;
// If 'bottom' is 'auto', then replace it with '0' (its default value), too
bottomIsAuto = PR_FALSE;
// Solve for the value of 'height'
if (NS_AUTOHEIGHT == containingBlockHeight) {
// If the containing block's height was not explicitly specified (i.e.,
@ -632,6 +627,9 @@ nsHTMLReflowState::InitAbsoluteConstraints(nsIPresContext& aPresContext,
mComputedHeight = NS_AUTOHEIGHT;
} else {
// Replace any 'auto' on 'margin-top' or 'margin-bottom' with 0 (their
// default values). If 'bottom' is 'auto', then replace it with '0' (its
// default value), too
mComputedHeight = containingBlockHeight - mComputedOffsets.top -
mComputedMargin.top - mComputedBorderPadding.top -
mComputedBorderPadding.bottom -
@ -642,6 +640,13 @@ nsHTMLReflowState::InitAbsoluteConstraints(nsIPresContext& aPresContext,
mComputedHeight = mComputedMaxHeight;
} else if (mComputedHeight < mComputedMinHeight) {
mComputedHeight = mComputedMinHeight;
} else {
// Note that we wait until after checkin minimum and maximum size
// information, because if we use the minimum or maximum value instead
// then the rules are applied again and that means margin recalculation
marginTopIsAuto = PR_FALSE;
marginBottomIsAuto = PR_FALSE;
bottomIsAuto = PR_FALSE;
}
}
}

Просмотреть файл

@ -169,8 +169,6 @@ nsAbsoluteContainingBlock::IncrementalReflow(nsIFrame* aDelegatin
if (isAbsoluteChild) {
nsIReflowCommand::ReflowType type;
nsIFrame* newFrames;
PRInt32 numFrames = 0;
// Get the type of reflow command
aReflowState.reflowCommand->GetType(type);
@ -187,7 +185,7 @@ nsAbsoluteContainingBlock::IncrementalReflow(nsIFrame* aDelegatin
if (frameState & NS_FRAME_IS_DIRTY) {
nsReflowStatus status;
ReflowAbsoluteFrame(aDelegatingFrame, aPresContext, aReflowState,
newFrames, PR_TRUE, status);
f, PR_TRUE, status);
}
}
@ -263,8 +261,21 @@ nsAbsoluteContainingBlock::ReflowAbsoluteFrame(nsIFrame* aDelegat
rv = htmlReflow->Reflow(aPresContext, kidDesiredSize, kidReflowState, aStatus);
// Because we don't know the size of a replaced element until after we reflow
// it 'auto' margins must be computed now
// it 'auto' margins must be computed now, and we need to take into account
// min-max information
if (NS_FRAME_IS_REPLACED(kidReflowState.mFrameType)) {
// Factor in any minimum and maximum size information
if (kidDesiredSize.width > kidReflowState.mComputedMaxWidth) {
kidDesiredSize.width = kidReflowState.mComputedMaxWidth;
} else if (kidDesiredSize.width < kidReflowState.mComputedMinWidth) {
kidDesiredSize.width = kidReflowState.mComputedMinWidth;
}
if (kidDesiredSize.height > kidReflowState.mComputedMaxHeight) {
kidDesiredSize.height = kidReflowState.mComputedMaxHeight;
} else if (kidDesiredSize.height < kidReflowState.mComputedMinHeight) {
kidDesiredSize.height = kidReflowState.mComputedMinHeight;
}
// Get the containing block width/height
nscoord containingBlockWidth, containingBlockHeight;
kidReflowState.ComputeContainingBlockRectangle(&aReflowState,

Просмотреть файл

@ -479,22 +479,25 @@ nsHTMLReflowState::InitAbsoluteConstraints(nsIPresContext& aPresContext,
} else {
// Any remaining 'auto' values for 'left', 'right', 'margin-left', or
// 'margin-right' are replaced with 0 (their default value)
leftIsAuto = PR_FALSE;
rightIsAuto = PR_FALSE;
marginLeftIsAuto = PR_FALSE;
marginRightIsAuto = PR_FALSE;
mComputedWidth = containingBlockWidth - mComputedOffsets.left -
mComputedMargin.left - mComputedBorderPadding.left -
mComputedBorderPadding.right -
mComputedMargin.right - mComputedOffsets.right;
}
// Factor in any minimum and maximum size information
if (mComputedWidth > mComputedMaxWidth) {
mComputedWidth = mComputedMaxWidth;
} else if (mComputedWidth < mComputedMinWidth) {
mComputedWidth = mComputedMinWidth;
// Factor in any minimum and maximum size information
if (mComputedWidth > mComputedMaxWidth) {
mComputedWidth = mComputedMaxWidth;
} else if (mComputedWidth < mComputedMinWidth) {
mComputedWidth = mComputedMinWidth;
} else {
// Note that we wait until after checkin minimum and maximum size
// information, because if we use the minimum or maximum value instead
// then the rules are applied again and that means margin recalculation
leftIsAuto = PR_FALSE;
rightIsAuto = PR_FALSE;
marginLeftIsAuto = PR_FALSE;
marginRightIsAuto = PR_FALSE;
}
}
} else {
@ -505,7 +508,7 @@ nsHTMLReflowState::InitAbsoluteConstraints(nsIPresContext& aPresContext,
ComputeHorizontalValue(containingBlockWidth, widthUnit,
mStylePosition->mWidth, mComputedWidth);
}
// Factor in any minimum and maximum size information
if (mComputedWidth > mComputedMaxWidth) {
mComputedWidth = mComputedMaxWidth;
@ -617,14 +620,6 @@ nsHTMLReflowState::InitAbsoluteConstraints(nsIPresContext& aPresContext,
if (NS_FRAME_IS_REPLACED(mFrameType)) {
mComputedHeight = NS_INTRINSICSIZE;
} else {
// Replace any 'auto' on 'margin-top' or 'margin-bottom' with 0 (their
// default values)
marginTopIsAuto = PR_FALSE;
marginBottomIsAuto = PR_FALSE;
// If 'bottom' is 'auto', then replace it with '0' (its default value), too
bottomIsAuto = PR_FALSE;
// Solve for the value of 'height'
if (NS_AUTOHEIGHT == containingBlockHeight) {
// If the containing block's height was not explicitly specified (i.e.,
@ -632,6 +627,9 @@ nsHTMLReflowState::InitAbsoluteConstraints(nsIPresContext& aPresContext,
mComputedHeight = NS_AUTOHEIGHT;
} else {
// Replace any 'auto' on 'margin-top' or 'margin-bottom' with 0 (their
// default values). If 'bottom' is 'auto', then replace it with '0' (its
// default value), too
mComputedHeight = containingBlockHeight - mComputedOffsets.top -
mComputedMargin.top - mComputedBorderPadding.top -
mComputedBorderPadding.bottom -
@ -642,6 +640,13 @@ nsHTMLReflowState::InitAbsoluteConstraints(nsIPresContext& aPresContext,
mComputedHeight = mComputedMaxHeight;
} else if (mComputedHeight < mComputedMinHeight) {
mComputedHeight = mComputedMinHeight;
} else {
// Note that we wait until after checkin minimum and maximum size
// information, because if we use the minimum or maximum value instead
// then the rules are applied again and that means margin recalculation
marginTopIsAuto = PR_FALSE;
marginBottomIsAuto = PR_FALSE;
bottomIsAuto = PR_FALSE;
}
}
}