From aab00646c0baf43620ce19b44e069fe4dc3fac66 Mon Sep 17 00:00:00 2001 From: "peterv%netscape.com" Date: Tue, 28 May 2002 12:34:48 +0000 Subject: [PATCH] Fix for bug 88761 (html code for selected and noshade (and other minimizable attributes) not w3c conformant). r=heikki, sr=jst. git-svn-id: svn://10.0.0.236/trunk@122219 18797224-902f-48f8-a5cc-f745e15eee43 --- .../base/src/nsHTMLContentSerializer.cpp | 7 +- .../base/src/nsXMLContentSerializer.cpp | 104 ++++++++++++++++++ .../content/base/src/nsXMLContentSerializer.h | 2 + 3 files changed, 112 insertions(+), 1 deletion(-) diff --git a/mozilla/content/base/src/nsHTMLContentSerializer.cpp b/mozilla/content/base/src/nsHTMLContentSerializer.cpp index 4af1e711ac0..78ed3fb6c37 100644 --- a/mozilla/content/base/src/nsHTMLContentSerializer.cpp +++ b/mozilla/content/base/src/nsHTMLContentSerializer.cpp @@ -55,6 +55,7 @@ #include "nsEscape.h" #include "nsITextToSubURI.h" #include "nsCRT.h" +#include "nsIHTMLContent.h" static NS_DEFINE_CID(kParserServiceCID, NS_PARSERSERVICE_CID); @@ -395,7 +396,7 @@ nsHTMLContentSerializer::SerializeAttributes(nsIContent* aContent, if (!isJS && NS_FAILED(EscapeURI(tempURI, valueStr))) valueStr = tempURI; } - + attrName->ToString(nameStr); /*If we already crossed the MaxColumn limit or @@ -408,6 +409,10 @@ nsHTMLContentSerializer::SerializeAttributes(nsIContent* aContent, mColPos = 0; } + // Expand shorthand attribute. + if (IsShorthandAttr(attrName, aTagName) && valueStr.IsEmpty()) { + valueStr = nameStr; + } SerializeAttr(nsAutoString(), nameStr, valueStr, aStr, !isJS); } } diff --git a/mozilla/content/base/src/nsXMLContentSerializer.cpp b/mozilla/content/base/src/nsXMLContentSerializer.cpp index 9c83c3f89dc..e4fd64290a6 100644 --- a/mozilla/content/base/src/nsXMLContentSerializer.cpp +++ b/mozilla/content/base/src/nsXMLContentSerializer.cpp @@ -38,6 +38,7 @@ #include "nsXMLContentSerializer.h" +#include "nsHTMLAtoms.h" #include "nsIDOMText.h" #include "nsIDOMCDATASection.h" #include "nsIDOMProcessingInstruction.h" @@ -509,6 +510,18 @@ nsXMLContentSerializer::AppendElementStart(nsIDOMElement *aElement, if (!nameStr.IsEmpty() && nameStr.First() == '-') continue; + if (namespaceID == kNameSpaceID_None) { + PRInt32 elementNsID; + content->GetNameSpaceID(elementNsID); + if (elementNsID == kNameSpaceID_XHTML) { + nsCOMPtr elementName; + content->GetTag(*getter_AddRefs(elementName)); + if (IsShorthandAttr(attrName, elementName) && + valueStr.IsEmpty()) { + valueStr = nameStr; + } + } + } SerializeAttr(prefixStr, nameStr, valueStr, aStr, PR_TRUE); if (addNSAttr) { @@ -650,3 +663,94 @@ nsXMLContentSerializer::AppendToString(const nsAString& aStr, aOutputStr.Append(aStr); } + +PRBool +nsXMLContentSerializer::IsShorthandAttr(const nsIAtom* aAttrName, + const nsIAtom* aElementName) +{ + // checked + if ((aAttrName == nsHTMLAtoms::checked) && + (aElementName == nsHTMLAtoms::input)) { + return PR_TRUE; + } + + // compact + if ((aAttrName == nsHTMLAtoms::compact) && + (aElementName == nsHTMLAtoms::dir || + aElementName == nsHTMLAtoms::dl || + aElementName == nsHTMLAtoms::menu || + aElementName == nsHTMLAtoms::ol || + aElementName == nsHTMLAtoms::ul)) { + return PR_TRUE; + } + + // declare + if ((aAttrName == nsHTMLAtoms::declare) && + (aElementName == nsHTMLAtoms::object)) { + return PR_TRUE; + } + + // defer + if ((aAttrName == nsHTMLAtoms::defer) && + (aElementName == nsHTMLAtoms::script)) { + return PR_TRUE; + } + + // disabled + if ((aAttrName == nsHTMLAtoms::disabled) && + (aElementName == nsHTMLAtoms::button || + aElementName == nsHTMLAtoms::input || + aElementName == nsHTMLAtoms::optgroup || + aElementName == nsHTMLAtoms::option || + aElementName == nsHTMLAtoms::select || + aElementName == nsHTMLAtoms::textarea)) { + return PR_TRUE; + } + + // ismap + if ((aAttrName == nsHTMLAtoms::ismap) && + (aElementName == nsHTMLAtoms::img || + aElementName == nsHTMLAtoms::input)) { + return PR_TRUE; + } + + // multiple + if ((aAttrName == nsHTMLAtoms::multiple) && + (aElementName == nsHTMLAtoms::select)) { + return PR_TRUE; + } + + // noresize + if ((aAttrName == nsHTMLAtoms::noresize) && + (aElementName == nsHTMLAtoms::frame)) { + return PR_TRUE; + } + + // noshade + if ((aAttrName == nsHTMLAtoms::noshade) && + (aElementName == nsHTMLAtoms::hr)) { + return PR_TRUE; + } + + // nowrap + if ((aAttrName == nsHTMLAtoms::nowrap) && + (aElementName == nsHTMLAtoms::td || + aElementName == nsHTMLAtoms::th)) { + return PR_TRUE; + } + + // readonly + if ((aAttrName == nsHTMLAtoms::readonly) && + (aElementName == nsHTMLAtoms::input || + aElementName == nsHTMLAtoms::textarea)) { + return PR_TRUE; + } + + // selected + if ((aAttrName == nsHTMLAtoms::selected) && + (aElementName == nsHTMLAtoms::option)) { + return PR_TRUE; + } + + return PR_FALSE; +} diff --git a/mozilla/content/base/src/nsXMLContentSerializer.h b/mozilla/content/base/src/nsXMLContentSerializer.h index 06845562d9a..5f1c37dab74 100644 --- a/mozilla/content/base/src/nsXMLContentSerializer.h +++ b/mozilla/content/base/src/nsXMLContentSerializer.h @@ -110,6 +110,8 @@ class nsXMLContentSerializer : public nsIContentSerializer { const nsAString& aValue, nsAString& aStr, PRBool aDoEscapeEntities); + PRBool IsShorthandAttr(const nsIAtom* aAttrName, + const nsIAtom* aElementName); PRInt32 mPrefixIndex; nsVoidArray mNameSpaceStack;