Back to index

lightning-sunbird  0.9+nobinonly
Public Member Functions | Public Attributes | Private Member Functions | Private Attributes
nsDOMAttributeMap Class Reference

#include <nsDOMAttributeMap.h>

Inheritance diagram for nsDOMAttributeMap:
Inheritance graph
[legend]
Collaboration diagram for nsDOMAttributeMap:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 nsDOMAttributeMap (nsIContent *aContent)
virtual ~nsDOMAttributeMap ()
PRBool Init ()
 Initialize the map.
NS_DECL_ISUPPORTS
NS_DECL_NSIDOMNAMEDNODEMAP
void 
DropReference ()
nsIContentGetContent ()
void DropAttribute (PRInt32 aNamespaceID, nsIAtom *aLocalName)
 Drop an attribute from the map's cache (does not remove the attribute from the node!)
nsIDOMNode getNamedItem (in DOMString name)
nsIDOMNode setNamedItem (in nsIDOMNode arg) raises (DOMException)
nsIDOMNode removeNamedItem (in DOMString name) raises (DOMException)
nsIDOMNode item (in unsigned long index)
nsIDOMNode getNamedItemNS (in DOMString namespaceURI, in DOMString localName)
nsIDOMNode setNamedItemNS (in nsIDOMNode arg) raises (DOMException)
nsIDOMNode removeNamedItemNS (in DOMString namespaceURI, in DOMString localName) raises (DOMException)

Public Attributes

readonly attribute unsigned long length

Private Member Functions

nsresult SetNamedItemInternal (nsIDOMNode *aNode, nsIDOMNode **aReturn, PRBool aWithNS)
 SetNamedItem() (aWithNS = PR_FALSE) and SetNamedItemNS() (aWithNS = PR_TRUE) implementation.
nsresult GetNamedItemNSInternal (const nsAString &aNamespaceURI, const nsAString &aLocalName, nsIDOMNode **aReturn, PRBool aRemove=PR_FALSE)
 GetNamedItemNS() implementation taking |aRemove| for GetAttribute(), which is used by RemoveNamedItemNS().
nsresult GetAttribute (nsINodeInfo *aNodeInfo, nsIDOMNode **aReturn, PRBool aRemove=PR_FALSE)
 Returns an attribute, either by retrieving it from the cache or by creating a new one.

Private Attributes

nsIContentmContent
nsInterfaceHashtable
< nsAttrHashKey, nsIDOMNode
mAttributeCache
 Cache of nsDOMAttributes.

Detailed Description

Definition at line 114 of file nsDOMAttributeMap.h.


Constructor & Destructor Documentation

Definition at line 50 of file nsDOMAttributeMap.cpp.

  : mContent(aContent)
{
  // We don't add a reference to our content. If it goes away,
  // we'll be told to drop our reference
}

Definition at line 76 of file nsDOMAttributeMap.cpp.

Here is the call graph for this function:


Member Function Documentation

Drop an attribute from the map's cache (does not remove the attribute from the node!)

Definition at line 101 of file nsDOMAttributeMap.cpp.

{
  nsAttrKey attr(aNamespaceID, aLocalName);
  nsIDOMNode *node = mAttributeCache.GetWeak(attr);
  if (node) {
    nsCOMPtr<nsIAttribute> iAttr(do_QueryInterface(node));
    NS_ASSERTION(iAttr, "non-nsIAttribute somehow made it into the hashmap?!");

    // Break link to map
    iAttr->SetMap(nsnull);

    // Remove from cache
    mAttributeCache.Remove(attr);
  }
}

Here is the call graph for this function:

Definition at line 82 of file nsDOMAttributeMap.cpp.

Here is the call graph for this function:

nsresult nsDOMAttributeMap::GetAttribute ( nsINodeInfo aNodeInfo,
nsIDOMNode **  aReturn,
PRBool  aRemove = PR_FALSE 
) [private]

Returns an attribute, either by retrieving it from the cache or by creating a new one.

Definition at line 118 of file nsDOMAttributeMap.cpp.

