diff --git a/mozilla/content/html/style/src/nsCSSLoader.cpp b/mozilla/content/html/style/src/nsCSSLoader.cpp index 3b895bb9cd7..731049eef31 100644 --- a/mozilla/content/html/style/src/nsCSSLoader.cpp +++ b/mozilla/content/html/style/src/nsCSSLoader.cpp @@ -31,6 +31,7 @@ #include "nsHashtable.h" #include "nsIURL.h" +#include "nsIURLGroup.h" #include "nsCRT.h" #include "nsVoidArray.h" #include "nsISupportsArray.h" @@ -609,6 +610,7 @@ CSSLoaderImpl::Cleanup(URLKey& aKey, SheetLoadData* aLoadData) } } + delete aLoadData; // delete data last, it may have last ref on loader... } @@ -949,6 +951,28 @@ CSSLoaderImpl::InsertChildSheet(nsICSSStyleSheet* aSheet, nsICSSStyleSheet* aPar return NS_ERROR_OUT_OF_MEMORY; } +static nsIURL* CloneURL(nsIURL* aURL) +{ + nsIURL* result = nsnull; + + PRUnichar* urlStr; + aURL->ToString(&urlStr); + if (urlStr) { + nsAutoString buffer(urlStr); + delete [] urlStr; + nsIURLGroup* urlGroup = nsnull; + aURL->GetURLGroup(&urlGroup); + if (urlGroup) { + urlGroup->CreateURL(&result, aURL, buffer, nsnull); + NS_RELEASE(urlGroup); + } + else { + NS_NewURL(&result, buffer, aURL); + } + } + return result; +} + nsresult CSSLoaderImpl::LoadSheet(URLKey& aKey, SheetLoadData* aData) { @@ -963,21 +987,25 @@ CSSLoaderImpl::LoadSheet(URLKey& aKey, SheetLoadData* aData) } else { // not loading, go load it nsIUnicharStreamLoader* loader; - result = NS_NewUnicharStreamLoader(&loader, aKey.mURL, DoneLoadingStyle, aData); - if (NS_SUCCEEDED(result)) { - mLoadingSheets.Put(&aKey, aData); - // grab any pending alternates that have this URL - loadingData = aData; - PRInt32 index = 0; - while (index < mPendingAlternateSheets.Count()) { - SheetLoadData* data = (SheetLoadData*)mPendingAlternateSheets.ElementAt(index); - if (aKey.mURL->Equals(data->mURL)) { - mPendingAlternateSheets.RemoveElementAt(index); - loadingData->mNext = data; - loadingData = data; - } - else { - index++; + nsIURL* urlClone = CloneURL(aKey.mURL); // don't give the key to netlib, it munges it + if (urlClone) { + result = NS_NewUnicharStreamLoader(&loader, urlClone, DoneLoadingStyle, aData); + NS_RELEASE(urlClone); + if (NS_SUCCEEDED(result)) { + mLoadingSheets.Put(&aKey, aData); + // grab any pending alternates that have this URL + loadingData = aData; + PRInt32 index = 0; + while (index < mPendingAlternateSheets.Count()) { + SheetLoadData* data = (SheetLoadData*)mPendingAlternateSheets.ElementAt(index); + if (aKey.mURL->Equals(data->mURL)) { + mPendingAlternateSheets.RemoveElementAt(index); + loadingData->mNext = data; + loadingData = data; + } + else { + index++; + } } } } @@ -1144,19 +1172,23 @@ CSSLoaderImpl::LoadAgentSheet(nsIURL* aURL, if (aURL) { // Get an input stream from the url nsIInputStream* in; - result = NS_OpenURL(aURL, &in); - if (NS_SUCCEEDED(result)) { - // Translate the input using the argument character set id into unicode - nsIUnicharInputStream* uin; - result = NS_NewConverterStream(&uin, nsnull, in); + nsIURL* urlClone = CloneURL(aURL); // dont give key URL to netlib, it gets munged + if (urlClone) { + result = NS_OpenURL(urlClone, &in); + NS_RELEASE(urlClone); if (NS_SUCCEEDED(result)) { - SheetLoadData* data = new SheetLoadData(this, aURL, aCallback, aData); - URLKey key(aURL); - mLoadingSheets.Put(&key, data); - result = ParseSheet(uin, data, aCompleted, aSheet); - NS_RELEASE(uin); + // Translate the input using the argument character set id into unicode + nsIUnicharInputStream* uin; + result = NS_NewConverterStream(&uin, nsnull, in); + if (NS_SUCCEEDED(result)) { + SheetLoadData* data = new SheetLoadData(this, aURL, aCallback, aData); + URLKey key(aURL); + mLoadingSheets.Put(&key, data); + result = ParseSheet(uin, data, aCompleted, aSheet); + NS_RELEASE(uin); + } + NS_RELEASE(in); } - NS_RELEASE(in); } } return result; diff --git a/mozilla/layout/html/style/src/nsCSSLoader.cpp b/mozilla/layout/html/style/src/nsCSSLoader.cpp index 3b895bb9cd7..731049eef31 100644 --- a/mozilla/layout/html/style/src/nsCSSLoader.cpp +++ b/mozilla/layout/html/style/src/nsCSSLoader.cpp @@ -31,6 +31,7 @@ #include "nsHashtable.h" #include "nsIURL.h" +#include "nsIURLGroup.h" #include "nsCRT.h" #include "nsVoidArray.h" #include "nsISupportsArray.h" @@ -609,6 +610,7 @@ CSSLoaderImpl::Cleanup(URLKey& aKey, SheetLoadData* aLoadData) } } + delete aLoadData; // delete data last, it may have last ref on loader... } @@ -949,6 +951,28 @@ CSSLoaderImpl::InsertChildSheet(nsICSSStyleSheet* aSheet, nsICSSStyleSheet* aPar return NS_ERROR_OUT_OF_MEMORY; } +static nsIURL* CloneURL(nsIURL* aURL) +{ + nsIURL* result = nsnull; + + PRUnichar* urlStr; + aURL->ToString(&urlStr); + if (urlStr) { + nsAutoString buffer(urlStr); + delete [] urlStr; + nsIURLGroup* urlGroup = nsnull; + aURL->GetURLGroup(&urlGroup); + if (urlGroup) { + urlGroup->CreateURL(&result, aURL, buffer, nsnull); + NS_RELEASE(urlGroup); + } + else { + NS_NewURL(&result, buffer, aURL); + } + } + return result; +} + nsresult CSSLoaderImpl::LoadSheet(URLKey& aKey, SheetLoadData* aData) { @@ -963,21 +987,25 @@ CSSLoaderImpl::LoadSheet(URLKey& aKey, SheetLoadData* aData) } else { // not loading, go load it nsIUnicharStreamLoader* loader; - result = NS_NewUnicharStreamLoader(&loader, aKey.mURL, DoneLoadingStyle, aData); - if (NS_SUCCEEDED(result)) { - mLoadingSheets.Put(&aKey, aData); - // grab any pending alternates that have this URL - loadingData = aData; - PRInt32 index = 0; - while (index < mPendingAlternateSheets.Count()) { - SheetLoadData* data = (SheetLoadData*)mPendingAlternateSheets.ElementAt(index); - if (aKey.mURL->Equals(data->mURL)) { - mPendingAlternateSheets.RemoveElementAt(index); - loadingData->mNext = data; - loadingData = data; - } - else { - index++; + nsIURL* urlClone = CloneURL(aKey.mURL); // don't give the key to netlib, it munges it + if (urlClone) { + result = NS_NewUnicharStreamLoader(&loader, urlClone, DoneLoadingStyle, aData); + NS_RELEASE(urlClone); + if (NS_SUCCEEDED(result)) { + mLoadingSheets.Put(&aKey, aData); + // grab any pending alternates that have this URL + loadingData = aData; + PRInt32 index = 0; + while (index < mPendingAlternateSheets.Count()) { + SheetLoadData* data = (SheetLoadData*)mPendingAlternateSheets.ElementAt(index); + if (aKey.mURL->Equals(data->mURL)) { + mPendingAlternateSheets.RemoveElementAt(index); + loadingData->mNext = data; + loadingData = data; + } + else { + index++; + } } } } @@ -1144,19 +1172,23 @@ CSSLoaderImpl::LoadAgentSheet(nsIURL* aURL, if (aURL) { // Get an input stream from the url nsIInputStream* in; - result = NS_OpenURL(aURL, &in); - if (NS_SUCCEEDED(result)) { - // Translate the input using the argument character set id into unicode - nsIUnicharInputStream* uin; - result = NS_NewConverterStream(&uin, nsnull, in); + nsIURL* urlClone = CloneURL(aURL); // dont give key URL to netlib, it gets munged + if (urlClone) { + result = NS_OpenURL(urlClone, &in); + NS_RELEASE(urlClone); if (NS_SUCCEEDED(result)) { - SheetLoadData* data = new SheetLoadData(this, aURL, aCallback, aData); - URLKey key(aURL); - mLoadingSheets.Put(&key, data); - result = ParseSheet(uin, data, aCompleted, aSheet); - NS_RELEASE(uin); + // Translate the input using the argument character set id into unicode + nsIUnicharInputStream* uin; + result = NS_NewConverterStream(&uin, nsnull, in); + if (NS_SUCCEEDED(result)) { + SheetLoadData* data = new SheetLoadData(this, aURL, aCallback, aData); + URLKey key(aURL); + mLoadingSheets.Put(&key, data); + result = ParseSheet(uin, data, aCompleted, aSheet); + NS_RELEASE(uin); + } + NS_RELEASE(in); } - NS_RELEASE(in); } } return result; diff --git a/mozilla/layout/style/nsCSSLoader.cpp b/mozilla/layout/style/nsCSSLoader.cpp index 3b895bb9cd7..731049eef31 100644 --- a/mozilla/layout/style/nsCSSLoader.cpp +++ b/mozilla/layout/style/nsCSSLoader.cpp @@ -31,6 +31,7 @@ #include "nsHashtable.h" #include "nsIURL.h" +#include "nsIURLGroup.h" #include "nsCRT.h" #include "nsVoidArray.h" #include "nsISupportsArray.h" @@ -609,6 +610,7 @@ CSSLoaderImpl::Cleanup(URLKey& aKey, SheetLoadData* aLoadData) } } + delete aLoadData; // delete data last, it may have last ref on loader... } @@ -949,6 +951,28 @@ CSSLoaderImpl::InsertChildSheet(nsICSSStyleSheet* aSheet, nsICSSStyleSheet* aPar return NS_ERROR_OUT_OF_MEMORY; } +static nsIURL* CloneURL(nsIURL* aURL) +{ + nsIURL* result = nsnull; + + PRUnichar* urlStr; + aURL->ToString(&urlStr); + if (urlStr) { + nsAutoString buffer(urlStr); + delete [] urlStr; + nsIURLGroup* urlGroup = nsnull; + aURL->GetURLGroup(&urlGroup); + if (urlGroup) { + urlGroup->CreateURL(&result, aURL, buffer, nsnull); + NS_RELEASE(urlGroup); + } + else { + NS_NewURL(&result, buffer, aURL); + } + } + return result; +} + nsresult CSSLoaderImpl::LoadSheet(URLKey& aKey, SheetLoadData* aData) { @@ -963,21 +987,25 @@ CSSLoaderImpl::LoadSheet(URLKey& aKey, SheetLoadData* aData) } else { // not loading, go load it nsIUnicharStreamLoader* loader; - result = NS_NewUnicharStreamLoader(&loader, aKey.mURL, DoneLoadingStyle, aData); - if (NS_SUCCEEDED(result)) { - mLoadingSheets.Put(&aKey, aData); - // grab any pending alternates that have this URL - loadingData = aData; - PRInt32 index = 0; - while (index < mPendingAlternateSheets.Count()) { - SheetLoadData* data = (SheetLoadData*)mPendingAlternateSheets.ElementAt(index); - if (aKey.mURL->Equals(data->mURL)) { - mPendingAlternateSheets.RemoveElementAt(index); - loadingData->mNext = data; - loadingData = data; - } - else { - index++; + nsIURL* urlClone = CloneURL(aKey.mURL); // don't give the key to netlib, it munges it + if (urlClone) { + result = NS_NewUnicharStreamLoader(&loader, urlClone, DoneLoadingStyle, aData); + NS_RELEASE(urlClone); + if (NS_SUCCEEDED(result)) { + mLoadingSheets.Put(&aKey, aData); + // grab any pending alternates that have this URL + loadingData = aData; + PRInt32 index = 0; + while (index < mPendingAlternateSheets.Count()) { + SheetLoadData* data = (SheetLoadData*)mPendingAlternateSheets.ElementAt(index); + if (aKey.mURL->Equals(data->mURL)) { + mPendingAlternateSheets.RemoveElementAt(index); + loadingData->mNext = data; + loadingData = data; + } + else { + index++; + } } } } @@ -1144,19 +1172,23 @@ CSSLoaderImpl::LoadAgentSheet(nsIURL* aURL, if (aURL) { // Get an input stream from the url nsIInputStream* in; - result = NS_OpenURL(aURL, &in); - if (NS_SUCCEEDED(result)) { - // Translate the input using the argument character set id into unicode - nsIUnicharInputStream* uin; - result = NS_NewConverterStream(&uin, nsnull, in); + nsIURL* urlClone = CloneURL(aURL); // dont give key URL to netlib, it gets munged + if (urlClone) { + result = NS_OpenURL(urlClone, &in); + NS_RELEASE(urlClone); if (NS_SUCCEEDED(result)) { - SheetLoadData* data = new SheetLoadData(this, aURL, aCallback, aData); - URLKey key(aURL); - mLoadingSheets.Put(&key, data); - result = ParseSheet(uin, data, aCompleted, aSheet); - NS_RELEASE(uin); + // Translate the input using the argument character set id into unicode + nsIUnicharInputStream* uin; + result = NS_NewConverterStream(&uin, nsnull, in); + if (NS_SUCCEEDED(result)) { + SheetLoadData* data = new SheetLoadData(this, aURL, aCallback, aData); + URLKey key(aURL); + mLoadingSheets.Put(&key, data); + result = ParseSheet(uin, data, aCompleted, aSheet); + NS_RELEASE(uin); + } + NS_RELEASE(in); } - NS_RELEASE(in); } } return result;