Don't set NS_BLOCK_SPACE_MGR and NS_BLOCK_WRAP_SIZE on relatively positioned blocks, by default. Use |ConstructBlock| for them rather than duplicating it, slightly incorrectly. b=180711 r+sr=roc

This commit is contained in:
dbaron%fas.harvard.edu 2002-12-13 20:13:17 +00:00
parent 8c5891eb62
commit 5be27562ba
6 changed files with 40 additions and 104 deletions

View File

@ -6526,48 +6526,8 @@ nsCSSFrameConstructor::ConstructFrameByDisplayType(nsIPresShell* aPre
NS_NewRelativeItemWrapperFrame(aPresShell, &newFrame); NS_NewRelativeItemWrapperFrame(aPresShell, &newFrame);
isBlockFrame = PR_TRUE; isBlockFrame = PR_TRUE;
// Initialize the frame ConstructBlock(aPresShell, aPresContext, aState, aDisplay, aContent,
InitAndRestoreFrame(aPresContext, aState, aContent, adjParentFrame, aStyleContext, newFrame, PR_TRUE);
adjParentFrame, aStyleContext, nsnull, newFrame);
// Create a view
nsHTMLContainerFrame::CreateViewForFrame(aPresContext, newFrame,
aStyleContext, nsnull, PR_FALSE);
// Process the child content. Relatively positioned frames becomes a
// container for child frames that are positioned
nsFrameConstructorSaveState absoluteSaveState;
nsFrameConstructorSaveState floaterSaveState;
nsFrameItems childItems;
aState.PushAbsoluteContainingBlock(newFrame, absoluteSaveState);
PRBool haveFirstLetterStyle, haveFirstLineStyle;
HaveSpecialBlockStyle(aPresContext, aContent, aStyleContext,
&haveFirstLetterStyle, &haveFirstLineStyle);
aState.PushFloaterContainingBlock(newFrame, floaterSaveState,
haveFirstLetterStyle,
haveFirstLineStyle);
ProcessChildren(aPresShell, aPresContext, aState, aContent, newFrame, PR_TRUE,
childItems, isBlockFrame);
nsCOMPtr<nsIAtom> tag;
aContent->GetTag(*getter_AddRefs(tag));
CreateAnonymousFrames(aPresShell, aPresContext, tag, aState, aContent, newFrame,
childItems);
// Set the frame's initial child list
newFrame->SetInitialChildList(aPresContext, nsnull, childItems.childList);
if (aState.mAbsoluteItems.childList) {
newFrame->SetInitialChildList(aPresContext, nsLayoutAtoms::absoluteList,
aState.mAbsoluteItems.childList);
}
if (aState.mFloatedItems.childList) {
newFrame->SetInitialChildList(aPresContext,
nsLayoutAtoms::floaterList,
aState.mFloatedItems.childList);
}
} else { } else {
// Create a positioned inline frame // Create a positioned inline frame
NS_NewPositionedInlineFrame(aPresShell, &newFrame); NS_NewPositionedInlineFrame(aPresShell, &newFrame);
@ -6591,7 +6551,7 @@ nsCSSFrameConstructor::ConstructFrameByDisplayType(nsIPresShell* aPre
nsPseudoFrames savePseudo; nsPseudoFrames savePseudo;
aState.mPseudoFrames.Reset(&savePseudo); aState.mPseudoFrames.Reset(&savePseudo);
rv = ConstructBlock(aPresShell, aPresContext, aState, aDisplay, aContent, rv = ConstructBlock(aPresShell, aPresContext, aState, aDisplay, aContent,
adjParentFrame, aStyleContext, newFrame); adjParentFrame, aStyleContext, newFrame, PR_FALSE);
if (!aState.mPseudoFrames.IsEmpty()) { // process pending pseudo frames if (!aState.mPseudoFrames.IsEmpty()) { // process pending pseudo frames
ProcessPseudoFrames(aPresContext, aState.mPseudoFrames, aFrameItems); ProcessPseudoFrames(aPresContext, aState.mPseudoFrames, aFrameItems);
} }
@ -11502,7 +11462,7 @@ nsCSSFrameConstructor::CreateContinuingFrame(nsIPresShell* aPresShell,
} }
} else if (nsLayoutAtoms::areaFrame == frameType) { } else if (nsLayoutAtoms::areaFrame == frameType) {
rv = NS_NewAreaFrame(aPresShell, &newFrame); rv = NS_NewAreaFrame(aPresShell, &newFrame, 0);
if (NS_SUCCEEDED(rv)) { if (NS_SUCCEEDED(rv)) {
newFrame->Init(aPresContext, content, aParentFrame, styleContext, newFrame->Init(aPresContext, content, aParentFrame, styleContext,
aFrame); aFrame);
@ -13366,14 +13326,15 @@ nsCSSFrameConstructor::CreateListBoxContent(nsIPresContext* aPresContext,
//---------------------------------------- //----------------------------------------
nsresult nsresult
nsCSSFrameConstructor::ConstructBlock(nsIPresShell* aPresShell, nsCSSFrameConstructor::ConstructBlock(nsIPresShell* aPresShell,
nsIPresContext* aPresContext, nsIPresContext* aPresContext,
nsFrameConstructorState& aState, nsFrameConstructorState& aState,
const nsStyleDisplay* aDisplay, const nsStyleDisplay* aDisplay,
nsIContent* aContent, nsIContent* aContent,
nsIFrame* aParentFrame, nsIFrame* aParentFrame,
nsIStyleContext* aStyleContext, nsIStyleContext* aStyleContext,
nsIFrame* aNewFrame) nsIFrame* aNewFrame,
PRBool aRelPos)
{ {
InitAndRestoreFrame(aPresContext, aState, aContent, InitAndRestoreFrame(aPresContext, aState, aContent,
aParentFrame, aStyleContext, nsnull, aNewFrame); aParentFrame, aStyleContext, nsnull, aNewFrame);
@ -13394,8 +13355,10 @@ nsCSSFrameConstructor::ConstructBlock(nsIPresShell* aPresShell,
// ...and that we're the absolute containing block. // ...and that we're the absolute containing block.
nsFrameConstructorSaveState absoluteSaveState; nsFrameConstructorSaveState absoluteSaveState;
if (! aState.mAbsoluteItems.containingBlock) if (aRelPos || !aState.mAbsoluteItems.containingBlock) {
NS_ASSERTION(aRelPos, "should have made area frame for this");
aState.PushAbsoluteContainingBlock(aNewFrame, absoluteSaveState); aState.PushAbsoluteContainingBlock(aNewFrame, absoluteSaveState);
}
// See if the block has first-letter style applied to it... // See if the block has first-letter style applied to it...
PRBool haveFirstLetterStyle, haveFirstLineStyle; PRBool haveFirstLetterStyle, haveFirstLineStyle;
@ -13425,6 +13388,11 @@ nsCSSFrameConstructor::ConstructBlock(nsIPresShell* aPresShell,
nsLayoutAtoms::floaterList, nsLayoutAtoms::floaterList,
aState.mFloatedItems.childList); aState.mFloatedItems.childList);
} }
// and the same for absolutely positioned children.
if (aRelPos && aState.mAbsoluteItems.childList) {
aNewFrame->SetInitialChildList(aPresContext, nsLayoutAtoms::absoluteList,
aState.mAbsoluteItems.childList);
}
return rv; return rv;
} }

View File

@ -823,7 +823,8 @@ protected:
nsIContent* aContent, nsIContent* aContent,
nsIFrame* aParentFrame, nsIFrame* aParentFrame,
nsIStyleContext* aStyleContext, nsIStyleContext* aStyleContext,
nsIFrame* aNewFrame); nsIFrame* aNewFrame,
PRBool aRelPos);
nsresult ProcessBlockChildren(nsIPresShell* aPresShell, nsresult ProcessBlockChildren(nsIPresShell* aPresShell,
nsIPresContext* aPresContext, nsIPresContext* aPresContext,

View File

@ -110,10 +110,9 @@ NS_NewAttributeContent(nsIContent ** aResult);
extern nsresult NS_NewSelectsAreaFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame, extern nsresult NS_NewSelectsAreaFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame,
PRUint32 aFlags = NS_BLOCK_WRAP_SIZE); PRUint32 aFlags = NS_BLOCK_WRAP_SIZE);
// Create a basic area frame. By default, area frames will extend // Create a basic area frame.
// their height to cover any children that "stick out".
extern nsresult NS_NewAreaFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame, extern nsresult NS_NewAreaFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame,
PRUint32 aFlags = NS_BLOCK_SPACE_MGR|NS_BLOCK_WRAP_SIZE); PRUint32 aFlags);
// These AreaFrame's shrink wrap around their contents // These AreaFrame's shrink wrap around their contents
inline nsresult NS_NewTableCellInnerFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame) { inline nsresult NS_NewTableCellInnerFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame) {
@ -140,7 +139,7 @@ inline nsresult NS_NewFloatingItemWrapperFrame(nsIPresShell* aPresShell, nsIFram
// This type of AreaFrame doesn't use its own space manager and // This type of AreaFrame doesn't use its own space manager and
// doesn't shrink wrap. // doesn't shrink wrap.
inline nsresult NS_NewRelativeItemWrapperFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame) { inline nsresult NS_NewRelativeItemWrapperFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame) {
return NS_NewAreaFrame(aPresShell, aNewFrame); return NS_NewAreaFrame(aPresShell, aNewFrame, 0);
} }
extern nsresult NS_NewBRFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame); extern nsresult NS_NewBRFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);

