From 45727ae1a7aaaa4a0702463c084e88c05e95164d Mon Sep 17 00:00:00 2001 From: "peterv@propagandism.org" Date: Tue, 27 May 2008 08:48:31 -0700 Subject: [PATCH] Fix for bug 426261 (Crash in nsNavHistoryContainerResultNode::GetSortType() during bookmark synchronization). Patch by ondrej and me, r=Mano, a=beltzner. --- .../places/src/nsNavHistoryResult.cpp | 52 ++++++++++++++----- .../places/src/nsNavHistoryResult.h | 4 +- 2 files changed, 42 insertions(+), 14 deletions(-) diff --git a/toolkit/components/places/src/nsNavHistoryResult.cpp b/toolkit/components/places/src/nsNavHistoryResult.cpp index 27e3bf89f550..1a918b89691a 100644 --- a/toolkit/components/places/src/nsNavHistoryResult.cpp +++ b/toolkit/components/places/src/nsNavHistoryResult.cpp @@ -104,7 +104,16 @@ inline PRInt32 CompareIntegers(PRUint32 a, PRUint32 b) // nsNavHistoryResultNode ****************************************************** -NS_IMPL_CYCLE_COLLECTION_0(nsNavHistoryResultNode) + +NS_IMPL_CYCLE_COLLECTION_CLASS(nsNavHistoryResultNode) + +NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsNavHistoryResultNode) + NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mParent) +NS_IMPL_CYCLE_COLLECTION_UNLINK_END + +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsNavHistoryResultNode) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR_AMBIGUOUS(mParent, nsINavHistoryContainerResultNode); +NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsNavHistoryResultNode) NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsINavHistoryResultNode) @@ -3678,14 +3687,42 @@ nsNavHistorySeparatorResultNode::nsNavHistorySeparatorResultNode() // nsNavHistoryResult ********************************************************** NS_IMPL_CYCLE_COLLECTION_CLASS(nsNavHistoryResult) +PR_STATIC_CALLBACK(PLDHashOperator) +RemoveBookmarkFolderObserversCallback(nsTrimInt64HashKey::KeyType aKey, + nsNavHistoryResult::FolderObserverList*& aData, + void* userArg) +{ + delete aData; + return PL_DHASH_REMOVE; +} + NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsNavHistoryResult) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mRootNode) NS_IMPL_CYCLE_COLLECTION_UNLINK_NSCOMPTR(mView) + tmp->mBookmarkFolderObservers.Enumerate(&RemoveBookmarkFolderObserversCallback, nsnull); NS_IMPL_CYCLE_COLLECTION_UNLINK_END +PR_STATIC_CALLBACK(PLDHashOperator) +TraverseBookmarkFolderObservers(nsTrimInt64HashKey::KeyType aKey, + nsNavHistoryResult::FolderObserverList*& aData, + void* aUserArg) +{ + nsCycleCollectionTraversalCallback* cb = + static_cast(aUserArg); + PRUint32 i, count = aData->Length(); + for (i = 0; i < count; ++i) { + NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(*cb, + "mBookmarkFolderObservers value[i]"); + nsNavHistoryResultNode* node = aData->ElementAt(i); + cb->NoteXPCOMChild(node); + } + return PL_DHASH_NEXT; +} + NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsNavHistoryResult) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR_AMBIGUOUS(mRootNode, nsINavHistoryContainerResultNode) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_NSCOMPTR(mView) + tmp->mBookmarkFolderObservers.Enumerate(&TraverseBookmarkFolderObservers, &cb); NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_IMPL_CYCLE_COLLECTING_ADDREF(nsNavHistoryResult) @@ -3710,15 +3747,6 @@ nsNavHistoryResult::nsNavHistoryResult(nsNavHistoryContainerResultNode* aRoot) : mRootNode->mResult = this; } -PR_STATIC_CALLBACK(PLDHashOperator) -RemoveBookmarkFolderObserversCallback(nsTrimInt64HashKey::KeyType aKey, - nsNavHistoryResult::FolderObserverList*& aData, - void* userArg) -{ - delete aData; - return PL_DHASH_REMOVE; -} - nsNavHistoryResult::~nsNavHistoryResult() { // delete all bookmark folder observer arrays which are allocated on the heap @@ -4149,10 +4177,10 @@ nsNavHistoryResult::OnItemChanged(PRInt64 aItemId, return NS_OK; for (PRUint32 i = 0; i < list->Length(); i++) { - nsNavHistoryFolderResultNode* folder = list->ElementAt(i); + nsRefPtr folder = list->ElementAt(i); if (folder) { PRUint32 nodeIndex; - nsNavHistoryResultNode* node = folder->FindChildById(aItemId, &nodeIndex); + nsRefPtr node = folder->FindChildById(aItemId, &nodeIndex); // if ExcludeItems is true we don't update non visible items if (node && (!folder->mOptions->ExcludeItems() || diff --git a/toolkit/components/places/src/nsNavHistoryResult.h b/toolkit/components/places/src/nsNavHistoryResult.h index f64757066655..328f52023bfc 100644 --- a/toolkit/components/places/src/nsNavHistoryResult.h +++ b/toolkit/components/places/src/nsNavHistoryResult.h @@ -189,7 +189,7 @@ public: nsTArray mHistoryObservers; nsTArray mAllBookmarksObservers; - typedef nsTArray FolderObserverList; + typedef nsTArray > FolderObserverList; nsDataHashtable mBookmarkFolderObservers; FolderObserverList* BookmarkFolderObserversForId(PRInt64 aFolderId, PRBool aCreate); @@ -383,7 +383,7 @@ public: return reinterpret_cast(this); } - nsNavHistoryContainerResultNode* mParent; + nsRefPtr mParent; nsCString mURI; // not necessarily valid for containers, call GetUri nsCString mTitle; nsString mTags;