From 9673ca95ec2795568adaff18869bed263ed75fa2 Mon Sep 17 00:00:00 2001 From: "kin%netscape.com" Date: Wed, 31 Oct 2001 19:03:46 +0000 Subject: [PATCH] Backout glazman's fix for bug 107567, pending investigation on why it causes the tinderbox Leak count to go up. a=beard@netscape.com,jj@netscape.com git-svn-id: svn://10.0.0.236/trunk@106834 18797224-902f-48f8-a5cc-f745e15eee43 --- .../content/html/style/src/nsCSSLoader.cpp | 75 +++++++++++++++++-- mozilla/layout/style/nsCSSLoader.cpp | 75 +++++++++++++++++-- 2 files changed, 136 insertions(+), 14 deletions(-) diff --git a/mozilla/content/html/style/src/nsCSSLoader.cpp b/mozilla/content/html/style/src/nsCSSLoader.cpp index f84cfe8a838..5661d92b788 100644 --- a/mozilla/content/html/style/src/nsCSSLoader.cpp +++ b/mozilla/content/html/style/src/nsCSSLoader.cpp @@ -312,6 +312,8 @@ public: nsVoidArray mPendingDocSheets; // loaded sheet waiting for doc insertion nsVoidArray mPendingAlternateSheets; // alternates waiting for load to start + nsHashtable mSheetMapTable; // map to insertion index arrays + // @charset support nsString mCharset; // the charset we are using @@ -484,6 +486,13 @@ static PRBool PR_CALLBACK DeleteLoadData(void* aData, void* aClosure) return PR_TRUE; } +static PRBool PR_CALLBACK DeleteSheetMap(nsHashKey* aKey, void* aData, void* aClosure) +{ + nsAutoVoidArray* map = (nsAutoVoidArray*)aData; + delete map; + return PR_TRUE; +} + CSSLoaderImpl::~CSSLoaderImpl(void) { if (mLoadingSheets.Count() > 0) { @@ -494,6 +503,7 @@ CSSLoaderImpl::~CSSLoaderImpl(void) mLoadingSheets.Enumerate(DeleteHashLoadData); mPendingDocSheets.EnumerateForwards(DeletePendingData, nsnull); mPendingAlternateSheets.EnumerateForwards(DeleteLoadData, nsnull); + mSheetMapTable.Enumerate(DeleteSheetMap); } NS_IMPL_ISUPPORTS1(CSSLoaderImpl, nsICSSLoader) @@ -1109,7 +1119,7 @@ CSSLoaderImpl::InsertSheetInDoc(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, return NS_ERROR_NULL_POINTER; } - if (aElement) { + if (nsnull != aElement) { nsIDOMNode* domNode = nsnull; if (NS_SUCCEEDED(aElement->QueryInterface(NS_GET_IID(nsIDOMNode), (void**)&domNode))) { aSheet->SetOwningNode(domNode); @@ -1128,11 +1138,37 @@ CSSLoaderImpl::InsertSheetInDoc(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, aSheet->GetTitle(title); aSheet->SetEnabled(! IsAlternate(title)); - mDocument->InsertStyleSheetAt(aSheet, aDocIndex, aNotify); - if (aObserver) { - aObserver->StyleSheetLoaded(aSheet, aNotify); + nsVoidKey key(mDocument); + nsAutoVoidArray* sheetMap = (nsAutoVoidArray*)mSheetMapTable.Get(&key); + if (! sheetMap) { + sheetMap = new nsAutoVoidArray(); + if (sheetMap) { + mSheetMapTable.Put(&key, sheetMap); + } } - return NS_OK; + + if (sheetMap) { + PRInt32 insertIndex = sheetMap->Count(); + PRBool insertedSheet = PR_FALSE; + while (0 <= --insertIndex) { + PRInt32 targetIndex = NS_PTR_TO_INT32(sheetMap->ElementAt(insertIndex)); + if (targetIndex < aDocIndex) { + mDocument->InsertStyleSheetAt(aSheet, insertIndex + 1, aNotify); + sheetMap->InsertElementAt((void*)aDocIndex, insertIndex + 1); + insertedSheet = PR_TRUE; + break; + } + } + if (!insertedSheet) { // didn't insert yet + mDocument->InsertStyleSheetAt(aSheet, 0, aNotify); + sheetMap->InsertElementAt((void*)aDocIndex, 0); + } + if (nsnull != aObserver) { + aObserver->StyleSheetLoaded(aSheet, aNotify); + } + return NS_OK; + } + return NS_ERROR_OUT_OF_MEMORY; } nsresult @@ -1143,8 +1179,33 @@ CSSLoaderImpl::InsertChildSheet(nsICSSStyleSheet* aSheet, nsICSSStyleSheet* aPar return NS_ERROR_NULL_POINTER; } - aParentSheet->InsertStyleSheetAt(aSheet, aIndex); - return NS_OK; + nsVoidKey key(aParentSheet); + nsAutoVoidArray* sheetMap = (nsAutoVoidArray*)mSheetMapTable.Get(&key); + if (! sheetMap) { + sheetMap = new nsAutoVoidArray(); + if (sheetMap) { + mSheetMapTable.Put(&key, sheetMap); + } + } + + if (sheetMap) { + PRInt32 insertIndex = sheetMap->Count(); + while (0 <= --insertIndex) { + PRInt32 targetIndex = NS_PTR_TO_INT32(sheetMap->ElementAt(insertIndex)); + if (targetIndex < aIndex) { + aParentSheet->InsertStyleSheetAt(aSheet, insertIndex + 1); + sheetMap->InsertElementAt((void*)aIndex, insertIndex + 1); + aSheet = nsnull; + break; + } + } + if (nsnull != aSheet) { // didn't insert yet + aParentSheet->InsertStyleSheetAt(aSheet, 0); + sheetMap->InsertElementAt((void*)aIndex, 0); + } + return NS_OK; + } + return NS_ERROR_OUT_OF_MEMORY; } nsresult diff --git a/mozilla/layout/style/nsCSSLoader.cpp b/mozilla/layout/style/nsCSSLoader.cpp index f84cfe8a838..5661d92b788 100644 --- a/mozilla/layout/style/nsCSSLoader.cpp +++ b/mozilla/layout/style/nsCSSLoader.cpp @@ -312,6 +312,8 @@ public: nsVoidArray mPendingDocSheets; // loaded sheet waiting for doc insertion nsVoidArray mPendingAlternateSheets; // alternates waiting for load to start + nsHashtable mSheetMapTable; // map to insertion index arrays + // @charset support nsString mCharset; // the charset we are using @@ -484,6 +486,13 @@ static PRBool PR_CALLBACK DeleteLoadData(void* aData, void* aClosure) return PR_TRUE; } +static PRBool PR_CALLBACK DeleteSheetMap(nsHashKey* aKey, void* aData, void* aClosure) +{ + nsAutoVoidArray* map = (nsAutoVoidArray*)aData; + delete map; + return PR_TRUE; +} + CSSLoaderImpl::~CSSLoaderImpl(void) { if (mLoadingSheets.Count() > 0) { @@ -494,6 +503,7 @@ CSSLoaderImpl::~CSSLoaderImpl(void) mLoadingSheets.Enumerate(DeleteHashLoadData); mPendingDocSheets.EnumerateForwards(DeletePendingData, nsnull); mPendingAlternateSheets.EnumerateForwards(DeleteLoadData, nsnull); + mSheetMapTable.Enumerate(DeleteSheetMap); } NS_IMPL_ISUPPORTS1(CSSLoaderImpl, nsICSSLoader) @@ -1109,7 +1119,7 @@ CSSLoaderImpl::InsertSheetInDoc(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, return NS_ERROR_NULL_POINTER; } - if (aElement) { + if (nsnull != aElement) { nsIDOMNode* domNode = nsnull; if (NS_SUCCEEDED(aElement->QueryInterface(NS_GET_IID(nsIDOMNode), (void**)&domNode))) { aSheet->SetOwningNode(domNode); @@ -1128,11 +1138,37 @@ CSSLoaderImpl::InsertSheetInDoc(nsICSSStyleSheet* aSheet, PRInt32 aDocIndex, aSheet->GetTitle(title); aSheet->SetEnabled(! IsAlternate(title)); - mDocument->InsertStyleSheetAt(aSheet, aDocIndex, aNotify); - if (aObserver) { - aObserver->StyleSheetLoaded(aSheet, aNotify); + nsVoidKey key(mDocument); + nsAutoVoidArray* sheetMap = (nsAutoVoidArray*)mSheetMapTable.Get(&key); + if (! sheetMap) { + sheetMap = new nsAutoVoidArray(); + if (sheetMap) { + mSheetMapTable.Put(&key, sheetMap); + } } - return NS_OK; + + if (sheetMap) { + PRInt32 insertIndex = sheetMap->Count(); + PRBool insertedSheet = PR_FALSE; + while (0 <= --insertIndex) { + PRInt32 targetIndex = NS_PTR_TO_INT32(sheetMap->ElementAt(insertIndex)); + if (targetIndex < aDocIndex) { + mDocument->InsertStyleSheetAt(aSheet, insertIndex + 1, aNotify); + sheetMap->InsertElementAt((void*)aDocIndex, insertIndex + 1); + insertedSheet = PR_TRUE; + break; + } + } + if (!insertedSheet) { // didn't insert yet + mDocument->InsertStyleSheetAt(aSheet, 0, aNotify); + sheetMap->InsertElementAt((void*)aDocIndex, 0); + } + if (nsnull != aObserver) { + aObserver->StyleSheetLoaded(aSheet, aNotify); + } + return NS_OK; + } + return NS_ERROR_OUT_OF_MEMORY; } nsresult @@ -1143,8 +1179,33 @@ CSSLoaderImpl::InsertChildSheet(nsICSSStyleSheet* aSheet, nsICSSStyleSheet* aPar return NS_ERROR_NULL_POINTER; } - aParentSheet->InsertStyleSheetAt(aSheet, aIndex); - return NS_OK; + nsVoidKey key(aParentSheet); + nsAutoVoidArray* sheetMap = (nsAutoVoidArray*)mSheetMapTable.Get(&key); + if (! sheetMap) { + sheetMap = new nsAutoVoidArray(); + if (sheetMap) { + mSheetMapTable.Put(&key, sheetMap); + } + } + + if (sheetMap) { + PRInt32 insertIndex = sheetMap->Count(); + while (0 <= --insertIndex) { + PRInt32 targetIndex = NS_PTR_TO_INT32(sheetMap->ElementAt(insertIndex)); + if (targetIndex < aIndex) { + aParentSheet->InsertStyleSheetAt(aSheet, insertIndex + 1); + sheetMap->InsertElementAt((void*)aIndex, insertIndex + 1); + aSheet = nsnull; + break; + } + } + if (nsnull != aSheet) { // didn't insert yet + aParentSheet->InsertStyleSheetAt(aSheet, 0); + sheetMap->InsertElementAt((void*)aIndex, 0); + } + return NS_OK; + } + return NS_ERROR_OUT_OF_MEMORY; } nsresult