diff --git a/mozilla/content/base/src/nsScriptLoader.cpp b/mozilla/content/base/src/nsScriptLoader.cpp index bfb05126675..ef99a146a52 100644 --- a/mozilla/content/base/src/nsScriptLoader.cpp +++ b/mozilla/content/base/src/nsScriptLoader.cpp @@ -43,7 +43,7 @@ #include "jsapi.h" #include "nsContentUtils.h" #include "nsUnicharUtils.h" - +#include "nsAutoPtr.h" static NS_DEFINE_CID(kCharsetAliasCID, NS_CHARSETALIAS_CID); static NS_DEFINE_CID(kCharsetConverterManagerCID, NS_ICHARSETCONVERTERMANAGER_CID); @@ -133,12 +133,10 @@ nsScriptLoader::~nsScriptLoader() { mObservers.Clear(); - PRUint32 i, count; - mPendingRequests.Count(&count); - for (i = 0; i < count; i++) { - nsCOMPtr sup(mPendingRequests.ElementAt(i)); - if (sup) { - nsScriptLoadRequest* req = NS_REINTERPRET_CAST(nsScriptLoadRequest*, sup.get()); + PRInt32 count = mPendingRequests.Count(); + for (PRInt32 i = 0; i < count; i++) { + nsScriptLoadRequest* req = mPendingRequests[i]; + if (req) { req->FireScriptAvailable(NS_ERROR_ABORT, NS_LITERAL_STRING("")); } } @@ -179,7 +177,7 @@ nsScriptLoader::AddObserver(nsIScriptLoaderObserver *aObserver) { NS_ENSURE_ARG(aObserver); - mObservers.AppendElement(aObserver); + mObservers.AppendObject(aObserver); return NS_OK; } @@ -190,7 +188,7 @@ nsScriptLoader::RemoveObserver(nsIScriptLoaderObserver *aObserver) { NS_ENSURE_ARG(aObserver); - mObservers.RemoveElement(aObserver, 0); + mObservers.RemoveObject(aObserver); return NS_OK; } @@ -388,12 +386,10 @@ nsScriptLoader::ProcessScriptElement(nsIDOMHTMLScriptElement *aElement, } // Create a request object for this script - nsScriptLoadRequest* request = new nsScriptLoadRequest(aElement, aObserver, jsVersionString); + nsRefPtr request = new nsScriptLoadRequest(aElement, aObserver, jsVersionString); if (!request) { return FireErrorNotification(NS_ERROR_OUT_OF_MEMORY, aElement, aObserver); } - // Temporarily hold on to the request - nsCOMPtr reqsup(request); // Check to see if we have a src attribute. aElement->GetSrc(src); @@ -442,7 +438,7 @@ nsScriptLoader::ProcessScriptElement(nsIDOMHTMLScriptElement *aElement, request->mLoading = PR_TRUE; // Add the request to our pending requests list - mPendingRequests.AppendElement(reqsup); + mPendingRequests.AppendObject(request); nsCOMPtr loadGroup; nsCOMPtr loader; @@ -452,7 +448,7 @@ nsScriptLoader::ProcessScriptElement(nsIDOMHTMLScriptElement *aElement, nsCOMPtr docshell; rv = globalObject->GetDocShell(getter_AddRefs(docshell)); if (NS_FAILED(rv)) { - mPendingRequests.RemoveElement(reqsup, 0); + mPendingRequests.RemoveObject(request); return FireErrorNotification(rv, aElement, aObserver); } @@ -475,10 +471,10 @@ nsScriptLoader::ProcessScriptElement(nsIDOMHTMLScriptElement *aElement, PR_FALSE); httpChannel->SetReferrer(documentURI); } - rv = NS_NewStreamLoader(getter_AddRefs(loader), channel, this, reqsup); + rv = NS_NewStreamLoader(getter_AddRefs(loader), channel, this, request); } if (NS_FAILED(rv)) { - mPendingRequests.RemoveElement(reqsup, 0); + mPendingRequests.RemoveObject(request); return FireErrorNotification(rv, aElement, aObserver); } } @@ -494,14 +490,11 @@ nsScriptLoader::ProcessScriptElement(nsIDOMHTMLScriptElement *aElement, request->mLineNo = lineNumber; } - PRUint32 pendingRequestCount; - mPendingRequests.Count(&pendingRequestCount); - // If we've got existing pending requests, add ourselves // to this list. - if (pendingRequestCount) { + if (mPendingRequests.Count() > 0) { request->mWasPending = PR_TRUE; - mPendingRequests.AppendElement(reqsup); + mPendingRequests.AppendObject(request); } else { request->mWasPending = PR_FALSE; @@ -517,12 +510,9 @@ nsScriptLoader::FireErrorNotification(nsresult aResult, nsIDOMHTMLScriptElement* aElement, nsIScriptLoaderObserver* aObserver) { - PRUint32 i, count; - - mObservers.Count(&count); - for (i = 0; i < count; i++) { - nsCOMPtr sup(dont_AddRef(mObservers.ElementAt(i))); - nsCOMPtr observer(do_QueryInterface(sup)); + PRInt32 count = mObservers.Count(); + for (PRInt32 i = 0; i < count; i++) { + nsCOMPtr observer = mObservers[i]; if (observer) { observer->ScriptAvailable(aResult, aElement, @@ -573,12 +563,9 @@ nsScriptLoader::FireScriptAvailable(nsresult aResult, nsScriptLoadRequest* aRequest, const nsAFlatString& aScript) { - PRUint32 i, count; - - mObservers.Count(&count); - for (i = 0; i < count; i++) { - nsCOMPtr sup(dont_AddRef(mObservers.ElementAt(i))); - nsCOMPtr observer(do_QueryInterface(sup)); + PRInt32 count = mObservers.Count(); + for (PRInt32 i = 0; i < count; i++) { + nsCOMPtr observer = mObservers[i]; if (observer) { observer->ScriptAvailable(aResult, aRequest->mElement, @@ -595,12 +582,9 @@ void nsScriptLoader::FireScriptEvaluated(nsresult aResult, nsScriptLoadRequest* aRequest) { - PRUint32 i, count; - - mObservers.Count(&count); - for (i = 0; i < count; i++) { - nsCOMPtr sup(dont_AddRef(mObservers.ElementAt(i))); - nsCOMPtr observer(do_QueryInterface(sup)); + PRInt32 count = mObservers.Count(); + for (PRInt32 i = 0; i < count; i++) { + nsCOMPtr observer = mObservers[i]; if (observer) { observer->ScriptEvaluated(aResult, aRequest->mElement, @@ -663,14 +647,18 @@ nsScriptLoader::EvaluateScript(nsScriptLoadRequest* aRequest, void nsScriptLoader::ProcessPendingReqests() { - nsCOMPtr reqsup(dont_AddRef(mPendingRequests.ElementAt(0))); - nsScriptLoadRequest* request = NS_REINTERPRET_CAST(nsScriptLoadRequest*, - reqsup.get()); + if (mPendingRequests.Count() == 0) { + return; + } + + nsRefPtr request = mPendingRequests[0]; while (request && !request->mLoading) { - mPendingRequests.RemoveElement(reqsup, 0); + mPendingRequests.RemoveObjectAt(0); ProcessRequest(request); - reqsup = dont_AddRef(mPendingRequests.ElementAt(0)); - request = NS_REINTERPRET_CAST(nsScriptLoadRequest*, reqsup.get()); + if (mPendingRequests.Count() == 0) { + return; + } + request = mPendingRequests[0]; } } @@ -717,14 +705,14 @@ nsScriptLoader::OnStreamComplete(nsIStreamLoader* aLoader, const char* string) { nsresult rv; - nsScriptLoadRequest* request = NS_REINTERPRET_CAST(nsScriptLoadRequest*, aContext); + nsScriptLoadRequest* request = NS_STATIC_CAST(nsScriptLoadRequest*, aContext); NS_ASSERTION(request, "null request in stream complete handler"); if (!request) { return NS_ERROR_FAILURE; } if (NS_FAILED(aStatus)) { - mPendingRequests.RemoveElement(aContext, 0); + mPendingRequests.RemoveObject(request); FireScriptAvailable(aStatus, request, NS_LITERAL_STRING("")); ProcessPendingReqests(); return NS_OK; @@ -733,7 +721,7 @@ nsScriptLoader::OnStreamComplete(nsIStreamLoader* aLoader, // If we don't have a document, then we need to abort further // evaluation. if (!mDocument) { - mPendingRequests.RemoveElement(aContext, 0); + mPendingRequests.RemoveObject(request); FireScriptAvailable(NS_ERROR_NOT_AVAILABLE, request, NS_LITERAL_STRING("")); ProcessPendingReqests(); @@ -750,7 +738,7 @@ nsScriptLoader::OnStreamComplete(nsIStreamLoader* aLoader, PRBool requestSucceeded; rv = httpChannel->GetRequestSucceeded(&requestSucceeded); if (NS_SUCCEEDED(rv) && !requestSucceeded) { - mPendingRequests.RemoveElement(aContext, 0); + mPendingRequests.RemoveObject(request); FireScriptAvailable(NS_ERROR_NOT_AVAILABLE, request, NS_LITERAL_STRING("")); ProcessPendingReqests(); @@ -870,7 +858,7 @@ nsScriptLoader::OnStreamComplete(nsIStreamLoader* aLoader, NS_ASSERTION(NS_SUCCEEDED(rv), "Could not convert external JavaScript to Unicode!"); if (NS_FAILED(rv)) { - mPendingRequests.RemoveElement(aContext, 0); + mPendingRequests.RemoveObject(request); FireScriptAvailable(rv, request, NS_LITERAL_STRING("")); ProcessPendingReqests(); return NS_OK; @@ -888,7 +876,7 @@ nsScriptLoader::OnStreamComplete(nsIStreamLoader* aLoader, rv = mDocument->AddPrincipal(prin); if (NS_FAILED(rv)) { - mPendingRequests.RemoveElement(aContext, 0); + mPendingRequests.RemoveObject(request); FireScriptAvailable(rv, request, NS_LITERAL_STRING("")); ProcessPendingReqests(); return NS_OK; @@ -899,13 +887,13 @@ nsScriptLoader::OnStreamComplete(nsIStreamLoader* aLoader, // If we're not the first in the pending list, we mark ourselves // as loaded and just stay on the list. - nsCOMPtr first(dont_AddRef(mPendingRequests.ElementAt(0))); - if (first != aContext) { + NS_ASSERTION(mPendingRequests.Count() > 0, "aContext is a pending request!"); + if (mPendingRequests[0] != request) { request->mLoading = PR_FALSE; return NS_OK; } - mPendingRequests.RemoveElement(aContext, 0); + mPendingRequests.RemoveObject(request); ProcessRequest(request); // Process any pending requests diff --git a/mozilla/content/base/src/nsScriptLoader.h b/mozilla/content/base/src/nsScriptLoader.h index 14205df7cba..7d9a13497c5 100644 --- a/mozilla/content/base/src/nsScriptLoader.h +++ b/mozilla/content/base/src/nsScriptLoader.h @@ -29,7 +29,7 @@ #include "nsIDOMHTMLScriptElement.h" #include "nsIScriptLoaderObserver.h" #include "nsIURI.h" -#include "nsSupportsArray.h" +#include "nsCOMArray.h" #include "nsIDocument.h" #include "nsIStreamLoader.h" @@ -67,8 +67,8 @@ protected: void ProcessPendingReqests(); nsIDocument* mDocument; // [WEAK] - nsSupportsArray mObservers; - nsSupportsArray mPendingRequests; + nsCOMArray mObservers; + nsCOMArray mPendingRequests; PRBool mEnabled; };