Change the nsICSSParser::Parse() API so that we don't hand out a stylesheet;

require a stylesheet to be set before calling Parse().  Bug 404315,
r+sr=dbaron, a=beltzner
This commit is contained in:
bzbarsky%mit.edu 2008-02-15 04:21:57 +00:00
Родитель e7a2584f68
Коммит 5e148f5001
4 изменённых файлов: 53 добавлений и 44 удалений

Просмотреть файл

@ -438,6 +438,9 @@ CSSLoaderImpl::RecycleParser(nsICSSParser* aParser)
if (!gParsers->AppendObject(aParser)) {
return NS_ERROR_FAILURE;
}
// Make sure the parser doesn't keep the last sheet it parsed alive
aParser->SetStyleSheet(nsnull);
return NS_OK;
}
@ -1497,9 +1500,6 @@ CSSLoaderImpl::ParseSheet(nsIUnicharInputStream* aStream,
return rv;
}
// The parser insists on passing out a strong ref to the sheet it
// parsed. We don't care.
nsCOMPtr<nsICSSStyleSheet> dummySheet;
// Push our load data on the stack so any kids can pick it up
mParsingDatas.AppendElement(aLoadData);
nsCOMPtr<nsIURI> sheetURI, baseURI;
@ -1507,8 +1507,7 @@ CSSLoaderImpl::ParseSheet(nsIUnicharInputStream* aStream,
aLoadData->mSheet->GetBaseURI(getter_AddRefs(baseURI));
rv = parser->Parse(aStream, sheetURI, baseURI,
aLoadData->mSheet->Principal(), aLoadData->mLineNumber,
aLoadData->mAllowUnsafeRules,
*getter_AddRefs(dummySheet));
aLoadData->mAllowUnsafeRules);
mParsingDatas.RemoveElementAt(mParsingDatas.Count() - 1);
RecycleParser(parser);

Просмотреть файл

@ -110,8 +110,7 @@ public:
nsIURI* aBaseURI,
nsIPrincipal* aSheetPrincipal,
PRUint32 aLineNumber,
PRBool aAllowUnsafeRules,
nsICSSStyleSheet*& aResult);
PRBool aAllowUnsafeRules);
NS_IMETHOD ParseStyleAttribute(const nsAString& aAttributeValue,
nsIURI* aDocURL,
@ -584,16 +583,15 @@ CSSParserImpl::~CSSParserImpl()
NS_IMETHODIMP
CSSParserImpl::SetStyleSheet(nsICSSStyleSheet* aSheet)
{
NS_PRECONDITION(nsnull != aSheet, "null ptr");
if (nsnull == aSheet) {
return NS_ERROR_NULL_POINTER;
}
if (aSheet != mSheet) {
// Switch to using the new sheet
// Switch to using the new sheet, if any
mGroupStack.Clear();
mSheet = aSheet;
mNameSpaceMap = mSheet->GetNameSpaceMap();
if (mSheet) {
mNameSpaceMap = mSheet->GetNameSpaceMap();
} else {
mNameSpaceMap = nsnull;
}
}
return NS_OK;
@ -684,6 +682,7 @@ CSSParserImpl::ReleaseScanner(void)
#endif
mBaseURL = nsnull;
mSheetURL = nsnull;
mSheetPrincipal = nsnull;
return NS_OK;
}
@ -694,34 +693,26 @@ CSSParserImpl::Parse(nsIUnicharInputStream* aInput,
nsIURI* aBaseURI,
nsIPrincipal* aSheetPrincipal,
PRUint32 aLineNumber,
PRBool aAllowUnsafeRules,
nsICSSStyleSheet*& aResult)
PRBool aAllowUnsafeRules)
{
NS_PRECONDITION(aSheetPrincipal, "Must have principal here!");
NS_ASSERTION(nsnull != aBaseURI, "need base URL");
NS_ASSERTION(nsnull != aSheetURI, "need sheet URL");
if (! mSheet) {
NS_NewCSSStyleSheet(getter_AddRefs(mSheet));
NS_ENSURE_TRUE(mSheet, NS_ERROR_OUT_OF_MEMORY);
NS_PRECONDITION(mSheet, "Must have sheet to parse into");
NS_ENSURE_STATE(mSheet);
mSheet->SetURIs(aSheetURI, aSheetURI, aBaseURI);
mSheet->SetPrincipal(aSheetPrincipal);
mNameSpaceMap = nsnull;
}
#ifdef DEBUG
else {
nsCOMPtr<nsIURI> uri;
mSheet->GetSheetURI(getter_AddRefs(uri));
PRBool equal;
NS_ASSERTION(NS_SUCCEEDED(aSheetURI->Equals(uri, &equal)) && equal,
"Sheet URI does not match passed URI");
NS_ASSERTION(NS_SUCCEEDED(mSheet->Principal()->Equals(aSheetPrincipal,
&equal)) &&
equal,
"Sheet principal does not match passed principal");
}
nsCOMPtr<nsIURI> uri;
mSheet->GetSheetURI(getter_AddRefs(uri));
PRBool equal;
NS_ASSERTION(NS_SUCCEEDED(aSheetURI->Equals(uri, &equal)) && equal,
"Sheet URI does not match passed URI");
NS_ASSERTION(NS_SUCCEEDED(mSheet->Principal()->Equals(aSheetPrincipal,
&equal)) &&
equal,
"Sheet principal does not match passed principal");
#endif
nsresult errorCode = NS_OK;
@ -784,9 +775,6 @@ CSSParserImpl::Parse(nsIUnicharInputStream* aInput,
mUnsafeRulesEnabled = PR_FALSE;
aResult = mSheet;
NS_ADDREF(aResult);
return NS_OK;
}

Просмотреть файл

@ -190,7 +190,7 @@ nsCSSScanner::nsCSSScanner()
BuildLexTable();
}
mPushback = mLocalPushback;
mPushbackSize = 4;
mPushbackSize = NS_ARRAY_LENGTH(mLocalPushback);
// No need to init the other members, since they represent state
// which can get cleared. We'll init them every time Init() is
// called.
@ -456,6 +456,16 @@ void nsCSSScanner::Close()
{
mInputStream = nsnull;
mReadPointer = nsnull;
// Clean things up so we don't hold on to memory if our parser gets recycled.
mFileName.Truncate();
mURI = nsnull;
mError.Truncate();
if (mPushback != mLocalPushback) {
delete [] mPushback;
mPushback = mLocalPushback;
mPushbackSize = NS_ARRAY_LENGTH(mLocalPushback);
}
}
#ifdef CSS_REPORT_PARSE_ERRORS

