From 29e5c10d301222cdb4fbacad0028881dc624f757 Mon Sep 17 00:00:00 2001 From: "rbs%maths.uq.edu.au" Date: Tue, 27 Apr 2004 22:22:43 +0000 Subject: [PATCH] Find in textareas misses some matches & some cleanup/consolidation, b=241053, r=akkana, sr=jst git-svn-id: svn://10.0.0.236/trunk@155603 18797224-902f-48f8-a5cc-f745e15eee43 --- .../embedding/components/find/src/nsFind.cpp | 100 +++++++++--------- .../components/find/src/nsWebBrowserFind.cpp | 13 --- 2 files changed, 50 insertions(+), 63 deletions(-) diff --git a/mozilla/embedding/components/find/src/nsFind.cpp b/mozilla/embedding/components/find/src/nsFind.cpp index 6d2081edbc2..8f6dd953c06 100644 --- a/mozilla/embedding/components/find/src/nsFind.cpp +++ b/mozilla/embedding/components/find/src/nsFind.cpp @@ -155,19 +155,21 @@ NS_IMPL_ISUPPORTS1(nsFindContentIterator, nsIContentIterator) nsresult nsFindContentIterator::Init(nsIDOMRange* aRange) { - if (mFindBackward) { - // Use post-order in the reverse case, so we get parents - // before children in case we want to prevent descending - // into a node. - mOuterIterator = do_CreateInstance(kCContentIteratorCID); + if (!mOuterIterator) { + if (mFindBackward) { + // Use post-order in the reverse case, so we get parents + // before children in case we want to prevent descending + // into a node. + mOuterIterator = do_CreateInstance(kCContentIteratorCID); + } + else { + // Use pre-order in the forward case, so we get parents + // before children in case we want to prevent descending + // into a node. + mOuterIterator = do_CreateInstance(kCPreContentIteratorCID); + } + NS_ENSURE_ARG_POINTER(mOuterIterator); } - else { - // Use pre-order in the forward case, so we get parents - // before children in case we want to prevent descending - // into a node. - mOuterIterator = do_CreateInstance(kCPreContentIteratorCID); - } - NS_ENSURE_ARG_POINTER(mOuterIterator); // mRange is the search range that we will examine return aRange->CloneRange(getter_AddRefs(mRange)); @@ -177,20 +179,12 @@ void nsFindContentIterator::First() { Reset(); - mOuterIterator->First(); - if (mInnerIterator) { - mInnerIterator->First(); - } } void nsFindContentIterator::Last() { Reset(); - mOuterIterator->Last(); - if (mInnerIterator) { - mInnerIterator->Last(); - } } void @@ -206,14 +200,7 @@ nsFindContentIterator::Next() else { mOuterIterator->Next(); } - MaybeSetupInnerIterator(); - if (mInnerIterator) { - mInnerIterator->First(); - // finish setup: position mOuterIterator on the actual "next" - // node (this completes its re-init, @see SetupInnerIterator) - mOuterIterator->First(); - } } void @@ -229,14 +216,7 @@ nsFindContentIterator::Prev() else { mOuterIterator->Prev(); } - MaybeSetupInnerIterator(); - if (mInnerIterator) { - mInnerIterator->Last(); - // finish setup: position mOuterIterator on the actual "previous" - // node (this completes its re-init, @see SetupInnerIterator) - mOuterIterator->Last(); - } } nsIContent* @@ -259,23 +239,15 @@ nsFindContentIterator::IsDone() { nsresult nsFindContentIterator::PositionAt(nsIContent* aCurNode) { + nsIContent* oldNode = mOuterIterator->GetCurrentNode(); nsresult rv = mOuterIterator->PositionAt(aCurNode); if (NS_SUCCEEDED(rv)) { MaybeSetupInnerIterator(); - if (mInnerIterator) { - // same rationale as in Next() and Prev() above - if (!mFindBackward) { - mInnerIterator->First(); - mOuterIterator->First(); - } - else { - mInnerIterator->Last(); - mOuterIterator->Last(); - } - } } - else if (mInnerIterator) { - rv = mInnerIterator->PositionAt(aCurNode); + else { + mOuterIterator->PositionAt(oldNode); + if (mInnerIterator) + rv = mInnerIterator->PositionAt(aCurNode); } return rv; } @@ -318,11 +290,25 @@ nsFindContentIterator::Reset() if (mStartOuterNode != startNode) { // the start node was an anonymous text node SetupInnerIterator(startContent); + if (mInnerIterator) + mInnerIterator->First(); } + mOuterIterator->First(); } - else if (mEndOuterNode != endNode) { - // the end node was an anonymous text node - SetupInnerIterator(endContent); + else { + if (mEndOuterNode != endNode) { + // the end node was an anonymous text node + SetupInnerIterator(endContent); + if (mInnerIterator) + mInnerIterator->Last(); + } + mOuterIterator->Last(); + } + + // if we didn't create an inner-iterator, the boundary node could still be + // a text control, in which case we also need an inner-iterator straightaway + if (!mInnerIterator) { + MaybeSetupInnerIterator(); } } @@ -342,6 +328,20 @@ nsFindContentIterator::MaybeSetupInnerIterator() return; SetupInnerIterator(content); + if (mInnerIterator) { + if (!mFindBackward) { + mInnerIterator->First(); + // finish setup: position mOuterIterator on the actual "next" + // node (this completes its re-init, @see SetupInnerIterator) + mOuterIterator->First(); + } + else { + mInnerIterator->Last(); + // finish setup: position mOuterIterator on the actual "previous" + // node (this completes its re-init, @see SetupInnerIterator) + mOuterIterator->Last(); + } + } } void diff --git a/mozilla/embedding/components/find/src/nsWebBrowserFind.cpp b/mozilla/embedding/components/find/src/nsWebBrowserFind.cpp index f9cb970bcdb..3aba420f554 100644 --- a/mozilla/embedding/components/find/src/nsWebBrowserFind.cpp +++ b/mozilla/embedding/components/find/src/nsWebBrowserFind.cpp @@ -751,19 +751,6 @@ nsresult nsWebBrowserFind::SearchInFrame(nsIDOMWindow* aWindow, rv = secMan->CheckSameOrigin(nsnull, docURI); if (NS_FAILED(rv)) return rv; - // if this is a different frame to last time, throw away the mTSFind - // and make a new one. The nsIFindAndReplace is *not* stateless; - // it remembers the last search offset etc. - nsCOMPtr searchFrame = do_QueryReferent(mCurrentSearchFrame); - // Get the selection controller -- we'd better do this every time, - // since the doc might have changed since the last time. - nsIDocShell *docShell = GetDocShellFromWindow(aWindow); - NS_ENSURE_ARG_POINTER(docShell); - - nsCOMPtr presShell; - docShell->GetPresShell(getter_AddRefs(presShell)); - NS_ENSURE_ARG_POINTER(presShell); - if (!mFind) mFind = do_CreateInstance(NS_FIND_CONTRACTID, &rv);