diff --git a/accessible/src/generic/DocAccessible.cpp b/accessible/src/generic/DocAccessible.cpp index 3247812a4024..00dbe060b085 100644 --- a/accessible/src/generic/DocAccessible.cpp +++ b/accessible/src/generic/DocAccessible.cpp @@ -107,7 +107,9 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(DocAccessible, Accessible) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mNotificationController) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mVirtualCursor) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mChildDocuments) + tmp->mDependentIDsHash.EnumerateRead(CycleCollectorTraverseDepIDsEntry, &cb); NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mAccessibleCache) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mAnchorJumpElm) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(DocAccessible, Accessible) @@ -117,6 +119,7 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(DocAccessible, Accessible) tmp->mDependentIDsHash.Clear(); tmp->mNodeToAccessibleMap.Clear(); NS_IMPL_CYCLE_COLLECTION_UNLINK(mAccessibleCache) + NS_IMPL_CYCLE_COLLECTION_UNLINK(mAnchorJumpElm) NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(DocAccessible) @@ -1981,3 +1984,25 @@ DocAccessible::IsLoadEventTarget() const return (contentType == nsIDocShellTreeItem::typeContent); } +PLDHashOperator +DocAccessible::CycleCollectorTraverseDepIDsEntry(const nsAString& aKey, + AttrRelProviderArray* aProviders, + void* aUserArg) +{ + nsCycleCollectionTraversalCallback* cb = + static_cast(aUserArg); + + for (int32_t jdx = aProviders->Length() - 1; jdx >= 0; jdx--) { + NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(*cb, + "content of dependent ids hash entry of document accessible"); + + AttrRelProvider* provider = (*aProviders)[jdx]; + cb->NoteXPCOMChild(provider->mContent); + + NS_ASSERTION(provider->mContent->IsInDoc(), + "Referred content is not in document!"); + } + + return PL_DHASH_NEXT; +} + diff --git a/accessible/src/generic/DocAccessible.h b/accessible/src/generic/DocAccessible.h index da1a29f14c1d..67d938aa27b8 100644 --- a/accessible/src/generic/DocAccessible.h +++ b/accessible/src/generic/DocAccessible.h @@ -561,11 +561,19 @@ protected: AttrRelProvider& operator =(const AttrRelProvider&); }; + typedef nsTArray > AttrRelProviderArray; + typedef nsClassHashtable + DependentIDsHashtable; + /** * The cache of IDs pointed by relation attributes. */ - typedef nsTArray > AttrRelProviderArray; - nsClassHashtable mDependentIDsHash; + DependentIDsHashtable mDependentIDsHash; + + static PLDHashOperator + CycleCollectorTraverseDepIDsEntry(const nsAString& aKey, + AttrRelProviderArray* aProviders, + void* aUserArg); friend class RelatedAccIterator;