Bug 126669, we need to pass in aHasChildren parameter to the start tag serializing function because the node that is passed in may be a shallow copy, thereby making it impossible to determine if it originally had children, in the method itself. This fixes case where saving XHTML produces non-wellformed output. r=akkana,tmutreja, sr=jst, a=asa,ADT.

This commit is contained in:
heikki%netscape.com 2002-04-02 21:12:51 +00:00
parent 9d057fffdc
commit ffc7f73b64
8 changed files with 16 additions and 4 deletions

View File

@ -84,6 +84,7 @@ class nsIContentSerializer : public nsISupports {
nsAString& aStr) = 0;
NS_IMETHOD AppendElementStart(nsIDOMElement *aElement,
PRBool aHasChildren,
nsAString& aStr) = 0;
NS_IMETHOD AppendElementEnd(nsIDOMElement *aElement,

View File

@ -308,7 +308,14 @@ nsDocumentEncoder::SerializeNodeStart(nsIDOMNode* aNode, PRInt32 aStartOffset,
case nsIDOMNode::ELEMENT_NODE:
{
nsCOMPtr<nsIDOMElement> element = do_QueryInterface(node);
mSerializer->AppendElementStart(element, aStr);
// Because FixupNode() may have done a shallow copy of aNode
// we need to tell the serializer if the original had children.
// Some serializers (notably XML) need this information
// in order to handle empty tags properly.
PRBool hasChildren;
mSerializer->AppendElementStart(element,
NS_SUCCEEDED(aNode->HasChildNodes(&hasChildren)) && hasChildren,
aStr);
break;
}
case nsIDOMNode::TEXT_NODE:

View File

@ -411,6 +411,7 @@ nsHTMLContentSerializer::SerializeAttributes(nsIContent* aContent,
NS_IMETHODIMP
nsHTMLContentSerializer::AppendElementStart(nsIDOMElement *aElement,
PRBool aHasChildren,
nsAString& aStr)
{
NS_ENSURE_ARG(aElement);

View File

@ -59,6 +59,7 @@ class nsHTMLContentSerializer : public nsXMLContentSerializer {
PRInt32 aEndOffset,
nsAString& aStr);
NS_IMETHOD AppendElementStart(nsIDOMElement *aElement,
PRBool aHasChildren,
nsAString& aStr);
NS_IMETHOD AppendElementEnd(nsIDOMElement *aElement,

View File

@ -319,6 +319,7 @@ nsPlainTextSerializer::AppendText(nsIDOMText* aText,
NS_IMETHODIMP
nsPlainTextSerializer::AppendElementStart(nsIDOMElement *aElement,
PRBool aHasChildren,
nsAString& aStr)
{
NS_ENSURE_ARG(aElement);

View File

@ -80,6 +80,7 @@ public:
NS_IMETHOD AppendDoctype(nsIDOMDocumentType *aDoctype,
nsAString& aStr) { return NS_OK; }
NS_IMETHOD AppendElementStart(nsIDOMElement *aElement,
PRBool aHasChildren,
nsAString& aStr);
NS_IMETHOD AppendElementEnd(nsIDOMElement *aElement,
nsAString& aStr);

View File

@ -406,6 +406,7 @@ nsXMLContentSerializer::SerializeAttr(const nsAString& aPrefix,
NS_IMETHODIMP
nsXMLContentSerializer::AppendElementStart(nsIDOMElement *aElement,
PRBool aHasChildren,
nsAString& aStr)
{
NS_ENSURE_ARG(aElement);
@ -509,9 +510,7 @@ nsXMLContentSerializer::AppendElementStart(nsIDOMElement *aElement,
}
// We don't output a separate end tag for empty element
nsCOMPtr<nsIDOMNode> node(do_QueryInterface(aElement));
PRBool hasChildren;
if (NS_SUCCEEDED(node->HasChildNodes(&hasChildren)) && !hasChildren) {
if (!aHasChildren) {
AppendToString(NS_LITERAL_STRING("/>"), aStr);
} else {
AppendToString(NS_LITERAL_STRING(">"), aStr);

View File

@ -75,6 +75,7 @@ class nsXMLContentSerializer : public nsIContentSerializer {
nsAString& aStr);
NS_IMETHOD AppendElementStart(nsIDOMElement *aElement,
PRBool aHasChildren,
nsAString& aStr);
NS_IMETHOD AppendElementEnd(nsIDOMElement *aElement,