From bd7b96bf1202cad5174f289c84ae664d445dc1e2 Mon Sep 17 00:00:00 2001 From: Aryeh Gregor Date: Fri, 2 May 2014 15:15:27 +0300 Subject: [PATCH] Bug 1004522 part 14 - Clean up nsWSRunObject::GetWSPointBefore/After; r=ehsan --- editor/libeditor/html/nsWSRunObject.cpp | 106 +++++++++++------------- editor/libeditor/html/nsWSRunObject.h | 8 +- 2 files changed, 51 insertions(+), 63 deletions(-) diff --git a/editor/libeditor/html/nsWSRunObject.cpp b/editor/libeditor/html/nsWSRunObject.cpp index 698399174c1..54952d6afcf 100644 --- a/editor/libeditor/html/nsWSRunObject.cpp +++ b/editor/libeditor/html/nsWSRunObject.cpp @@ -14,10 +14,8 @@ #include "nsError.h" #include "nsHTMLEditor.h" #include "nsIContent.h" -#include "nsIDOMCharacterData.h" #include "nsIDOMDocument.h" #include "nsIDOMNode.h" -#include "nsIDOMRange.h" #include "nsISupportsImpl.h" #include "nsRange.h" #include "nsSelectionState.h" @@ -1405,7 +1403,7 @@ nsWSRunObject::GetCharAfter(nsINode* aNode, int32_t aOffset) int32_t idx = mNodeArray.IndexOf(aNode); if (idx == -1) { // Use range comparisons to get right ws node - return GetWSPointAfter(GetAsDOMNode(aNode), aOffset); + return GetWSPointAfter(aNode, aOffset); } else { // Use WSPoint version of GetCharAfter() return GetCharAfter(WSPoint(aNode, aOffset, 0)); @@ -1420,7 +1418,7 @@ nsWSRunObject::GetCharBefore(nsINode* aNode, int32_t aOffset) int32_t idx = mNodeArray.IndexOf(aNode); if (idx == -1) { // Use range comparisons to get right ws node - return GetWSPointBefore(GetAsDOMNode(aNode), aOffset); + return GetWSPointBefore(aNode, aOffset); } else { // Use WSPoint version of GetCharBefore() return GetCharBefore(WSPoint(aNode, aOffset, 0)); @@ -1647,52 +1645,48 @@ nsWSRunObject::GetCharAt(nsIContent *aTextNode, int32_t aOffset) } nsWSRunObject::WSPoint -nsWSRunObject::GetWSPointAfter(nsIDOMNode *aNode, int32_t aOffset) +nsWSRunObject::GetWSPointAfter(nsINode* aNode, int32_t aOffset) { - // Note: only to be called if aNode is not a ws node. - - // binary search on wsnodes - uint32_t numNodes, firstNum, curNum, lastNum; - numNodes = mNodeArray.Length(); - + // Note: only to be called if aNode is not a ws node. + + // Binary search on wsnodes + uint32_t numNodes = mNodeArray.Length(); + if (!numNodes) { - // do nothing if there are no nodes to search + // Do nothing if there are no nodes to search WSPoint outPoint; return outPoint; } - firstNum = 0; - curNum = numNodes/2; - lastNum = numNodes; - int16_t cmp=0; - nsCOMPtr curNode; - - // begin binary search - // we do this because we need to minimize calls to ComparePoints(), - // which is mongo expensive - while (curNum != lastNum) - { - curNode = GetAsDOMNode(mNodeArray[curNum]); + uint32_t firstNum = 0, curNum = numNodes/2, lastNum = numNodes; + int16_t cmp = 0; + nsCOMPtr curNode; + + // Begin binary search. We do this because we need to minimize calls to + // ComparePoints(), which is expensive. + while (curNum != lastNum) { + curNode = mNodeArray[curNum]; cmp = nsContentUtils::ComparePoints(aNode, aOffset, curNode, 0); - if (cmp < 0) + if (cmp < 0) { lastNum = curNum; - else + } else { firstNum = curNum + 1; - curNum = (lastNum - firstNum) / 2 + firstNum; - NS_ASSERTION(firstNum <= curNum && curNum <= lastNum, "Bad binary search"); + } + curNum = (lastNum - firstNum)/2 + firstNum; + MOZ_ASSERT(firstNum <= curNum && curNum <= lastNum, "Bad binary search"); } // When the binary search is complete, we always know that the current node // is the same as the end node, which is always past our range. Therefore, // we've found the node immediately after the point of interest. if (curNum == mNodeArray.Length()) { - // they asked for past our range (it's after the last node). GetCharAfter + // hey asked for past our range (it's after the last node). GetCharAfter // will do the work for us when we pass it the last index of the last node. nsCOMPtr textNode(mNodeArray[curNum - 1]); WSPoint point(textNode, textNode->TextLength(), 0); return GetCharAfter(point); } else { - // The char after the point of interest is the first character of our range. + // The char after the point is the first character of our range. nsCOMPtr textNode(mNodeArray[curNum]); WSPoint point(textNode, 0, 0); return GetCharAfter(point); @@ -1700,52 +1694,48 @@ nsWSRunObject::GetWSPointAfter(nsIDOMNode *aNode, int32_t aOffset) } nsWSRunObject::WSPoint -nsWSRunObject::GetWSPointBefore(nsIDOMNode *aNode, int32_t aOffset) +nsWSRunObject::GetWSPointBefore(nsINode* aNode, int32_t aOffset) { - // Note: only to be called if aNode is not a ws node. - - // binary search on wsnodes - uint32_t numNodes, firstNum, curNum, lastNum; - numNodes = mNodeArray.Length(); - + // Note: only to be called if aNode is not a ws node. + + // Binary search on wsnodes + uint32_t numNodes = mNodeArray.Length(); + if (!numNodes) { - // do nothing if there are no nodes to search + // Do nothing if there are no nodes to search WSPoint outPoint; return outPoint; } - - firstNum = 0; - curNum = numNodes/2; - lastNum = numNodes; - int16_t cmp=0; - nsCOMPtr curNode; - - // begin binary search - // we do this because we need to minimize calls to ComparePoints(), - // which is mongo expensive - while (curNum != lastNum) - { - curNode = GetAsDOMNode(mNodeArray[curNum]); + + uint32_t firstNum = 0, curNum = numNodes/2, lastNum = numNodes; + int16_t cmp = 0; + nsCOMPtr curNode; + + // Begin binary search. We do this because we need to minimize calls to + // ComparePoints(), which is expensive. + while (curNum != lastNum) { + curNode = mNodeArray[curNum]; cmp = nsContentUtils::ComparePoints(aNode, aOffset, curNode, 0); - if (cmp < 0) + if (cmp < 0) { lastNum = curNum; - else + } else { firstNum = curNum + 1; - curNum = (lastNum - firstNum) / 2 + firstNum; - NS_ASSERTION(firstNum <= curNum && curNum <= lastNum, "Bad binary search"); + } + curNum = (lastNum - firstNum)/2 + firstNum; + MOZ_ASSERT(firstNum <= curNum && curNum <= lastNum, "Bad binary search"); } // When the binary search is complete, we always know that the current node // is the same as the end node, which is always past our range. Therefore, // we've found the node immediately after the point of interest. if (curNum == mNodeArray.Length()) { - // get the point before the end of the last node, we can pass the length - // of the node into GetCharBefore, and it will return the last character. + // Get the point before the end of the last node, we can pass the length of + // the node into GetCharBefore, and it will return the last character. nsCOMPtr textNode(mNodeArray[curNum - 1]); WSPoint point(textNode, textNode->TextLength(), 0); return GetCharBefore(point); } else { - // we can just ask the current node for the point immediately before it, + // We can just ask the current node for the point immediately before it, // it will handle moving to the previous node (if any) and returning the // appropriate character nsCOMPtr textNode(mNodeArray[curNum]); diff --git a/editor/libeditor/html/nsWSRunObject.h b/editor/libeditor/html/nsWSRunObject.h index b0fcb1739bd..746380f21c2 100644 --- a/editor/libeditor/html/nsWSRunObject.h +++ b/editor/libeditor/html/nsWSRunObject.h @@ -6,10 +6,8 @@ #ifndef __wsrunobject_h__ #define __wsrunobject_h__ -#include "nsCOMArray.h" #include "nsCOMPtr.h" -#include "nsIDOMNode.h" -#include "nsIEditor.h" +#include "nsIEditor.h" // for EDirection #include "nsINode.h" #include "nscore.h" #include "mozilla/dom/Text.h" @@ -342,8 +340,8 @@ class MOZ_STACK_CLASS nsWSRunObject void FindRun(nsINode* aNode, int32_t aOffset, WSFragment** outRun, bool after); char16_t GetCharAt(nsIContent *aTextNode, int32_t aOffset); - WSPoint GetWSPointAfter(nsIDOMNode *aNode, int32_t aOffset); - WSPoint GetWSPointBefore(nsIDOMNode *aNode, int32_t aOffset); + WSPoint GetWSPointAfter(nsINode* aNode, int32_t aOffset); + WSPoint GetWSPointBefore(nsINode* aNode, int32_t aOffset); nsresult CheckTrailingNBSPOfRun(WSFragment *aRun); nsresult CheckTrailingNBSP(WSFragment* aRun, nsINode* aNode, int32_t aOffset);