Fix leak of atom and fix return value propagation from SetMedia. b=58697 r=pierre@netscape.com sr=waterson@netscape.com

git-svn-id: svn://10.0.0.236/trunk@83215 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
dbaron%fas.harvard.edu
2000-12-02 15:53:42 +00:00
parent 348ff6d2af
commit da3a72cf6f
3 changed files with 51 additions and 36 deletions

View File

@@ -935,11 +935,11 @@ CSSLoaderImpl::DidLoadStyle(nsIStreamLoader* aLoader,
}
typedef PRBool (*nsStringEnumFunc)(const nsString& aSubString, void *aData);
typedef nsresult (*nsStringEnumFunc)(const nsString& aSubString, void *aData);
static PRBool EnumerateMediaString(const nsString& aStringList, nsStringEnumFunc aFunc, void* aData)
static nsresult EnumerateMediaString(const nsString& aStringList, nsStringEnumFunc aFunc, void* aData)
{
PRBool running = PR_TRUE;
nsresult status = NS_OK;
nsAutoString stringList(aStringList); // copy to work buffer
nsAutoString subStr;
@@ -949,7 +949,7 @@ static PRBool EnumerateMediaString(const nsString& aStringList, nsStringEnumFunc
PRUnichar* start = (PRUnichar*)(const PRUnichar*)stringList.GetUnicode();
PRUnichar* end = start;
while (running && (kNullCh != *start)) {
while (NS_SUCCEEDED(status) && (kNullCh != *start)) {
PRBool quoted = PR_FALSE;
while ((kNullCh != *start) && nsCRT::IsAsciiSpace(*start)) { // skip leading space
@@ -997,31 +997,34 @@ static PRBool EnumerateMediaString(const nsString& aStringList, nsStringEnumFunc
}
if (0 < subStr.Length()) {
running = (*aFunc)(subStr, aData);
status = (*aFunc)(subStr, aData);
}
start = ++end;
}
return running;
return status;
}
static PRBool MediumEnumFunc(const nsString& aSubString, void* aData)
static nsresult MediumEnumFunc(const nsString& aSubString, void* aData)
{
nsIAtom* medium = NS_NewAtom(aSubString);
if (!medium) return NS_ERROR_OUT_OF_MEMORY;
((nsICSSStyleSheet*)aData)->AppendMedium(medium);
return PR_TRUE;
NS_RELEASE(medium);
return NS_OK;
}
nsresult
CSSLoaderImpl::SetMedia(nsICSSStyleSheet* aSheet, const nsString& aMedia)
{
nsresult rv = NS_OK;
aSheet->ClearMedia();
if (0 < aMedia.Length()) {
EnumerateMediaString(aMedia, MediumEnumFunc, aSheet);
rv = EnumerateMediaString(aMedia, MediumEnumFunc, aSheet);
}
return NS_OK;
return rv;
}
nsresult
@@ -1442,8 +1445,10 @@ CSSLoaderImpl::LoadChildSheet(nsICSSStyleSheet* aParentSheet,
nsICSSStyleSheet* clone = nsnull;
result = sheet->Clone(clone);
if (NS_SUCCEEDED(result)) {
SetMedia(clone, aMedia);
result = InsertChildSheet(clone, aParentSheet, aIndex);
result = SetMedia(clone, aMedia);
if (NS_SUCCEEDED(result)) {
result = InsertChildSheet(clone, aParentSheet, aIndex);
}
NS_RELEASE(clone);
}
}