From 0d0c23582fbd2a11f2f8603ca33bee765c9d0e75 Mon Sep 17 00:00:00 2001 From: Robert O'Callahan Date: Tue, 21 Jul 2015 16:13:53 +1200 Subject: [PATCH] Bug 1184842. Add aOldValue parameter to nsNodeUtils::AttributeChanged. r=peterv --- dom/base/Element.cpp | 10 ++++++++-- dom/base/nsNodeUtils.cpp | 3 ++- dom/base/nsNodeUtils.h | 6 +++++- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/dom/base/Element.cpp b/dom/base/Element.cpp index a5b0bc52107..b98f5bf9d15 100644 --- a/dom/base/Element.cpp +++ b/dom/base/Element.cpp @@ -2328,7 +2328,11 @@ Element::SetAttrAndNotify(int32_t aNamespaceID, } if (aNotify) { - nsNodeUtils::AttributeChanged(this, aNamespaceID, aName, aModType); + // Don't pass aOldValue to AttributeChanged since it may not be reliable. + // Callers only compute aOldValue under certain conditions which may not + // be triggered by all nsIMutationObservers. + nsNodeUtils::AttributeChanged(this, aNamespaceID, aName, aModType, + oldValue == &aParsedValue ? &aParsedValue : nullptr); } if (aFireMutation) { @@ -2540,8 +2544,10 @@ Element::UnsetAttr(int32_t aNameSpaceID, nsIAtom* aName, } if (aNotify) { + // We can always pass oldValue here since there is no new value which could + // have corrupted it. nsNodeUtils::AttributeChanged(this, aNameSpaceID, aName, - nsIDOMMutationEvent::REMOVAL); + nsIDOMMutationEvent::REMOVAL, &oldValue); } rv = AfterSetAttr(aNameSpaceID, aName, nullptr, aNotify); diff --git a/dom/base/nsNodeUtils.cpp b/dom/base/nsNodeUtils.cpp index aad031bd937..301301fc3d0 100644 --- a/dom/base/nsNodeUtils.cpp +++ b/dom/base/nsNodeUtils.cpp @@ -135,7 +135,8 @@ void nsNodeUtils::AttributeChanged(Element* aElement, int32_t aNameSpaceID, nsIAtom* aAttribute, - int32_t aModType) + int32_t aModType, + const nsAttrValue* aOldValue) { nsIDocument* doc = aElement->OwnerDoc(); IMPL_MUTATION_NOTIFICATION(AttributeChanged, aElement, diff --git a/dom/base/nsNodeUtils.h b/dom/base/nsNodeUtils.h index 1d0f9451df1..decde61615a 100644 --- a/dom/base/nsNodeUtils.h +++ b/dom/base/nsNodeUtils.h @@ -61,12 +61,16 @@ public: * @param aNameSpaceID Namespace of changed attribute * @param aAttribute Local-name of changed attribute * @param aModType Type of change (add/change/removal) + * @param aOldValue If the old value was StoresOwnData() (or absent), + * that value, otherwise null * @see nsIMutationObserver::AttributeChanged */ static void AttributeChanged(mozilla::dom::Element* aElement, int32_t aNameSpaceID, nsIAtom* aAttribute, - int32_t aModType); + int32_t aModType, + const nsAttrValue* aOldValue); + /** * Send AttributeSetToCurrentValue notifications to nsIMutationObservers. * @param aElement Element whose data changed