Make frames know whether they're leaves or not from the frame construction
point of view; use this in the frame constructor. Bug 265367, r+sr=dbaron
This commit is contained in:
@@ -857,13 +857,14 @@ nsPseudoFrameData::Dump()
|
||||
{
|
||||
nsIFrame* main = nsnull;
|
||||
nsIFrame* second = nsnull;
|
||||
printf(" %p\n", mFrame);
|
||||
printf(" %p\n", NS_STATIC_CAST(void*, mFrame));
|
||||
main = mChildList.childList;
|
||||
|
||||
|
||||
second = mChildList2.childList;
|
||||
while (main || second) {
|
||||
printf(" %p %p\n", main, second);
|
||||
printf(" %p %p\n", NS_STATIC_CAST(void*, main),
|
||||
NS_STATIC_CAST(void*, second));
|
||||
if (main)
|
||||
main = main->GetNextSibling();
|
||||
if (second)
|
||||
@@ -2618,7 +2619,8 @@ ProcessPseudoFrames(nsFrameConstructorState& aState,
|
||||
|
||||
#ifdef DEBUG
|
||||
if (gTablePseudoFrame) {
|
||||
printf("*** ProcessPseudoFrames complete leave, highestframe:%p***\n",highestFrame);
|
||||
printf("*** ProcessPseudoFrames complete leave, highestframe:%p***\n",
|
||||
NS_STATIC_CAST(void*, highestFrame));
|
||||
aState.mPseudoFrames.Dump();
|
||||
}
|
||||
#endif
|
||||
@@ -2657,7 +2659,8 @@ ProcessPseudoFrames(nsFrameConstructorState& aState,
|
||||
|
||||
#ifdef DEBUG
|
||||
if (gTablePseudoFrame) {
|
||||
printf("*** ProcessPseudoFrames limited leave:%p***\n",highestFrame);
|
||||
printf("*** ProcessPseudoFrames limited leave:%p***\n",
|
||||
NS_STATIC_CAST(void*, highestFrame));
|
||||
aState.mPseudoFrames.Dump();
|
||||
}
|
||||
#endif
|
||||
@@ -5042,10 +5045,8 @@ nsCSSFrameConstructor::InitializeSelectFrame(nsFrameConstructorState& aState,
|
||||
|
||||
// if a select is being created with zero options we need to create
|
||||
// a special pseudo frame so it can be sized as best it can
|
||||
nsCOMPtr<nsIDOMHTMLSelectElement> selectElement;
|
||||
nsresult result = aContent->QueryInterface(NS_GET_IID(nsIDOMHTMLSelectElement),
|
||||
(void**)getter_AddRefs(selectElement));
|
||||
if (NS_SUCCEEDED(result) && selectElement) {
|
||||
nsCOMPtr<nsIDOMHTMLSelectElement> selectElement(do_QueryInterface(aContent));
|
||||
if (selectElement) {
|
||||
AddDummyFrameToSelect(aState, scrollFrame, scrolledFrame, &childItems,
|
||||
aContent, selectElement);
|
||||
}
|
||||
@@ -5238,7 +5239,6 @@ nsCSSFrameConstructor::ConstructHTMLFrame(nsFrameConstructorState& aState,
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
PRBool processChildren = PR_FALSE; // whether we should process child content
|
||||
PRBool frameHasBeenInitialized = PR_FALSE;
|
||||
nsIFrame* newFrame = nsnull; // the frame we construct
|
||||
PRBool isReplaced = PR_FALSE;
|
||||
@@ -5336,7 +5336,6 @@ nsCSSFrameConstructor::ConstructHTMLFrame(nsFrameConstructorState& aState,
|
||||
ProcessPseudoFrames(aState, aFrameItems);
|
||||
}
|
||||
rv = NS_NewLegendFrame(mPresShell, &newFrame);
|
||||
processChildren = PR_TRUE;
|
||||
isFloatContainer = PR_TRUE;
|
||||
}
|
||||
else if (nsHTMLAtoms::frameset == aTag) {
|
||||
@@ -5384,7 +5383,6 @@ nsCSSFrameConstructor::ConstructHTMLFrame(nsFrameConstructorState& aState,
|
||||
// so it must be replaced or html outside it will
|
||||
// draw into its borders. -EDV
|
||||
isReplaced = PR_TRUE;
|
||||
processChildren = PR_TRUE;
|
||||
isFloatContainer = PR_TRUE;
|
||||
}
|
||||
else if (nsHTMLAtoms::isindex == aTag) {
|
||||
@@ -5413,6 +5411,9 @@ nsCSSFrameConstructor::ConstructHTMLFrame(nsFrameConstructorState& aState,
|
||||
newFrame->AddStateBits(NS_FRAME_REPLACED_ELEMENT);
|
||||
}
|
||||
|
||||
// Note: at this point we should construct kids for newFrame only if
|
||||
// it's not a leaf and hasn't been initialized yet.
|
||||
|
||||
if (!frameHasBeenInitialized) {
|
||||
NS_ASSERTION(!addedToFrameList,
|
||||
"Frames that were already added to the frame list should be "
|
||||
@@ -5456,7 +5457,7 @@ nsCSSFrameConstructor::ConstructHTMLFrame(nsFrameConstructorState& aState,
|
||||
nsFrameItems childItems;
|
||||
nsFrameConstructorSaveState absoluteSaveState;
|
||||
nsFrameConstructorSaveState floatSaveState;
|
||||
if (processChildren) {
|
||||
if (!newFrame->IsLeaf()) {
|
||||
if (display->IsPositioned()) {
|
||||
aState.PushAbsoluteContainingBlock(newFrame, absoluteSaveState);
|
||||
}
|
||||
@@ -5496,7 +5497,7 @@ nsCSSFrameConstructor::ConstructHTMLFrame(nsFrameConstructorState& aState,
|
||||
}
|
||||
}
|
||||
|
||||
if (newFrame) {
|
||||
if (newFrame && !newFrame->IsLeaf()) {
|
||||
rv = CreateInsertionPointChildren(aState, newFrame, aContent);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
@@ -5715,8 +5716,6 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
PRBool& aHaltProcessing)
|
||||
{
|
||||
PRBool primaryFrameSet = PR_FALSE;
|
||||
PRBool processChildren = PR_FALSE; // whether we should process child content
|
||||
PRBool processAnonymousChildren = PR_FALSE; // whether or not we process anonymous content.
|
||||
nsresult rv = NS_OK;
|
||||
PRBool isPopup = PR_FALSE;
|
||||
PRBool isReplaced = PR_FALSE;
|
||||
@@ -5752,7 +5751,6 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
#ifdef MOZ_XUL
|
||||
// BUTTON CONSTRUCTION
|
||||
if (aTag == nsXULAtoms::button || aTag == nsXULAtoms::checkbox || aTag == nsXULAtoms::radio) {
|
||||
processChildren = PR_TRUE;
|
||||
isReplaced = PR_TRUE;
|
||||
rv = NS_NewButtonBoxFrame(mPresShell, &newFrame);
|
||||
|
||||
@@ -5761,7 +5759,6 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
} // End of BUTTON CONSTRUCTION logic
|
||||
// AUTOREPEATBUTTON CONSTRUCTION
|
||||
else if (aTag == nsXULAtoms::autorepeatbutton) {
|
||||
processChildren = PR_TRUE;
|
||||
isReplaced = PR_TRUE;
|
||||
rv = NS_NewAutoRepeatBoxFrame(mPresShell, &newFrame);
|
||||
|
||||
@@ -5772,7 +5769,6 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
|
||||
// TITLEBAR CONSTRUCTION
|
||||
else if (aTag == nsXULAtoms::titlebar) {
|
||||
processChildren = PR_TRUE;
|
||||
isReplaced = PR_TRUE;
|
||||
rv = NS_NewTitleBarFrame(mPresShell, &newFrame);
|
||||
|
||||
@@ -5782,7 +5778,6 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
|
||||
// RESIZER CONSTRUCTION
|
||||
else if (aTag == nsXULAtoms::resizer) {
|
||||
processChildren = PR_TRUE;
|
||||
isReplaced = PR_TRUE;
|
||||
rv = NS_NewResizerFrame(mPresShell, &newFrame);
|
||||
|
||||
@@ -5805,7 +5800,6 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
}
|
||||
else if (aTag == nsXULAtoms::treecol) {
|
||||
isReplaced = PR_TRUE;
|
||||
processChildren = PR_TRUE;
|
||||
rv = NS_NewTreeColFrame(mPresShell, &newFrame);
|
||||
}
|
||||
// TEXT CONSTRUCTION
|
||||
@@ -5813,7 +5807,6 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
aTag == nsXULAtoms::description) {
|
||||
if ((aTag == nsHTMLAtoms::label || aTag == nsXULAtoms::description) &&
|
||||
(! aContent->HasAttr(kNameSpaceID_None, nsHTMLAtoms::value))) {
|
||||
processChildren = PR_TRUE;
|
||||
rv = NS_NewAreaFrame(mPresShell, &newFrame,
|
||||
NS_BLOCK_SPACE_MGR | NS_BLOCK_SHRINK_WRAP | NS_BLOCK_MARGIN_ROOT);
|
||||
}
|
||||
@@ -5831,7 +5824,6 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
// A derived class box frame
|
||||
// that has custom reflow to prevent menu children
|
||||
// from becoming part of the flow.
|
||||
processChildren = PR_TRUE; // Will need this to be custom.
|
||||
isReplaced = PR_TRUE;
|
||||
rv = NS_NewMenuFrame(mPresShell, &newFrame, (aTag != nsXULAtoms::menuitem));
|
||||
}
|
||||
@@ -5860,12 +5852,10 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
}
|
||||
#endif
|
||||
|
||||
processChildren = PR_TRUE;
|
||||
rv = NS_NewMenuBarFrame(mPresShell, &newFrame);
|
||||
}
|
||||
else if (aTag == nsXULAtoms::popupgroup) {
|
||||
// This frame contains child popups
|
||||
processChildren = PR_TRUE;
|
||||
isReplaced = PR_TRUE;
|
||||
rv = NS_NewPopupSetFrame(mPresShell, &newFrame);
|
||||
}
|
||||
@@ -5877,7 +5867,6 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
}
|
||||
// PROGRESS METER CONSTRUCTION
|
||||
else if (aTag == nsXULAtoms::progressmeter) {
|
||||
processChildren = PR_TRUE;
|
||||
isReplaced = PR_TRUE;
|
||||
rv = NS_NewProgressMeterFrame(mPresShell, &newFrame);
|
||||
}
|
||||
@@ -5886,7 +5875,6 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
#endif
|
||||
// SLIDER CONSTRUCTION
|
||||
if (aTag == nsXULAtoms::slider) {
|
||||
processChildren = PR_TRUE;
|
||||
isReplaced = PR_TRUE;
|
||||
rv = NS_NewSliderFrame(mPresShell, &newFrame);
|
||||
}
|
||||
@@ -5894,12 +5882,10 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
|
||||
// SCROLLBAR CONSTRUCTION
|
||||
else if (aTag == nsXULAtoms::scrollbar) {
|
||||
processChildren = PR_TRUE;
|
||||
isReplaced = PR_TRUE;
|
||||
rv = NS_NewScrollbarFrame(mPresShell, &newFrame);
|
||||
}
|
||||
else if (aTag == nsXULAtoms::nativescrollbar) {
|
||||
processChildren = PR_TRUE;
|
||||
isReplaced = PR_TRUE;
|
||||
rv = NS_NewNativeScrollbarFrame(mPresShell, &newFrame);
|
||||
}
|
||||
@@ -5907,7 +5893,6 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
|
||||
// SCROLLBUTTON CONSTRUCTION
|
||||
else if (aTag == nsXULAtoms::scrollbarbutton) {
|
||||
processChildren = PR_TRUE;
|
||||
isReplaced = PR_TRUE;
|
||||
rv = NS_NewScrollbarButtonFrame(mPresShell, &newFrame);
|
||||
}
|
||||
@@ -5916,7 +5901,6 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
#ifdef MOZ_XUL
|
||||
// SPLITTER CONSTRUCTION
|
||||
else if (aTag == nsXULAtoms::splitter) {
|
||||
processChildren = PR_TRUE;
|
||||
isReplaced = PR_TRUE;
|
||||
rv = NS_NewSplitterFrame(mPresShell, &newFrame);
|
||||
}
|
||||
@@ -5924,7 +5908,6 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
|
||||
// GRIPPY CONSTRUCTION
|
||||
else if (aTag == nsXULAtoms::grippy) {
|
||||
processChildren = PR_TRUE;
|
||||
isReplaced = PR_TRUE;
|
||||
rv = NS_NewGrippyFrame(mPresShell, &newFrame);
|
||||
}
|
||||
@@ -5937,7 +5920,6 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
if (!newFrame && isXULDisplay) {
|
||||
if (display->mDisplay == NS_STYLE_DISPLAY_INLINE_BOX ||
|
||||
display->mDisplay == NS_STYLE_DISPLAY_BOX) {
|
||||
processChildren = PR_TRUE;
|
||||
isReplaced = PR_TRUE;
|
||||
|
||||
rv = NS_NewBoxFrame(mPresShell, &newFrame, PR_FALSE, nsnull);
|
||||
@@ -5949,7 +5931,6 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
// ------- Begin Grid ---------
|
||||
else if (display->mDisplay == NS_STYLE_DISPLAY_INLINE_GRID ||
|
||||
display->mDisplay == NS_STYLE_DISPLAY_GRID) {
|
||||
processChildren = PR_TRUE;
|
||||
isReplaced = PR_TRUE;
|
||||
nsCOMPtr<nsIBoxLayout> layout;
|
||||
NS_NewGridLayout2(mPresShell, getter_AddRefs(layout));
|
||||
@@ -5961,7 +5942,6 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
|
||||
// ------- Begin Rows/Columns ---------
|
||||
else if (display->mDisplay == NS_STYLE_DISPLAY_GRID_GROUP) {
|
||||
processChildren = PR_TRUE;
|
||||
isReplaced = PR_TRUE;
|
||||
|
||||
nsCOMPtr<nsIBoxLayout> layout;
|
||||
@@ -5972,7 +5952,6 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
rv = NS_NewListBoxBodyFrame(mPresShell, &newFrame, PR_FALSE, layout);
|
||||
((nsListBoxBodyFrame*)newFrame)->InitGroup(this,
|
||||
aState.mPresContext);
|
||||
processChildren = PR_FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -5997,7 +5976,6 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
|
||||
// ------- Begin Row/Column ---------
|
||||
else if (display->mDisplay == NS_STYLE_DISPLAY_GRID_LINE) {
|
||||
processChildren = PR_TRUE;
|
||||
isReplaced = PR_TRUE;
|
||||
|
||||
nsCOMPtr<nsIBoxLayout> layout;
|
||||
@@ -6016,14 +5994,12 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
// End of STACK CONSTRUCTION logic
|
||||
// DECK CONSTRUCTION
|
||||
else if (display->mDisplay == NS_STYLE_DISPLAY_DECK) {
|
||||
processChildren = PR_TRUE;
|
||||
isReplaced = PR_TRUE;
|
||||
rv = NS_NewDeckFrame(mPresShell, &newFrame);
|
||||
}
|
||||
// End of DECK CONSTRUCTION logic
|
||||
else if (display->mDisplay == NS_STYLE_DISPLAY_GROUPBOX) {
|
||||
rv = NS_NewGroupBoxFrame(mPresShell, &newFrame);
|
||||
processChildren = PR_TRUE;
|
||||
isReplaced = PR_TRUE;
|
||||
|
||||
// Boxes can scroll.
|
||||
@@ -6032,10 +6008,8 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
// STACK CONSTRUCTION
|
||||
else if (display->mDisplay == NS_STYLE_DISPLAY_STACK ||
|
||||
display->mDisplay == NS_STYLE_DISPLAY_INLINE_STACK) {
|
||||
processChildren = PR_TRUE;
|
||||
isReplaced = PR_TRUE;
|
||||
|
||||
|
||||
rv = NS_NewStackFrame(mPresShell, &newFrame);
|
||||
|
||||
mayBeScrollable = PR_TRUE;
|
||||
@@ -6043,7 +6017,6 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
else if (display->mDisplay == NS_STYLE_DISPLAY_POPUP) {
|
||||
// This is its own frame that derives from
|
||||
// box.
|
||||
processChildren = PR_TRUE;
|
||||
isReplaced = PR_TRUE;
|
||||
rv = NS_NewMenuPopupFrame(mPresShell, &newFrame);
|
||||
|
||||
@@ -6186,23 +6159,24 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
#endif
|
||||
|
||||
// Process the child content if requested
|
||||
if (processChildren || processAnonymousChildren) {
|
||||
nsFrameItems childItems;
|
||||
if (processChildren) {
|
||||
mDocument->BindingManager()->ShouldBuildChildFrames(aContent,
|
||||
&processChildren);
|
||||
if (processChildren)
|
||||
rv = ProcessChildren(aState, aContent, newFrame, PR_FALSE,
|
||||
childItems, PR_FALSE);
|
||||
}
|
||||
|
||||
CreateAnonymousFrames(aTag, aState, aContent, newFrame, PR_FALSE,
|
||||
childItems);
|
||||
|
||||
// Set the frame's initial child list
|
||||
newFrame->SetInitialChildList(aState.mPresContext, nsnull,
|
||||
childItems.childList);
|
||||
nsFrameItems childItems;
|
||||
if (!newFrame->IsLeaf()) {
|
||||
// XXXbz don't we need calls to ShouldBuildChildFrames
|
||||
// elsewhere too? Why only for XUL?
|
||||
PRBool processChildren = PR_TRUE;
|
||||
mDocument->BindingManager()->ShouldBuildChildFrames(aContent,
|
||||
&processChildren);
|
||||
if (processChildren)
|
||||
rv = ProcessChildren(aState, aContent, newFrame, PR_FALSE,
|
||||
childItems, PR_FALSE);
|
||||
}
|
||||
|
||||
CreateAnonymousFrames(aTag, aState, aContent, newFrame, PR_FALSE,
|
||||
childItems);
|
||||
|
||||
// Set the frame's initial child list
|
||||
newFrame->SetInitialChildList(aState.mPresContext, nsnull,
|
||||
childItems.childList);
|
||||
}
|
||||
|
||||
#ifdef MOZ_XUL
|
||||
@@ -6225,7 +6199,7 @@ nsCSSFrameConstructor::ConstructXULFrame(nsFrameConstructorState& aState,
|
||||
|
||||
// addToHashTable:
|
||||
|
||||
if (newFrame) {
|
||||
if (newFrame && !newFrame->IsLeaf()) {
|
||||
rv = CreateInsertionPointChildren(aState, newFrame, aContent);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
}
|
||||
@@ -6790,12 +6764,6 @@ nsCSSFrameConstructor::ConstructMathMLFrame(nsFrameConstructorState& aState,
|
||||
if (aNameSpaceID != kNameSpaceID_MathML)
|
||||
return NS_OK;
|
||||
|
||||
PRBool processChildren = PR_TRUE; // Whether we should process child content.
|
||||
// MathML frames are inline frames.
|
||||
// processChildren = PR_TRUE for inline frames.
|
||||
// see case NS_STYLE_DISPLAY_INLINE in
|
||||
// ConstructFrameByDisplayType()
|
||||
|
||||
nsresult rv = NS_OK;
|
||||
PRBool isReplaced = PR_FALSE;
|
||||
PRBool ignoreInterTagWhitespace = PR_TRUE;
|
||||
@@ -6952,15 +6920,13 @@ nsCSSFrameConstructor::ConstructMathMLFrame(nsFrameConstructorState& aState,
|
||||
return rv;
|
||||
}
|
||||
|
||||
// Process the child content if requested
|
||||
// MathML frames are inline frames, so just process their kids
|
||||
nsFrameItems childItems;
|
||||
if (processChildren) {
|
||||
rv = ProcessChildren(aState, aContent, newFrame, PR_TRUE,
|
||||
childItems, PR_FALSE);
|
||||
rv = ProcessChildren(aState, aContent, newFrame, PR_TRUE,
|
||||
childItems, PR_FALSE);
|
||||
|
||||
CreateAnonymousFrames(aTag, aState, aContent, newFrame, PR_FALSE,
|
||||
childItems);
|
||||
}
|
||||
CreateAnonymousFrames(aTag, aState, aContent, newFrame, PR_FALSE,
|
||||
childItems);
|
||||
|
||||
// Set the frame's initial child list
|
||||
newFrame->SetInitialChildList(aState.mPresContext, nsnull,
|
||||
@@ -7245,7 +7211,6 @@ nsCSSFrameConstructor::ConstructSVGFrame(nsFrameConstructorState& aState,
|
||||
|
||||
nsresult rv = NS_OK;
|
||||
PRBool forceView = PR_FALSE;
|
||||
PRBool processChildren = PR_FALSE;
|
||||
PRBool isOuterSVGNode = PR_FALSE;
|
||||
const nsStyleDisplay* disp = aStyleContext->GetStyleDisplay();
|
||||
|
||||
@@ -7265,7 +7230,6 @@ nsCSSFrameConstructor::ConstructSVGFrame(nsFrameConstructorState& aState,
|
||||
|
||||
if (aTag == nsSVGAtoms::svg) {
|
||||
nsCOMPtr<nsISVGContainerFrame> container = do_QueryInterface(aParentFrame);
|
||||
processChildren = PR_TRUE;
|
||||
if (!container) {
|
||||
// This is the outermost <svg> element.
|
||||
isOuterSVGNode = PR_TRUE;
|
||||
@@ -7282,7 +7246,6 @@ nsCSSFrameConstructor::ConstructSVGFrame(nsFrameConstructorState& aState,
|
||||
}
|
||||
}
|
||||
else if (aTag == nsSVGAtoms::g) {
|
||||
processChildren = PR_TRUE;
|
||||
rv = NS_NewSVGGFrame(mPresShell, aContent, &newFrame);
|
||||
}
|
||||
else if (aTag == nsSVGAtoms::polygon)
|
||||
@@ -7292,7 +7255,6 @@ nsCSSFrameConstructor::ConstructSVGFrame(nsFrameConstructorState& aState,
|
||||
else if (aTag == nsSVGAtoms::circle)
|
||||
rv = NS_NewSVGCircleFrame(mPresShell, aContent, &newFrame);
|
||||
else if (aTag == nsSVGAtoms::defs) {
|
||||
processChildren = PR_TRUE;
|
||||
rv = NS_NewSVGDefsFrame(mPresShell, aContent, &newFrame);
|
||||
}
|
||||
else if (aTag == nsSVGAtoms::ellipse)
|
||||
@@ -7303,44 +7265,36 @@ nsCSSFrameConstructor::ConstructSVGFrame(nsFrameConstructorState& aState,
|
||||
rv = NS_NewSVGRectFrame(mPresShell, aContent, &newFrame);
|
||||
#ifdef MOZ_SVG_FOREIGNOBJECT
|
||||
else if (aTag == nsSVGAtoms::foreignObject) {
|
||||
processChildren = PR_TRUE;
|
||||
rv = NS_NewSVGForeignObjectFrame(mPresShell, aContent, &newFrame);
|
||||
}
|
||||
#endif
|
||||
else if (aTag == nsSVGAtoms::path)
|
||||
rv = NS_NewSVGPathFrame(mPresShell, aContent, &newFrame);
|
||||
else if (aTag == nsSVGAtoms::text) {
|
||||
processChildren = PR_TRUE;
|
||||
rv = NS_NewSVGTextFrame(mPresShell, aContent, &newFrame);
|
||||
}
|
||||
else if (aTag == nsSVGAtoms::tspan) {
|
||||
processChildren = PR_TRUE;
|
||||
rv = NS_NewSVGTSpanFrame(mPresShell, aContent, aParentFrame, &newFrame);
|
||||
}
|
||||
else if (aTag == nsSVGAtoms::linearGradient) {
|
||||
processChildren = PR_TRUE;
|
||||
rv = NS_NewSVGLinearGradientFrame(mPresShell, aContent, &newFrame);
|
||||
}
|
||||
else if (aTag == nsSVGAtoms::radialGradient) {
|
||||
processChildren = PR_TRUE;
|
||||
rv = NS_NewSVGRadialGradientFrame(mPresShell, aContent, &newFrame);
|
||||
}
|
||||
else if (aTag == nsSVGAtoms::stop) {
|
||||
rv = NS_NewSVGStopFrame(mPresShell, aContent, aParentFrame, &newFrame);
|
||||
}
|
||||
else if (aTag == nsSVGAtoms::use) {
|
||||
processChildren = PR_TRUE;
|
||||
rv = NS_NewSVGUseFrame(mPresShell, aContent, &newFrame);
|
||||
}
|
||||
else if (aTag == nsSVGAtoms::marker) {
|
||||
processChildren = PR_TRUE;
|
||||
rv = NS_NewSVGMarkerFrame(mPresShell, aContent, &newFrame);
|
||||
}
|
||||
else if (aTag == nsSVGAtoms::image) {
|
||||
rv = NS_NewSVGImageFrame(mPresShell, aContent, &newFrame);
|
||||
}
|
||||
else if (aTag == nsSVGAtoms::clipPath) {
|
||||
processChildren = PR_TRUE;
|
||||
rv = NS_NewSVGClipPathFrame(mPresShell, aContent, &newFrame);
|
||||
}
|
||||
|
||||
@@ -7359,7 +7313,6 @@ nsCSSFrameConstructor::ConstructSVGFrame(nsFrameConstructorState& aState,
|
||||
// aTag->ToString(str);
|
||||
// printf("%s>\n", NS_ConvertUCS2toUTF8(str).get());
|
||||
#endif
|
||||
processChildren = PR_TRUE;
|
||||
rv = NS_NewSVGGenericContainerFrame(mPresShell, aContent, &newFrame);
|
||||
}
|
||||
// If we succeeded in creating a frame then initialize it, process its
|
||||
@@ -7390,9 +7343,9 @@ nsCSSFrameConstructor::ConstructSVGFrame(nsFrameConstructorState& aState,
|
||||
|
||||
nsHTMLContainerFrame::CreateViewForFrame(newFrame, aParentFrame, forceView);
|
||||
|
||||
// Process the child content if requested
|
||||
// Process the child content if requested.
|
||||
nsFrameItems childItems;
|
||||
if (processChildren) {
|
||||
if (!newFrame->IsLeaf()) {
|
||||
if (aTag == nsSVGAtoms::svgSwitch) {
|
||||
rv = SVGSwitchProcessChildren(aState, aContent, newFrame,
|
||||
childItems);
|
||||
@@ -7401,16 +7354,17 @@ nsCSSFrameConstructor::ConstructSVGFrame(nsFrameConstructorState& aState,
|
||||
PR_FALSE);
|
||||
}
|
||||
|
||||
CreateAnonymousFrames(aTag, aState, aContent, newFrame,
|
||||
PR_FALSE, childItems);
|
||||
}
|
||||
CreateAnonymousFrames(aTag, aState, aContent, newFrame,
|
||||
PR_FALSE, childItems);
|
||||
|
||||
// Set the frame's initial child list
|
||||
newFrame->SetInitialChildList(aState.mPresContext, nsnull,
|
||||
childItems.childList);
|
||||
}
|
||||
|
||||
rv = CreateInsertionPointChildren(aState, newFrame, aContent);
|
||||
if (!newFrame->IsLeaf())
|
||||
rv = CreateInsertionPointChildren(aState, newFrame, aContent);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
@@ -8432,6 +8386,11 @@ nsCSSFrameConstructor::ContentAppended(nsIContent* aContainer,
|
||||
|
||||
parentFrame = insertionPoint;
|
||||
|
||||
if (parentFrame->IsLeaf()) {
|
||||
// Nothing to do here; we shouldn't be constructing kids of leaves
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// If the frame we are manipulating is a ``special'' frame (that
|
||||
// is, one that's been created as a result of a block-in-inline
|
||||
// situation) then do something different instead of just
|
||||
@@ -8493,17 +8452,7 @@ nsCSSFrameConstructor::ContentAppended(nsIContent* aContainer,
|
||||
// Get the parent frame's last-in-flow
|
||||
parentFrame = parentFrame->GetLastInFlow();
|
||||
|
||||
// If we didn't process children when we originally created the frame,
|
||||
// then don't do any processing now
|
||||
nsIAtom* frameType = parentFrame->GetType();
|
||||
if (frameType == nsLayoutAtoms::objectFrame ||
|
||||
frameType == nsLayoutAtoms::tableColFrame ||
|
||||
frameType == nsLayoutAtoms::HTMLCanvasFrame ||
|
||||
frameType == nsLayoutAtoms::textInputFrame) {
|
||||
// This handles APPLET, EMBED, OBJECT, COL, CANVAS, TEXTAREA and
|
||||
// <INPUT TYPE=text>
|
||||
return NS_OK;
|
||||
}
|
||||
// Deal with inner/outer tables, fieldsets
|
||||
parentFrame = ::GetAdjustedParentFrame(parentFrame, frameType,
|
||||
aContainer, aNewIndexInContainer);
|
||||
@@ -9078,23 +9027,16 @@ nsCSSFrameConstructor::ContentInserted(nsIContent* aContainer,
|
||||
else {
|
||||
// No previous or next sibling, so treat this like an appended frame.
|
||||
isAppend = PR_TRUE;
|
||||
|
||||
// If we didn't process children when we originally created the frame,
|
||||
// then don't do any processing now
|
||||
nsIAtom* frameType = parentFrame->GetType();
|
||||
if (frameType == nsLayoutAtoms::objectFrame ||
|
||||
frameType == nsLayoutAtoms::tableColFrame ||
|
||||
frameType == nsLayoutAtoms::HTMLCanvasFrame ||
|
||||
frameType == nsLayoutAtoms::textInputFrame) {
|
||||
// This handles APPLET, EMBED, OBJECT, COL, CANVAS, TEXTAREA, and
|
||||
// <INPUT TYPE=text>
|
||||
return NS_OK;
|
||||
}
|
||||
// Deal with inner/outer tables, fieldsets
|
||||
parentFrame = ::GetAdjustedParentFrame(parentFrame, frameType,
|
||||
parentFrame = ::GetAdjustedParentFrame(parentFrame, parentFrame->GetType(),
|
||||
aContainer, aIndexInContainer);
|
||||
}
|
||||
|
||||
// Don't construct kids of leaves
|
||||
if (parentFrame->IsLeaf()) {
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
// If the frame we are manipulating is a special frame then see if we need to reframe
|
||||
// NOTE: if we are in ReinsertContent, then don't reframe as we are already doing just that!
|
||||
if (handleSpecialFrame) {
|
||||
@@ -11764,6 +11706,7 @@ nsCSSFrameConstructor::ProcessChildren(nsFrameConstructorState& aState,
|
||||
PRBool aParentIsBlock,
|
||||
nsTableCreator* aTableCreator)
|
||||
{
|
||||
NS_PRECONDITION(!aFrame->IsLeaf(), "Bogus ProcessChildren caller!");
|
||||
// XXXbz ideally, this would do all the pushing of various
|
||||
// containing blocks as needed, so callers don't have to do it...
|
||||
nsresult rv = NS_OK;
|
||||
|
||||
Reference in New Issue
Block a user