diff --git a/mozilla/content/html/style/src/nsCSSParser.cpp b/mozilla/content/html/style/src/nsCSSParser.cpp index 3374dd4a031..f5f205b8315 100644 --- a/mozilla/content/html/style/src/nsCSSParser.cpp +++ b/mozilla/content/html/style/src/nsCSSParser.cpp @@ -319,6 +319,8 @@ CSSParserImpl::Parse(nsIUnicharInputStream* aInput, nsIURL* aInputURL, nsICSSStyleSheet*& aResult) { + NS_ASSERTION(nsnull != aInputURL, "need base URL"); + if (nsnull == mSheet) { NS_NewCSSStyleSheet(&mSheet, aInputURL); } @@ -364,6 +366,8 @@ CSSParserImpl::ParseDeclarations(const nsString& aDeclaration, nsIURL* aBaseURL, nsIStyleRule*& aResult) { + NS_ASSERTION(nsnull != aBaseURL, "need base URL"); + nsString* str = new nsString(aDeclaration); if (nsnull == str) { return NS_ERROR_OUT_OF_MEMORY; @@ -410,6 +414,8 @@ CSSParserImpl::ParseAndAppendDeclaration(const nsString& aBuffer, nsICSSDeclaration* aDeclaration, PRInt32* aHint) { + NS_ASSERTION(nsnull != aBaseURL, "need base URL"); + nsString* str = new nsString(aBuffer); if (nsnull == str) { return NS_ERROR_OUT_OF_MEMORY; @@ -564,7 +570,7 @@ PRBool CSSParserImpl::ParseAtRule(PRInt32& aErrorCode) } PRBool CSSParserImpl::GatherMedia(PRInt32& aErrorCode, nsString& aMedia) -{ +{ // media is acse sensative PRBool first = PR_TRUE; for (;;) { if (!GetToken(aErrorCode, PR_TRUE)) { @@ -574,7 +580,6 @@ PRBool CSSParserImpl::GatherMedia(PRInt32& aErrorCode, nsString& aMedia) PRUnichar symbol = mToken.mSymbol; if (';' == symbol) { UngetToken(); - aMedia.ToUpperCase(); return PR_TRUE; } else if (',' != symbol) { UngetToken(); @@ -649,6 +654,7 @@ const PRUnichar kNullCh = PRUnichar('\0'); const PRUnichar kSingleQuote = PRUnichar('\''); const PRUnichar kDoubleQuote = PRUnichar('\"'); const PRUnichar kComma = PRUnichar(','); +const PRUnichar kHyphenCh = PRUnichar('-'); static PRBool EnumerateString(const nsString& aStringList, nsStringEnumFunc aFunc, void* aData) { @@ -693,6 +699,16 @@ static PRBool EnumerateString(const nsString& aStringList, nsStringEnumFunc aFun *end = kNullCh; // end string here } + // truncate at first non letter, digit or hyphen + PRUnichar* test = start; + while (test <= end) { + if ((PR_FALSE == nsString::IsAlpha(*test)) && + (PR_FALSE == nsString::IsDigit(*test)) && (kHyphenCh != *test)) { + *test = kNullCh; + break; + } + test++; + } subStr = start; if (PR_FALSE == quoted) { @@ -1137,6 +1153,18 @@ PRBool CSSParserImpl::ParseSelector(PRInt32& aErrorCode, if (0 == (dataMask & SEL_MASK_PELEM)) { dataMask |= SEL_MASK_PELEM; aSelector.AddPseudoClass(pseudo); // store it here, it gets pulled later + + // ensure selector ends here, must be followed by EOF, space, '{' or ',' + if (GetToken(aErrorCode, PR_FALSE)) { // premature eof is ok (here!) + if ((eCSSToken_WhiteSpace == mToken.mType) || + ((eCSSToken_Symbol == mToken.mType) && + (('{' == mToken.mSymbol) || (',' == mToken.mSymbol)))) { + UngetToken(); + return PR_TRUE; + } + UngetToken(); + return PR_FALSE; + } } else { // multiple pseudo elements, not legal UngetToken(); @@ -1933,9 +1961,14 @@ PRBool CSSParserImpl::ParseURL(PRInt32& aErrorCode, nsCSSValue& aValue) // the style sheet. // XXX editors won't like this - too bad for now nsAutoString absURL; - nsString baseURL; - nsresult rv = NS_MakeAbsoluteURL(mURL, baseURL, tk->mIdent, absURL); - if (NS_OK != rv) { + if (nsnull != mURL) { + nsString baseURL; + nsresult rv = NS_MakeAbsoluteURL(mURL, baseURL, tk->mIdent, absURL); + if (NS_FAILED(rv)) { + absURL = tk->mIdent; + } + } + else { absURL = tk->mIdent; } if (ExpectSymbol(aErrorCode, ')', PR_TRUE)) { diff --git a/mozilla/layout/html/style/src/nsCSSParser.cpp b/mozilla/layout/html/style/src/nsCSSParser.cpp index 3374dd4a031..f5f205b8315 100644 --- a/mozilla/layout/html/style/src/nsCSSParser.cpp +++ b/mozilla/layout/html/style/src/nsCSSParser.cpp @@ -319,6 +319,8 @@ CSSParserImpl::Parse(nsIUnicharInputStream* aInput, nsIURL* aInputURL, nsICSSStyleSheet*& aResult) { + NS_ASSERTION(nsnull != aInputURL, "need base URL"); + if (nsnull == mSheet) { NS_NewCSSStyleSheet(&mSheet, aInputURL); } @@ -364,6 +366,8 @@ CSSParserImpl::ParseDeclarations(const nsString& aDeclaration, nsIURL* aBaseURL, nsIStyleRule*& aResult) { + NS_ASSERTION(nsnull != aBaseURL, "need base URL"); + nsString* str = new nsString(aDeclaration); if (nsnull == str) { return NS_ERROR_OUT_OF_MEMORY; @@ -410,6 +414,8 @@ CSSParserImpl::ParseAndAppendDeclaration(const nsString& aBuffer, nsICSSDeclaration* aDeclaration, PRInt32* aHint) { + NS_ASSERTION(nsnull != aBaseURL, "need base URL"); + nsString* str = new nsString(aBuffer); if (nsnull == str) { return NS_ERROR_OUT_OF_MEMORY; @@ -564,7 +570,7 @@ PRBool CSSParserImpl::ParseAtRule(PRInt32& aErrorCode) } PRBool CSSParserImpl::GatherMedia(PRInt32& aErrorCode, nsString& aMedia) -{ +{ // media is acse sensative PRBool first = PR_TRUE; for (;;) { if (!GetToken(aErrorCode, PR_TRUE)) { @@ -574,7 +580,6 @@ PRBool CSSParserImpl::GatherMedia(PRInt32& aErrorCode, nsString& aMedia) PRUnichar symbol = mToken.mSymbol; if (';' == symbol) { UngetToken(); - aMedia.ToUpperCase(); return PR_TRUE; } else if (',' != symbol) { UngetToken(); @@ -649,6 +654,7 @@ const PRUnichar kNullCh = PRUnichar('\0'); const PRUnichar kSingleQuote = PRUnichar('\''); const PRUnichar kDoubleQuote = PRUnichar('\"'); const PRUnichar kComma = PRUnichar(','); +const PRUnichar kHyphenCh = PRUnichar('-'); static PRBool EnumerateString(const nsString& aStringList, nsStringEnumFunc aFunc, void* aData) { @@ -693,6 +699,16 @@ static PRBool EnumerateString(const nsString& aStringList, nsStringEnumFunc aFun *end = kNullCh; // end string here } + // truncate at first non letter, digit or hyphen + PRUnichar* test = start; + while (test <= end) { + if ((PR_FALSE == nsString::IsAlpha(*test)) && + (PR_FALSE == nsString::IsDigit(*test)) && (kHyphenCh != *test)) { + *test = kNullCh; + break; + } + test++; + } subStr = start; if (PR_FALSE == quoted) { @@ -1137,6 +1153,18 @@ PRBool CSSParserImpl::ParseSelector(PRInt32& aErrorCode, if (0 == (dataMask & SEL_MASK_PELEM)) { dataMask |= SEL_MASK_PELEM; aSelector.AddPseudoClass(pseudo); // store it here, it gets pulled later + + // ensure selector ends here, must be followed by EOF, space, '{' or ',' + if (GetToken(aErrorCode, PR_FALSE)) { // premature eof is ok (here!) + if ((eCSSToken_WhiteSpace == mToken.mType) || + ((eCSSToken_Symbol == mToken.mType) && + (('{' == mToken.mSymbol) || (',' == mToken.mSymbol)))) { + UngetToken(); + return PR_TRUE; + } + UngetToken(); + return PR_FALSE; + } } else { // multiple pseudo elements, not legal UngetToken(); @@ -1933,9 +1961,14 @@ PRBool CSSParserImpl::ParseURL(PRInt32& aErrorCode, nsCSSValue& aValue) // the style sheet. // XXX editors won't like this - too bad for now nsAutoString absURL; - nsString baseURL; - nsresult rv = NS_MakeAbsoluteURL(mURL, baseURL, tk->mIdent, absURL); - if (NS_OK != rv) { + if (nsnull != mURL) { + nsString baseURL; + nsresult rv = NS_MakeAbsoluteURL(mURL, baseURL, tk->mIdent, absURL); + if (NS_FAILED(rv)) { + absURL = tk->mIdent; + } + } + else { absURL = tk->mIdent; } if (ExpectSymbol(aErrorCode, ')', PR_TRUE)) { diff --git a/mozilla/layout/style/nsCSSParser.cpp b/mozilla/layout/style/nsCSSParser.cpp index 3374dd4a031..f5f205b8315 100644 --- a/mozilla/layout/style/nsCSSParser.cpp +++ b/mozilla/layout/style/nsCSSParser.cpp @@ -319,6 +319,8 @@ CSSParserImpl::Parse(nsIUnicharInputStream* aInput, nsIURL* aInputURL, nsICSSStyleSheet*& aResult) { + NS_ASSERTION(nsnull != aInputURL, "need base URL"); + if (nsnull == mSheet) { NS_NewCSSStyleSheet(&mSheet, aInputURL); } @@ -364,6 +366,8 @@ CSSParserImpl::ParseDeclarations(const nsString& aDeclaration, nsIURL* aBaseURL, nsIStyleRule*& aResult) { + NS_ASSERTION(nsnull != aBaseURL, "need base URL"); + nsString* str = new nsString(aDeclaration); if (nsnull == str) { return NS_ERROR_OUT_OF_MEMORY; @@ -410,6 +414,8 @@ CSSParserImpl::ParseAndAppendDeclaration(const nsString& aBuffer, nsICSSDeclaration* aDeclaration, PRInt32* aHint) { + NS_ASSERTION(nsnull != aBaseURL, "need base URL"); + nsString* str = new nsString(aBuffer); if (nsnull == str) { return NS_ERROR_OUT_OF_MEMORY; @@ -564,7 +570,7 @@ PRBool CSSParserImpl::ParseAtRule(PRInt32& aErrorCode) } PRBool CSSParserImpl::GatherMedia(PRInt32& aErrorCode, nsString& aMedia) -{ +{ // media is acse sensative PRBool first = PR_TRUE; for (;;) { if (!GetToken(aErrorCode, PR_TRUE)) { @@ -574,7 +580,6 @@ PRBool CSSParserImpl::GatherMedia(PRInt32& aErrorCode, nsString& aMedia) PRUnichar symbol = mToken.mSymbol; if (';' == symbol) { UngetToken(); - aMedia.ToUpperCase(); return PR_TRUE; } else if (',' != symbol) { UngetToken(); @@ -649,6 +654,7 @@ const PRUnichar kNullCh = PRUnichar('\0'); const PRUnichar kSingleQuote = PRUnichar('\''); const PRUnichar kDoubleQuote = PRUnichar('\"'); const PRUnichar kComma = PRUnichar(','); +const PRUnichar kHyphenCh = PRUnichar('-'); static PRBool EnumerateString(const nsString& aStringList, nsStringEnumFunc aFunc, void* aData) { @@ -693,6 +699,16 @@ static PRBool EnumerateString(const nsString& aStringList, nsStringEnumFunc aFun *end = kNullCh; // end string here } + // truncate at first non letter, digit or hyphen + PRUnichar* test = start; + while (test <= end) { + if ((PR_FALSE == nsString::IsAlpha(*test)) && + (PR_FALSE == nsString::IsDigit(*test)) && (kHyphenCh != *test)) { + *test = kNullCh; + break; + } + test++; + } subStr = start; if (PR_FALSE == quoted) { @@ -1137,6 +1153,18 @@ PRBool CSSParserImpl::ParseSelector(PRInt32& aErrorCode, if (0 == (dataMask & SEL_MASK_PELEM)) { dataMask |= SEL_MASK_PELEM; aSelector.AddPseudoClass(pseudo); // store it here, it gets pulled later + + // ensure selector ends here, must be followed by EOF, space, '{' or ',' + if (GetToken(aErrorCode, PR_FALSE)) { // premature eof is ok (here!) + if ((eCSSToken_WhiteSpace == mToken.mType) || + ((eCSSToken_Symbol == mToken.mType) && + (('{' == mToken.mSymbol) || (',' == mToken.mSymbol)))) { + UngetToken(); + return PR_TRUE; + } + UngetToken(); + return PR_FALSE; + } } else { // multiple pseudo elements, not legal UngetToken(); @@ -1933,9 +1961,14 @@ PRBool CSSParserImpl::ParseURL(PRInt32& aErrorCode, nsCSSValue& aValue) // the style sheet. // XXX editors won't like this - too bad for now nsAutoString absURL; - nsString baseURL; - nsresult rv = NS_MakeAbsoluteURL(mURL, baseURL, tk->mIdent, absURL); - if (NS_OK != rv) { + if (nsnull != mURL) { + nsString baseURL; + nsresult rv = NS_MakeAbsoluteURL(mURL, baseURL, tk->mIdent, absURL); + if (NS_FAILED(rv)) { + absURL = tk->mIdent; + } + } + else { absURL = tk->mIdent; } if (ExpectSymbol(aErrorCode, ')', PR_TRUE)) {