bool nsStyledElementNotElementCSSInlineStyle::ParseAttribute(PRInt32 aNamespaceID, nsIAtom* aAttribute, const nsAString& aValue, nsAttrValue& aResult) { if (aNamespaceID == kNameSpaceID_None) { if (aAttribute == nsGkAtoms::style) { SetMayHaveStyle(); ParseStyleAttribute(aValue, aResult, false); return true; } if (aAttribute == nsGkAtoms::_class) { SetFlags(NODE_MAY_HAVE_CLASS); aResult.ParseAtomArray(aValue); return true; } if (aAttribute == nsGkAtoms::id) { // Store id as an atom. id="" means that the element has no id, // not that it has an emptystring as the id. RemoveFromIdTable(); if (aValue.IsEmpty()) { ClearHasID(); return false; } aResult.ParseAtom(aValue); SetHasID(); AddToIdTable(aResult.GetAtomValue()); return true; } } return nsStyledElementBase::ParseAttribute(aNamespaceID, aAttribute, aValue, aResult); }
nsIDOMCSSStyleDeclaration* nsStyledElementNotElementCSSInlineStyle::GetStyle(nsresult* retval) { nsXULElement* xulElement = nsXULElement::FromContent(this); if (xulElement) { nsresult rv = xulElement->EnsureLocalStyle(); if (NS_FAILED(rv)) { *retval = rv; return nsnull; } } nsGenericElement::nsDOMSlots *slots = DOMSlots(); if (!slots->mStyle) { // Just in case... ReparseStyleAttribute(true); slots->mStyle = new nsDOMCSSAttributeDeclaration(this, false); SetMayHaveStyle(); } *retval = NS_OK; return slots->mStyle; }
nsIDOMCSSStyleDeclaration* nsStyledElementNotElementCSSInlineStyle::GetStyle(nsresult* retval) { nsGenericElement::nsDOMSlots *slots = DOMSlots(); if (!slots->mStyle) { // Just in case... ReparseStyleAttribute(true); slots->mStyle = new nsDOMCSSAttributeDeclaration(this, false); SetMayHaveStyle(); } *retval = NS_OK; return slots->mStyle; }
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); }