Random array stuff in nsScriptLoader; fix a leak. Bug 212271, r=caillon, sr=jst

git-svn-id: svn://10.0.0.236/trunk@144751 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
bzbarsky%mit.edu
2003-07-11 22:47:17 +00:00
parent 70c87b0997
commit 760dbdd94a
2 changed files with 45 additions and 57 deletions

View File

@@ -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<nsISupports> 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<nsScriptLoadRequest> request = new nsScriptLoadRequest(aElement, aObserver, jsVersionString);
if (!request) {
return FireErrorNotification(NS_ERROR_OUT_OF_MEMORY, aElement, aObserver);
}
// Temporarily hold on to the request
nsCOMPtr<nsISupports> 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<nsILoadGroup> loadGroup;
nsCOMPtr<nsIStreamLoader> loader;
@@ -452,7 +448,7 @@ nsScriptLoader::ProcessScriptElement(nsIDOMHTMLScriptElement *aElement,
nsCOMPtr<nsIDocShell> 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<nsISupports> sup(dont_AddRef(mObservers.ElementAt(i)));
nsCOMPtr<nsIScriptLoaderObserver> observer(do_QueryInterface(sup));
PRInt32 count = mObservers.Count();
for (PRInt32 i = 0; i < count; i++) {
nsCOMPtr<nsIScriptLoaderObserver> 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<nsISupports> sup(dont_AddRef(mObservers.ElementAt(i)));
nsCOMPtr<nsIScriptLoaderObserver> observer(do_QueryInterface(sup));
PRInt32 count = mObservers.Count();
for (PRInt32 i = 0; i < count; i++) {
nsCOMPtr<nsIScriptLoaderObserver> 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<nsISupports> sup(dont_AddRef(mObservers.ElementAt(i)));
nsCOMPtr<nsIScriptLoaderObserver> observer(do_QueryInterface(sup));
PRInt32 count = mObservers.Count();
for (PRInt32 i = 0; i < count; i++) {
nsCOMPtr<nsIScriptLoaderObserver> observer = mObservers[i];
if (observer) {
observer->ScriptEvaluated(aResult, aRequest->mElement,
@@ -663,14 +647,18 @@ nsScriptLoader::EvaluateScript(nsScriptLoadRequest* aRequest,
void
nsScriptLoader::ProcessPendingReqests()
{
nsCOMPtr<nsISupports> reqsup(dont_AddRef(mPendingRequests.ElementAt(0)));
nsScriptLoadRequest* request = NS_REINTERPRET_CAST(nsScriptLoadRequest*,
reqsup.get());
if (mPendingRequests.Count() == 0) {
return;
}
nsRefPtr<nsScriptLoadRequest> 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<nsISupports> 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