From 39dbe2d452014d6519119ad374b26a6ca5f26558 Mon Sep 17 00:00:00 2001 From: "peterv%propagandism.org" Date: Fri, 7 May 2004 13:22:39 +0000 Subject: [PATCH] Try to fix bustage by backing out. git-svn-id: svn://10.0.0.236/trunk@156087 18797224-902f-48f8-a5cc-f745e15eee43 --- .../parser/htmlparser/src/nsExpatDriver.cpp | 840 +++++++++--------- mozilla/parser/htmlparser/src/nsExpatDriver.h | 28 +- 2 files changed, 424 insertions(+), 444 deletions(-) diff --git a/mozilla/parser/htmlparser/src/nsExpatDriver.cpp b/mozilla/parser/htmlparser/src/nsExpatDriver.cpp index 04c847d7aa2..868bc810518 100644 --- a/mozilla/parser/htmlparser/src/nsExpatDriver.cpp +++ b/mozilla/parser/htmlparser/src/nsExpatDriver.cpp @@ -34,7 +34,6 @@ * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ - #include "nsExpatDriver.h" #include "nsIParser.h" #include "nsCOMPtr.h" @@ -53,76 +52,75 @@ #include "nsCRT.h" static const char kWhitespace[] = " \r\n\t"; // Optimized for typical cases -static const XML_Char kUTF16[] = { 'U', 'T', 'F', '-', '1', '6', '\0' }; -/***************************** EXPAT CALL BACKS ******************************/ -// The callback handlers that get called from the expat parser. +/***************************** EXPAT CALL BACKS *******************************/ + // The callback handlers that get called from the expat parser PR_STATIC_CALLBACK(void) -Driver_HandleStartElement(void *aUserData, - const XML_Char *aName, - const XML_Char **aAtts) +Driver_HandleStartElement(void *aUserData, + const XML_Char *aName, + const XML_Char **aAtts) { NS_ASSERTION(aUserData, "expat driver should exist"); if (aUserData) { - NS_STATIC_CAST(nsExpatDriver*, aUserData)->HandleStartElement((const PRUnichar*)aName, - (const PRUnichar**)aAtts); + NS_STATIC_CAST(nsExpatDriver*,aUserData)->HandleStartElement((const PRUnichar*)aName, + (const PRUnichar**)aAtts); } } PR_STATIC_CALLBACK(void) -Driver_HandleEndElement(void *aUserData, - const XML_Char *aName) +Driver_HandleEndElement(void *aUserData, + const XML_Char *aName) { NS_ASSERTION(aUserData, "expat driver should exist"); if (aUserData) { - NS_STATIC_CAST(nsExpatDriver*, aUserData)->HandleEndElement((const PRUnichar*)aName); + NS_STATIC_CAST(nsExpatDriver*,aUserData)->HandleEndElement((const PRUnichar*)aName); } } PR_STATIC_CALLBACK(void) Driver_HandleCharacterData(void *aUserData, - const XML_Char *aData, + const XML_Char *aData, int aLength) { NS_ASSERTION(aUserData, "expat driver should exist"); if (aUserData) { - nsExpatDriver* driver = NS_STATIC_CAST(nsExpatDriver*, aUserData); - driver->HandleCharacterData((const PRUnichar*)aData, PRUint32(aLength)); + NS_STATIC_CAST(nsExpatDriver*,aUserData)->HandleCharacterData((PRUnichar*)aData, + PRUint32(aLength)); } } PR_STATIC_CALLBACK(void) Driver_HandleComment(void *aUserData, - const XML_Char *aName) + const XML_Char *aName) { NS_ASSERTION(aUserData, "expat driver should exist"); if(aUserData) { - NS_STATIC_CAST(nsExpatDriver*, aUserData)->HandleComment((const PRUnichar*)aName); + NS_STATIC_CAST(nsExpatDriver*,aUserData)->HandleComment((const PRUnichar*)aName); } } PR_STATIC_CALLBACK(void) -Driver_HandleProcessingInstruction(void *aUserData, - const XML_Char *aTarget, +Driver_HandleProcessingInstruction(void *aUserData, + const XML_Char *aTarget, const XML_Char *aData) { NS_ASSERTION(aUserData, "expat driver should exist"); if (aUserData) { - nsExpatDriver* driver = NS_STATIC_CAST(nsExpatDriver*, aUserData); - driver->HandleProcessingInstruction((const PRUnichar*)aTarget, (const PRUnichar*)aData); + NS_STATIC_CAST(nsExpatDriver*,aUserData)->HandleProcessingInstruction((const PRUnichar*)aTarget, + (const PRUnichar*)aData); } } PR_STATIC_CALLBACK(void) -Driver_HandleDefault(void *aUserData, - const XML_Char *aData, - int aLength) +Driver_HandleDefault(void *aUserData, + const XML_Char *aData, + int aLength) { NS_ASSERTION(aUserData, "expat driver should exist"); if (aUserData) { - nsExpatDriver* driver = NS_STATIC_CAST(nsExpatDriver*, aUserData); - driver->HandleDefault((const PRUnichar*)aData, PRUint32(aLength)); + NS_STATIC_CAST(nsExpatDriver*,aUserData)->HandleDefault((const PRUnichar*)aData, + PRUint32(aLength)); } } @@ -131,7 +129,7 @@ Driver_HandleStartCdataSection(void *aUserData) { NS_ASSERTION(aUserData, "expat driver should exist"); if (aUserData) { - NS_STATIC_CAST(nsExpatDriver*, aUserData)->HandleStartCdataSection(); + NS_STATIC_CAST(nsExpatDriver*,aUserData)->HandleStartCdataSection(); } } @@ -140,60 +138,54 @@ Driver_HandleEndCdataSection(void *aUserData) { NS_ASSERTION(aUserData, "expat driver should exist"); if (aUserData) { - NS_STATIC_CAST(nsExpatDriver*, aUserData)->HandleEndCdataSection(); + NS_STATIC_CAST(nsExpatDriver*,aUserData)->HandleEndCdataSection(); } } PR_STATIC_CALLBACK(void) -Driver_HandleStartDoctypeDecl(void *aUserData, - const XML_Char *aDoctypeName) +Driver_HandleStartDoctypeDecl(void *aUserData, + const XML_Char *aDoctypeName) { NS_ASSERTION(aUserData, "expat driver should exist"); if (aUserData) { - NS_STATIC_CAST(nsExpatDriver*, aUserData)->HandleStartDoctypeDecl(); + NS_STATIC_CAST(nsExpatDriver*,aUserData)->HandleStartDoctypeDecl(); } } PR_STATIC_CALLBACK(void) -Driver_HandleEndDoctypeDecl(void *aUserData) +Driver_HandleEndDoctypeDecl(void *aUserData) { NS_ASSERTION(aUserData, "expat driver should exist"); if (aUserData) { - NS_STATIC_CAST(nsExpatDriver*, aUserData)->HandleEndDoctypeDecl(); + NS_STATIC_CAST(nsExpatDriver*,aUserData)->HandleEndDoctypeDecl(); } } PR_STATIC_CALLBACK(int) -Driver_HandleExternalEntityRef(void *aExternalEntityRefHandler, - const XML_Char *aOpenEntityNames, - const XML_Char *aBase, - const XML_Char *aSystemId, - const XML_Char *aPublicId) +Driver_HandleExternalEntityRef(void* aExternalEntityRefHandler, + const XML_Char *openEntityNames, + const XML_Char *base, + const XML_Char *systemId, + const XML_Char *publicId) { NS_ASSERTION(aExternalEntityRefHandler, "expat driver should exist"); - if (!aExternalEntityRefHandler) { - return 1; + if (aExternalEntityRefHandler) { + return NS_STATIC_CAST(nsExpatDriver*, + aExternalEntityRefHandler)->HandleExternalEntityRef( + (const PRUnichar*)openEntityNames, (const PRUnichar*)base, + (const PRUnichar*)systemId, (const PRUnichar*)publicId); } - - nsExpatDriver* driver = NS_STATIC_CAST(nsExpatDriver*, - aExternalEntityRefHandler); - - return driver->HandleExternalEntityRef((const PRUnichar*)aOpenEntityNames, - (const PRUnichar*)aBase, - (const PRUnichar*)aSystemId, - (const PRUnichar*)aPublicId); + return 1; } -/***************************** END CALL BACKS ********************************/ +/***************************** END CALL BACKS *********************************/ -/***************************** CATALOG UTILS *********************************/ +/***************************** CATALOG UTILS **********************************/ // Initially added for bug 113400 to switch from the remote "XHTML 1.0 plus // MathML 2.0" DTD to the the lightweight customized version that Mozilla uses. -// Since Mozilla is not validating, no need to fetch a *huge* file at each -// click. -// XXX The cleanest solution here would be to fix Bug 98413: Implement XML -// Catalogs. +// Since Mozilla is not validating, no need to fetch a *huge* file at each click. +// XXX The cleanest solution here would be to fix Bug 98413: Implement XML Catalogs struct nsCatalogData { const char* mPublicID; const char* mLocalDTD; @@ -202,77 +194,83 @@ struct nsCatalogData { // The order of this table is guestimated to be in the optimum order static const nsCatalogData kCatalogTable[] = { - { "-//W3C//DTD XHTML 1.0 Transitional//EN", "xhtml11.dtd", nsnull }, - { "-//W3C//DTD XHTML 1.1//EN", "xhtml11.dtd", nsnull }, - { "-//W3C//DTD XHTML 1.0 Strict//EN", "xhtml11.dtd", nsnull }, - { "-//W3C//DTD XHTML 1.0 Frameset//EN", "xhtml11.dtd", nsnull }, - { "-//W3C//DTD XHTML Basic 1.0//EN", "xhtml11.dtd", nsnull }, - { "-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN", "mathml.dtd", "resource://gre/res/mathml.css" }, - { "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN", "mathml.dtd", "resource://gre/res/mathml.css" }, - { "-//W3C//DTD MathML 2.0//EN", "mathml.dtd", "resource://gre/res/mathml.css" }, - { "-//W3C//DTD SVG 20001102//EN", "svg.dtd", nsnull }, - { "-//WAPFORUM//DTD XHTML Mobile 1.0//EN", "xhtml11.dtd", nsnull }, - { nsnull, nsnull, nsnull } + {"-//W3C//DTD XHTML 1.0 Transitional//EN", "xhtml11.dtd", nsnull }, + {"-//W3C//DTD XHTML 1.1//EN", "xhtml11.dtd", nsnull }, + {"-//W3C//DTD XHTML 1.0 Strict//EN", "xhtml11.dtd", nsnull }, + {"-//W3C//DTD XHTML 1.0 Frameset//EN", "xhtml11.dtd", nsnull }, + {"-//W3C//DTD XHTML Basic 1.0//EN", "xhtml11.dtd", nsnull }, + {"-//W3C//DTD XHTML 1.1 plus MathML 2.0//EN", "mathml.dtd", "resource://gre/res/mathml.css" }, + {"-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN", "mathml.dtd", "resource://gre/res/mathml.css" }, + {"-//W3C//DTD MathML 2.0//EN", "mathml.dtd", "resource://gre/res/mathml.css" }, + {"-//W3C//DTD SVG 20001102//EN", "svg.dtd", nsnull }, + {"-//WAPFORUM//DTD XHTML Mobile 1.0//EN", "xhtml11.dtd", nsnull }, + {nsnull, nsnull, nsnull} }; static const nsCatalogData* LookupCatalogData(const PRUnichar* aPublicID) { - nsDependentString publicID(aPublicID); + nsCAutoString publicID; + publicID.AssignWithConversion(aPublicID); // linear search for now since the number of entries is going to // be negligible, and the fix for bug 98413 would get rid of this // code anyway const nsCatalogData* data = kCatalogTable; while (data->mPublicID) { - if (publicID.EqualsASCII(data->mPublicID)) { + if (publicID.Equals(data->mPublicID)) { return data; } ++data; } - return nsnull; } // aCatalogData can be null. If not null, it provides a hook to additional -// built-in knowledge on the resource that we are trying to load. Returns true -// if the local DTD specified in the catalog data exists or if the filename -// contained within the url exists in the special DTD directory. If either of -// this exists, aResult is set to the file: url that points to the DTD file -// found in the local DTD directory. +// built-in knowledge on the resource that we are trying to load. +// aDTD is an in/out parameter. Returns true if the local DTD specified in the +// catalog data exists or if the filename contained within the url exists in +// the special DTD directory. If either of this exists, aDTD is set to the +// file: url that points to the DTD file found in the local DTD directory AND +// the old URI is relased. static PRBool -IsLoadableDTD(const nsCatalogData* aCatalogData, nsIURI* aDTD, - nsIURI** aResult) +IsLoadableDTD(const nsCatalogData* aCatalogData, nsCOMPtr* aDTD) { - NS_ASSERTION(aDTD, "Null parameter."); + PRBool isLoadable = PR_FALSE; + nsresult res = NS_OK; + + if (!aDTD || !*aDTD) { + NS_ASSERTION(0, "Null parameter."); + return PR_FALSE; + } nsCAutoString fileName; if (aCatalogData) { // remap the DTD to a known local DTD fileName.Assign(aCatalogData->mLocalDTD); } - if (fileName.IsEmpty()) { - // Try to see if the user has installed the DTD file -- we extract the + // try to see if the user has installed the DTD file -- we extract the // filename.ext of the DTD here. Hence, for any DTD for which we have // no predefined mapping, users just have to copy the DTD file to our - // special DTD directory and it will be picked. - nsCOMPtr dtdURL = do_QueryInterface(aDTD); - if (!dtdURL) { + // special DTD directory and it will be picked + nsCOMPtr dtdURL; + dtdURL = do_QueryInterface(*aDTD, &res); + if (NS_FAILED(res)) { return PR_FALSE; } - - dtdURL->GetFileName(fileName); - if (fileName.IsEmpty()) { + res = dtdURL->GetFileName(fileName); + if (NS_FAILED(res) || fileName.IsEmpty()) { return PR_FALSE; } } - + nsCOMPtr dtdPath; - NS_GetSpecialDirectory(NS_GRE_DIR, getter_AddRefs(dtdPath)); - if (!dtdPath) { + NS_GetSpecialDirectory(NS_GRE_DIR, + getter_AddRefs(dtdPath)); + + if (!dtdPath) return PR_FALSE; - } nsCOMPtr lfile = do_QueryInterface(dtdPath); @@ -285,59 +283,64 @@ IsLoadableDTD(const nsCatalogData* aCatalogData, nsIURI* aDTD, PRBool exists; dtdPath->Exists(&exists); - if (!exists) { - return PR_FALSE; + + if (exists) { + // The DTD was found in the local DTD directory. + // Set aDTD to a file: url pointing to the local DT + nsCOMPtr dtdURI; + NS_NewFileURI(getter_AddRefs(dtdURI), dtdPath); + + if (dtdURI) { + *aDTD = dtdURI; + isLoadable = PR_TRUE; + } } - // The DTD was found in the local DTD directory. - // Set aDTD to a file: url pointing to the local DTD - NS_NewFileURI(aResult, dtdPath); - - return *aResult != nsnull; + return isLoadable; } -/***************************** END CATALOG UTILS *****************************/ +/***************************** END CATALOG UTILS ******************************/ NS_IMPL_ISUPPORTS2(nsExpatDriver, nsITokenizer, nsIDTD) -nsresult -NS_NewExpatDriver(nsIDTD** aResult) -{ - *aResult = new nsExpatDriver(); - if (!*aResult) { - return NS_ERROR_OUT_OF_MEMORY; - } +nsresult +NS_NewExpatDriver(nsIDTD** aResult) { + nsExpatDriver* driver = nsnull; + NS_NEWXPCOM(driver, nsExpatDriver); + NS_ENSURE_TRUE(driver,NS_ERROR_OUT_OF_MEMORY); - NS_ADDREF(*aResult); - - return NS_OK; + return driver->QueryInterface(NS_GET_IID(nsIDTD), (void**)aResult); } nsExpatDriver::nsExpatDriver() - : mExpatParser(nsnull), - mInCData(PR_FALSE), - mInDoctype(PR_FALSE), - mInExternalDTD(PR_FALSE), - mBytePosition(0), - mInternalState(NS_OK), - mBytesParsed(0), - mCatalogData(nsnull) + :mExpatParser(0), + mInCData(PR_FALSE), + mInDoctype(PR_FALSE), + mInExternalDTD(PR_FALSE), + mHandledXMLDeclaration(PR_FALSE), + mBytePosition(0), + mInternalState(NS_OK), + mBytesParsed(0), + mSink(0), + mCatalogData(nsnull) { } -nsExpatDriver::~nsExpatDriver() +nsExpatDriver::~nsExpatDriver() { + NS_IF_RELEASE(mSink); if (mExpatParser) { XML_ParserFree(mExpatParser); + mExpatParser = nsnull; } } -nsresult -nsExpatDriver::HandleStartElement(const PRUnichar *aValue, +nsresult +nsExpatDriver::HandleStartElement(const PRUnichar *aValue, const PRUnichar **aAtts) -{ +{ NS_ASSERTION(mSink, "content sink not found!"); // Calculate the total number of elements in aAtts. @@ -350,48 +353,49 @@ nsExpatDriver::HandleStartElement(const PRUnichar *aValue, attrArrayLength += 2) { // Just looping till we find out what the length is } - - if (mSink) { - mSink->HandleStartElement(aValue, aAtts, + + if (mSink){ + mSink->HandleStartElement(aValue, aAtts, attrArrayLength, - XML_GetIdAttributeIndex(mExpatParser), + XML_GetIdAttributeIndex(mExpatParser), XML_GetCurrentLineNumber(mExpatParser)); } - return NS_OK; } -nsresult +nsresult nsExpatDriver::HandleEndElement(const PRUnichar *aValue) { NS_ASSERTION(mSink, "content sink not found!"); - if (mSink && - mSink->HandleEndElement(aValue) == NS_ERROR_HTMLPARSER_BLOCK) { - mInternalState = NS_ERROR_HTMLPARSER_BLOCK; - XML_BlockParser(mExpatParser); + if (mSink){ + nsresult result = mSink->HandleEndElement(aValue); + if (result == NS_ERROR_HTMLPARSER_BLOCK) { + mInternalState = NS_ERROR_HTMLPARSER_BLOCK; + XML_BlockParser(mExpatParser); + } } - + return NS_OK; } -nsresult -nsExpatDriver::HandleCharacterData(const PRUnichar *aValue, +nsresult +nsExpatDriver::HandleCharacterData(const PRUnichar *aValue, const PRUint32 aLength) { NS_ASSERTION(mSink, "content sink not found!"); if (mInCData) { - mCDataText.Append(aValue, aLength); - } - else if (mSink) { + mCDataText.Append(aValue,aLength); + } + else if (mSink){ mInternalState = mSink->HandleCharacterData(aValue, aLength); } - + return NS_OK; } -nsresult +nsresult nsExpatDriver::HandleComment(const PRUnichar *aValue) { NS_ASSERTION(mSink, "content sink not found!"); @@ -401,40 +405,40 @@ nsExpatDriver::HandleComment(const PRUnichar *aValue) mDoctypeText.Append(aValue); } } - else if (mSink) { + else if (mSink){ mInternalState = mSink->HandleComment(aValue); } - + return NS_OK; } -nsresult -nsExpatDriver::HandleProcessingInstruction(const PRUnichar *aTarget, +nsresult +nsExpatDriver::HandleProcessingInstruction(const PRUnichar *aTarget, const PRUnichar *aData) { NS_ASSERTION(mSink, "content sink not found!"); - if (mSink && - mSink->HandleProcessingInstruction(aTarget, aData) == - NS_ERROR_HTMLPARSER_BLOCK) { - mInternalState = NS_ERROR_HTMLPARSER_BLOCK; - XML_BlockParser(mExpatParser); + if (mSink){ + nsresult result = mSink->HandleProcessingInstruction(aTarget, aData); + if (result == NS_ERROR_HTMLPARSER_BLOCK) { + mInternalState = NS_ERROR_HTMLPARSER_BLOCK; + XML_BlockParser(mExpatParser); + } } return NS_OK; } -nsresult -nsExpatDriver::HandleXMLDeclaration(const PRUnichar *aValue, +nsresult +nsExpatDriver::HandleXMLDeclaration(const PRUnichar *aValue, const PRUint32 aLength) { mHandledXMLDeclaration = PR_TRUE; // // 0123456789012345678 - // ?> can start at position 17 at the earliest - PRUint32 i; - for (i = 17; i < aLength; ++i) { + PRUint32 i = 17; // ?> can start at position 17 at the earliest + for (; i < aLength; ++i) { if (aValue[i] == '?') break; } @@ -443,16 +447,15 @@ nsExpatDriver::HandleXMLDeclaration(const PRUnichar *aValue, // +1 because '>' follows '?' i += 2; - if (i > aLength) { + if (i > aLength) return NS_OK; // Bad declaration - } return mSink->HandleXMLDeclaration(aValue, i); } -nsresult -nsExpatDriver::HandleDefault(const PRUnichar *aValue, - const PRUint32 aLength) +nsresult +nsExpatDriver::HandleDefault(const PRUnichar *aValue, + const PRUint32 aLength) { NS_ASSERTION(mSink, "content sink not found!"); @@ -465,43 +468,41 @@ nsExpatDriver::HandleDefault(const PRUnichar *aValue, if (!mHandledXMLDeclaration && !mBytesParsed) { static const PRUnichar xmlDecl[] = {'<', '?', 'x', 'm', 'l', ' ', '\0'}; // strlen("") == 19, shortest decl - if (aLength >= 19 && nsCRT::strncmp(aValue, xmlDecl, 6) == 0) { - HandleXMLDeclaration(aValue, aLength); + if ((aLength >= 19) && + (nsCRT::strncmp(aValue, xmlDecl, 6) == 0)) { + HandleXMLDeclaration(aValue, aLength); } } static const PRUnichar newline[] = {'\n','\0'}; - PRUint32 i; - for (i = 0; i < aLength && NS_SUCCEEDED(mInternalState); ++i) { + for (PRUint32 i = 0; i < aLength && NS_SUCCEEDED(mInternalState); i++) { if (aValue[i] == '\n' || aValue[i] == '\r') { mInternalState = mSink->HandleCharacterData(newline, 1); } } } - + return NS_OK; } -nsresult +nsresult nsExpatDriver::HandleStartCdataSection() { mInCData = PR_TRUE; - return NS_OK; } -nsresult +nsresult nsExpatDriver::HandleEndCdataSection() { NS_ASSERTION(mSink, "content sink not found!"); mInCData = PR_FALSE; if (mSink) { - mInternalState = mSink->HandleCDataSection(mCDataText.get(), - mCDataText.Length()); + mInternalState = mSink->HandleCDataSection(mCDataText.get(),mCDataText.Length()); } mCDataText.Truncate(); - + return NS_OK; } @@ -515,17 +516,17 @@ nsExpatDriver::HandleEndCdataSection() * We assume the string will not contain the ending '>'. */ static void -GetDocTypeToken(nsString& aStr, nsString& aToken, PRBool aQuotedString) +GetDocTypeToken(nsString& aStr, + nsString& aToken, + PRBool aQuotedString) { - // If we don't do this we must look ahead before Cut() and adjust the cut - // amount. - aStr.Trim(kWhitespace, PR_TRUE, PR_FALSE); - if (aQuotedString) { - PRInt32 endQuote = aStr.FindChar(aStr[0], 1); - aStr.Mid(aToken, 1, endQuote - 1); - aStr.Cut(0, endQuote + 1); - } - else { + aStr.Trim(kWhitespace,PR_TRUE,PR_FALSE); // If we don't do this we must look ahead + // before Cut() and adjust the cut amount. + if (aQuotedString) { + PRInt32 endQuote = aStr.FindChar(aStr[0],1); + aStr.Mid(aToken,1,endQuote-1); + aStr.Cut(0,endQuote+1); + } else { static const char* kDelimiter = " [\r\n\t"; // Optimized for typical cases PRInt32 tokenEnd = aStr.FindCharInSet(kDelimiter); if (tokenEnd < 0) { @@ -538,7 +539,7 @@ GetDocTypeToken(nsString& aStr, nsString& aToken, PRBool aQuotedString) } } -nsresult +nsresult nsExpatDriver::HandleStartDoctypeDecl() { mInDoctype = PR_TRUE; @@ -546,53 +547,58 @@ nsExpatDriver::HandleStartDoctypeDecl() // allocations. In an effort to avoid too many allocations // setting mDoctypeText's capacity to be 1K ( just a guesstimate! ). mDoctypeText.SetCapacity(1024); - return NS_OK; } -nsresult -nsExpatDriver::HandleEndDoctypeDecl() +nsresult +nsExpatDriver::HandleEndDoctypeDecl() { NS_ASSERTION(mSink, "content sink not found!"); - + mInDoctype = PR_FALSE; - if (mSink) { - // let the sink know any additional knowledge that we have about the - // document (currently, from bug 124570, we only expect to pass additional - // agent sheets needed to layout the XML vocabulary of the document) + if(mSink) { + // let the sink know any additional knowledge that we have about the document + // (currently, from bug 124570, we only expect to pass additional agent sheets + // needed to layout the XML vocabulary of the document) nsCOMPtr data; if (mCatalogData && mCatalogData->mAgentSheet) { NS_NewURI(getter_AddRefs(data), mCatalogData->mAgentSheet); } - + nsAutoString name; GetDocTypeToken(mDoctypeText, name, PR_FALSE); nsAutoString token, publicId, systemId; GetDocTypeToken(mDoctypeText, token, PR_FALSE); - if (token.EqualsLiteral("PUBLIC")) { + if (token.Equals(NS_LITERAL_STRING("PUBLIC"))) { GetDocTypeToken(mDoctypeText, publicId, PR_TRUE); GetDocTypeToken(mDoctypeText, systemId, PR_TRUE); } - else if (token.EqualsLiteral("SYSTEM")) { + else if (token.Equals(NS_LITERAL_STRING("SYSTEM"))) { GetDocTypeToken(mDoctypeText, systemId, PR_TRUE); } // The rest is the internal subset with [] (minus whitespace) mDoctypeText.Trim(kWhitespace); - // Take out the brackets too, if any if (mDoctypeText.Length() > 2) { const nsAString& internalSubset = Substring(mDoctypeText, 1, - mDoctypeText.Length() - 2); - mInternalState = mSink->HandleDoctypeDecl(internalSubset, name, systemId, - publicId, data); + mDoctypeText.Length() - 2); + mInternalState = mSink->HandleDoctypeDecl(internalSubset, + name, + systemId, + publicId, + data); } else { // There's nothing but brackets, don't include them - mInternalState = mSink->HandleDoctypeDecl(EmptyString(), name, systemId, - publicId, data); + mInternalState = mSink->HandleDoctypeDecl(nsString(),// !internalSubset + name, + systemId, + publicId, + data); } + } mDoctypeText.SetCapacity(0); @@ -610,19 +616,16 @@ ExternalDTDStreamReaderFunc(nsIUnicharInputStream* aIn, { // Pass the buffer to expat for parsing. XML_Parse returns 0 for // fatal errors. - if (XML_Parse((XML_Parser)aClosure, (char *)aFromSegment, + if (XML_Parse((XML_Parser)aClosure, (char *)aFromSegment, aCount * sizeof(PRUnichar), 0)) { *aWriteCount = aCount; - return NS_OK; } - *aWriteCount = 0; - return NS_ERROR_FAILURE; } -int +int nsExpatDriver::HandleExternalEntityRef(const PRUnichar *openEntityNames, const PRUnichar *base, const PRUnichar *systemId, @@ -633,31 +636,47 @@ nsExpatDriver::HandleExternalEntityRef(const PRUnichar *openEntityNames, mDoctypeText.Append(nsDependentString(openEntityNames)); mDoctypeText.Append(PRUnichar(';')); } + + int result = 1; - // Load the external entity into a buffer. + // Load the external entity into a buffer nsCOMPtr in; nsAutoString absURL; - nsresult rv = OpenInputStreamFromExternalDTD(publicId, systemId, base, - getter_AddRefs(in), absURL); - NS_ENSURE_SUCCESS(rv, 1); + + nsresult rv = OpenInputStreamFromExternalDTD(publicId, + systemId, + base, + getter_AddRefs(in), + absURL); + + if (NS_FAILED(rv)) { + return result; + } nsCOMPtr uniIn; - rv = NS_NewUTF8ConverterStream(getter_AddRefs(uniIn), in, 1024); - NS_ENSURE_SUCCESS(rv, 1); - int result = 1; + rv = NS_NewUTF8ConverterStream(getter_AddRefs(uniIn), in, 1024); + + if (NS_FAILED(rv)) { + return result; + } + if (uniIn) { - XML_Parser entParser = - XML_ExternalEntityParserCreate(mExpatParser, 0, kUTF16); + XML_Parser entParser = + XML_ExternalEntityParserCreate( + mExpatParser, + 0, + (const XML_Char*) NS_LITERAL_STRING("UTF-16").get()); + if (entParser) { - XML_SetBase(entParser, (const XML_Char*)absURL.get()); + XML_SetBase(entParser, (const XML_Char*) absURL.get()); mInExternalDTD = PR_TRUE; PRUint32 totalRead; do { - rv = uniIn->ReadSegments(ExternalDTDStreamReaderFunc, entParser, - PRUint32(-1), &totalRead); + rv = uniIn->ReadSegments(ExternalDTDStreamReaderFunc, + (void*)entParser, PRUint32(-1), &totalRead); } while (NS_SUCCEEDED(rv) && totalRead > 0); result = XML_Parse(entParser, nsnull, 0, 1); @@ -667,58 +686,49 @@ nsExpatDriver::HandleExternalEntityRef(const PRUnichar *openEntityNames, XML_ParserFree(entParser); } } - + return result; } nsresult nsExpatDriver::OpenInputStreamFromExternalDTD(const PRUnichar* aFPIStr, - const PRUnichar* aURLStr, - const PRUnichar* aBaseURL, - nsIInputStream** aStream, - nsAString& aAbsURL) + const PRUnichar* aURLStr, + const PRUnichar* aBaseURL, + nsIInputStream** in, + nsAString& aAbsURL) { - nsCOMPtr baseURI; - nsresult rv = NS_NewURI(getter_AddRefs(baseURI), - NS_ConvertUTF16toUTF8(aBaseURL)); - NS_ENSURE_SUCCESS(rv, rv); - - nsCOMPtr uri; - rv = NS_NewURI(getter_AddRefs(uri), NS_ConvertUTF16toUTF8(aURLStr), nsnull, - baseURI); - NS_ENSURE_SUCCESS(rv, rv); - - // check if it is alright to load this uri - PRBool isChrome = PR_FALSE; - uri->SchemeIs("chrome", &isChrome); - if (!isChrome) { - // since the url is not a chrome url, check to see if we can map the DTD - // to a known local DTD, or if a DTD file of the same name exists in the - // special DTD directory - if (aFPIStr) { - // see if the Formal Public Identifier (FPI) maps to a catalog entry - mCatalogData = LookupCatalogData(aFPIStr); + nsresult rv; + nsCOMPtr baseURI; + rv = NS_NewURI(getter_AddRefs(baseURI), NS_ConvertUTF16toUTF8(aBaseURL)); + if (NS_SUCCEEDED(rv) && baseURI) { + nsCOMPtr uri; + rv = NS_NewURI(getter_AddRefs(uri), NS_ConvertUTF16toUTF8(aURLStr), nsnull, + baseURI); + if (NS_SUCCEEDED(rv) && uri) { + // check if it is alright to load this uri + PRBool isChrome = PR_FALSE; + uri->SchemeIs("chrome", &isChrome); + if (!isChrome) { + // since the url is not a chrome url, check to see if we can map the DTD + // to a known local DTD, or if a DTD file of the same name exists in the + // special DTD directory + if (aFPIStr) { + // see if the Formal Public Identifier (FPI) maps to a catalog entry + mCatalogData = LookupCatalogData(aFPIStr); + } + if (!IsLoadableDTD(mCatalogData, address_of(uri))) + return NS_ERROR_NOT_IMPLEMENTED; + } + rv = NS_OpenURI(in, uri); + nsCAutoString absURL; + uri->GetSpec(absURL); + CopyUTF8toUTF16(absURL, aAbsURL); } - - nsCOMPtr localURI; - if (!IsLoadableDTD(mCatalogData, uri, getter_AddRefs(localURI))) { - return NS_ERROR_NOT_IMPLEMENTED; - } - - localURI.swap(uri); } - - rv = NS_OpenURI(aStream, uri); - - nsCAutoString absURL; - uri->GetSpec(absURL); - - CopyUTF8toUTF16(absURL, aAbsURL); - return rv; } -static nsresult +static nsresult CreateErrorText(const PRUnichar* aDescription, const PRUnichar* aSourceURL, const PRInt32 aLineNumber, @@ -728,95 +738,86 @@ CreateErrorText(const PRUnichar* aDescription, aErrorString.Truncate(); nsAutoString msg; - nsresult rv = - nsParserMsgUtils::GetLocalizedStringByName(XMLPARSER_PROPERTIES, - "XMLParsingError", msg); - NS_ENSURE_SUCCESS(rv, rv); + nsresult rv = nsParserMsgUtils::GetLocalizedStringByName(XMLPARSER_PROPERTIES,"XMLParsingError",msg); + if (NS_FAILED(rv)) { + return rv; + } // XML Parsing Error: %1$S\nLocation: %2$S\nLine Number %3$d, Column %4$d: - PRUnichar *message = nsTextFormatter::smprintf(msg.get(), aDescription, - aSourceURL, aLineNumber, - aColNumber); + PRUnichar *message = nsTextFormatter::smprintf(msg.get(),aDescription,aSourceURL,aLineNumber,aColNumber); if (!message) { return NS_ERROR_OUT_OF_MEMORY; } - aErrorString.Assign(message); nsTextFormatter::smprintf_free(message); return NS_OK; } -static nsresult -CreateSourceText(const PRInt32 aColNumber, - const PRUnichar *aSourceLine, +static nsresult +CreateSourceText(const PRInt32 aColNumber, + const PRUnichar* aSourceLine, nsString& aSourceString) -{ +{ + PRInt32 errorPosition = aColNumber; + aSourceString.Append(aSourceLine); aSourceString.Append(PRUnichar('\n')); - - PRInt32 i; - for (i = aColNumber - 1; i > 0; --i) { + for (PRInt32 i = 0; i < errorPosition - 1; ++i) { aSourceString.Append(PRUnichar('-')); } - aSourceString.Append(PRUnichar('^')); + aSourceString.Append(PRUnichar('^')); return NS_OK; } -nsresult +nsresult nsExpatDriver::HandleError(const char *aBuffer, PRUint32 aLength, - PRBool aIsFinal) + PRBool aIsFinal) { - PRInt32 code = XML_GetErrorCode(mExpatParser); - NS_WARN_IF_FALSE(code > XML_ERROR_NONE, "unexpected XML error code"); + PRInt32 code = XML_GetErrorCode(mExpatParser); + NS_WARN_IF_FALSE(code >= 1, "unexpected XML error code"); + // Map Expat error code to an error string // XXX Deal with error returns. nsAutoString description; - nsParserMsgUtils::GetLocalizedStringByID(XMLPARSER_PROPERTIES, code, - description); + nsParserMsgUtils::GetLocalizedStringByID(XMLPARSER_PROPERTIES, code, description); if (code == XML_ERROR_TAG_MISMATCH) { nsAutoString msg; - nsParserMsgUtils::GetLocalizedStringByName(XMLPARSER_PROPERTIES, - "Expected", msg); + nsParserMsgUtils::GetLocalizedStringByName(XMLPARSER_PROPERTIES, "Expected", msg); // . Expected: . - PRUnichar *message = - nsTextFormatter::smprintf(msg.get(), - MOZ_XML_GetMismatchedTag(mExpatParser)); + PRUnichar *message = nsTextFormatter::smprintf(msg.get(), (const PRUnichar*)XML_GetMismatchedTag(mExpatParser)); if (!message) { return NS_ERROR_OUT_OF_MEMORY; } - description.Append(message); - nsTextFormatter::smprintf_free(message); } - + nsAutoString sourceLine; if (!aIsFinal) { - GetLine(aBuffer, aLength, - XML_GetCurrentByteIndex(mExpatParser) - mBytesParsed, - sourceLine); + GetLine(aBuffer, aLength, (XML_GetCurrentByteIndex(mExpatParser) - mBytesParsed), sourceLine); } else { sourceLine.Append(mLastLine); } // Adjust the column number so that it is one based rather than zero based. - PRInt32 colNumber = XML_GetCurrentColumnNumber(mExpatParser) + 1; + PRInt32 colNumber = XML_GetCurrentColumnNumber(mExpatParser) + 1; nsAutoString errorText; - CreateErrorText(description.get(), (const PRUnichar*)XML_GetBase(mExpatParser), - XML_GetCurrentLineNumber(mExpatParser), + CreateErrorText(description.get(), + (PRUnichar*)XML_GetBase(mExpatParser), + XML_GetCurrentLineNumber(mExpatParser), colNumber, errorText); nsAutoString sourceText; CreateSourceText(colNumber, sourceLine.get(), sourceText); - NS_ASSERTION(mSink, "no sink?"); + NS_ASSERTION(mSink,"no sink?"); if (mSink) { mSink->ReportError(errorText.get(), sourceText.get()); } @@ -824,13 +825,14 @@ nsExpatDriver::HandleError(const char *aBuffer, return NS_ERROR_HTMLPARSER_STOPPARSING; } -nsresult -nsExpatDriver::ParseBuffer(const char* aBuffer, - PRUint32 aLength, +nsresult +nsExpatDriver::ParseBuffer(const char* aBuffer, + PRUint32 aLength, PRBool aIsFinal) { - NS_ASSERTION((aBuffer && aLength != 0) || (!aBuffer && aLength == 0), "?"); - + nsresult result = NS_OK; + NS_ASSERTION((aBuffer && aLength) || (aBuffer == nsnull && aLength == 0), "?"); + if (mExpatParser && mInternalState == NS_OK) { if (!XML_Parse(mExpatParser, aBuffer, aLength, aIsFinal)) { if (mInternalState == NS_ERROR_HTMLPARSER_BLOCK || @@ -839,98 +841,86 @@ nsExpatDriver::ParseBuffer(const char* aBuffer, mBytesParsed += mBytePosition; } else { - HandleError(aBuffer, aLength, aIsFinal); + HandleError(aBuffer,aLength,aIsFinal); mInternalState = NS_ERROR_HTMLPARSER_STOPPARSING; } - return mInternalState; } - - if (aBuffer && aLength != 0) { + else if (aBuffer && aLength) { // Cache the last line in the buffer GetLine(aBuffer, aLength, aLength - sizeof(PRUnichar), mLastLine); } - - mBytesParsed += aLength; + mBytesParsed += aLength; mBytePosition = 0; } - - return NS_OK; + + return result; } -void -nsExpatDriver::GetLine(const char* aSourceBuffer, - PRUint32 aLength, - PRUint32 aOffset, +void +nsExpatDriver::GetLine(const char* aSourceBuffer, + PRUint32 aLength, + PRUint32 aOffset, nsString& aLine) { - // Figure out the line inside aSourceBuffer that contains character specified - // by aOffset. Copy it into aLine. - NS_ASSERTION(aOffset < aLength, "?"); - // Assert that the byteIndex and the length of the buffer are even. - NS_ASSERTION(aOffset % 2 == 0 && aLength % 2 == 0, "?"); - - // Will try to find the start of the line. - PRUnichar* start = (PRUnichar*)&aSourceBuffer[aOffset]; - - // Will try to find the end of the line. - PRUnichar* end = (PRUnichar*)&aSourceBuffer[aOffset]; - - // Track the position of the 'start' pointer into the buffer. - PRUint32 startIndex = aOffset / sizeof(PRUnichar); - - // Track the position of the 'end' pointer into the buffer. - PRUint32 endIndex = aOffset / sizeof(PRUnichar); - + /* Figure out the line inside aSourceBuffer that contains character specified by aOffset. + Copy it into aLine. */ + NS_ASSERTION(aOffset >= 0 && aOffset < aLength, "?"); + /* Assert that the byteIndex and the length of the buffer is even */ + NS_ASSERTION(aOffset % 2 == 0 && aLength % 2 == 0, "?"); + PRUnichar* start = (PRUnichar* ) &aSourceBuffer[aOffset]; /* Will try to find the start of the line */ + PRUnichar* end = (PRUnichar* ) &aSourceBuffer[aOffset]; /* Will try to find the end of the line */ + PRUint32 startIndex = aOffset / sizeof(PRUnichar); /* Track the position of the 'start' pointer into the buffer */ + PRUint32 endIndex = aOffset / sizeof(PRUnichar); /* Track the position of the 'end' pointer into the buffer */ PRUint32 numCharsInBuffer = aLength / sizeof(PRUnichar); + PRBool reachedStart; + PRBool reachedEnd; + - // Use start to find the first new line before the error position and end to - // find the first new line after the error position. - PRBool reachedStart = startIndex <= 0 || *start == '\n' || *start == '\r'; - PRBool reachedEnd = endIndex >= numCharsInBuffer || *end == '\n' || - *end == '\r'; + /* Use start to find the first new line before the error position and + end to find the first new line after the error position */ + reachedStart = (startIndex <= 0 || '\n' == *start || '\r' == *start); + reachedEnd = (endIndex >= numCharsInBuffer || '\n' == *end || '\r' == *end); while (!reachedStart || !reachedEnd) { if (!reachedStart) { --start; --startIndex; - reachedStart = startIndex <= 0 || *start == '\n' || *start == '\r'; + reachedStart = (startIndex <= 0 || '\n' == *start || '\r' == *start); } if (!reachedEnd) { ++end; ++endIndex; - reachedEnd = endIndex >= numCharsInBuffer || *end == '\n' || - *end == '\r'; + reachedEnd = (endIndex >= numCharsInBuffer || '\n' == *end || '\r' == *end); } } aLine.Truncate(0); if (startIndex == endIndex) { - // Special case if the error is on a line where the only character is a - // newline. Do nothing. + // Special case if the error is on a line where the only character is a newline. + // Do nothing } else { NS_ASSERTION(endIndex - startIndex >= sizeof(PRUnichar), "?"); - // At this point, there are two cases. Either the error is on the first - // line or on subsequent lines. If the error is on the first line, - // startIndex will decrement all the way to zero. If not, startIndex - // will decrement to the position of the newline character on the - // previous line. So, in the first case, the start position of the - // error line = startIndex (== 0). In the second case, the start - // position of the error line = startIndex + 1. In both cases, the end - // position of the error line will be (endIndex - 1). - PRUint32 startPosn = startIndex <= 0 ? startIndex : startIndex + 1; - - // At this point the substring starting at startPosn and ending at - // (endIndex - 1) is the line on which the error occurred. Copy that - // substring into the error structure. - const PRUnichar* unicodeBuffer = (const PRUnichar*)aSourceBuffer; + /* At this point, there are two cases. Either the error is on the first line or + on subsequent lines. If the error is on the first line, startIndex will decrement + all the way to zero. If not, startIndex will decrement to the position of the + newline character on the previous line. So, in the first case, the start position + of the error line = startIndex (== 0). In the second case, the start position of the + error line = startIndex + 1. In both cases, the end position of the error line will be + (endIndex - 1). */ + PRUint32 startPosn = (startIndex <= 0) ? startIndex : startIndex + 1; + + /* At this point, the substring starting at startPosn and ending at (endIndex - 1), + is the line on which the error occurred. Copy that substring into the error structure. */ + const PRUnichar* unicodeBuffer = (const PRUnichar*) aSourceBuffer; aLine.Append(&unicodeBuffer[startPosn], endIndex - startPosn); } } + NS_IMETHODIMP nsExpatDriver::CreateNewInstance(nsIDTD** aInstancePtrResult) -{ +{ return NS_NewExpatDriver(aInstancePtrResult); } @@ -940,28 +930,27 @@ nsExpatDriver::ConsumeToken(nsScanner& aScanner, { // Ask the scanner to send us all the data it has // scanned and pass that data to expat. - + mInternalState = NS_OK; // Resume in case we're blocked. XML_UnblockParser(mExpatParser); nsScannerIterator start, end; aScanner.CurrentPosition(start); aScanner.EndReading(end); - + while (start != end) { PRUint32 fragLength = PRUint32(start.size_forward()); - - mInternalState = ParseBuffer((const char*)start.get(), - fragLength * sizeof(PRUnichar), + + mInternalState = ParseBuffer((const char *)start.get(), + fragLength * sizeof(PRUnichar), aFlushTokens); - + if (NS_FAILED(mInternalState)) { if (mInternalState == NS_ERROR_HTMLPARSER_BLOCK) { - // mBytePosition / 2 => character position, one char is two bytes. + // mBytePosition / 2 => character position. Since one char = two bytes. aScanner.SetPosition(start.advance(mBytePosition / 2), PR_TRUE); aScanner.Mark(); } - return mInternalState; } @@ -969,83 +958,77 @@ nsExpatDriver::ConsumeToken(nsScanner& aScanner, } aScanner.SetPosition(end, PR_TRUE); - - if (NS_SUCCEEDED(mInternalState)) { + + if(NS_SUCCEEDED(mInternalState)) { return aScanner.Eof(); } return NS_OK; } -NS_IMETHODIMP_(eAutoDetectResult) -nsExpatDriver::CanParse(CParserContext& aParserContext, - const nsString& aBuffer, +NS_IMETHODIMP_(eAutoDetectResult) +nsExpatDriver::CanParse(CParserContext& aParserContext, + const nsString& aBuffer, PRInt32 aVersion) { - if (aParserContext.mParserCommand == eViewSource) { - return eUnknownDetect; - } + eAutoDetectResult result = eUnknownDetect; - if (aParserContext.mMimeType.Equals(kXMLTextContentType) || - aParserContext.mMimeType.Equals(kXMLApplicationContentType) || - aParserContext.mMimeType.Equals(kXHTMLApplicationContentType)|| - aParserContext.mMimeType.Equals(kRDFTextContentType) || + if (eViewSource != aParserContext.mParserCommand) { + if (aParserContext.mMimeType.Equals(kXMLTextContentType) || + aParserContext.mMimeType.Equals(kXMLApplicationContentType) || + aParserContext.mMimeType.Equals(kXHTMLApplicationContentType)|| + aParserContext.mMimeType.Equals(kRDFTextContentType) || #ifdef MOZ_SVG - aParserContext.mMimeType.Equals(kSVGTextContentType) || + aParserContext.mMimeType.Equals(kSVGTextContentType) || #endif - aParserContext.mMimeType.Equals(kXULTextContentType)) { - - return ePrimaryDetect; + aParserContext.mMimeType.Equals(kXULTextContentType)) { + result=ePrimaryDetect; + } + else { + if (aParserContext.mMimeType.IsEmpty() && + kNotFound != aBuffer.Find("QueryInterface(NS_GET_IID(nsIExpatSink),(void**)&(mSink)); + NS_ENSURE_TRUE(mSink,NS_ERROR_FAILURE); - mExpatParser = XML_ParserCreate(kUTF16); + mExpatParser = XML_ParserCreate((const XML_Char*) NS_LITERAL_STRING("UTF-16").get()); NS_ENSURE_TRUE(mExpatParser, NS_ERROR_FAILURE); #ifdef XML_DTD - XML_SetParamEntityParsing(mExpatParser, XML_PARAM_ENTITY_PARSING_ALWAYS); + XML_SetParamEntityParsing(mExpatParser, XML_PARAM_ENTITY_PARSING_ALWAYS); #endif - - XML_SetBase(mExpatParser, - (const XML_Char*)aParserContext.mScanner->GetFilename().get()); + + XML_SetBase(mExpatParser, (const XML_Char*) (aParserContext.mScanner->GetFilename()).get()); // Set up the callbacks - XML_SetElementHandler(mExpatParser, Driver_HandleStartElement, - Driver_HandleEndElement); + XML_SetElementHandler(mExpatParser, Driver_HandleStartElement, Driver_HandleEndElement); XML_SetCharacterDataHandler(mExpatParser, Driver_HandleCharacterData); - XML_SetProcessingInstructionHandler(mExpatParser, - Driver_HandleProcessingInstruction); + XML_SetProcessingInstructionHandler(mExpatParser, Driver_HandleProcessingInstruction); XML_SetDefaultHandlerExpand(mExpatParser, Driver_HandleDefault); - XML_SetExternalEntityRefHandler(mExpatParser, - Driver_HandleExternalEntityRef); + XML_SetExternalEntityRefHandler(mExpatParser, Driver_HandleExternalEntityRef); XML_SetExternalEntityRefHandlerArg(mExpatParser, this); XML_SetCommentHandler(mExpatParser, Driver_HandleComment); XML_SetCdataSectionHandler(mExpatParser, Driver_HandleStartCdataSection, Driver_HandleEndCdataSection); - XML_SetParamEntityParsing(mExpatParser, - XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE); - XML_SetDoctypeDeclHandler(mExpatParser, Driver_HandleStartDoctypeDecl, - Driver_HandleEndDoctypeDecl); + XML_SetParamEntityParsing(mExpatParser, XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE); + XML_SetDoctypeDeclHandler(mExpatParser, Driver_HandleStartDoctypeDecl, Driver_HandleEndDoctypeDecl); // Set up the user data. XML_SetUserData(mExpatParser, this); @@ -1053,16 +1036,16 @@ nsExpatDriver::WillBuildModel(const CParserContext& aParserContext, return aSink->WillBuildModel(); } -NS_IMETHODIMP +NS_IMETHODIMP nsExpatDriver::BuildModel(nsIParser* aParser, nsITokenizer* aTokenizer, nsITokenObserver* anObserver, - nsIContentSink* aSink) + nsIContentSink* aSink) { return mInternalState; } -NS_IMETHODIMP +NS_IMETHODIMP nsExpatDriver::DidBuildModel(nsresult anErrorCode, PRBool aNotifySink, nsIParser* aParser, @@ -1073,38 +1056,37 @@ nsExpatDriver::DidBuildModel(nsresult anErrorCode, nsresult result = NS_OK; if (mSink) { result = aSink->DidBuildModel(); - mSink = nsnull; + NS_RELEASE(mSink); // assigns null } - return result; } -NS_IMETHODIMP +NS_IMETHODIMP nsExpatDriver::WillTokenize(PRBool aIsFinalChunk, nsTokenAllocator* aTokenAllocator) { return NS_OK; } -NS_IMETHODIMP +NS_IMETHODIMP nsExpatDriver::WillResumeParse(nsIContentSink* aSink) { - return aSink ? aSink->WillResume() : NS_OK; + return (aSink)? aSink->WillResume():NS_OK; } -NS_IMETHODIMP +NS_IMETHODIMP nsExpatDriver::WillInterruptParse(nsIContentSink* aSink) { - return aSink ? aSink->WillInterrupt() : NS_OK; + return (aSink)? aSink->WillInterrupt():NS_OK; } NS_IMETHODIMP nsExpatDriver::DidTokenize(PRBool aIsFinalChunk) { return ParseBuffer(nsnull, 0, aIsFinalChunk); -} +} -NS_IMETHODIMP_(const nsIID&) +NS_IMETHODIMP_(const nsIID&) nsExpatDriver::GetMostDerivedIID(void) const { return NS_GET_IID(nsIDTD); @@ -1113,8 +1095,7 @@ nsExpatDriver::GetMostDerivedIID(void) const NS_IMETHODIMP_(void) nsExpatDriver::Terminate() { - // XXX - not sure what happens to the unparsed data. - XML_BlockParser(mExpatParser); + XML_BlockParser(mExpatParser); // XXX - not sure what happens to the unparsed data. mInternalState = NS_ERROR_HTMLPARSER_STOPPARSING; } @@ -1124,11 +1105,10 @@ nsExpatDriver::GetType() return NS_IPARSER_FLAG_XML; } -/*************************** Unused methods **********************************/ +/*************************** Unused methods ***************************************/ -NS_IMETHODIMP -nsExpatDriver::CollectSkippedContent(PRInt32 aTag, nsAString& aContent, - PRInt32 &aLineNo) +NS_IMETHODIMP +nsExpatDriver::CollectSkippedContent(PRInt32 aTag, nsAString& aContent, PRInt32 &aLineNo) { return NS_OK; } @@ -1144,20 +1124,20 @@ nsExpatDriver::PushToken(CToken* aToken) { return 0; } - + NS_IMETHODIMP_(CToken*) nsExpatDriver::PopToken(void) { return 0; } - -NS_IMETHODIMP_(CToken*) + +NS_IMETHODIMP_(CToken*) nsExpatDriver::PeekToken(void) { return 0; } -NS_IMETHODIMP_(CToken*) +NS_IMETHODIMP_(CToken*) nsExpatDriver::GetTokenAt(PRInt32 anIndex) { return 0; @@ -1174,8 +1154,8 @@ nsExpatDriver::GetTokenAllocator(void) { return 0; } - -NS_IMETHODIMP_(void) + +NS_IMETHODIMP_(void) nsExpatDriver::PrependTokens(nsDeque& aDeque) { @@ -1187,20 +1167,20 @@ nsExpatDriver::CopyState(nsITokenizer* aTokenizer) return NS_OK; } -NS_IMETHODIMP +NS_IMETHODIMP nsExpatDriver::HandleToken(CToken* aToken,nsIParser* aParser) { return NS_OK; } -NS_IMETHODIMP_(PRBool) -nsExpatDriver::IsBlockElement(PRInt32 aTagID,PRInt32 aParentID) const +NS_IMETHODIMP_(PRBool) +nsExpatDriver::IsBlockElement(PRInt32 aTagID,PRInt32 aParentID) const { return PR_FALSE; } -NS_IMETHODIMP_(PRBool) -nsExpatDriver::IsInlineElement(PRInt32 aTagID,PRInt32 aParentID) const +NS_IMETHODIMP_(PRBool) +nsExpatDriver::IsInlineElement(PRInt32 aTagID,PRInt32 aParentID) const { return PR_FALSE; } @@ -1217,7 +1197,7 @@ nsExpatDriver::CanContain(PRInt32 aParent,PRInt32 aChild) const return PR_TRUE; } -NS_IMETHODIMP +NS_IMETHODIMP nsExpatDriver::StringTagToIntTag(const nsAString &aTag, PRInt32* aIntTag) const { return NS_OK; @@ -1234,3 +1214,5 @@ nsExpatDriver::IntTagToAtom(PRInt32 aIntTag) const { return 0; } + +/******************************************************************************/ diff --git a/mozilla/parser/htmlparser/src/nsExpatDriver.h b/mozilla/parser/htmlparser/src/nsExpatDriver.h index 71941c6f161..9eddf9f34d9 100644 --- a/mozilla/parser/htmlparser/src/nsExpatDriver.h +++ b/mozilla/parser/htmlparser/src/nsExpatDriver.h @@ -39,7 +39,6 @@ #define NS_EXPAT_DRIVER__ #include "xmlparse.h" -#include "nsCOMPtr.h" #include "nsString.h" #include "nsIDTD.h" #include "nsITokenizer.h" @@ -59,16 +58,15 @@ public: nsExpatDriver(); virtual ~nsExpatDriver(); - int HandleExternalEntityRef(const PRUnichar *aOpenEntityNames, - const PRUnichar *aBase, - const PRUnichar *aSystemId, - const PRUnichar *aPublicId); + int HandleExternalEntityRef(const PRUnichar *openEntityNames, + const PRUnichar *base, + const PRUnichar *systemId, + const PRUnichar *publicId); nsresult HandleStartElement(const PRUnichar *aName, const PRUnichar **aAtts); nsresult HandleEndElement(const PRUnichar *aName); nsresult HandleCharacterData(const PRUnichar *aCData, const PRUint32 aLength); nsresult HandleComment(const PRUnichar *aName); - nsresult HandleProcessingInstruction(const PRUnichar *aTarget, - const PRUnichar *aData); + nsresult HandleProcessingInstruction(const PRUnichar *aTarget, const PRUnichar *aData); nsresult HandleXMLDeclaration(const PRUnichar *aData, const PRUint32 aLength); nsresult HandleDefault(const PRUnichar *aData, const PRUint32 aLength); nsresult HandleStartCdataSection(); @@ -76,20 +74,20 @@ public: nsresult HandleStartDoctypeDecl(); nsresult HandleEndDoctypeDecl(); -private: +protected: + // Load up an external stream to get external entity information nsresult OpenInputStreamFromExternalDTD(const PRUnichar* aFPIStr, - const PRUnichar* aURLStr, + const PRUnichar* aURLStr, const PRUnichar* aBaseURL, - nsIInputStream** aStream, + nsIInputStream** in, nsAString& aAbsURL); nsresult ParseBuffer(const char* aBuffer, PRUint32 aLength, PRBool aIsFinal); nsresult HandleError(const char *aBuffer, PRUint32 aLength, PRBool aIsFinal); - void GetLine(const char* aSourceBuffer, PRUint32 aLength, PRUint32 aOffset, - nsString& aLine); + void GetLine(const char* aSourceBuffer, PRUint32 aLength, PRUint32 aOffset, nsString& aLine); - XML_Parser mExpatParser; + XML_Parser mExpatParser; nsString mLastLine; nsString mCDataText; nsString mDoctypeText; @@ -100,10 +98,10 @@ private: PRInt32 mBytePosition; nsresult mInternalState; PRUint32 mBytesParsed; - nsCOMPtr mSink; + nsIExpatSink* mSink; const nsCatalogData* mCatalogData; // weak -}; +}; nsresult NS_NewExpatDriver(nsIDTD** aDriver); #endif