NS_IMETHODIMP nsStyledElement::SetInlineStyleRule(nsICSSStyleRule* aStyleRule, PRBool aNotify) { SetFlags(NODE_MAY_HAVE_STYLE); PRBool modification = PR_FALSE; nsAutoString oldValueStr; PRBool hasListeners = aNotify && nsContentUtils::HasMutationListeners(this, NS_EVENT_BITS_MUTATION_ATTRMODIFIED, this); // There's no point in comparing the stylerule pointers since we're always // getting a new stylerule here. And we can't compare the stringvalues of // the old and the new rules since both will point to the same declaration // and thus will be the same. if (hasListeners) { // save the old attribute so we can set up the mutation event properly // XXXbz if the old rule points to the same declaration as the new one, // this is getting the new attr value, not the old one.... modification = GetAttr(kNameSpaceID_None, nsGkAtoms::style, oldValueStr); } else if (aNotify && IsInDoc()) { modification = !!mAttrsAndChildren.GetAttr(nsGkAtoms::style); } nsAttrValue attrValue(aStyleRule); return SetAttrAndNotify(kNameSpaceID_None, nsGkAtoms::style, nsnull, oldValueStr, attrValue, modification, hasListeners, aNotify, nsnull); }
NS_IMETHODIMP nsSVGElement::DidModifySVGObservable(nsISVGValue* aObservable, nsISVGValue::modificationType aModType) { // Return without setting DOM attributes as markup attributes if the // attribute's element is being inserted into an SVG document fragment, // which provides a context which percentage lengths are relative to. // Bug 274886 if (aModType == nsISVGValue::mod_context) return NS_OK; // Return without setting DOM attribute if (mSuppressNotification) return NS_OK; PRUint32 i, count = mMappedAttributes.AttrCount(); const nsAttrValue* attrValue = nsnull; for (i = 0; i < count; ++i) { attrValue = mMappedAttributes.AttrAt(i); if (attrValue->GetSVGValue() == aObservable) { break; } } if (i == count) { NS_NOTREACHED("unknown nsISVGValue"); return NS_ERROR_UNEXPECTED; } const nsAttrName* attrName = mMappedAttributes.AttrNameAt(i); PRBool modification = PR_FALSE; PRBool hasListeners = nsContentUtils::HasMutationListeners(this, NS_EVENT_BITS_MUTATION_ATTRMODIFIED, this); if (hasListeners || IsInDoc()) { modification = !!mAttrsAndChildren.GetAttr(attrName->LocalName(), attrName->NamespaceID()); } nsAttrValue newValue(aObservable); return SetAttrAndNotify(attrName->NamespaceID(), attrName->LocalName(), attrName->GetPrefix(), EmptyString(), newValue, modification, hasListeners, PR_TRUE, nsnull); }
NS_IMETHODIMP nsStyledElementNotElementCSSInlineStyle::SetInlineStyleRule(css::StyleRule* aStyleRule, const nsAString* aSerialized, bool aNotify) { SetMayHaveStyle(); bool modification = false; nsAttrValue oldValue; bool hasListeners = aNotify && nsContentUtils::HasMutationListeners(this, NS_EVENT_BITS_MUTATION_ATTRMODIFIED, this); // There's no point in comparing the stylerule pointers since we're always // getting a new stylerule here. And we can't compare the stringvalues of // the old and the new rules since both will point to the same declaration // and thus will be the same. if (hasListeners) { // save the old attribute so we can set up the mutation event properly // XXXbz if the old rule points to the same declaration as the new one, // this is getting the new attr value, not the old one.... nsAutoString oldValueStr; modification = GetAttr(kNameSpaceID_None, nsGkAtoms::style, oldValueStr); if (modification) { oldValue.SetTo(oldValueStr); } } else if (aNotify && IsInDoc()) { modification = !!mAttrsAndChildren.GetAttr(nsGkAtoms::style); } nsAttrValue attrValue(aStyleRule, aSerialized); // XXXbz do we ever end up with ADDITION here? I doubt it. PRUint8 modType = modification ? static_cast<PRUint8>(nsIDOMMutationEvent::MODIFICATION) : static_cast<PRUint8>(nsIDOMMutationEvent::ADDITION); return SetAttrAndNotify(kNameSpaceID_None, nsGkAtoms::style, nsnull, oldValue, attrValue, modType, hasListeners, aNotify, kDontCallAfterSetAttr); }