nsContentList::AttributeChanged(nsIDocument *aDocument, nsIContent* aContent, PRInt32 aNameSpaceID, nsIAtom* aAttribute, PRInt32 aModType) { NS_PRECONDITION(aContent, "Must have a content node to work with");  if (!mFunc || mState == LIST_DIRTY || IsContentAnonymous(aContent)) {   return; }  if (MayContainRelevantNodes(aContent->GetParent())) { if (Match(aContent)) {  mState = LIST_DIRTY; } else {    mElements.RemoveElement(aContent); } } }
NS_IMETHOD AttributeChanged(nsIDocument *aDocument, nsIContent*  aContent, PRInt32      aNameSpaceID, nsIAtom*     aAttribute, PRInt32      aModType, PRInt32      aHint) { return NS_OK; }
nsContentList::AttributeChanged(nsIDocument *aDocument, nsIContent* aContent,                                PRInt32 aNameSpaceID, nsIAtom* aAttribute,                                PRInt32 aModType){  NS_PRECONDITION(aContent, "Must have a content node to work with");    if (!mFunc || mState == LIST_DIRTY || IsContentAnonymous(aContent)) {    // Either we're already dirty or this notification doesn't affect    // whether we might match aContent.    return;  }    if (MayContainRelevantNodes(aContent->GetParent())) {    if (Match(aContent)) {      // We may now match a new node.  Just dirty ourselves.      mState = LIST_DIRTY;    } else {      // We no longer match aContent.  Remove it from our list.  If      // it's already not there, this is a no-op, which is fine.      // Either way, no change of mState is required here.      mElements.RemoveElement(aContent);    }  }}