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;