diff --git a/mozilla/content/base/public/nsIContent.h b/mozilla/content/base/public/nsIContent.h index 90e22078967..66dea71af0f 100644 --- a/mozilla/content/base/public/nsIContent.h +++ b/mozilla/content/base/public/nsIContent.h @@ -195,6 +195,15 @@ public: NS_IMETHOD GetAttr(PRInt32 aNameSpaceID, nsIAtom* aName, nsIAtom*& aPrefix, nsAWritableString& aResult) const = 0; + /** + * Determine if an attribute has been set. + * + * @param aNameSpaceId the namespace id of the attribute + * @param aAttr the attribute name + */ + + NS_IMETHOD_(PRBool) HasAttr(PRInt32 aNameSpaceID, nsIAtom* aName) const = 0; + /** * Remove an attribute so that it is no longer explicitly specified. * diff --git a/mozilla/content/base/src/nsCommentNode.cpp b/mozilla/content/base/src/nsCommentNode.cpp index 045f0ce12a9..6499e42fb18 100644 --- a/mozilla/content/base/src/nsCommentNode.cpp +++ b/mozilla/content/base/src/nsCommentNode.cpp @@ -127,6 +127,9 @@ public: nsAWritableString& aResult) const { return mInner.GetAttribute(aNameSpaceID, aAttribute, aResult); } + NS_IMETHOD_(PRBool) HasAttr(PRInt32 aNameSpaceID, nsIAtom* aAttribute) const { + return mInner.HasAttribute(aNameSpaceID, aAttribute); + } NS_IMETHOD GetAttr(PRInt32 aNameSpaceID, nsIAtom *aAttribute, nsIAtom*& aPrefix, nsAWritableString& aResult) const { return mInner.GetAttribute(aNameSpaceID, aAttribute, aPrefix, aResult); diff --git a/mozilla/content/base/src/nsGenericDOMDataNode.h b/mozilla/content/base/src/nsGenericDOMDataNode.h index 76dff745265..447f04b00af 100644 --- a/mozilla/content/base/src/nsGenericDOMDataNode.h +++ b/mozilla/content/base/src/nsGenericDOMDataNode.h @@ -193,6 +193,9 @@ struct nsGenericDOMDataNode { aPrefix = nsnull; return NS_CONTENT_ATTR_NOT_THERE; } + PRBool HasAttribute(PRInt32 aNameSpaceID, nsIAtom *aAttribute) const { + return PR_FALSE; + } nsresult GetAttributeNameAt(PRInt32 aIndex, PRInt32& aNameSpaceID, nsIAtom*& aName, nsIAtom*& aPrefix) const { aNameSpaceID = kNameSpaceID_None; @@ -516,6 +519,10 @@ struct nsGenericDOMDataNode { nsIAtom*& aPrefix, nsAWritableString& aResult) const { \ return _g.GetAttribute(aNameSpaceID, aAttribute, aPrefix, aResult); \ } \ + NS_IMETHOD_(PRBool) HasAttr(PRInt32 aNameSpaceID, nsIAtom *aAttribute) \ + const { \ + return _g.HasAttribute(aNameSpaceID, aAttribute); \ + } \ NS_IMETHOD SetAttr(PRInt32 aNameSpaceID, nsIAtom* aAttribute, \ const nsAReadableString& aValue, PRBool aNotify) { \ return _g.SetAttribute(aNameSpaceID, aAttribute, aValue, aNotify); \ diff --git a/mozilla/content/base/src/nsGenericElement.cpp b/mozilla/content/base/src/nsGenericElement.cpp index 3a57ab33b21..dcaf472f113 100644 --- a/mozilla/content/base/src/nsGenericElement.cpp +++ b/mozilla/content/base/src/nsGenericElement.cpp @@ -1470,13 +1470,7 @@ nsGenericElement::HasAttribute(const nsAReadableString& aName, PRBool* aReturn) ni->GetNamespaceID(nsid); ni->GetNameAtom(*getter_AddRefs(nameAtom)); - nsAutoString tmp; - nsresult rv = NS_STATIC_CAST(nsIContent *, this)->GetAttr(nsid, - nameAtom, - tmp); - - *aReturn = rv == NS_CONTENT_ATTR_NOT_THERE ? PR_FALSE : PR_TRUE; - + *aReturn = HasAttr(nsid, nameAtom); return NS_OK; } @@ -1507,11 +1501,7 @@ nsGenericElement::HasAttributeNS(const nsAReadableString& aNamespaceURI, return NS_OK; } - nsAutoString tmp; - nsresult rv = NS_STATIC_CAST(nsIContent *, this)->GetAttr(nsid, name, tmp); - - *aReturn = rv == NS_CONTENT_ATTR_NOT_THERE ? PR_FALSE : PR_TRUE; - + *aReturn = HasAttr(nsid, name); return NS_OK; } @@ -3358,6 +3348,29 @@ nsGenericContainerElement::GetAttr(PRInt32 aNameSpaceID, nsIAtom* aName, return rv; } +NS_IMETHODIMP_(PRBool) +nsGenericContainerElement::HasAttr(PRInt32 aNameSpaceID, nsIAtom* aName) const +{ + NS_ASSERTION(nsnull != aName, "must have attribute name"); + if (nsnull == aName) + return PR_FALSE; + + if (nsnull != mAttributes) { + PRInt32 count = mAttributes->Count(); + PRInt32 index; + for (index = 0; index < count; index++) { + const nsGenericAttribute* attr = (const nsGenericAttribute*)mAttributes->ElementAt(index); + if ((aNameSpaceID == kNameSpaceID_Unknown || + attr->mNodeInfo->NamespaceEquals(aNameSpaceID)) && + (attr->mNodeInfo->Equals(aName))) { + return PR_TRUE; + } + } + } + + return PR_FALSE; +} + nsresult nsGenericContainerElement::UnsetAttr(PRInt32 aNameSpaceID, nsIAtom* aName, PRBool aNotify) diff --git a/mozilla/content/base/src/nsGenericElement.h b/mozilla/content/base/src/nsGenericElement.h index 4f6169386d0..c0a6e165553 100644 --- a/mozilla/content/base/src/nsGenericElement.h +++ b/mozilla/content/base/src/nsGenericElement.h @@ -485,6 +485,7 @@ public: nsAWritableString& aResult) const; NS_IMETHOD GetAttr(PRInt32 aNameSpaceID, nsIAtom* aName, nsIAtom*& aPrefix, nsAWritableString& aResult) const; + NS_IMETHOD_(PRBool) HasAttr(PRInt32 aNameSpaceID, nsIAtom* aName) const; NS_IMETHOD UnsetAttr(PRInt32 aNameSpaceID, nsIAtom* aAttribute, PRBool aNotify); NS_IMETHOD GetAttrNameAt(PRInt32 aIndex, diff --git a/mozilla/content/html/content/src/nsAttributeContent.cpp b/mozilla/content/html/content/src/nsAttributeContent.cpp index 3c5c604740e..6699ccf7e06 100644 --- a/mozilla/content/html/content/src/nsAttributeContent.cpp +++ b/mozilla/content/html/content/src/nsAttributeContent.cpp @@ -146,6 +146,9 @@ public: NS_IMETHOD UnsetAttr(PRInt32 aNameSpaceID, nsIAtom* aAttribute, PRBool aNotify) { return NS_OK; } NS_IMETHOD GetAttr(PRInt32 aNameSpaceID, nsIAtom *aAttribute, nsAWritableString& aResult) const {return NS_CONTENT_ATTR_NOT_THERE; } NS_IMETHOD GetAttr(PRInt32 aNameSpaceID, nsIAtom *aAttribute, nsIAtom*& aPrefix, nsAWritableString& aResult) const {return NS_CONTENT_ATTR_NOT_THERE; } + NS_IMETHOD_(PRBool) HasAttr(PRInt32 aNameSpaceID, nsIAtom *aAttribute) const { + return PR_FALSE; + } NS_IMETHOD GetAttrNameAt(PRInt32 aIndex, PRInt32& aNameSpaceID, nsIAtom*& aName, nsIAtom*& aPrefix) const { aName = nsnull; aPrefix = nsnull; diff --git a/mozilla/content/html/content/src/nsGenericHTMLElement.cpp b/mozilla/content/html/content/src/nsGenericHTMLElement.cpp index 6a0c7e0846d..e43a13db23c 100644 --- a/mozilla/content/html/content/src/nsGenericHTMLElement.cpp +++ b/mozilla/content/html/content/src/nsGenericHTMLElement.cpp @@ -2055,6 +2055,12 @@ nsGenericHTMLElement::GetAttr(PRInt32 aNameSpaceID, nsIAtom *aAttribute, return result; } +NS_IMETHODIMP_(PRBool) +nsGenericHTMLElement::HasAttr(PRInt32 aNameSpaceID, nsIAtom* aName) const +{ + return mAttributes ? mAttributes->HasAttribute(aName) : PR_FALSE; +} + nsresult nsGenericHTMLElement::GetHTMLAttribute(nsIAtom* aAttribute, nsHTMLValue& aValue) const diff --git a/mozilla/content/html/content/src/nsGenericHTMLElement.h b/mozilla/content/html/content/src/nsGenericHTMLElement.h index 297f3aaae18..d0ec94f356b 100644 --- a/mozilla/content/html/content/src/nsGenericHTMLElement.h +++ b/mozilla/content/html/content/src/nsGenericHTMLElement.h @@ -161,6 +161,7 @@ public: nsAWritableString& aResult) const; NS_IMETHOD GetAttr(PRInt32 aNameSpaceID, nsIAtom* aName, nsIAtom*& aPrefix, nsAWritableString& aResult) const; + NS_IMETHOD_(PRBool) HasAttr(PRInt32 aNameSpaceID, nsIAtom* aName) const; NS_IMETHOD UnsetAttr(PRInt32 aNameSpaceID, nsIAtom* aName, PRBool aNotify); NS_IMETHOD GetAttrNameAt(PRInt32 aIndex, diff --git a/mozilla/content/html/style/src/nsHTMLAttributes.cpp b/mozilla/content/html/style/src/nsHTMLAttributes.cpp index d0c4abd1e70..6bb0085358c 100644 --- a/mozilla/content/html/style/src/nsHTMLAttributes.cpp +++ b/mozilla/content/html/style/src/nsHTMLAttributes.cpp @@ -320,6 +320,7 @@ public: nsHTMLValue& aValue) const; NS_IMETHOD GetAttribute(nsIAtom* aAttrName, const nsHTMLValue** aValue) const; + NS_IMETHOD_(PRBool) HasAttribute(nsIAtom* aAttrName) const; NS_IMETHOD GetAttributeCount(PRInt32& aCount) const; @@ -626,6 +627,16 @@ nsHTMLMappedAttributes::GetAttribute(nsIAtom* aAttrName, return NS_CONTENT_ATTR_NOT_THERE; } +NS_IMETHODIMP_(PRBool) +nsHTMLMappedAttributes::HasAttribute(nsIAtom* aAttrName) const +{ + if (!aAttrName) + return PR_FALSE; + + const HTMLAttribute* attr = HTMLAttribute::FindHTMLAttribute(aAttrName, &mFirst); + return attr != nsnull; +} + NS_IMETHODIMP nsHTMLMappedAttributes::GetAttributeCount(PRInt32& aCount) const { @@ -846,6 +857,8 @@ public: NS_IMETHOD GetAttribute(nsIAtom* aAttribute, const nsHTMLValue** aValue) const; + NS_IMETHOD_(PRBool) HasAttribute(nsIAtom* aAttrName) const; + NS_IMETHOD GetAttributeNameAt(PRInt32 aIndex, nsIAtom*& aName) const; @@ -1358,6 +1371,18 @@ HTMLAttributesImpl::GetAttribute(nsIAtom* aAttrName, return result; } +NS_IMETHODIMP_(PRBool) +HTMLAttributesImpl::HasAttribute(nsIAtom* aAttrName) const +{ + if (mMapped) + return mMapped->HasAttribute(aAttrName); + + const HTMLAttribute* attr = HTMLAttribute::FindHTMLAttribute(aAttrName, mFirstUnmapped); + return attr != nsnull; +} + + + NS_IMETHODIMP HTMLAttributesImpl::GetAttributeNameAt(PRInt32 aIndex, nsIAtom*& aName) const diff --git a/mozilla/content/html/style/src/nsIHTMLAttributes.h b/mozilla/content/html/style/src/nsIHTMLAttributes.h index e8ef498fa8f..b1388d77ab8 100644 --- a/mozilla/content/html/style/src/nsIHTMLAttributes.h +++ b/mozilla/content/html/style/src/nsIHTMLAttributes.h @@ -81,6 +81,8 @@ public: nsHTMLValue& aValue) const = 0; NS_IMETHOD GetAttribute(nsIAtom* aAttribute, const nsHTMLValue** aValue) const = 0; + + NS_IMETHOD_(PRBool) HasAttribute(nsIAtom* aAttrName) const = 0; NS_IMETHOD GetAttributeNameAt(PRInt32 aIndex, nsIAtom*& aName) const = 0; diff --git a/mozilla/content/xml/content/src/nsXMLProcessingInstruction.cpp b/mozilla/content/xml/content/src/nsXMLProcessingInstruction.cpp index 416f768698d..a70d5a63e3a 100644 --- a/mozilla/content/xml/content/src/nsXMLProcessingInstruction.cpp +++ b/mozilla/content/xml/content/src/nsXMLProcessingInstruction.cpp @@ -222,6 +222,9 @@ public: nsIAtom*& aPrefix, nsAWritableString& aResult) const { return mInner.GetAttribute(aNameSpaceID, aAttribute, aPrefix, aResult); } + NS_IMETHOD_(PRBool) HasAttr(PRInt32 aNameSpaceID, nsIAtom *aAttribute) const { + return mInner.HasAttribute(aNameSpaceID, aAttribute); + } NS_IMETHOD SetAttr(PRInt32 aNameSpaceID, nsIAtom* aAttribute, const nsAReadableString& aValue, PRBool aNotify) { return mInner.SetAttribute(aNameSpaceID, aAttribute, aValue, aNotify); diff --git a/mozilla/content/xul/content/src/nsXULElement.cpp b/mozilla/content/xul/content/src/nsXULElement.cpp index 56e7342cfb3..76713351c41 100644 --- a/mozilla/content/xul/content/src/nsXULElement.cpp +++ b/mozilla/content/xul/content/src/nsXULElement.cpp @@ -1601,24 +1601,20 @@ nsXULElement::GetElementsByTagNameNS(const nsAReadableString& aNamespaceURI, NS_IMETHODIMP nsXULElement::HasAttribute(const nsAReadableString& aName, PRBool* aReturn) { - NS_ENSURE_ARG_POINTER(aReturn); + NS_ENSURE_ARG_POINTER(aReturn); - nsCOMPtr name; - nsCOMPtr ni; - PRInt32 nsid; + nsCOMPtr name; + nsCOMPtr ni; + PRInt32 nsid; - nsresult rv = NormalizeAttrString(aName, *getter_AddRefs(ni)); - NS_ENSURE_SUCCESS(rv, rv); + nsresult rv = NormalizeAttrString(aName, *getter_AddRefs(ni)); + NS_ENSURE_SUCCESS(rv, rv); - ni->GetNameAtom(*getter_AddRefs(name)); - ni->GetNamespaceID(nsid); + ni->GetNameAtom(*getter_AddRefs(name)); + ni->GetNamespaceID(nsid); - nsAutoString tmp; - rv = GetAttr(nsid, name, tmp); - - *aReturn = rv == NS_CONTENT_ATTR_NOT_THERE ? PR_FALSE : PR_TRUE; - - return NS_OK; + *aReturn = HasAttr(nsid, name); + return NS_OK; } NS_IMETHODIMP @@ -1635,16 +1631,11 @@ nsXULElement::HasAttributeNS(const nsAReadableString& aNamespaceURI, if (nsid == kNameSpaceID_Unknown) { // Unkonwn namespace means no attr... - *aReturn = PR_FALSE; return NS_OK; } - nsAutoString tmp; - nsresult rv = GetAttr(nsid, name, tmp); - - *aReturn = rv == NS_CONTENT_ATTR_NOT_THERE ? PR_FALSE : PR_TRUE; - + *aReturn = HasAttr(nsid, name); return NS_OK; } @@ -2796,6 +2787,39 @@ nsXULElement::GetAttr(PRInt32 aNameSpaceID, return NS_CONTENT_ATTR_NOT_THERE; } +NS_IMETHODIMP_(PRBool) +nsXULElement::HasAttr(PRInt32 aNameSpaceID, nsIAtom* aName) const +{ + NS_ASSERTION(nsnull != aName, "must have attribute name"); + if (!aName) + return PR_FALSE; + + if (mSlots && mSlots->mAttributes) { + PRInt32 count = mSlots->mAttributes->Count(); + for (PRInt32 i = 0; i < count; i++) { + nsXULAttribute* attr = NS_REINTERPRET_CAST(nsXULAttribute*, + mSlots->mAttributes->ElementAt(i)); + + nsINodeInfo *ni = attr->GetNodeInfo(); + if (ni->Equals(aName, aNameSpaceID)) + return PR_TRUE; + } + } + + if (mPrototype) { + PRInt32 count = mPrototype->mNumAttributes; + for (PRInt32 i = 0; i < count; i++) { + nsXULPrototypeAttribute* attr = &(mPrototype->mAttributes[i]); + + nsINodeInfo *ni = attr->mNodeInfo; + if (ni->Equals(aName, aNameSpaceID)) + return PR_TRUE; + } + } + + return PR_FALSE; +} + NS_IMETHODIMP nsXULElement::UnsetAttr(PRInt32 aNameSpaceID, nsIAtom* aName, PRBool aNotify) diff --git a/mozilla/content/xul/content/src/nsXULElement.h b/mozilla/content/xul/content/src/nsXULElement.h index 0c957782d3f..d4ebb64384b 100644 --- a/mozilla/content/xul/content/src/nsXULElement.h +++ b/mozilla/content/xul/content/src/nsXULElement.h @@ -410,6 +410,7 @@ public: NS_IMETHOD SetAttr(nsINodeInfo *aNodeInfo, const nsAReadableString& aValue, PRBool aNotify); NS_IMETHOD GetAttr(PRInt32 aNameSpaceID, nsIAtom* aName, nsAWritableString& aResult) const; NS_IMETHOD GetAttr(PRInt32 aNameSpaceID, nsIAtom* aName, nsIAtom*& aPrefix, nsAWritableString& aResult) const; + NS_IMETHOD_(PRBool) HasAttr(PRInt32 aNameSpaceID, nsIAtom* aName) const; NS_IMETHOD UnsetAttr(PRInt32 aNameSpaceID, nsIAtom* aName, PRBool aNotify); NS_IMETHOD GetAttrNameAt(PRInt32 aIndex, PRInt32& aNameSpaceID, nsIAtom*& aName, nsIAtom*& aPrefix) const;