View File

@ -110,10 +110,9 @@ NS_NewAttributeContent(nsIContent ** aResult);
extern nsresult NS_NewSelectsAreaFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame, extern nsresult NS_NewSelectsAreaFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame,
PRUint32 aFlags = NS_BLOCK_WRAP_SIZE); PRUint32 aFlags = NS_BLOCK_WRAP_SIZE);
// Create a basic area frame. By default, area frames will extend // Create a basic area frame.
// their height to cover any children that "stick out".
extern nsresult NS_NewAreaFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame, extern nsresult NS_NewAreaFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame,
PRUint32 aFlags = NS_BLOCK_SPACE_MGR|NS_BLOCK_WRAP_SIZE); PRUint32 aFlags);
// These AreaFrame's shrink wrap around their contents // These AreaFrame's shrink wrap around their contents
inline nsresult NS_NewTableCellInnerFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame) { inline nsresult NS_NewTableCellInnerFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame) {
@ -140,7 +139,7 @@ inline nsresult NS_NewFloatingItemWrapperFrame(nsIPresShell* aPresShell, nsIFram
// This type of AreaFrame doesn't use its own space manager and // This type of AreaFrame doesn't use its own space manager and
// doesn't shrink wrap. // doesn't shrink wrap.
inline nsresult NS_NewRelativeItemWrapperFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame) { inline nsresult NS_NewRelativeItemWrapperFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame) {
return NS_NewAreaFrame(aPresShell, aNewFrame); return NS_NewAreaFrame(aPresShell, aNewFrame, 0);
} }
extern nsresult NS_NewBRFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame); extern nsresult NS_NewBRFrame(nsIPresShell* aPresShell, nsIFrame** aNewFrame);

