already_AddRefed<nsISVGPoint> DOMSVGPointList::RemoveItem(uint32_t aIndex, ErrorResult& aError) { if (IsAnimValList()) { aError.Throw(NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR); return nullptr; } if (aIndex >= LengthNoFlush()) { aError.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); return nullptr; } AutoChangePointListNotifier notifier(this); // Now that we know we're removing, keep animVal list in sync as necessary. // Do this *before* touching InternalList() so the removed item can get its // internal value. MaybeRemoveItemFromAnimValListAt(aIndex); // We have to return the removed item, so get it, creating it if necessary: RefPtr<nsISVGPoint> result = GetItemAt(aIndex); // Notify the DOM item of removal *before* modifying the lists so that the // DOM item can copy its *old* value: mItems[aIndex]->RemovingFromList(); InternalList().RemoveItem(aIndex); mItems.RemoveElementAt(aIndex); UpdateListIndicesFromIndex(mItems, aIndex); return result.forget(); }
already_AddRefed<DOMSVGPathSeg> DOMSVGPathSegList::RemoveItem(uint32_t aIndex, ErrorResult& aError) { if (IsAnimValList()) { aError.Throw(NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR); return nullptr; } if (aIndex >= LengthNoFlush()) { aError.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); return nullptr; } // We have to return the removed item, so make sure it exists: EnsureItemAt(aIndex); nsAttrValue emptyOrOldValue = Element()->WillChangePathSegList(); // Notify the DOM item of removal *before* modifying the lists so that the // DOM item can copy its *old* value: ItemAt(aIndex)->RemovingFromList(); nsRefPtr<DOMSVGPathSeg> result = ItemAt(aIndex); uint32_t internalIndex = mItems[aIndex].mInternalDataIndex; uint32_t segType = SVGPathSegUtils::DecodeType(InternalList().mData[internalIndex]); // NOTE: ArgCountForType returns a (small) unsigned value, but we're // intentionally putting it in a signed value, because we're going to // negate it, and you can't negate an unsigned value. int32_t argCount = SVGPathSegUtils::ArgCountForType(segType); // Now that we know we're removing, keep animVal list in sync as necessary. // Do this *before* touching InternalList() so the removed item can get its // internal value. MaybeRemoveItemFromAnimValListAt(aIndex, argCount); InternalList().mData.RemoveElementsAt(internalIndex, 1 + argCount); mItems.RemoveElementAt(aIndex); UpdateListIndicesFromIndex(aIndex, -(argCount + 1)); Element()->DidChangePathSegList(emptyOrOldValue); if (AttrIsAnimating()) { Element()->AnimationNeedsResample(); } return result.forget(); }
NS_IMETHODIMP DOMSVGPathSegList::RemoveItem(PRUint32 aIndex, nsIDOMSVGPathSeg **_retval) { *_retval = nsnull; if (IsAnimValList()) { return NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR; } if (aIndex >= Length()) { return NS_ERROR_DOM_INDEX_SIZE_ERR; } // We have to return the removed item, so make sure it exists: EnsureItemAt(aIndex); // Notify the DOM item of removal *before* modifying the lists so that the // DOM item can copy its *old* value: ItemAt(aIndex)->RemovingFromList(); NS_ADDREF(*_retval = ItemAt(aIndex)); PRUint32 internalIndex = mItems[aIndex].mInternalDataIndex; PRUint32 segType = SVGPathSegUtils::DecodeType(InternalList().mData[internalIndex]); PRUint32 argCount = SVGPathSegUtils::ArgCountForType(segType); // Now that we know we're removing, keep animVal list in sync as necessary. // Do this *before* touching InternalList() so the removed item can get its // internal value. MaybeRemoveItemFromAnimValListAt(aIndex, argCount); InternalList().mData.RemoveElementsAt(internalIndex, 1 + argCount); mItems.RemoveElementAt(aIndex); UpdateListIndicesFromIndex(aIndex, -(argCount + 1)); Element()->DidChangePathSegList(PR_TRUE); #ifdef MOZ_SMIL if (AttrIsAnimating()) { Element()->AnimationNeedsResample(); } #endif return NS_OK; }
NS_IMETHODIMP DOMSVGNumberList::RemoveItem(PRUint32 index, nsIDOMSVGNumber **_retval) { *_retval = nsnull; if (IsAnimValList()) { return NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR; } if (index >= Length()) { return NS_ERROR_DOM_INDEX_SIZE_ERR; } // Now that we know we're removing, keep animVal list in sync as necessary. // Do this *before* touching InternalList() so the removed item can get its // internal value. MaybeRemoveItemFromAnimValListAt(index); // We have to return the removed item, so make sure it exists: EnsureItemAt(index); // Notify the DOM item of removal *before* modifying the lists so that the // DOM item can copy its *old* value: mItems[index]->RemovingFromList(); NS_ADDREF(*_retval = mItems[index]); InternalList().RemoveItem(index); mItems.RemoveElementAt(index); UpdateListIndicesFromIndex(mItems, index); Element()->DidChangeNumberList(AttrEnum(), PR_TRUE); #ifdef MOZ_SMIL if (mAList->IsAnimating()) { Element()->AnimationNeedsResample(); } #endif return NS_OK; }
already_AddRefed<nsISVGPoint> DOMSVGPointList::RemoveItem(uint32_t aIndex, ErrorResult& aError) { if (IsAnimValList()) { aError.Throw(NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR); return nullptr; } if (aIndex >= LengthNoFlush()) { aError.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); return nullptr; } nsAttrValue emptyOrOldValue = Element()->WillChangePointList(); // Now that we know we're removing, keep animVal list in sync as necessary. // Do this *before* touching InternalList() so the removed item can get its // internal value. MaybeRemoveItemFromAnimValListAt(aIndex); // We have to return the removed item, so make sure it exists: EnsureItemAt(aIndex); // Notify the DOM item of removal *before* modifying the lists so that the // DOM item can copy its *old* value: mItems[aIndex]->RemovingFromList(); nsCOMPtr<nsISVGPoint> result = mItems[aIndex]; InternalList().RemoveItem(aIndex); mItems.RemoveElementAt(aIndex); UpdateListIndicesFromIndex(mItems, aIndex); Element()->DidChangePointList(emptyOrOldValue); if (AttrIsAnimating()) { Element()->AnimationNeedsResample(); } return result.forget(); }
NS_IMETHODIMP DOMSVGPointList::RemoveItem(PRUint32 aIndex, nsIDOMSVGPoint **_retval) { *_retval = nsnull; if (IsAnimValList()) { return NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR; } if (aIndex >= Length()) { return NS_ERROR_DOM_INDEX_SIZE_ERR; } nsAttrValue emptyOrOldValue = Element()->WillChangePointList(); // Now that we know we're removing, keep animVal list in sync as necessary. // Do this *before* touching InternalList() so the removed item can get its // internal value. MaybeRemoveItemFromAnimValListAt(aIndex); // We have to return the removed item, so make sure it exists: EnsureItemAt(aIndex); // Notify the DOM item of removal *before* modifying the lists so that the // DOM item can copy its *old* value: mItems[aIndex]->RemovingFromList(); NS_ADDREF(*_retval = mItems[aIndex]); InternalList().RemoveItem(aIndex); mItems.RemoveElementAt(aIndex); UpdateListIndicesFromIndex(mItems, aIndex); Element()->DidChangePointList(emptyOrOldValue); if (AttrIsAnimating()) { Element()->AnimationNeedsResample(); } return NS_OK; }
already_AddRefed<SVGTransform> DOMSVGTransformList::RemoveItem(uint32_t index, ErrorResult& error) { if (IsAnimValList()) { error.Throw(NS_ERROR_DOM_NO_MODIFICATION_ALLOWED_ERR); return nullptr; } if (index >= LengthNoFlush()) { error.Throw(NS_ERROR_DOM_INDEX_SIZE_ERR); return nullptr; } nsAttrValue emptyOrOldValue = Element()->WillChangeTransformList(); // Now that we know we're removing, keep animVal list in sync as necessary. // Do this *before* touching InternalList() so the removed item can get its // internal value. MaybeRemoveItemFromAnimValListAt(index); // We have to return the removed item, so get it, creating it if necessary: nsRefPtr<SVGTransform> result = GetItemAt(index); // Notify the DOM item of removal *before* modifying the lists so that the // DOM item can copy its *old* value: result->RemovingFromList(); InternalList().RemoveItem(index); mItems.RemoveElementAt(index); UpdateListIndicesFromIndex(mItems, index); Element()->DidChangeTransformList(emptyOrOldValue); if (mAList->IsAnimating()) { Element()->AnimationNeedsResample(); } return result.forget(); }