From 6edc32d46b6ae42af8d60640308ec8e5fa6fce6f Mon Sep 17 00:00:00 2001 From: Daniel Holbert Date: Tue, 15 Feb 2011 23:54:04 -0800 Subject: [PATCH] Bug 632143 patch 0: Add helper-method 'UpdateListIndicesFromIndex' to DOMSVGxxxList classes. r=roc a=blocking-final+ --- content/svg/content/src/DOMSVGLengthList.cpp | 31 ++++++++++++------ content/svg/content/src/DOMSVGNumberList.cpp | 31 ++++++++++++------ content/svg/content/src/DOMSVGPathSegList.cpp | 28 +++++++++------- content/svg/content/src/DOMSVGPathSegList.h | 6 ++++ content/svg/content/src/DOMSVGPointList.cpp | 32 +++++++++++++------ 5 files changed, 86 insertions(+), 42 deletions(-) diff --git a/content/svg/content/src/DOMSVGLengthList.cpp b/content/svg/content/src/DOMSVGLengthList.cpp index 30bff8b4ebe5..3b85afff31e7 100644 --- a/content/svg/content/src/DOMSVGLengthList.cpp +++ b/content/svg/content/src/DOMSVGLengthList.cpp @@ -43,6 +43,25 @@ // See the comment in this file's header. +// local helper functions +namespace { + +using mozilla::DOMSVGLength; + +void UpdateListIndicesFromIndex(nsTArray& aItemsArray, + PRUint32 aStartingIndex) +{ + PRUint32 length = aItemsArray.Length(); + + for (PRUint32 i = aStartingIndex; i < length; ++i) { + if (aItemsArray[i]) { + aItemsArray[i]->UpdateListIndex(i); + } + } +} + +} // namespace + namespace mozilla { // We could use NS_IMPL_CYCLE_COLLECTION_1, except that in Unlink() we need to @@ -235,11 +254,7 @@ DOMSVGLengthList::InsertItemBefore(nsIDOMSVGLength *newItem, // data from InternalList() itself!: domItem->InsertingIntoList(this, AttrEnum(), index, IsAnimValList()); - for (PRUint32 i = index + 1; i < Length(); ++i) { - if (mItems[i]) { - mItems[i]->UpdateListIndex(i); - } - } + UpdateListIndicesFromIndex(mItems, index + 1); Element()->DidChangeLengthList(AttrEnum(), PR_TRUE); #ifdef MOZ_SMIL @@ -318,11 +333,7 @@ DOMSVGLengthList::RemoveItem(PRUint32 index, InternalList().RemoveItem(index); mItems.RemoveElementAt(index); - for (PRUint32 i = index; i < Length(); ++i) { - if (mItems[i]) { - mItems[i]->UpdateListIndex(i); - } - } + UpdateListIndicesFromIndex(mItems, index); Element()->DidChangeLengthList(AttrEnum(), PR_TRUE); #ifdef MOZ_SMIL diff --git a/content/svg/content/src/DOMSVGNumberList.cpp b/content/svg/content/src/DOMSVGNumberList.cpp index e412ec84bdcb..45fcfaa8eb4f 100644 --- a/content/svg/content/src/DOMSVGNumberList.cpp +++ b/content/svg/content/src/DOMSVGNumberList.cpp @@ -45,6 +45,25 @@ namespace mozilla { +// local helper functions +namespace { + +using mozilla::DOMSVGNumber; + +void UpdateListIndicesFromIndex(nsTArray& aItemsArray, + PRUint32 aStartingIndex) +{ + PRUint32 length = aItemsArray.Length(); + + for (PRUint32 i = aStartingIndex; i < length; ++i) { + if (aItemsArray[i]) { + aItemsArray[i]->UpdateListIndex(i); + } + } +} + +} // namespace + // We could use NS_IMPL_CYCLE_COLLECTION_1, except that in Unlink() we need to // clear our DOMSVGAnimatedNumberList's weak ref to us to be safe. (The other // option would be to not unlink and rely on the breaking of the other edges in @@ -235,11 +254,7 @@ DOMSVGNumberList::InsertItemBefore(nsIDOMSVGNumber *newItem, // data from InternalList() itself!: domItem->InsertingIntoList(this, AttrEnum(), index, IsAnimValList()); - for (PRUint32 i = index + 1; i < Length(); ++i) { - if (mItems[i]) { - mItems[i]->UpdateListIndex(i); - } - } + UpdateListIndicesFromIndex(mItems, index + 1); Element()->DidChangeNumberList(AttrEnum(), PR_TRUE); #ifdef MOZ_SMIL @@ -318,11 +333,7 @@ DOMSVGNumberList::RemoveItem(PRUint32 index, InternalList().RemoveItem(index); mItems.RemoveElementAt(index); - for (PRUint32 i = index; i < Length(); ++i) { - if (mItems[i]) { - mItems[i]->UpdateListIndex(i); - } - } + UpdateListIndicesFromIndex(mItems, index); Element()->DidChangeNumberList(AttrEnum(), PR_TRUE); #ifdef MOZ_SMIL diff --git a/content/svg/content/src/DOMSVGPathSegList.cpp b/content/svg/content/src/DOMSVGPathSegList.cpp index 8f155f80e962..a45488b72d06 100644 --- a/content/svg/content/src/DOMSVGPathSegList.cpp +++ b/content/svg/content/src/DOMSVGPathSegList.cpp @@ -360,12 +360,7 @@ DOMSVGPathSegList::InsertItemBefore(nsIDOMSVGPathSeg *aNewItem, // data from InternalList() itself!: domItem->InsertingIntoList(this, aIndex, IsAnimValList()); - for (PRUint32 i = aIndex + 1; i < Length(); ++i) { - mItems[i].mInternalDataIndex += 1 + argCount; - if (ItemAt(i)) { - ItemAt(i)->UpdateListIndex(i); - } - } + UpdateListIndicesFromIndex(aIndex + 1, argCount + 1); Element()->DidChangePathSegList(PR_TRUE); #ifdef MOZ_SMIL @@ -470,12 +465,7 @@ DOMSVGPathSegList::RemoveItem(PRUint32 aIndex, InternalList().mData.RemoveElementsAt(internalIndex, 1 + argCount); mItems.RemoveElementAt(aIndex); - for (PRUint32 i = aIndex; i < Length(); ++i) { - mItems[i].mInternalDataIndex -= 1 + argCount; - if (ItemAt(i)) { - ItemAt(i)->UpdateListIndex(i); - } - } + UpdateListIndicesFromIndex(aIndex, -(argCount + 1)); Element()->DidChangePathSegList(PR_TRUE); #ifdef MOZ_SMIL @@ -501,4 +491,18 @@ DOMSVGPathSegList::EnsureItemAt(PRUint32 aIndex) } } +void +DOMSVGPathSegList::UpdateListIndicesFromIndex(PRUint32 aStartingIndex, + PRInt32 aInternalDataIndexDelta) +{ + PRUint32 length = Length(); + + for (PRUint32 i = aStartingIndex; i < length; ++i) { + mItems[i].mInternalDataIndex += aInternalDataIndexDelta; + if (ItemAt(i)) { + ItemAt(i)->UpdateListIndex(i); + } + } +} + } // namespace mozilla diff --git a/content/svg/content/src/DOMSVGPathSegList.h b/content/svg/content/src/DOMSVGPathSegList.h index be621b0ba18e..5bc5e3fc36c7 100644 --- a/content/svg/content/src/DOMSVGPathSegList.h +++ b/content/svg/content/src/DOMSVGPathSegList.h @@ -190,6 +190,12 @@ private: // aIndex, if it doesn't already exist. void EnsureItemAt(PRUint32 aIndex); + // Calls UpdateListIndex on all elements in |mItems| that satisfy ItemAt(), + // from |aStartingIndex| to the end of |mItems|. Also adjusts + // |mItems.mInternalDataIndex| by the requested amount. + void UpdateListIndicesFromIndex(PRUint32 aStartingIndex, + PRInt32 aInternalDataIndexDelta); + DOMSVGPathSeg*& ItemAt(PRUint32 aIndex) { return mItems[aIndex].mItem; } diff --git a/content/svg/content/src/DOMSVGPointList.cpp b/content/svg/content/src/DOMSVGPointList.cpp index 22c0f93492f9..5cb7fcbad667 100644 --- a/content/svg/content/src/DOMSVGPointList.cpp +++ b/content/svg/content/src/DOMSVGPointList.cpp @@ -44,6 +44,26 @@ // See the comment in this file's header. +// local helper functions +namespace { + +using mozilla::DOMSVGPoint; + +void +UpdateListIndicesFromIndex(nsTArray& aItemsArray, + PRUint32 aStartingIndex) +{ + PRUint32 length = aItemsArray.Length(); + + for (PRUint32 i = aStartingIndex; i < length; ++i) { + if (aItemsArray[i]) { + aItemsArray[i]->UpdateListIndex(i); + } + } +} + +} // namespace + namespace mozilla { static nsSVGAttrTearoffTable @@ -285,11 +305,7 @@ DOMSVGPointList::InsertItemBefore(nsIDOMSVGPoint *aNewItem, // data from InternalList() itself!: domItem->InsertingIntoList(this, aIndex, IsAnimValList()); - for (PRUint32 i = aIndex + 1; i < Length(); ++i) { - if (mItems[i]) { - mItems[i]->UpdateListIndex(i); - } - } + UpdateListIndicesFromIndex(mItems, aIndex + 1); Element()->DidChangePointList(PR_TRUE); #ifdef MOZ_SMIL @@ -368,11 +384,7 @@ DOMSVGPointList::RemoveItem(PRUint32 aIndex, InternalList().RemoveItem(aIndex); mItems.RemoveElementAt(aIndex); - for (PRUint32 i = aIndex; i < Length(); ++i) { - if (mItems[i]) { - mItems[i]->UpdateListIndex(i); - } - } + UpdateListIndicesFromIndex(mItems, aIndex); Element()->DidChangePointList(PR_TRUE); #ifdef MOZ_SMIL