diff --git a/content/html/content/src/nsGenericHTMLElement.cpp b/content/html/content/src/nsGenericHTMLElement.cpp
index 624734fbd2d6..2bd47c49ced0 100644
--- a/content/html/content/src/nsGenericHTMLElement.cpp
+++ b/content/html/content/src/nsGenericHTMLElement.cpp
@@ -1220,8 +1220,9 @@ nsGenericHTMLElement::GetAttribute(PRInt32 aNameSpaceID, nsIAtom *aAttribute,
return NS_CONTENT_ATTR_NOT_THERE;
}
- nsHTMLValue value;
- nsresult result = GetHTMLAttribute(aAttribute, value);
+ const nsHTMLValue* value;
+ nsresult result = mAttributes ? mAttributes->GetAttribute(aAttribute, &value) :
+ NS_CONTENT_ATTR_NOT_THERE;
char cbuf[20];
nscolor color;
@@ -1233,14 +1234,14 @@ nsGenericHTMLElement::GetAttribute(PRInt32 aNameSpaceID, nsIAtom *aAttribute,
}
// Try subclass conversion routine first
if (NS_CONTENT_ATTR_HAS_VALUE ==
- htmlContent->AttributeToString(aAttribute, value, aResult)) {
+ htmlContent->AttributeToString(aAttribute, *value, aResult)) {
NS_RELEASE(htmlContent);
return result;
}
NS_RELEASE(htmlContent);
// Provide default conversions for most everything
- switch (value.GetUnit()) {
+ switch (value->GetUnit()) {
case eHTMLUnit_Null:
case eHTMLUnit_Empty:
aResult.Truncate();
@@ -1248,27 +1249,27 @@ nsGenericHTMLElement::GetAttribute(PRInt32 aNameSpaceID, nsIAtom *aAttribute,
case eHTMLUnit_String:
case eHTMLUnit_ColorName:
- value.GetStringValue(aResult);
+ value->GetStringValue(aResult);
break;
case eHTMLUnit_Integer:
aResult.Truncate();
- aResult.Append(value.GetIntValue(), 10);
+ aResult.Append(value->GetIntValue(), 10);
break;
case eHTMLUnit_Pixel:
aResult.Truncate();
- aResult.Append(value.GetPixelValue(), 10);
+ aResult.Append(value->GetPixelValue(), 10);
break;
case eHTMLUnit_Percent:
aResult.Truncate();
- aResult.Append(PRInt32(value.GetPercentValue() * 100.0f), 10);
+ aResult.Append(PRInt32(value->GetPercentValue() * 100.0f), 10);
aResult.Append('%');
break;
case eHTMLUnit_Color:
- color = nscolor(value.GetColorValue());
+ color = nscolor(value->GetColorValue());
PR_snprintf(cbuf, sizeof(cbuf), "#%02x%02x%02x",
NS_GET_R(color), NS_GET_G(color), NS_GET_B(color));
aResult.Truncate();
@@ -1282,6 +1283,7 @@ nsGenericHTMLElement::GetAttribute(PRInt32 aNameSpaceID, nsIAtom *aAttribute,
break;
}
}
+
return result;
}
diff --git a/content/html/style/src/nsHTMLAttributes.cpp b/content/html/style/src/nsHTMLAttributes.cpp
index 23b451d3cce7..4508215d2a14 100644
--- a/content/html/style/src/nsHTMLAttributes.cpp
+++ b/content/html/style/src/nsHTMLAttributes.cpp
@@ -294,6 +294,8 @@ public:
NS_IMETHOD GetAttribute(nsIAtom* aAttrName,
nsHTMLValue& aValue) const;
+ NS_IMETHOD GetAttribute(nsIAtom* aAttrName,
+ const nsHTMLValue** aValue) const;
NS_IMETHOD GetAttributeCount(PRInt32& aCount) const;
@@ -593,6 +595,25 @@ nsHTMLMappedAttributes::GetAttribute(nsIAtom* aAttrName,
return NS_CONTENT_ATTR_NOT_THERE;
}
+NS_IMETHODIMP
+nsHTMLMappedAttributes::GetAttribute(nsIAtom* aAttrName,
+ const nsHTMLValue** aValue) const
+{
+ if (! aAttrName) {
+ return NS_ERROR_NULL_POINTER;
+ }
+
+ const HTMLAttribute* attr = HTMLAttribute::FindHTMLAttribute(aAttrName, &mFirst);
+ if (attr) {
+ *aValue = &attr->mValue;
+ return ((attr->mValue.GetUnit() == eHTMLUnit_Null) ?
+ NS_CONTENT_ATTR_NO_VALUE :
+ NS_CONTENT_ATTR_HAS_VALUE);
+ }
+ *aValue = nsnull;
+ return NS_CONTENT_ATTR_NOT_THERE;
+}
+
NS_IMETHODIMP
nsHTMLMappedAttributes::GetAttributeCount(PRInt32& aCount) const
{
@@ -794,6 +815,8 @@ public:
NS_IMETHOD GetAttribute(nsIAtom* aAttrName,
nsHTMLValue& aValue) const;
+ NS_IMETHOD GetAttribute(nsIAtom* aAttribute,
+ const nsHTMLValue** aValue) const;
NS_IMETHOD GetAttributeNameAt(PRInt32 aIndex,
nsIAtom*& aName) const;
@@ -1290,6 +1313,33 @@ HTMLAttributesImpl::GetAttribute(nsIAtom* aAttrName,
return result;
}
+NS_IMETHODIMP
+HTMLAttributesImpl::GetAttribute(nsIAtom* aAttrName,
+ const nsHTMLValue** aValue) const
+{
+ nsresult result = NS_CONTENT_ATTR_NOT_THERE;
+
+ if (mMapped) {
+ result = mMapped->GetAttribute(aAttrName, aValue);
+ }
+
+ if (NS_CONTENT_ATTR_NOT_THERE == result) {
+ const HTMLAttribute* attr = HTMLAttribute::FindHTMLAttribute(aAttrName, mFirstUnmapped);
+
+ if (attr) {
+ *aValue = &attr->mValue;
+ result = ((attr->mValue.GetUnit() == eHTMLUnit_Null) ?
+ NS_CONTENT_ATTR_NO_VALUE :
+ NS_CONTENT_ATTR_HAS_VALUE);
+ }
+ else {
+ *aValue = nsnull;
+ }
+ }
+
+ return result;
+}
+
NS_IMETHODIMP
HTMLAttributesImpl::GetAttributeNameAt(PRInt32 aIndex,
nsIAtom*& aName) const
diff --git a/content/html/style/src/nsIHTMLAttributes.h b/content/html/style/src/nsIHTMLAttributes.h
index fcb47126a695..015ceb6db25c 100644
--- a/content/html/style/src/nsIHTMLAttributes.h
+++ b/content/html/style/src/nsIHTMLAttributes.h
@@ -63,6 +63,8 @@ public:
NS_IMETHOD GetAttribute(nsIAtom* aAttribute,
nsHTMLValue& aValue) const = 0;
+ NS_IMETHOD GetAttribute(nsIAtom* aAttribute,
+ const nsHTMLValue** aValue) const = 0;
NS_IMETHOD GetAttributeNameAt(PRInt32 aIndex,
nsIAtom*& aName) const = 0;
@@ -100,6 +102,7 @@ public:
NS_DEFINE_STATIC_IID_ACCESSOR(NS_IHTML_MAPPED_ATTRIBUTES_IID);
NS_IMETHOD GetAttribute(nsIAtom* aAttrName, nsHTMLValue& aValue) const = 0;
+ NS_IMETHOD GetAttribute(nsIAtom* aAttrName, const nsHTMLValue** aValue) const = 0;
NS_IMETHOD GetAttributeCount(PRInt32& aCount) const = 0;
NS_IMETHOD Equals(const nsIHTMLMappedAttributes* aAttributes, PRBool& aResult) const = 0;
diff --git a/layout/html/content/src/nsGenericHTMLElement.cpp b/layout/html/content/src/nsGenericHTMLElement.cpp
index 624734fbd2d6..2bd47c49ced0 100644
--- a/layout/html/content/src/nsGenericHTMLElement.cpp
+++ b/layout/html/content/src/nsGenericHTMLElement.cpp
@@ -1220,8 +1220,9 @@ nsGenericHTMLElement::GetAttribute(PRInt32 aNameSpaceID, nsIAtom *aAttribute,
return NS_CONTENT_ATTR_NOT_THERE;
}
- nsHTMLValue value;
- nsresult result = GetHTMLAttribute(aAttribute, value);
+ const nsHTMLValue* value;
+ nsresult result = mAttributes ? mAttributes->GetAttribute(aAttribute, &value) :
+ NS_CONTENT_ATTR_NOT_THERE;
char cbuf[20];
nscolor color;
@@ -1233,14 +1234,14 @@ nsGenericHTMLElement::GetAttribute(PRInt32 aNameSpaceID, nsIAtom *aAttribute,
}
// Try subclass conversion routine first
if (NS_CONTENT_ATTR_HAS_VALUE ==
- htmlContent->AttributeToString(aAttribute, value, aResult)) {
+ htmlContent->AttributeToString(aAttribute, *value, aResult)) {
NS_RELEASE(htmlContent);
return result;
}
NS_RELEASE(htmlContent);
// Provide default conversions for most everything
- switch (value.GetUnit()) {
+ switch (value->GetUnit()) {
case eHTMLUnit_Null:
case eHTMLUnit_Empty:
aResult.Truncate();
@@ -1248,27 +1249,27 @@ nsGenericHTMLElement::GetAttribute(PRInt32 aNameSpaceID, nsIAtom *aAttribute,
case eHTMLUnit_String:
case eHTMLUnit_ColorName:
- value.GetStringValue(aResult);
+ value->GetStringValue(aResult);
break;
case eHTMLUnit_Integer:
aResult.Truncate();
- aResult.Append(value.GetIntValue(), 10);
+ aResult.Append(value->GetIntValue(), 10);
break;
case eHTMLUnit_Pixel:
aResult.Truncate();
- aResult.Append(value.GetPixelValue(), 10);
+ aResult.Append(value->GetPixelValue(), 10);
break;
case eHTMLUnit_Percent:
aResult.Truncate();
- aResult.Append(PRInt32(value.GetPercentValue() * 100.0f), 10);
+ aResult.Append(PRInt32(value->GetPercentValue() * 100.0f), 10);
aResult.Append('%');
break;
case eHTMLUnit_Color:
- color = nscolor(value.GetColorValue());
+ color = nscolor(value->GetColorValue());
PR_snprintf(cbuf, sizeof(cbuf), "#%02x%02x%02x",
NS_GET_R(color), NS_GET_G(color), NS_GET_B(color));
aResult.Truncate();
@@ -1282,6 +1283,7 @@ nsGenericHTMLElement::GetAttribute(PRInt32 aNameSpaceID, nsIAtom *aAttribute,
break;
}
}
+
return result;
}
diff --git a/layout/html/style/src/nsHTMLAttributes.cpp b/layout/html/style/src/nsHTMLAttributes.cpp
index 23b451d3cce7..4508215d2a14 100644
--- a/layout/html/style/src/nsHTMLAttributes.cpp
+++ b/layout/html/style/src/nsHTMLAttributes.cpp
@@ -294,6 +294,8 @@ public:
NS_IMETHOD GetAttribute(nsIAtom* aAttrName,
nsHTMLValue& aValue) const;
+ NS_IMETHOD GetAttribute(nsIAtom* aAttrName,
+ const nsHTMLValue** aValue) const;
NS_IMETHOD GetAttributeCount(PRInt32& aCount) const;
@@ -593,6 +595,25 @@ nsHTMLMappedAttributes::GetAttribute(nsIAtom* aAttrName,
return NS_CONTENT_ATTR_NOT_THERE;
}
+NS_IMETHODIMP
+nsHTMLMappedAttributes::GetAttribute(nsIAtom* aAttrName,
+ const nsHTMLValue** aValue) const
+{
+ if (! aAttrName) {
+ return NS_ERROR_NULL_POINTER;
+ }
+
+ const HTMLAttribute* attr = HTMLAttribute::FindHTMLAttribute(aAttrName, &mFirst);
+ if (attr) {
+ *aValue = &attr->mValue;
+ return ((attr->mValue.GetUnit() == eHTMLUnit_Null) ?
+ NS_CONTENT_ATTR_NO_VALUE :
+ NS_CONTENT_ATTR_HAS_VALUE);
+ }
+ *aValue = nsnull;
+ return NS_CONTENT_ATTR_NOT_THERE;
+}
+
NS_IMETHODIMP
nsHTMLMappedAttributes::GetAttributeCount(PRInt32& aCount) const
{
@@ -794,6 +815,8 @@ public:
NS_IMETHOD GetAttribute(nsIAtom* aAttrName,
nsHTMLValue& aValue) const;
+ NS_IMETHOD GetAttribute(nsIAtom* aAttribute,
+ const nsHTMLValue** aValue) const;
NS_IMETHOD GetAttributeNameAt(PRInt32 aIndex,
nsIAtom*& aName) const;
@@ -1290,6 +1313,33 @@ HTMLAttributesImpl::GetAttribute(nsIAtom* aAttrName,
return result;
}
+NS_IMETHODIMP
+HTMLAttributesImpl::GetAttribute(nsIAtom* aAttrName,
+ const nsHTMLValue** aValue) const
+{
+ nsresult result = NS_CONTENT_ATTR_NOT_THERE;
+
+ if (mMapped) {
+ result = mMapped->GetAttribute(aAttrName, aValue);
+ }
+
+ if (NS_CONTENT_ATTR_NOT_THERE == result) {
+ const HTMLAttribute* attr = HTMLAttribute::FindHTMLAttribute(aAttrName, mFirstUnmapped);
+
+ if (attr) {
+ *aValue = &attr->mValue;
+ result = ((attr->mValue.GetUnit() == eHTMLUnit_Null) ?
+ NS_CONTENT_ATTR_NO_VALUE :
+ NS_CONTENT_ATTR_HAS_VALUE);
+ }
+ else {
+ *aValue = nsnull;
+ }
+ }
+
+ return result;
+}
+
NS_IMETHODIMP
HTMLAttributesImpl::GetAttributeNameAt(PRInt32 aIndex,
nsIAtom*& aName) const
diff --git a/layout/html/style/src/nsIHTMLAttributes.h b/layout/html/style/src/nsIHTMLAttributes.h
index fcb47126a695..015ceb6db25c 100644
--- a/layout/html/style/src/nsIHTMLAttributes.h
+++ b/layout/html/style/src/nsIHTMLAttributes.h
@@ -63,6 +63,8 @@ public:
NS_IMETHOD GetAttribute(nsIAtom* aAttribute,
nsHTMLValue& aValue) const = 0;
+ NS_IMETHOD GetAttribute(nsIAtom* aAttribute,
+ const nsHTMLValue** aValue) const = 0;
NS_IMETHOD GetAttributeNameAt(PRInt32 aIndex,
nsIAtom*& aName) const = 0;
@@ -100,6 +102,7 @@ public:
NS_DEFINE_STATIC_IID_ACCESSOR(NS_IHTML_MAPPED_ATTRIBUTES_IID);
NS_IMETHOD GetAttribute(nsIAtom* aAttrName, nsHTMLValue& aValue) const = 0;
+ NS_IMETHOD GetAttribute(nsIAtom* aAttrName, const nsHTMLValue** aValue) const = 0;
NS_IMETHOD GetAttributeCount(PRInt32& aCount) const = 0;
NS_IMETHOD Equals(const nsIHTMLMappedAttributes* aAttributes, PRBool& aResult) const = 0;