From a7d38d2e5ca3e1bcbccbe44ef9bc5f76d4021f7e Mon Sep 17 00:00:00 2001 From: "allan%beaufour.dk" Date: Wed, 24 May 2006 07:32:10 +0000 Subject: [PATCH] [XForms] Repeat index() doesnt reset to 0 when last repeat item is deleted. Bug 334015, r=smaug+aaronr. Also fixes bug 318779. git-svn-id: svn://10.0.0.236/trunk@198317 18797224-902f-48f8-a5cc-f745e15eee43 --- .../xforms/nsXFormsRepeatElement.cpp | 48 ++++++++++++++----- 1 file changed, 35 insertions(+), 13 deletions(-) diff --git a/mozilla/extensions/xforms/nsXFormsRepeatElement.cpp b/mozilla/extensions/xforms/nsXFormsRepeatElement.cpp index d1f38e61601..36844ee8b0e 100644 --- a/mozilla/extensions/xforms/nsXFormsRepeatElement.cpp +++ b/mozilla/extensions/xforms/nsXFormsRepeatElement.cpp @@ -415,11 +415,8 @@ nsXFormsRepeatElement::SetIndex(PRUint32 *aIndex, // Do nothing if we are not showing anything if (mMaxIndex == 0) { - // 9.3.6 states that the index position becomes 0 if there are - // no elements in the repeat. - mCurrentIndex = 0; - - // XXXbeaufour: handle scroll-first/last + SanitizeIndex(aIndex, PR_TRUE); + mCurrentIndex = *aIndex; return NS_OK; } @@ -474,8 +471,12 @@ NS_IMETHODIMP nsXFormsRepeatElement::GetIndex(PRUint32 *aIndex) { NS_ENSURE_ARG(aIndex); - if (mParent) { - return mParent->GetIndex(aIndex); + if (mIsParent) { + if (!mCurrentRepeat) { + *aIndex = 0; + return NS_OK; + } + return mCurrentRepeat->GetIndex(aIndex); } *aIndex = mCurrentIndex; @@ -747,6 +748,9 @@ nsXFormsRepeatElement::InsertTemplateContent(nsIDOMNode *aNode) nsresult nsXFormsRepeatElement::UnrollRows(nsIDOMXPathResult *aNodeset) { +#ifdef DEBUG_XF_REPEAT + printf("nsXFormsRepeatElement::UnrollRows()\n"); +#endif NS_ENSURE_STATE(mElement); nsCOMPtr anon = GetAnonymousContent(); @@ -764,6 +768,11 @@ nsXFormsRepeatElement::UnrollRows(nsIDOMXPathResult *aNodeset) mMaxIndex = contextSize; } +#ifdef DEBUG_XF_REPEAT + printf("\tmMaxIndex: %d, mCurrentRowCount: %d\n", + mMaxIndex, mCurrentRowCount); +#endif + // STEP 1: Remove rows nsCOMPtr tmp; if (mMaxIndex < mCurrentRowCount) { @@ -859,6 +868,8 @@ nsXFormsRepeatElement::Refresh() nsPostRefresh postRefresh = nsPostRefresh(); + PRUint32 oldIndex = mCurrentIndex; + /// @todo The spec says: "This node-set must consist of contiguous child /// element nodes, with the same local name and namespace name of a common /// parent node. The behavior of element repeat with respect to @@ -881,10 +892,10 @@ nsXFormsRepeatElement::Refresh() NS_ENSURE_SUCCESS(rv, rv); // Maintain the index - if (mCurrentIndex) { - // somebody might have been fooling around with our children since last - // refresh (either using delete or through script, so check the index - // value + if (mCurrentIndex || !mMaxIndex) { + // Somebody might have been fooling around with our children since last + // refresh (either using delete or through script). Or we might have an + // empty nodeset. So fix the index value. SanitizeIndex(&mCurrentIndex); } else if (mMaxIndex) { // repeat-index has not been initialized, set it. @@ -927,6 +938,10 @@ nsXFormsRepeatElement::Refresh() SetChildIndex(mCurrentIndex, PR_TRUE, PR_TRUE); } + if (mCurrentIndex != oldIndex) { + mParent ? mParent->IndexHasChanged() : IndexHasChanged(); + } + return NS_OK; } @@ -983,9 +998,12 @@ nsXFormsRepeatElement::SanitizeIndex(PRUint32 *aIndex, PRBool aIsScroll) { if (!aIndex) return; - +#ifdef DEBUG_XF_REPEAT + printf("nsXFormsRepeatElement::SanitizeIndex()\n"); + printf("\tCurrent index: %d\n", *aIndex); +#endif if (*aIndex < 1) { - *aIndex = 1; + *aIndex = mMaxIndex ? 1 : 0; if (aIsScroll) nsXFormsUtils::DispatchEvent(mElement, eEvent_ScrollFirst); } else if (*aIndex > mMaxIndex) { @@ -993,6 +1011,10 @@ nsXFormsRepeatElement::SanitizeIndex(PRUint32 *aIndex, PRBool aIsScroll) if (aIsScroll) nsXFormsUtils::DispatchEvent(mElement, eEvent_ScrollLast); } + +#ifdef DEBUG_XF_REPEAT + printf("\tNew index: %d\n", *aIndex); +#endif } nsresult