bug 229163 : Going back to using an nsISupportsArray

to try and fix perf regression r=sicking sr=jst
This commit is contained in:
hpradhan%hotpop.com 2003-12-24 07:45:06 +00:00
Родитель f03919eea5
Коммит 7bd11e3242
4 изменённых файлов: 22 добавлений и 11 удалений

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

@ -161,6 +161,9 @@ nsContentSink::Init(nsIDocument* aDoc,
return NS_ERROR_NULL_POINTER;
}
nsresult rv = NS_NewISupportsArray(getter_AddRefs(mScriptElements));
NS_ENSURE_SUCCESS(rv, rv);
mDocument = aDoc;
mDocumentURL = aURL;
@ -174,7 +177,7 @@ nsContentSink::Init(nsIDocument* aDoc,
nsIScriptLoader *loader = mDocument->GetScriptLoader();
NS_ENSURE_TRUE(loader, NS_ERROR_FAILURE);
nsresult rv = loader->AddObserver(proxy);
rv = loader->AddObserver(proxy);
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIHTMLContentContainer> htmlContainer(do_QueryInterface(aDoc));
@ -207,14 +210,18 @@ nsContentSink::ScriptAvailable(nsresult aResult,
PRInt32 aLineNo,
const nsAString& aScript)
{
PRUint32 count = mScriptElements.Count();
PRUint32 count;
mScriptElements->Count(&count);
if (count == 0) {
return NS_OK;
}
nsCOMPtr<nsIDOMHTMLScriptElement> scriptElement =
do_QueryElementAt(mScriptElements, count - 1);
// Check if this is the element we were waiting for
if (aElement != mScriptElements[count - 1]) {
if (aElement != scriptElement) {
return NS_OK;
}
@ -232,7 +239,7 @@ nsContentSink::ScriptAvailable(nsresult aResult,
if (NS_SUCCEEDED(aResult) && aResult != NS_CONTENT_SCRIPT_IS_EVENTHANDLER) {
PreEvaluateScript();
} else {
mScriptElements.RemoveObjectAt(count - 1);
mScriptElements->RemoveElementAt(count - 1);
if (mParser && aWasPending) {
// Loading external script failed!. So, resume
@ -252,17 +259,21 @@ nsContentSink::ScriptEvaluated(nsresult aResult,
PRBool aWasPending)
{
// Check if this is the element we were waiting for
PRInt32 count = mScriptElements.Count();
PRUint32 count;
mScriptElements->Count(&count);
if (count == 0) {
return NS_OK;
}
if (aElement != mScriptElements[count - 1]) {
nsCOMPtr<nsIDOMHTMLScriptElement> scriptElement =
do_QueryElementAt(mScriptElements, count - 1);
if (aElement != scriptElement) {
return NS_OK;
}
// Pop the script element stack
mScriptElements.RemoveObjectAt(count - 1);
mScriptElements->RemoveElementAt(count - 1);
if (NS_SUCCEEDED(aResult)) {
PostEvaluateScript();

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

@ -44,7 +44,7 @@
#include "nsIScriptLoaderObserver.h"
#include "nsWeakReference.h"
#include "nsCOMPtr.h"
#include "nsCOMArray.h"
#include "nsISupportsArray.h"
#include "nsString.h"
class nsIDocument;
@ -109,7 +109,7 @@ protected:
nsCOMPtr<nsICSSLoader> mCSSLoader;
nsCOMPtr<nsINodeInfoManager> mNodeInfoManager;
nsCOMArray<nsIDOMHTMLScriptElement> mScriptElements;
nsCOMPtr<nsISupportsArray> mScriptElements;
nsCString mRef; // ScrollTo #ref
PRBool mNeedToBlockParser;

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

@ -4476,7 +4476,7 @@ HTMLContentSink::ProcessSCRIPTTag(const nsIParserNode& aNode)
mNeedToBlockParser = PR_TRUE;
nsCOMPtr<nsIDOMHTMLScriptElement> scriptElement = do_QueryInterface(element);
mScriptElements.AppendObject(scriptElement);
mScriptElements->AppendElement(scriptElement);
}
// Insert the child into the content tree. This will evaluate the

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

@ -1686,7 +1686,7 @@ nsXMLContentSink::ProcessEndSCRIPTTag(nsIContent* aContent)
nsCOMPtr<nsIDOMHTMLScriptElement> scriptElement(do_QueryInterface(aContent));
NS_ASSERTION(scriptElement, "null script element in XML content sink");
mScriptElements.AppendObject(scriptElement);
mScriptElements->AppendElement(scriptElement);
nsCOMPtr<nsIScriptElement> sele(do_QueryInterface(aContent));
if (sele) {