{
  NS_ASSERTION(aNodeInfo, "GetAttribute() called with aNodeInfo == nsnull!");
  NS_ASSERTION(aReturn, "GetAttribute() called with aReturn == nsnull");

  *aReturn = nsnull;

  nsAttrKey attr(aNodeInfo->NamespaceID(), aNodeInfo->NameAtom());

  if (!mAttributeCache.Get(attr, aReturn)) {
    nsAutoString value;
    if (aRemove) {
      // As we are removing the attribute we need to set the current value in
      // the attribute node.
      mContent->GetAttr(aNodeInfo->NamespaceID(), aNodeInfo->NameAtom(), value);
    }
    nsCOMPtr<nsIDOMNode> newAttr = new nsDOMAttribute(aRemove ? nsnull : this,
                                                      aNodeInfo, value);
    if (!newAttr) {
      return NS_ERROR_OUT_OF_MEMORY;
    }
    if (!aRemove && !mAttributeCache.Put(attr, newAttr)) {
      return NS_ERROR_OUT_OF_MEMORY;
    }
    newAttr.swap(*aReturn);
  }
  else if (aRemove) {
    nsCOMPtr<nsIAttribute> iAttr(do_QueryInterface(*aReturn));
    NS_ASSERTION(iAttr, "non-nsIAttribute somehow made it into the hashmap?!");

    // Break link to map
    iAttr->SetMap(nsnull);

    // Remove from cache
    mAttributeCache.Remove(attr);
  }

  return NS_OK;
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 132 of file nsDOMAttributeMap.h.

  {
    return mContent;
  }

Here is the caller graph for this function:

nsIDOMNode nsIDOMNamedNodeMap::getNamedItem ( in DOMString  name) [inherited]
nsIDOMNode nsIDOMNamedNodeMap::getNamedItemNS ( in DOMString  namespaceURI,
in DOMString  localName 
) [inherited]
nsresult nsDOMAttributeMap::GetNamedItemNSInternal ( const nsAString &  aNamespaceURI,
const nsAString &  aLocalName,
nsIDOMNode **  aReturn,
PRBool  aRemove = PR_FALSE 
) [private]

GetNamedItemNS() implementation taking |aRemove| for GetAttribute(), which is used by RemoveNamedItemNS().

Definition at line 376 of file nsDOMAttributeMap.cpp.

{
  NS_ENSURE_ARG_POINTER(aReturn);
  *aReturn = nsnull;

  if (!mContent) {
    return NS_OK;
  }

  NS_ConvertUTF16toUTF8 utf8Name(aLocalName);
  PRInt32 nameSpaceID = kNameSpaceID_None;

  if (!aNamespaceURI.IsEmpty()) {
    nsContentUtils::GetNSManagerWeakRef()->GetNameSpaceID(aNamespaceURI,
                                                          &nameSpaceID);

    if (nameSpaceID == kNameSpaceID_Unknown) {
      return NS_OK;
    }
  }

  PRUint32 i, count = mContent->GetAttrCount();
  for (i = 0; i < count; ++i) {
    PRInt32 attrNS;
    nsCOMPtr<nsIAtom> nameAtom, prefix;
    mContent->GetAttrNameAt(i, &attrNS, getter_AddRefs(nameAtom),
                            getter_AddRefs(prefix));
    if (nameSpaceID == attrNS &&
        nameAtom->EqualsUTF8(utf8Name)) {
      nsCOMPtr<nsINodeInfo> ni;
      mContent->GetNodeInfo()->NodeInfoManager()->
        GetNodeInfo(nameAtom, prefix, nameSpaceID, getter_AddRefs(ni));
      NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);

      return GetAttribute(ni, aReturn, aRemove);
    }
  }

  return NS_OK;
}

Here is the call graph for this function:

Initialize the map.

Must be called before the map is used.

Definition at line 58 of file nsDOMAttributeMap.cpp.

{
  return mAttributeCache.Init();
}

Here is the call graph for this function:

nsIDOMNode nsIDOMNamedNodeMap::item ( in unsigned long  index) [inherited]
nsIDOMNode nsIDOMNamedNodeMap::removeNamedItem ( in DOMString  name) raises (DOMException) [inherited]
nsIDOMNode nsIDOMNamedNodeMap::removeNamedItemNS ( in DOMString  namespaceURI,
in DOMString  localName 
) raises (DOMException) [inherited]
nsIDOMNode nsIDOMNamedNodeMap::setNamedItem ( in nsIDOMNode  arg) raises (DOMException) [inherited]
nsresult nsDOMAttributeMap::SetNamedItemInternal ( nsIDOMNode aNode,
nsIDOMNode **  aReturn,
PRBool  aWithNS 
) [private]

SetNamedItem() (aWithNS = PR_FALSE) and SetNamedItemNS() (aWithNS = PR_TRUE) implementation.

Definition at line 192 of file nsDOMAttributeMap.cpp.

