Bug 904202. Make sure we remove our nsContentLists from list caches during unlink. r=smaug

This commit is contained in:
Boris Zbarsky 2013-09-24 22:56:18 -04:00
Родитель 2bbd14edd3
Коммит adf46cfff7
2 изменённых файлов: 21 добавлений и 2 удалений

Просмотреть файл

@ -44,7 +44,17 @@ nsBaseContentList::~nsBaseContentList()
{
}
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_1(nsBaseContentList, mElements)
NS_IMPL_CYCLE_COLLECTION_CLASS(nsBaseContentList)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsBaseContentList)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mElements)
NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
tmp->RemoveFromCaches();
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(nsBaseContentList)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mElements)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
NS_IMPL_CYCLE_COLLECTION_TRACE_WRAPPERCACHE(nsBaseContentList)
NS_IMPL_CYCLE_COLLECTION_CAN_SKIP_BEGIN(nsBaseContentList)
if (nsCCUncollectableMarker::sGeneration && tmp->IsBlack()) {

Просмотреть файл

@ -96,6 +96,14 @@ public:
MOZ_OVERRIDE = 0;
protected:
/**
* To be called from non-destructor locations (e.g. unlink) that want to
* remove from caches. Cacheable subclasses should override.
*/
virtual void RemoveFromCaches()
{
}
nsTArray< nsCOMPtr<nsIContent> > mElements;
};
@ -365,7 +373,8 @@ protected:
* Needed because if subclasses want to have cache behavior they can't just
* override RemoveFromHashtable(), since we call that in our destructor.
*/
virtual void RemoveFromCaches() {
virtual void RemoveFromCaches() MOZ_OVERRIDE
{
RemoveFromHashtable();
}