void nsFindContentIterator::MaybeSetupInnerIterator() { mInnerIterator = nsnull; nsCOMPtr<nsIContent> content = do_QueryInterface(mOuterIterator->GetCurrentNode()); if (!content || !content->IsNodeOfType(nsINode::eHTML_FORM_CONTROL)) return; nsCOMPtr<nsIFormControl> formControl(do_QueryInterface(content)); if (!formControl->IsTextControl(true)) { 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) if (!mOuterIterator->IsDone()) mOuterIterator->First(); } else { mInnerIterator->Last(); // finish setup: position mOuterIterator on the actual "previous" // node (this completes its re-init, @see SetupInnerIterator) if (!mOuterIterator->IsDone()) mOuterIterator->Last(); } } }
void nsFindContentIterator::MaybeSetupInnerIterator() { mInnerIterator = nsnull; nsIContent* content = mOuterIterator->GetCurrentNode(); if (!content || !content->IsNodeOfType(nsINode::eHTML_FORM_CONTROL)) return; nsCOMPtr<nsIFormControl> formControl(do_QueryInterface(content)); PRInt32 controlType = formControl->GetType(); if (controlType != NS_FORM_TEXTAREA && controlType != NS_FORM_INPUT_TEXT) 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 nsFindContentIterator::Reset() { mInnerIterator = nsnull; mStartOuterContent = nsnull; mEndOuterContent = nsnull; // As a consequence of searching through text controls, we may have been // initialized with a selection inside a <textarea> or a text <input>. // see if the start node is an anonymous text node inside a text control nsCOMPtr<nsIContent> startContent(do_QueryInterface(mStartNode)); if (startContent) { mStartOuterContent = startContent->FindFirstNonNativeAnonymous(); } // see if the end node is an anonymous text node inside a text control nsCOMPtr<nsIContent> endContent(do_QueryInterface(mEndNode)); if (endContent) { mEndOuterContent = endContent->FindFirstNonNativeAnonymous(); } // Note: OK to just set up the outer iterator here; if our range has a native // anonymous endpoint we'll end up setting up an inner iterator, and // reset the outer one in the process. nsCOMPtr<nsIDOMRange> range = nsFind::CreateRange(); range->SetStart(mStartNode, mStartOffset); range->SetEnd(mEndNode, mEndOffset); mOuterIterator->Init(range); if (!mFindBackward) { if (mStartOuterContent != startContent) { // the start node was an anonymous text node SetupInnerIterator(mStartOuterContent); if (mInnerIterator) mInnerIterator->First(); } if (!mOuterIterator->IsDone()) mOuterIterator->First(); } else { if (mEndOuterContent != endContent) { // the end node was an anonymous text node SetupInnerIterator(mEndOuterContent); if (mInnerIterator) mInnerIterator->Last(); } if (!mOuterIterator->IsDone()) 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(); } }