Просмотреть файл

@ -57,8 +57,8 @@ class nsMediaList;
class nsIPrincipal;
#define NS_ICSS_PARSER_IID \
{ 0x2cb34728, 0x0f17, 0x4753, \
{0x8e, 0xad, 0xec, 0x73, 0xe5, 0x69, 0xcd, 0xcd} }
{ 0xad4a3778, 0xdae0, 0x4640, \
{ 0xb2, 0x5a, 0x24, 0xff, 0x09, 0xc3, 0x70, 0xef } }
// Rule processing function
typedef void (*PR_CALLBACK RuleAppendFunc) (nsICSSRule* aRule, void* aData);
@ -69,7 +69,8 @@ public:
NS_DECLARE_STATIC_IID_ACCESSOR(NS_ICSS_PARSER_IID)
// Set a style sheet for the parser to fill in. The style sheet must
// implement the nsICSSStyleSheet interface
// implement the nsICSSStyleSheet interface. Null can be passed in to clear
// out an existing stylesheet reference.
NS_IMETHOD SetStyleSheet(nsICSSStyleSheet* aSheet) = 0;
// Set whether or not tags & classes are case sensitive or uppercased
@ -87,16 +88,27 @@ public:
NS_IMETHOD SetChildLoader(nsICSSLoader* aChildLoader) = 0;
/**
* Parse aInput into the stylesheet that was previously set by calling
* SetStyleSheet. Calling this method without calling SetStyleSheet first is
* an error.
*
* @param aInput the data to parse
* @param aSheetURL the URI to use as the sheet URI (for error reporting).
* This must match the URI of the sheet passed to
* SetStyleSheet.
* @param aBaseURI the URI to use for relative URI resolution
* @param aSheetPrincipal the principal of the stylesheet. This must match
* the principal of the sheet passed to SetStyleSheet.
* @param aLineNumber the line number of the first line of the sheet.
* @param aAllowUnsafeRules see aEnableUnsafeRules in
* nsICSSLoader::LoadSheetSync
* nsICSSLoader::LoadSheetSync
*/
NS_IMETHOD Parse(nsIUnicharInputStream* aInput,
nsIURI* aSheetURL,
nsIURI* aBaseURI,
nsIPrincipal* aSheetPrincipal,
PRUint32 aLineNumber,
PRBool aAllowUnsafeRules,
nsICSSStyleSheet*& aResult) = 0;
PRBool aAllowUnsafeRules) = 0;
// Parse HTML style attribute or its equivalent in other markup
// languages. aBaseURL is the base url to use for relative links in