Bug 968766 - Part i: Move the document.all NodeLists into a separate hashtable; r=jst

This commit is contained in:
Ms2ger 2014-02-09 09:04:36 +01:00
Родитель 4204e87a21
Коммит 58bd97db70
5 изменённых файлов: 40 добавлений и 22 удалений

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

@ -241,9 +241,6 @@ nsIdentifierMapEntry::Traverse(nsCycleCollectionTraversalCallback* aCallback)
"mIdentifierMap mNameContentList");
aCallback->NoteXPCOMChild(static_cast<nsIDOMNodeList*>(mNameContentList));
NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(*aCallback, "mIdentifierMap mDocAllList");
aCallback->NoteXPCOMChild(static_cast<nsIDOMNodeList*>(mDocAllList));
if (mImageElement) {
NS_CYCLE_COLLECTION_NOTE_EDGE_NAME(*aCallback,
"mIdentifierMap mImageElement element");

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

@ -189,9 +189,6 @@ public:
void Traverse(nsCycleCollectionTraversalCallback* aCallback);
void SetDocAllList(nsContentList* aContentList) { mDocAllList = aContentList; }
nsContentList* GetDocAllList() { return mDocAllList; }
struct ChangeCallback {
nsIDocument::IDTargetObserver mCallback;
void* mData;
@ -236,7 +233,6 @@ private:
// The elements are stored as weak pointers.
nsSmallVoidArray mIdContentList;
nsRefPtr<nsBaseContentList> mNameContentList;
nsRefPtr<nsContentList> mDocAllList;
nsAutoPtr<nsTHashtable<ChangeCallbackEntry> > mChangeCallbacks;
nsRefPtr<Element> mImageElement;
};

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

@ -199,8 +199,9 @@ nsHTMLDocument::~nsHTMLDocument()
{
}
NS_IMPL_CYCLE_COLLECTION_INHERITED_11(nsHTMLDocument, nsDocument,
NS_IMPL_CYCLE_COLLECTION_INHERITED_12(nsHTMLDocument, nsDocument,
mAll,
mAllMap,
mImages,
mApplets,
mEmbeds,
@ -2596,11 +2597,8 @@ nsHTMLDocument::GetDocumentAllList(const nsAString& aID, nsresult *aResult)
{
*aResult = NS_OK;
nsIdentifierMapEntry *entry = mIdentifierMap.PutEntry(aID);
if (!entry) {
*aResult = NS_ERROR_OUT_OF_MEMORY;
return nullptr;
if (nsContentList* docAllList = mAllMap.GetWeak(aID)) {
return docAllList;
}
Element* root = GetRootElement();
@ -2608,15 +2606,10 @@ nsHTMLDocument::GetDocumentAllList(const nsAString& aID, nsresult *aResult)
return nullptr;
}
nsRefPtr<nsContentList> docAllList = entry->GetDocAllList();
if (!docAllList) {
nsCOMPtr<nsIAtom> id = do_GetAtom(aID);
docAllList = new nsContentList(root, DocAllResultMatch,
nullptr, nullptr, true, id);
entry->SetDocAllList(docAllList);
}
nsCOMPtr<nsIAtom> id = do_GetAtom(aID);
nsRefPtr<nsContentList> docAllList =
new nsContentList(root, DocAllResultMatch, nullptr, nullptr, true, id);
mAllMap.Put(aID, docAllList);
return docAllList;
}

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

@ -292,6 +292,7 @@ protected:
nsRefPtr<nsContentList> mFormControls;
nsRefPtr<mozilla::dom::HTMLAllCollection> mAll;
nsRefPtrHashtable<nsStringHashKey, nsContentList> mAllMap;
/** # of forms in the document, synchronously set */
int32_t mNumForms;

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

@ -1145,6 +1145,37 @@ static NS_CYCLE_COLLECTION_INNERCLASS NS_CYCLE_COLLECTION_INNERNAME;
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f11) \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
#define NS_IMPL_CYCLE_COLLECTION_INHERITED_12(_class, _base, _f1, _f2, _f3, _f4, _f5, _f6, _f7, _f8, _f9, _f10, _f11, _f12) \
NS_IMPL_CYCLE_COLLECTION_CLASS(_class) \
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(_class, _base) \
NS_IMPL_CYCLE_COLLECTION_UNLINK(_f1) \
NS_IMPL_CYCLE_COLLECTION_UNLINK(_f2) \
NS_IMPL_CYCLE_COLLECTION_UNLINK(_f3) \
NS_IMPL_CYCLE_COLLECTION_UNLINK(_f4) \
NS_IMPL_CYCLE_COLLECTION_UNLINK(_f5) \
NS_IMPL_CYCLE_COLLECTION_UNLINK(_f6) \
NS_IMPL_CYCLE_COLLECTION_UNLINK(_f7) \
NS_IMPL_CYCLE_COLLECTION_UNLINK(_f8) \
NS_IMPL_CYCLE_COLLECTION_UNLINK(_f9) \
NS_IMPL_CYCLE_COLLECTION_UNLINK(_f10) \
NS_IMPL_CYCLE_COLLECTION_UNLINK(_f11) \
NS_IMPL_CYCLE_COLLECTION_UNLINK(_f12) \
NS_IMPL_CYCLE_COLLECTION_UNLINK_END \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(_class, _base) \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f1) \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f2) \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f3) \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f4) \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f5) \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f6) \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f7) \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f8) \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f9) \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f10) \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f11) \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(_f12) \
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
#define NS_CYCLE_COLLECTION_NOTE_EDGE_NAME CycleCollectionNoteEdgeName
#endif // nsCycleCollectionParticipant_h__