Refactor MaybeCheckSameAttrVal to streamline old value storage for custom elements

This commit is contained in:
ownedbywuigi 2026-03-27 11:34:40 +00:00
commit d34a9c5778

View file

@ -2336,6 +2336,7 @@ Element::MaybeCheckSameAttrVal(int32_t aNamespaceID,
bool* aOldValueSet) bool* aOldValueSet)
{ {
bool modification = false; bool modification = false;
CustomElementData* customElementData = GetCustomElementData();
*aHasListeners = aNotify && *aHasListeners = aNotify &&
nsContentUtils::HasMutationListeners(this, nsContentUtils::HasMutationListeners(this,
NS_EVENT_BITS_MUTATION_ATTRMODIFIED, NS_EVENT_BITS_MUTATION_ATTRMODIFIED,
@ -2351,13 +2352,14 @@ Element::MaybeCheckSameAttrVal(int32_t aNamespaceID,
if (*aHasListeners || aNotify) { if (*aHasListeners || aNotify) {
BorrowedAttrInfo info(GetAttrInfo(aNamespaceID, aName)); BorrowedAttrInfo info(GetAttrInfo(aNamespaceID, aName));
if (info.mValue) { if (info.mValue) {
// Check whether the old value is the same as the new one. Note that we bool valueMatches = aValue.EqualsAsStrings(*info.mValue);
// only need to actually _get_ the old value if we have listeners or if (valueMatches && aPrefix == info.mName->GetPrefix()) {
// if the element is a custom element (because it may have an return true;
// attribute changed callback). }
if (*aHasListeners || GetCustomElementData()) {
// Need to store the old value. // Need to store the old value if listeners are present or this is a
// // custom element that may run an attribute-changed callback.
if (*aHasListeners || customElementData) {
// If the current attribute value contains a pointer to some other data // If the current attribute value contains a pointer to some other data
// structure that gets updated in the process of setting the attribute // structure that gets updated in the process of setting the attribute
// we'll no longer have the old value of the attribute. Therefore, we // we'll no longer have the old value of the attribute. Therefore, we
@ -2368,10 +2370,7 @@ Element::MaybeCheckSameAttrVal(int32_t aNamespaceID,
aOldValue.SetToSerialized(*info.mValue); aOldValue.SetToSerialized(*info.mValue);
*aOldValueSet = true; *aOldValueSet = true;
} }
bool valueMatches = aValue.EqualsAsStrings(*info.mValue);
if (valueMatches && aPrefix == info.mName->GetPrefix()) {
return true;
}
modification = true; modification = true;
} }
} }