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;