View File

@ -6526,48 +6526,8 @@ nsCSSFrameConstructor::ConstructFrameByDisplayType(nsIPresShell* aPre
NS_NewRelativeItemWrapperFrame(aPresShell, &newFrame); NS_NewRelativeItemWrapperFrame(aPresShell, &newFrame);
isBlockFrame = PR_TRUE; isBlockFrame = PR_TRUE;
// Initialize the frame ConstructBlock(aPresShell, aPresContext, aState, aDisplay, aContent,
InitAndRestoreFrame(aPresContext, aState, aContent, adjParentFrame, aStyleContext, newFrame, PR_TRUE);
adjParentFrame, aStyleContext, nsnull, newFrame);
// Create a view
nsHTMLContainerFrame::CreateViewForFrame(aPresContext, newFrame,
aStyleContext, nsnull, PR_FALSE);
// Process the child content. Relatively positioned frames becomes a
// container for child frames that are positioned
nsFrameConstructorSaveState absoluteSaveState;
nsFrameConstructorSaveState floaterSaveState;
nsFrameItems childItems;
aState.PushAbsoluteContainingBlock(newFrame, absoluteSaveState);
PRBool haveFirstLetterStyle, haveFirstLineStyle;
HaveSpecialBlockStyle(aPresContext, aContent, aStyleContext,
&haveFirstLetterStyle, &haveFirstLineStyle);
aState.PushFloaterContainingBlock(newFrame, floaterSaveState,
haveFirstLetterStyle,
haveFirstLineStyle);
ProcessChildren(aPresShell, aPresContext, aState, aContent, newFrame, PR_TRUE,
childItems, isBlockFrame);
nsCOMPtr<nsIAtom> tag;
aContent->GetTag(*getter_AddRefs(tag));
CreateAnonymousFrames(aPresShell, aPresContext, tag, aState, aContent, newFrame,
childItems);
// Set the frame's initial child list
newFrame->SetInitialChildList(aPresContext, nsnull, childItems.childList);
if (aState.mAbsoluteItems.childList) {
newFrame->SetInitialChildList(aPresContext, nsLayoutAtoms::absoluteList,
aState.mAbsoluteItems.childList);
}
if (aState.mFloatedItems.childList) {
newFrame->SetInitialChildList(aPresContext,
nsLayoutAtoms::floaterList,
aState.mFloatedItems.childList);
}
} else { } else {
// Create a positioned inline frame // Create a positioned inline frame
NS_NewPositionedInlineFrame(aPresShell, &newFrame); NS_NewPositionedInlineFrame(aPresShell, &newFrame);
@ -6591,7 +6551,7 @@ nsCSSFrameConstructor::ConstructFrameByDisplayType(nsIPresShell* aPre
nsPseudoFrames savePseudo; nsPseudoFrames savePseudo;
aState.mPseudoFrames.Reset(&savePseudo); aState.mPseudoFrames.Reset(&savePseudo);
rv = ConstructBlock(aPresShell, aPresContext, aState, aDisplay, aContent, rv = ConstructBlock(aPresShell, aPresContext, aState, aDisplay, aContent,
adjParentFrame, aStyleContext, newFrame); adjParentFrame, aStyleContext, newFrame, PR_FALSE);
if (!aState.mPseudoFrames.IsEmpty()) { // process pending pseudo frames if (!aState.mPseudoFrames.IsEmpty()) { // process pending pseudo frames
ProcessPseudoFrames(aPresContext, aState.mPseudoFrames, aFrameItems); ProcessPseudoFrames(aPresContext, aState.mPseudoFrames, aFrameItems);
} }
@ -11502,7 +11462,7 @@ nsCSSFrameConstructor::CreateContinuingFrame(nsIPresShell* aPresShell,
} }
} else if (nsLayoutAtoms::areaFrame == frameType) { } else if (nsLayoutAtoms::areaFrame == frameType) {
rv = NS_NewAreaFrame(aPresShell, &newFrame); rv = NS_NewAreaFrame(aPresShell, &newFrame, 0);
if (NS_SUCCEEDED(rv)) { if (NS_SUCCEEDED(rv)) {
newFrame->Init(aPresContext, content, aParentFrame, styleContext, newFrame->Init(aPresContext, content, aParentFrame, styleContext,
aFrame); aFrame);
@ -13366,14 +13326,15 @@ nsCSSFrameConstructor::CreateListBoxContent(nsIPresContext* aPresContext,
//---------------------------------------- //----------------------------------------
nsresult nsresult
nsCSSFrameConstructor::ConstructBlock(nsIPresShell* aPresShell, nsCSSFrameConstructor::ConstructBlock(nsIPresShell* aPresShell,
nsIPresContext* aPresContext, nsIPresContext* aPresContext,
nsFrameConstructorState& aState, nsFrameConstructorState& aState,
const nsStyleDisplay* aDisplay, const nsStyleDisplay* aDisplay,
nsIContent* aContent, nsIContent* aContent,
nsIFrame* aParentFrame, nsIFrame* aParentFrame,
nsIStyleContext* aStyleContext, nsIStyleContext* aStyleContext,
nsIFrame* aNewFrame) nsIFrame* aNewFrame,
PRBool aRelPos)
{ {
InitAndRestoreFrame(aPresContext, aState, aContent, InitAndRestoreFrame(aPresContext, aState, aContent,
aParentFrame, aStyleContext, nsnull, aNewFrame); aParentFrame, aStyleContext, nsnull, aNewFrame);
@ -13394,8 +13355,10 @@ nsCSSFrameConstructor::ConstructBlock(nsIPresShell* aPresShell,
// ...and that we're the absolute containing block. // ...and that we're the absolute containing block.
nsFrameConstructorSaveState absoluteSaveState; nsFrameConstructorSaveState absoluteSaveState;
if (! aState.mAbsoluteItems.containingBlock) if (aRelPos || !aState.mAbsoluteItems.containingBlock) {
NS_ASSERTION(aRelPos, "should have made area frame for this");
aState.PushAbsoluteContainingBlock(aNewFrame, absoluteSaveState); aState.PushAbsoluteContainingBlock(aNewFrame, absoluteSaveState);
}
// See if the block has first-letter style applied to it... // See if the block has first-letter style applied to it...
PRBool haveFirstLetterStyle, haveFirstLineStyle; PRBool haveFirstLetterStyle, haveFirstLineStyle;
@ -13425,6 +13388,11 @@ nsCSSFrameConstructor::ConstructBlock(nsIPresShell* aPresShell,
nsLayoutAtoms::floaterList, nsLayoutAtoms::floaterList,
aState.mFloatedItems.childList); aState.mFloatedItems.childList);
} }
// and the same for absolutely positioned children.
if (aRelPos && aState.mAbsoluteItems.childList) {
aNewFrame->SetInitialChildList(aPresContext, nsLayoutAtoms::absoluteList,
aState.mAbsoluteItems.childList);
}
return rv; return rv;
} }

View File

@ -823,7 +823,8 @@ protected:
nsIContent* aContent, nsIContent* aContent,
nsIFrame* aParentFrame, nsIFrame* aParentFrame,
nsIStyleContext* aStyleContext, nsIStyleContext* aStyleContext,
nsIFrame* aNewFrame); nsIFrame* aNewFrame,
PRBool aRelPos);
nsresult ProcessBlockChildren(nsIPresShell* aPresShell, nsresult ProcessBlockChildren(nsIPresShell* aPresShell,
nsIPresContext* aPresContext, nsIPresContext* aPresContext,