don't rely on framconstructor to deliver a valid sibling for insert of colgroups and rowgroups as they are siblings contentwise but live on different childlists, bug 337124 r/sr=roc

This commit is contained in:
bmlk%gmx.de 2006-11-11 13:38:09 +00:00
parent b8f9995da5
commit d3be21f08f

View File

@ -2539,7 +2539,52 @@ nsTableFrame::InsertFrames(nsIAtom* aListName,
// See what kind of frame we have
const nsStyleDisplay* display = aFrameList->GetStyleDisplay();
if (aPrevFrame) {
const nsStyleDisplay* prevDisplay = aPrevFrame->GetStyleDisplay();
if (display->mDisplay != prevDisplay->mDisplay) {
// the previous frame is not valid, see comment at ::AppendFrames
nsIFrame* pseudoFrame = aFrameList;
nsIContent* parentContent = GetContent();
nsIContent* content;
aPrevFrame = nsnull;
while (pseudoFrame && (parentContent ==
(content = pseudoFrame->GetContent()))) {
pseudoFrame = pseudoFrame->GetFirstChild(nsnull);
}
nsCOMPtr<nsIContent> container = content->GetParent();
PRInt32 newIndex = container->IndexOf(content);
nsIFrame* kidFrame;
PRBool isColGroup = (NS_STYLE_DISPLAY_TABLE_COLUMN_GROUP ==
display->mDisplay);
if (isColGroup) {
kidFrame = mColGroups.FirstChild();
}
else {
kidFrame = mFrames.FirstChild();
}
PRInt32 lastIndex = 0;
while (kidFrame) {
if (isColGroup) {
nsTableColGroupType groupType =
((nsTableColGroupFrame *)kidFrame)->GetColType();
if (eColGroupAnonymousCell == groupType) {
continue;
}
}
pseudoFrame = kidFrame;
while (pseudoFrame && (parentContent ==
(content = pseudoFrame->GetContent()))) {
pseudoFrame = pseudoFrame->GetFirstChild(nsnull);
}
PRInt32 index = container->IndexOf(content);
if (index > lastIndex && index < newIndex) {
lastIndex = index;
aPrevFrame = kidFrame;
}
kidFrame = kidFrame->GetNextSibling();
}
}
}
if (NS_STYLE_DISPLAY_TABLE_COLUMN_GROUP == display->mDisplay) {
NS_ASSERTION(!aListName || aListName == nsLayoutAtoms::colGroupList,
"unexpected child list");