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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user