From b12dd3ebe75b6d8a072c54796fedf23b41bbdf50 Mon Sep 17 00:00:00 2001 From: "bzbarsky%mit.edu" Date: Thu, 15 Aug 2002 02:28:54 +0000 Subject: [PATCH] Fix crash; we may have a #text node. Bug 159359, r=sicking, sr=jst --- layout/base/nsCSSFrameConstructor.cpp | 25 +++++++++++++------ .../html/style/src/nsCSSFrameConstructor.cpp | 25 +++++++++++++------ 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/layout/base/nsCSSFrameConstructor.cpp b/layout/base/nsCSSFrameConstructor.cpp index 2fc4b7bd2da3..9ee3494d7f42 100644 --- a/layout/base/nsCSSFrameConstructor.cpp +++ b/layout/base/nsCSSFrameConstructor.cpp @@ -3187,15 +3187,24 @@ nsCSSFrameConstructor::TableProcessChild(nsIPresShell* aPresShell, // NOT create psuedoframe for it. // see bug 159359 nsCOMPtr parentNodeInfo, childNodeInfo; - aParentContent->GetNodeInfo(*getter_AddRefs(parentNodeInfo)); aChildContent->GetNodeInfo(*getter_AddRefs(childNodeInfo)); - if (childNodeInfo->Equals(nsHTMLAtoms::form, kNameSpaceID_None) && - (parentNodeInfo->Equals(nsHTMLAtoms::table, kNameSpaceID_None) || - parentNodeInfo->Equals(nsHTMLAtoms::tr, kNameSpaceID_None) || - parentNodeInfo->Equals(nsHTMLAtoms::tbody, kNameSpaceID_None) || - parentNodeInfo->Equals(nsHTMLAtoms::thead, kNameSpaceID_None) || - parentNodeInfo->Equals(nsHTMLAtoms::tfoot, kNameSpaceID_None))) { - break; + // Sometimes aChildContent is a #text node. In those cases it + // does not have a nodeinfo, and in those cases we want to + // construct a foreign frame for it in any case. So we can just + // null-check the nodeinfo here. + NS_ASSERTION(childNodeInfo || + aChildContent->IsContentOfType(nsIContent::eTEXT), + "Non-#text nodes should have a nodeinfo here!"); + if (childNodeInfo) { + aParentContent->GetNodeInfo(*getter_AddRefs(parentNodeInfo)); + if (childNodeInfo->Equals(nsHTMLAtoms::form, kNameSpaceID_None) && + (parentNodeInfo->Equals(nsHTMLAtoms::table, kNameSpaceID_None) || + parentNodeInfo->Equals(nsHTMLAtoms::tr, kNameSpaceID_None) || + parentNodeInfo->Equals(nsHTMLAtoms::tbody, kNameSpaceID_None) || + parentNodeInfo->Equals(nsHTMLAtoms::thead, kNameSpaceID_None) || + parentNodeInfo->Equals(nsHTMLAtoms::tfoot, kNameSpaceID_None))) { + break; + } } rv = ConstructTableForeignFrame(aPresShell, aPresContext, aState, aChildContent, diff --git a/layout/html/style/src/nsCSSFrameConstructor.cpp b/layout/html/style/src/nsCSSFrameConstructor.cpp index 2fc4b7bd2da3..9ee3494d7f42 100644 --- a/layout/html/style/src/nsCSSFrameConstructor.cpp +++ b/layout/html/style/src/nsCSSFrameConstructor.cpp @@ -3187,15 +3187,24 @@ nsCSSFrameConstructor::TableProcessChild(nsIPresShell* aPresShell, // NOT create psuedoframe for it. // see bug 159359 nsCOMPtr parentNodeInfo, childNodeInfo; - aParentContent->GetNodeInfo(*getter_AddRefs(parentNodeInfo)); aChildContent->GetNodeInfo(*getter_AddRefs(childNodeInfo)); - if (childNodeInfo->Equals(nsHTMLAtoms::form, kNameSpaceID_None) && - (parentNodeInfo->Equals(nsHTMLAtoms::table, kNameSpaceID_None) || - parentNodeInfo->Equals(nsHTMLAtoms::tr, kNameSpaceID_None) || - parentNodeInfo->Equals(nsHTMLAtoms::tbody, kNameSpaceID_None) || - parentNodeInfo->Equals(nsHTMLAtoms::thead, kNameSpaceID_None) || - parentNodeInfo->Equals(nsHTMLAtoms::tfoot, kNameSpaceID_None))) { - break; + // Sometimes aChildContent is a #text node. In those cases it + // does not have a nodeinfo, and in those cases we want to + // construct a foreign frame for it in any case. So we can just + // null-check the nodeinfo here. + NS_ASSERTION(childNodeInfo || + aChildContent->IsContentOfType(nsIContent::eTEXT), + "Non-#text nodes should have a nodeinfo here!"); + if (childNodeInfo) { + aParentContent->GetNodeInfo(*getter_AddRefs(parentNodeInfo)); + if (childNodeInfo->Equals(nsHTMLAtoms::form, kNameSpaceID_None) && + (parentNodeInfo->Equals(nsHTMLAtoms::table, kNameSpaceID_None) || + parentNodeInfo->Equals(nsHTMLAtoms::tr, kNameSpaceID_None) || + parentNodeInfo->Equals(nsHTMLAtoms::tbody, kNameSpaceID_None) || + parentNodeInfo->Equals(nsHTMLAtoms::thead, kNameSpaceID_None) || + parentNodeInfo->Equals(nsHTMLAtoms::tfoot, kNameSpaceID_None))) { + break; + } } rv = ConstructTableForeignFrame(aPresShell, aPresContext, aState, aChildContent,