mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-14 13:55:43 +00:00
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:
parent
9d057fffdc
commit
ffc7f73b64
@ -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,
|
||||
|
@ -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:
|
||||
|
@ -411,6 +411,7 @@ nsHTMLContentSerializer::SerializeAttributes(nsIContent* aContent,
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsHTMLContentSerializer::AppendElementStart(nsIDOMElement *aElement,
|
||||
PRBool aHasChildren,
|
||||
nsAString& aStr)
|
||||
{
|
||||
NS_ENSURE_ARG(aElement);
|
||||
|
@ -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,
|
||||
|
@ -319,6 +319,7 @@ nsPlainTextSerializer::AppendText(nsIDOMText* aText,
|
||||
|
||||
NS_IMETHODIMP
|
||||
nsPlainTextSerializer::AppendElementStart(nsIDOMElement *aElement,
|
||||
PRBool aHasChildren,
|
||||
nsAString& aStr)
|
||||
{
|
||||
NS_ENSURE_ARG(aElement);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -75,6 +75,7 @@ class nsXMLContentSerializer : public nsIContentSerializer {
|
||||
nsAString& aStr);
|
||||
|
||||
NS_IMETHOD AppendElementStart(nsIDOMElement *aElement,
|
||||
PRBool aHasChildren,
|
||||
nsAString& aStr);
|
||||
|
||||
NS_IMETHOD AppendElementEnd(nsIDOMElement *aElement,
|
||||
|
Loading…
Reference in New Issue
Block a user