diff --git a/content/html/document/src/nsHTMLDocument.cpp b/content/html/document/src/nsHTMLDocument.cpp
index d0017a998f06..2bada09a870e 100644
--- a/content/html/document/src/nsHTMLDocument.cpp
+++ b/content/html/document/src/nsHTMLDocument.cpp
@@ -89,6 +89,7 @@ nsHTMLDocument::nsHTMLDocument()
nsHTMLAtoms::AddrefAtoms();
// Find/Search Init
+ mSearchStr = nsnull;
mLastBlockSearchOffset = 0;
mAdjustToEnd = PR_FALSE;
mShouldMatchCase = PR_FALSE;
@@ -98,6 +99,7 @@ nsHTMLDocument::nsHTMLDocument()
mCurrentBlockContent = nsnull;
// These will be converted to a nsDeque
+ mStackInx = 0;
mParentStack = (nsIContent**) new PRUint32[32];
mChildStack = (nsIContent**) new PRUint32[32];
@@ -134,6 +136,8 @@ nsHTMLDocument::~nsHTMLDocument()
// These will be converted to a nsDeque
delete[] mParentStack;
delete[] mChildStack;
+
+ delete mSearchStr;
}
NS_IMETHODIMP nsHTMLDocument::QueryInterface(REFNSIID aIID,
@@ -1091,7 +1095,9 @@ public:
BlockText() : mNumSubTexts(0) {}
virtual ~BlockText();
- char * GetText() { return mText.ToNewCString(); }
+ char * GetText() { return mText.ToNewCString(); }
+ const nsString & GetNSString() { return mText; }
+
void AddSubText(nsIContent * aContent, nsString & aStr);
PRInt32 GetStartEnd(PRInt32 anIndex, PRInt32 aLength,
nsIContent ** aStartContent, PRInt32 & aStartOffset,
@@ -1116,8 +1122,8 @@ void BlockText::AddSubText(nsIContent * aContent, nsString & aStr)
subTxt->mOffset = mText.Length();
subTxt->mLength = aStr.Length();
mText.Append(aStr);
- printf("Adding Str to Block [%s]\n", aStr.ToNewCString());
- printf("Block [%s]\n", mText.ToNewCString());
+ //DEBUG printf("Adding Str to Block [%s]\n", aStr.ToNewCString());
+ //DEBUG printf("Block [%s]\n", mText.ToNewCString());
mSubTexts[mNumSubTexts++] = subTxt;
}
@@ -1127,12 +1133,12 @@ PRInt32 BlockText::GetStartEnd(PRInt32 anIndex, PRInt32 aLength,
nsIContent ** aEndContent, PRInt32 & aEndOffset,
PRInt32 aDirection)
{
- // Debug
+ // Debug Start
char * cStr = mText.ToNewCString();
if (strstr(cStr, "blue text")) {
int x = 0;
}
- // Debug
+ // Debug End
PRInt32 i = 0;
PRInt32 offset = 0;
@@ -1163,14 +1169,27 @@ PRInt32 BlockText::GetStartEnd(PRInt32 anIndex, PRInt32 aLength,
//-----------------------------------------------
PRBool nsHTMLDocument::SearchBlock(BlockText & aBlockText,
- nsString & aStr)
+ nsString & aStr)
{
PRBool found = PR_FALSE;
mLastBlockSearchOffset = (mCurrentBlockContent == mHoldBlockContent? mLastBlockSearchOffset : 0);
- char * searchStr = aStr.ToNewCString();
- char * contentStr = aBlockText.GetText();
+ char * searchStr;
+ char * contentStr;
+
+ if (!mShouldMatchCase) {
+ nsString searchTxt(aStr);
+ nsString blockTxt(aBlockText.GetNSString());
+
+ searchTxt.ToLowerCase();
+ blockTxt.ToLowerCase();
+ searchStr = searchTxt.ToNewCString();
+ contentStr = blockTxt.ToNewCString();
+ } else {
+ searchStr = aStr.ToNewCString();
+ contentStr = aBlockText.GetText();
+ }
char * adjustedContent;
char * str = nsnull;
@@ -1252,13 +1271,18 @@ PRBool nsHTMLDocument::ContentIsBlock(nsIContent * aContent)
// looking for a parent that is a "block"
/////////////////////////////////////////////
nsIContent * nsHTMLDocument::FindBlockParent(nsIContent * aContent,
- PRBool aSkipThisContent)
+ PRBool aSkipThisContent)
{
+ // Clear up stack and release content nodes on it
+ PRInt32 i;
+ for (i=0;iGetParent();
nsIContent * child;
-
if (parent == nsnull) {
return nsnull;
}
@@ -1320,7 +1344,7 @@ nsIContent * nsHTMLDocument::FindBlockParent(nsIContent * aContent,
//-----------------------------------------------
PRBool nsHTMLDocument::BuildBlockFromContent(nsIContent * aContent,
- BlockText & aBlockText)
+ BlockText & aBlockText)
{
// First check to see if it is a new Block node
// If it is then we need to check the current block text (aBlockText)
@@ -1328,7 +1352,7 @@ PRBool nsHTMLDocument::BuildBlockFromContent(nsIContent * aContent,
if (ContentIsBlock(aContent)) {
// Search current block of text
- if (SearchBlock(aBlockText, mSearchStr)) {
+ if (SearchBlock(aBlockText, *mSearchStr)) {
return PR_TRUE;
}
@@ -1337,7 +1361,7 @@ PRBool nsHTMLDocument::BuildBlockFromContent(nsIContent * aContent,
if (!BuildBlockTraversing(aContent, blockText)) {
// down inside the search string wasn't found check the full block text
// for the search text
- if (SearchBlock(blockText, mSearchStr)) {
+ if (SearchBlock(blockText, *mSearchStr)) {
return PR_TRUE;
}
} else {
@@ -1356,7 +1380,7 @@ PRBool nsHTMLDocument::BuildBlockFromContent(nsIContent * aContent,
// the hiearchy and build the block of text
//-----------------------------------------
PRBool nsHTMLDocument::BuildBlockTraversing(nsIContent * aParent,
- BlockText & aBlockText)
+ BlockText & aBlockText)
{
nsIAtom * atom = aParent->GetTag();
if (atom != nsnull) {
@@ -1366,15 +1390,19 @@ PRBool nsHTMLDocument::BuildBlockTraversing(nsIContent * aParent,
for (i=0;iChildCount();i++) {
nsIContent * child = aParent->ChildAt(i);
if (BuildBlockFromContent(child, aBlockText)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
+ NS_RELEASE(child);
}
} else { // Backward
for (i=aParent->ChildCount()-1;i>=0;i--) {
nsIContent * child = aParent->ChildAt(i);
if (BuildBlockFromContent(child, aBlockText)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
+ NS_RELEASE(child);
}
}
}
@@ -1398,8 +1426,8 @@ PRBool nsHTMLDocument::BuildBlockTraversing(nsIContent * aParent,
// the hiearchy and build the block of text
//-----------------------------------------
PRBool nsHTMLDocument::BuildBlockFromStack(nsIContent * aParent,
- BlockText & aBlockText,
- PRInt32 aStackInx)
+ BlockText & aBlockText,
+ PRInt32 aStackInx)
{
nsIContent * stackParent = mParentStack[aStackInx];
nsIContent * stackChild = mChildStack[aStackInx];
@@ -1413,34 +1441,42 @@ PRBool nsHTMLDocument::BuildBlockFromStack(nsIContent * aParent,
nsIContent * child = aParent->ChildAt(j);
if (child == stackChild && aStackInx < mStackInx) {
if (BuildBlockFromStack(child, aBlockText, aStackInx+1)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
} else {
if (!BuildBlockTraversing(child, aBlockText)) {
- if (SearchBlock(aBlockText, mSearchStr)) {
+ if (SearchBlock(aBlockText, *mSearchStr)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
} else {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
}
+ NS_RELEASE(child);
}
} else { // Backward
for (j=inx;j>=0;j--) {
nsIContent * child = aParent->ChildAt(j);
if (child == stackChild && aStackInx < mStackInx) {
if (BuildBlockFromStack(child, aBlockText, aStackInx+1)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
} else {
if (!BuildBlockTraversing(child, aBlockText)) {
- if (SearchBlock(aBlockText, mSearchStr)) {
+ if (SearchBlock(aBlockText, *mSearchStr)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
} else {
- return PR_TRUE;
+ NS_IF_RELEASE(child);
+ return PR_TRUE;
}
}
+ NS_RELEASE(child);
}
}
@@ -1453,7 +1489,7 @@ PRBool nsHTMLDocument::BuildBlockFromStack(nsIContent * aParent,
// the hiearchy and build the block of text
//-----------------------------------------
PRBool nsHTMLDocument::BuildBlock(nsIContent * aParent,
- BlockText & aBlockText)
+ BlockText & aBlockText)
{
nsIContent * stackParent = mParentStack[0];
nsIContent * stackChild = mChildStack[0];
@@ -1465,17 +1501,21 @@ PRBool nsHTMLDocument::BuildBlock(nsIContent * aParent,
nsIContent * child = stackParent->ChildAt(j);
if (child == stackChild && mStackInx > 1) {
if (BuildBlockFromStack(child, aBlockText, 1)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
} else {
if (BuildBlockTraversing(child, aBlockText)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
} else {
- if (SearchBlock(aBlockText, mSearchStr)) {
+ if (SearchBlock(aBlockText, *mSearchStr)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
}
}
+ NS_IF_RELEASE(child);
}
} else {
for (j=inx;j>=0;j--) {
@@ -1483,18 +1523,22 @@ PRBool nsHTMLDocument::BuildBlock(nsIContent * aParent,
nsIContent * child = stackParent->ChildAt(j);
if (child == stackChild && mStackInx > 1) {
if (BuildBlockFromStack(child, blockText, 1)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
} else {
if (BuildBlockTraversing(child, blockText)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
} else {
- if (SearchBlock(blockText, mSearchStr)) {
+ if (SearchBlock(blockText, *mSearchStr)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
}
}
mAdjustToEnd = PR_TRUE;
+ NS_IF_RELEASE(child);
}
}
return PR_FALSE;
@@ -1505,10 +1549,15 @@ PRBool nsHTMLDocument::BuildBlock(nsIContent * aParent,
*/
NS_IMETHODIMP nsHTMLDocument::FindNext(const nsString &aSearchStr, PRBool aMatchCase, PRBool aSearchDown, PRBool &aIsFound)
{
- aIsFound = PR_FALSE;
+ aIsFound = PR_FALSE;
+ mShouldMatchCase = aMatchCase;
- mSearchStr.SetLength(0);
- mSearchStr.Append(aSearchStr);
+ if (mSearchStr == nsnull) {
+ mSearchStr = new nsString(aSearchStr);
+ } else {
+ mSearchStr->SetLength(0);
+ mSearchStr->Append(aSearchStr);
+ }
nsIContent * start = nsnull;
nsIContent * end = nsnull;
@@ -1566,7 +1615,7 @@ NS_IMETHODIMP nsHTMLDocument::FindNext(const nsString &aSearchStr, PRBool aMatch
searchContent = (mSearchDirection == kForward ? body:end);
BlockText blockText;
if (!BuildBlockTraversing(searchContent, blockText)) {
- if (SearchBlock(blockText, mSearchStr)) {
+ if (SearchBlock(blockText, *mSearchStr)) {
aIsFound = PR_TRUE;
}
}
@@ -1578,7 +1627,7 @@ NS_IMETHODIMP nsHTMLDocument::FindNext(const nsString &aSearchStr, PRBool aMatch
searchContent = end;
mAdjustToEnd = PR_TRUE;
}
- nsIContent * blockContent = FindBlockParent(searchContent);
+ nsIContent * blockContent = FindBlockParent(searchContent); // this ref counts blockContent
while (blockContent != nsnull) {
BlockText blockText;
@@ -1589,10 +1638,22 @@ NS_IMETHODIMP nsHTMLDocument::FindNext(const nsString &aSearchStr, PRBool aMatch
mLastBlockSearchOffset = 0;
mAdjustToEnd = PR_TRUE;
+
+ NS_RELEASE(blockContent);
blockContent = FindBlockParent(blockContent, PR_TRUE);
}
+
+ // Clear up stack and release content nodes on it
+ PRInt32 i;
+ for (i=0;imOffset = mText.Length();
subTxt->mLength = aStr.Length();
mText.Append(aStr);
- printf("Adding Str to Block [%s]\n", aStr.ToNewCString());
- printf("Block [%s]\n", mText.ToNewCString());
+ //DEBUG printf("Adding Str to Block [%s]\n", aStr.ToNewCString());
+ //DEBUG printf("Block [%s]\n", mText.ToNewCString());
mSubTexts[mNumSubTexts++] = subTxt;
}
@@ -1127,12 +1133,12 @@ PRInt32 BlockText::GetStartEnd(PRInt32 anIndex, PRInt32 aLength,
nsIContent ** aEndContent, PRInt32 & aEndOffset,
PRInt32 aDirection)
{
- // Debug
+ // Debug Start
char * cStr = mText.ToNewCString();
if (strstr(cStr, "blue text")) {
int x = 0;
}
- // Debug
+ // Debug End
PRInt32 i = 0;
PRInt32 offset = 0;
@@ -1163,14 +1169,27 @@ PRInt32 BlockText::GetStartEnd(PRInt32 anIndex, PRInt32 aLength,
//-----------------------------------------------
PRBool nsHTMLDocument::SearchBlock(BlockText & aBlockText,
- nsString & aStr)
+ nsString & aStr)
{
PRBool found = PR_FALSE;
mLastBlockSearchOffset = (mCurrentBlockContent == mHoldBlockContent? mLastBlockSearchOffset : 0);
- char * searchStr = aStr.ToNewCString();
- char * contentStr = aBlockText.GetText();
+ char * searchStr;
+ char * contentStr;
+
+ if (!mShouldMatchCase) {
+ nsString searchTxt(aStr);
+ nsString blockTxt(aBlockText.GetNSString());
+
+ searchTxt.ToLowerCase();
+ blockTxt.ToLowerCase();
+ searchStr = searchTxt.ToNewCString();
+ contentStr = blockTxt.ToNewCString();
+ } else {
+ searchStr = aStr.ToNewCString();
+ contentStr = aBlockText.GetText();
+ }
char * adjustedContent;
char * str = nsnull;
@@ -1252,13 +1271,18 @@ PRBool nsHTMLDocument::ContentIsBlock(nsIContent * aContent)
// looking for a parent that is a "block"
/////////////////////////////////////////////
nsIContent * nsHTMLDocument::FindBlockParent(nsIContent * aContent,
- PRBool aSkipThisContent)
+ PRBool aSkipThisContent)
{
+ // Clear up stack and release content nodes on it
+ PRInt32 i;
+ for (i=0;iGetParent();
nsIContent * child;
-
if (parent == nsnull) {
return nsnull;
}
@@ -1320,7 +1344,7 @@ nsIContent * nsHTMLDocument::FindBlockParent(nsIContent * aContent,
//-----------------------------------------------
PRBool nsHTMLDocument::BuildBlockFromContent(nsIContent * aContent,
- BlockText & aBlockText)
+ BlockText & aBlockText)
{
// First check to see if it is a new Block node
// If it is then we need to check the current block text (aBlockText)
@@ -1328,7 +1352,7 @@ PRBool nsHTMLDocument::BuildBlockFromContent(nsIContent * aContent,
if (ContentIsBlock(aContent)) {
// Search current block of text
- if (SearchBlock(aBlockText, mSearchStr)) {
+ if (SearchBlock(aBlockText, *mSearchStr)) {
return PR_TRUE;
}
@@ -1337,7 +1361,7 @@ PRBool nsHTMLDocument::BuildBlockFromContent(nsIContent * aContent,
if (!BuildBlockTraversing(aContent, blockText)) {
// down inside the search string wasn't found check the full block text
// for the search text
- if (SearchBlock(blockText, mSearchStr)) {
+ if (SearchBlock(blockText, *mSearchStr)) {
return PR_TRUE;
}
} else {
@@ -1356,7 +1380,7 @@ PRBool nsHTMLDocument::BuildBlockFromContent(nsIContent * aContent,
// the hiearchy and build the block of text
//-----------------------------------------
PRBool nsHTMLDocument::BuildBlockTraversing(nsIContent * aParent,
- BlockText & aBlockText)
+ BlockText & aBlockText)
{
nsIAtom * atom = aParent->GetTag();
if (atom != nsnull) {
@@ -1366,15 +1390,19 @@ PRBool nsHTMLDocument::BuildBlockTraversing(nsIContent * aParent,
for (i=0;iChildCount();i++) {
nsIContent * child = aParent->ChildAt(i);
if (BuildBlockFromContent(child, aBlockText)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
+ NS_RELEASE(child);
}
} else { // Backward
for (i=aParent->ChildCount()-1;i>=0;i--) {
nsIContent * child = aParent->ChildAt(i);
if (BuildBlockFromContent(child, aBlockText)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
+ NS_RELEASE(child);
}
}
}
@@ -1398,8 +1426,8 @@ PRBool nsHTMLDocument::BuildBlockTraversing(nsIContent * aParent,
// the hiearchy and build the block of text
//-----------------------------------------
PRBool nsHTMLDocument::BuildBlockFromStack(nsIContent * aParent,
- BlockText & aBlockText,
- PRInt32 aStackInx)
+ BlockText & aBlockText,
+ PRInt32 aStackInx)
{
nsIContent * stackParent = mParentStack[aStackInx];
nsIContent * stackChild = mChildStack[aStackInx];
@@ -1413,34 +1441,42 @@ PRBool nsHTMLDocument::BuildBlockFromStack(nsIContent * aParent,
nsIContent * child = aParent->ChildAt(j);
if (child == stackChild && aStackInx < mStackInx) {
if (BuildBlockFromStack(child, aBlockText, aStackInx+1)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
} else {
if (!BuildBlockTraversing(child, aBlockText)) {
- if (SearchBlock(aBlockText, mSearchStr)) {
+ if (SearchBlock(aBlockText, *mSearchStr)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
} else {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
}
+ NS_RELEASE(child);
}
} else { // Backward
for (j=inx;j>=0;j--) {
nsIContent * child = aParent->ChildAt(j);
if (child == stackChild && aStackInx < mStackInx) {
if (BuildBlockFromStack(child, aBlockText, aStackInx+1)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
} else {
if (!BuildBlockTraversing(child, aBlockText)) {
- if (SearchBlock(aBlockText, mSearchStr)) {
+ if (SearchBlock(aBlockText, *mSearchStr)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
} else {
- return PR_TRUE;
+ NS_IF_RELEASE(child);
+ return PR_TRUE;
}
}
+ NS_RELEASE(child);
}
}
@@ -1453,7 +1489,7 @@ PRBool nsHTMLDocument::BuildBlockFromStack(nsIContent * aParent,
// the hiearchy and build the block of text
//-----------------------------------------
PRBool nsHTMLDocument::BuildBlock(nsIContent * aParent,
- BlockText & aBlockText)
+ BlockText & aBlockText)
{
nsIContent * stackParent = mParentStack[0];
nsIContent * stackChild = mChildStack[0];
@@ -1465,17 +1501,21 @@ PRBool nsHTMLDocument::BuildBlock(nsIContent * aParent,
nsIContent * child = stackParent->ChildAt(j);
if (child == stackChild && mStackInx > 1) {
if (BuildBlockFromStack(child, aBlockText, 1)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
} else {
if (BuildBlockTraversing(child, aBlockText)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
} else {
- if (SearchBlock(aBlockText, mSearchStr)) {
+ if (SearchBlock(aBlockText, *mSearchStr)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
}
}
+ NS_IF_RELEASE(child);
}
} else {
for (j=inx;j>=0;j--) {
@@ -1483,18 +1523,22 @@ PRBool nsHTMLDocument::BuildBlock(nsIContent * aParent,
nsIContent * child = stackParent->ChildAt(j);
if (child == stackChild && mStackInx > 1) {
if (BuildBlockFromStack(child, blockText, 1)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
} else {
if (BuildBlockTraversing(child, blockText)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
} else {
- if (SearchBlock(blockText, mSearchStr)) {
+ if (SearchBlock(blockText, *mSearchStr)) {
+ NS_IF_RELEASE(child);
return PR_TRUE;
}
}
}
mAdjustToEnd = PR_TRUE;
+ NS_IF_RELEASE(child);
}
}
return PR_FALSE;
@@ -1505,10 +1549,15 @@ PRBool nsHTMLDocument::BuildBlock(nsIContent * aParent,
*/
NS_IMETHODIMP nsHTMLDocument::FindNext(const nsString &aSearchStr, PRBool aMatchCase, PRBool aSearchDown, PRBool &aIsFound)
{
- aIsFound = PR_FALSE;
+ aIsFound = PR_FALSE;
+ mShouldMatchCase = aMatchCase;
- mSearchStr.SetLength(0);
- mSearchStr.Append(aSearchStr);
+ if (mSearchStr == nsnull) {
+ mSearchStr = new nsString(aSearchStr);
+ } else {
+ mSearchStr->SetLength(0);
+ mSearchStr->Append(aSearchStr);
+ }
nsIContent * start = nsnull;
nsIContent * end = nsnull;
@@ -1566,7 +1615,7 @@ NS_IMETHODIMP nsHTMLDocument::FindNext(const nsString &aSearchStr, PRBool aMatch
searchContent = (mSearchDirection == kForward ? body:end);
BlockText blockText;
if (!BuildBlockTraversing(searchContent, blockText)) {
- if (SearchBlock(blockText, mSearchStr)) {
+ if (SearchBlock(blockText, *mSearchStr)) {
aIsFound = PR_TRUE;
}
}
@@ -1578,7 +1627,7 @@ NS_IMETHODIMP nsHTMLDocument::FindNext(const nsString &aSearchStr, PRBool aMatch
searchContent = end;
mAdjustToEnd = PR_TRUE;
}
- nsIContent * blockContent = FindBlockParent(searchContent);
+ nsIContent * blockContent = FindBlockParent(searchContent); // this ref counts blockContent
while (blockContent != nsnull) {
BlockText blockText;
@@ -1589,10 +1638,22 @@ NS_IMETHODIMP nsHTMLDocument::FindNext(const nsString &aSearchStr, PRBool aMatch
mLastBlockSearchOffset = 0;
mAdjustToEnd = PR_TRUE;
+
+ NS_RELEASE(blockContent);
blockContent = FindBlockParent(blockContent, PR_TRUE);
}
+
+ // Clear up stack and release content nodes on it
+ PRInt32 i;
+ for (i=0;i