void DOMSVGAnimatedNumberList::InternalBaseValListWillChangeTo(const SVGNumberList& aNewValue) { // When the number of items in our internal counterpart's baseVal changes, // we MUST keep our baseVal in sync. If we don't, script will either see a // list that is too short and be unable to access indexes that should be // valid, or else, MUCH WORSE, script will see a list that is too long and be // able to access "items" at indexes that are out of bounds (read/write to // bad memory)!! RefPtr<DOMSVGAnimatedNumberList> kungFuDeathGrip; if (mBaseVal) { if (aNewValue.Length() < mBaseVal->LengthNoFlush()) { // InternalListLengthWillChange might clear last reference to |this|. // Retain a temporary reference to keep from dying before returning. kungFuDeathGrip = this; } mBaseVal->InternalListLengthWillChange(aNewValue.Length()); } // If our attribute is not animating, then our animVal mirrors our baseVal // and we must sync its length too. (If our attribute is animating, then the // SMIL engine takes care of calling InternalAnimValListWillChangeTo() if // necessary.) if (!IsAnimating()) { InternalAnimValListWillChangeTo(aNewValue); } }
void DOMSVGAnimatedNumberList::InternalAnimValListWillChangeTo(const SVGNumberList& aNewValue) { if (mAnimVal) { mAnimVal->InternalListLengthWillChange(aNewValue.Length()); } }
nsresult SVGNumberList::CopyFrom(const SVGNumberList& rhs) { if (!mNumbers.SetCapacity(rhs.Length())) { // Yes, we do want fallible alloc here return NS_ERROR_OUT_OF_MEMORY; } mNumbers = rhs.mNumbers; return NS_OK; }