{
  NS_ENSURE_ARG_POINTER(aNode);
  NS_ENSURE_ARG_POINTER(aReturn);

  nsresult rv = NS_OK;
  *aReturn = nsnull;
  nsCOMPtr<nsIDOMNode> tmpReturn;

  if (mContent) {
    // XXX should check same-origin between mContent and aNode however
    // nsContentUtils::CheckSameOrigin can't deal with attributenodes yet
    
    nsCOMPtr<nsIDOMAttr> attribute(do_QueryInterface(aNode));
    nsCOMPtr<nsIAttribute> iAttribute(do_QueryInterface(aNode));
    if (!attribute || !iAttribute) {
      return NS_ERROR_DOM_HIERARCHY_REQUEST_ERR;
    }

    // Check that attribute is not owned by somebody else
    nsCOMPtr<nsIDOMElement> owner;
    attribute->GetOwnerElement(getter_AddRefs(owner));
    if (owner) {
      nsCOMPtr<nsISupports> ownerSupports = do_QueryInterface(owner);
      nsCOMPtr<nsISupports> thisSupports = do_QueryInterface(mContent);
      if (ownerSupports != thisSupports) {
        return NS_ERROR_DOM_INUSE_ATTRIBUTE_ERR;
      }
    }

    nsCOMPtr<nsINodeInfo> ni;
    nsAutoString name;
    attribute->GetName(name);

    // SetNamedItemNS()
    if (aWithNS) {
      // Return existing attribute, if present
      nsAutoString nsURI;
      attribute->GetNamespaceURI(nsURI);

      nsINodeInfo *contentNi = mContent->GetNodeInfo();
      NS_ENSURE_TRUE(contentNi, NS_ERROR_FAILURE);

      contentNi->NodeInfoManager()->GetNodeInfo(name, nsURI,
                                                getter_AddRefs(ni));
      NS_ENSURE_TRUE(ni, NS_ERROR_FAILURE);

      if (mContent->HasAttr(ni->NamespaceID(), ni->NameAtom())) {
        rv = GetAttribute(ni, getter_AddRefs(tmpReturn), PR_TRUE);
        NS_ENSURE_SUCCESS(rv, rv);
      }

    }
    else { // SetNamedItem()
      // get node-info of old attribute
      ni = mContent->GetExistingAttrNameFromQName(name);
      if (ni) {
        rv = GetAttribute(ni, getter_AddRefs(tmpReturn), PR_TRUE);
        NS_ENSURE_SUCCESS(rv, rv);
      }
      else {
        nsINodeInfo *contentNi = mContent->GetNodeInfo();
        NS_ENSURE_TRUE(contentNi, NS_ERROR_FAILURE);

        rv = contentNi->NodeInfoManager()->GetNodeInfo(name, nsnull,
                                                       kNameSpaceID_None,
                                                       getter_AddRefs(ni));
        NS_ENSURE_SUCCESS(rv, rv);
        // value is already empty
      }
    }
    
    // Set the new attribute value
    nsAutoString value;
    attribute->GetValue(value);
    if (!aWithNS && ni->NamespaceID() == kNameSpaceID_None &&
        mContent->IsContentOfType(nsIContent::eHTML)) {
      // Set via setAttribute(), which may do normalization on the
      // attribute name for HTML
      nsCOMPtr<nsIDOMElement> ourElement(do_QueryInterface(mContent));
      NS_ASSERTION(ourElement, "HTML content that's not an element?");
      ourElement->SetAttribute(name, value);
    }
    else {
      // It's OK to just use SetAttr
      rv = mContent->SetAttr(ni->NamespaceID(), ni->NameAtom(),
                             ni->GetPrefixAtom(), value, PR_TRUE);
    }
    
    if (NS_SUCCEEDED(rv)) {
      nsAttrKey attrkey(ni->NamespaceID(), ni->NameAtom());
      rv = mAttributeCache.Put(attrkey, attribute);
      NS_ENSURE_SUCCESS(rv, rv);

      iAttribute->SetMap(this);
    }
  }

  tmpReturn.swap(*aReturn); // transfers ref.

  return rv;
}

Here is the call graph for this function:

nsIDOMNode nsIDOMNamedNodeMap::setNamedItemNS ( in nsIDOMNode  arg) raises (DOMException) [inherited]

Member Data Documentation

readonly attribute unsigned long nsIDOMNamedNodeMap::length [inherited]

Definition at line 61 of file nsIDOMNamedNodeMap.idl.

Cache of nsDOMAttributes.

Definition at line 149 of file nsDOMAttributeMap.h.

Definition at line 144 of file nsDOMAttributeMap.h.


The documentation for this class was generated from the following files: