diff --git a/mozilla/parser/htmlparser/src/CParserContext.cpp b/mozilla/parser/htmlparser/src/CParserContext.cpp index 4adf1cb316a..36f152108b6 100644 --- a/mozilla/parser/htmlparser/src/CParserContext.cpp +++ b/mozilla/parser/htmlparser/src/CParserContext.cpp @@ -1,4 +1,5 @@ /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 sw=2 et tw=80: */ /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * @@ -68,12 +69,10 @@ CParserContext::CParserContext(nsScanner* aScanner, mKey=aKey; mPrevContext=0; mListener=aListener; - NS_IF_ADDREF(mListener); mDTDMode=eDTDMode_unknown; mAutoDetectStatus=aStatus; mTransferBuffer=0; mDTD=aDTD; - NS_IF_ADDREF(mDTD); mTokenizer = 0; mTransferBufferSize=eTransferBufferSize; mStreamListenerState=eNone; @@ -99,16 +98,13 @@ CParserContext::CParserContext(const CParserContext &aContext) : mMimeType() { mKey=aContext.mKey; mPrevContext=0; mListener=aContext.mListener; - NS_IF_ADDREF(mListener); mDTDMode=aContext.mDTDMode; mAutoDetectStatus=aContext.mAutoDetectStatus; mTransferBuffer=aContext.mTransferBuffer; mDTD=aContext.mDTD; - NS_IF_ADDREF(mDTD); mTokenizer = aContext.mTokenizer; - NS_IF_ADDREF(mTokenizer); mTransferBufferSize=eTransferBufferSize; mStreamListenerState=aContext.mStreamListenerState; @@ -122,27 +118,19 @@ CParserContext::CParserContext(const CParserContext &aContext) : mMimeType() { /** * Destructor for parser context - * NOTE: DO NOT destroy the dtd here. - * @update gess7/11/98 */ -CParserContext::~CParserContext(){ - +CParserContext::~CParserContext() +{ MOZ_COUNT_DTOR(CParserContext); if(mScanner) { delete mScanner; - mScanner=nsnull; } - if(mTransferBuffer) + if(mTransferBuffer) { delete [] mTransferBuffer; - - NS_IF_RELEASE(mDTD); - NS_IF_RELEASE(mListener); - NS_IF_RELEASE(mTokenizer); - + } //Remember that it's ok to simply ingore the PrevContext. - } @@ -172,7 +160,8 @@ void CParserContext::SetMimeType(const nsACString& aMimeType){ nsresult CParserContext::GetTokenizer(PRInt32 aType, nsIContentSink* aSink, - nsITokenizer*& aTokenizer) { + nsITokenizer*& aTokenizer) +{ nsresult result = NS_OK; if(!mTokenizer) { @@ -195,17 +184,21 @@ CParserContext::GetTokenizer(PRInt32 aType, } } - result = NS_NewHTMLTokenizer(&mTokenizer,mDTDMode,mDocType, - mParserCommand,theFlags); + mTokenizer = new nsHTMLTokenizer(mDTDMode, mDocType, + mParserCommand, theFlags); + if (!mTokenizer) { + return NS_ERROR_OUT_OF_MEMORY; + } + // Make sure the new tokenizer has all of the necessary information. // XXX this might not be necessary. - if (mTokenizer && mPrevContext) { + if (mPrevContext) { mTokenizer->CopyState(mPrevContext->mTokenizer); } } else if (aType == NS_IPARSER_FLAG_XML) { - result = CallQueryInterface(mDTD, &mTokenizer); + mTokenizer = do_QueryInterface(mDTD, &result); } } diff --git a/mozilla/parser/htmlparser/src/CParserContext.h b/mozilla/parser/htmlparser/src/CParserContext.h index f73531b7ce3..41d09736d3a 100644 --- a/mozilla/parser/htmlparser/src/CParserContext.h +++ b/mozilla/parser/htmlparser/src/CParserContext.h @@ -83,11 +83,11 @@ public: nsCOMPtr mRequest; // provided by necko to differnciate different input streams // why is mRequest strongly referenced? see bug 102376. - nsIDTD* mDTD; - nsIRequestObserver* mListener; + nsCOMPtr mDTD; + nsCOMPtr mListener; char* mTransferBuffer; void* mKey; - nsITokenizer* mTokenizer; + nsCOMPtr mTokenizer; CParserContext* mPrevContext; nsScanner* mScanner; @@ -105,8 +105,4 @@ public: PRUint32 mTransferBufferSize; }; - - #endif - - diff --git a/mozilla/parser/htmlparser/src/nsHTMLTokenizer.cpp b/mozilla/parser/htmlparser/src/nsHTMLTokenizer.cpp index cab4c6e316f..a6c4c916966 100644 --- a/mozilla/parser/htmlparser/src/nsHTMLTokenizer.cpp +++ b/mozilla/parser/htmlparser/src/nsHTMLTokenizer.cpp @@ -59,74 +59,10 @@ And now for the main class -- nsHTMLTokenizer... ************************************************************************/ -static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID); -static NS_DEFINE_IID(kITokenizerIID, NS_ITOKENIZER_IID); -static NS_DEFINE_IID(kClassIID, NS_HTMLTOKENIZER_IID); - /** - * This method gets called as part of our COM-like interfaces. - * Its purpose is to create an interface to parser object - * of some type. - * - * @param aIID id of object to discover - * @param aInstancePtr ptr to newly discovered interface - * @return NS_xxx result code + * Satisfy the nsISupports interface. */ -nsresult nsHTMLTokenizer::QueryInterface(const nsIID& aIID, void** aInstancePtr) -{ - if (NULL == aInstancePtr) { - return NS_ERROR_NULL_POINTER; - } - - if(aIID.Equals(kISupportsIID)) { // Do IUnknown... - *aInstancePtr = (nsISupports*)(this); - } - else if(aIID.Equals(kITokenizerIID)) { // Do ITokenizer base class... - *aInstancePtr = (nsITokenizer*)(this); - } - else if(aIID.Equals(kClassIID)) { // Do this class... - *aInstancePtr = (nsHTMLTokenizer*)(this); - } - else { - *aInstancePtr=0; - return NS_NOINTERFACE; - } - NS_ADDREF_THIS(); - return NS_OK; -} - -/** - * This method is defined in nsHTMLTokenizer.h. It is used to - * cause the COM-like construction of an HTMLTokenizer. - * - * @param aInstancePtrResult** ptr to newly instantiated parser - * @param aFlag Parser flags the tokenizer should be aware of - * @param aDocType The doctype of the current document. - * @param aCommand The current command (view-source, fragment, etc). - * @return NS_xxx error result - */ - -nsresult NS_NewHTMLTokenizer(nsITokenizer** aInstancePtrResult, - PRInt32 aFlag, - eParserDocType aDocType, - eParserCommands aCommand, - PRInt32 aFlags) -{ - NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr"); - if (nsnull == aInstancePtrResult) { - return NS_ERROR_NULL_POINTER; - } - nsHTMLTokenizer* it = new nsHTMLTokenizer(aFlag,aDocType,aCommand,aFlags); - if (nsnull == it) { - return NS_ERROR_OUT_OF_MEMORY; - } - return it->QueryInterface(kClassIID, (void **) aInstancePtrResult); -} - - -NS_IMPL_ADDREF(nsHTMLTokenizer) -NS_IMPL_RELEASE(nsHTMLTokenizer) - +NS_IMPL_ISUPPORTS1(nsHTMLTokenizer, nsITokenizer); /** * Default constructor diff --git a/mozilla/parser/htmlparser/src/nsHTMLTokenizer.h b/mozilla/parser/htmlparser/src/nsHTMLTokenizer.h index 41aaada7e03..1fd46558749 100644 --- a/mozilla/parser/htmlparser/src/nsHTMLTokenizer.h +++ b/mozilla/parser/htmlparser/src/nsHTMLTokenizer.h @@ -54,10 +54,6 @@ #include "nsHTMLTokens.h" #include "nsDTDUtils.h" -#define NS_HTMLTOKENIZER_IID \ - {0xe4238ddd, 0x9eb6, 0x11d2, \ - {0xba, 0xa5, 0x0, 0x10, 0x4b, 0x98, 0x3f, 0xd4 }} - /*************************************************************** Notes: ***************************************************************/ @@ -79,17 +75,17 @@ public: protected: - virtual nsresult ConsumeTag(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner,PRBool& aFlushTokens); - virtual nsresult ConsumeStartTag(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner,PRBool& aFlushTokens); - virtual nsresult ConsumeEndTag(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner); - virtual nsresult ConsumeAttributes(PRUnichar aChar, CToken* aToken, nsScanner& aScanner); - virtual nsresult ConsumeEntity(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner); - virtual nsresult ConsumeWhitespace(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner); - virtual nsresult ConsumeComment(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner); - virtual nsresult ConsumeNewline(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner); - virtual nsresult ConsumeText(CToken*& aToken,nsScanner& aScanner); - virtual nsresult ConsumeSpecialMarkup(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner); - virtual nsresult ConsumeProcessingInstruction(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner); + nsresult ConsumeTag(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner,PRBool& aFlushTokens); + nsresult ConsumeStartTag(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner,PRBool& aFlushTokens); + nsresult ConsumeEndTag(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner); + nsresult ConsumeAttributes(PRUnichar aChar, CToken* aToken, nsScanner& aScanner); + nsresult ConsumeEntity(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner); + nsresult ConsumeWhitespace(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner); + nsresult ConsumeComment(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner); + nsresult ConsumeNewline(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner); + nsresult ConsumeText(CToken*& aToken,nsScanner& aScanner); + nsresult ConsumeSpecialMarkup(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner); + nsresult ConsumeProcessingInstruction(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner); nsresult ScanDocStructure(PRBool aIsFinalChunk); @@ -105,10 +101,6 @@ protected: PRUint32 mFlags; }; -extern nsresult NS_NewHTMLTokenizer(nsITokenizer** aInstancePtrResult, - PRInt32 aMode,eParserDocType aDocType, - eParserCommands aCommand, PRInt32 aFlags); - #endif diff --git a/mozilla/parser/htmlparser/src/nsParser.cpp b/mozilla/parser/htmlparser/src/nsParser.cpp index 00865dfed13..ee5a5e8daa0 100644 --- a/mozilla/parser/htmlparser/src/nsParser.cpp +++ b/mozilla/parser/htmlparser/src/nsParser.cpp @@ -1111,7 +1111,7 @@ FindSuitableDTD(CParserContext& aParserContext, } if(theBestDTD) { - rv = theBestDTD->CreateNewInstance(&aParserContext.mDTD); + rv = theBestDTD->CreateNewInstance(getter_AddRefs(aParserContext.mDTD)); NS_ENSURE_SUCCESS(rv, rv); *aReturn = PR_TRUE; @@ -1174,7 +1174,9 @@ nsParser::WillBuildModel(nsString& aFilename) return rv; nsITokenizer* tokenizer; - mParserContext->GetTokenizer(mParserContext->mDTD->GetType(), mSink, tokenizer); + rv = mParserContext->GetTokenizer(mParserContext->mDTD->GetType(), mSink, tokenizer); + NS_ENSURE_SUCCESS(rv, rv); + return mParserContext->mDTD->WillBuildModel(*mParserContext, tokenizer, mSink); } @@ -1981,18 +1983,18 @@ nsresult nsParser::ResumeParse(PRBool allowIteration, PRBool aIsFinalChunk, PRBo * @param * @return error code -- 0 if ok, non-zero if error. */ -nsresult nsParser::BuildModel() { +nsresult nsParser::BuildModel() +{ CParserContext* theRootContext = mParserContext; nsITokenizer* theTokenizer = 0; nsresult result = NS_OK; if (mParserContext) { PRInt32 type = mParserContext->mDTD ? mParserContext->mDTD->GetType() : NS_IPARSER_FLAG_HTML; - mParserContext->GetTokenizer(type, mSink, theTokenizer); + result = mParserContext->GetTokenizer(type, mSink, theTokenizer); } - if (theTokenizer) { - + if (NS_SUCCEEDED(result)) { //Get the root DTD for use in model building... while (theRootContext->mPrevContext) { theRootContext = theRootContext->mPrevContext; @@ -2007,38 +2009,16 @@ nsresult nsParser::BuildModel() { MOZ_TIMER_STOP(mDTDTime); } } - else{ + else { mInternalState = result = NS_ERROR_HTMLPARSER_BADTOKENIZER; } return result; } - -/** - * - * @update gess1/22/99 - * @param - * @return - */ -nsresult nsParser::GetTokenizer(nsITokenizer*& aTokenizer) { - nsresult result = NS_OK; - aTokenizer = nsnull; - if(mParserContext) { - PRInt32 type = mParserContext->mDTD ? mParserContext->mDTD->GetType() : NS_IPARSER_FLAG_HTML; - result = mParserContext->GetTokenizer(type, mSink, aTokenizer); - } - return result; -} - /******************************************************************* These methods are used to talk to the netlib system... *******************************************************************/ -#ifdef rickgdebug -#include - fstream* gOutFile; -#endif - /** * * @@ -2071,10 +2051,6 @@ nsresult nsParser::OnStartRequest(nsIRequest *request, nsISupports* aContext) { mParserContext->SetMimeType(contentType); } -#ifdef rickgdebug - gOutFile= new fstream("c:/temp/out.file",ios::trunc); -#endif - rv = NS_OK; if (sParserDataListeners && mSink) { @@ -2621,14 +2597,6 @@ nsresult nsParser::OnStopRequest(nsIRequest *request, nsISupports* aContext, mObserver->OnStopRequest(request, aContext, status); } -#ifdef rickgdebug - if(gOutFile){ - gOutFile->close(); - delete gOutFile; - gOutFile = 0; - } -#endif - if (sParserDataListeners && mSink) { nsISupports *ctx = mSink->GetTarget(); PRInt32 count = sParserDataListeners->Count(); @@ -2657,18 +2625,18 @@ nsresult nsParser::OnStopRequest(nsIRequest *request, nsISupports* aContext, * @param * @return TRUE if it's ok to proceed */ -PRBool nsParser::WillTokenize(PRBool aIsFinalChunk){ - nsITokenizer* theTokenizer=0; - nsresult result = NS_OK; - if (mParserContext) { - PRInt32 type = mParserContext->mDTD ? mParserContext->mDTD->GetType() : NS_IPARSER_FLAG_HTML; - mParserContext->GetTokenizer(type, mSink, theTokenizer); +PRBool nsParser::WillTokenize(PRBool aIsFinalChunk) +{ + if (!mParserContext) { + return PR_TRUE; } - if (theTokenizer) { - result = theTokenizer->WillTokenize(aIsFinalChunk,&mTokenAllocator); - } - return result; + nsITokenizer* theTokenizer; + PRInt32 type = mParserContext->mDTD ? mParserContext->mDTD->GetType() : NS_IPARSER_FLAG_HTML; + nsresult result = mParserContext->GetTokenizer(type, mSink, theTokenizer); + NS_ENSURE_SUCCESS(result, PR_FALSE); + + return NS_SUCCEEDED(theTokenizer->WillTokenize(aIsFinalChunk,&mTokenAllocator)); } @@ -2680,18 +2648,17 @@ PRBool nsParser::WillTokenize(PRBool aIsFinalChunk){ * @update gess 01/04/99 * @return error code -- 0 if ok, non-zero if error. */ -nsresult nsParser::Tokenize(PRBool aIsFinalChunk){ - - nsITokenizer* theTokenizer = 0; +nsresult nsParser::Tokenize(PRBool aIsFinalChunk) +{ + nsITokenizer* theTokenizer; - nsresult result = NS_OK; - + nsresult result = NS_ERROR_NOT_AVAILABLE; if (mParserContext) { PRInt32 type = mParserContext->mDTD ? mParserContext->mDTD->GetType() : NS_IPARSER_FLAG_HTML; - mParserContext->GetTokenizer(type, mSink, theTokenizer); + result = mParserContext->GetTokenizer(type, mSink, theTokenizer); } - if (theTokenizer) { + if (NS_SUCCEEDED(result)) { if (mFlags & NS_PARSER_FLAG_FLUSH_TOKENS) { // For some reason tokens didn't get flushed ( probably // the parser got blocked before all the tokens in the @@ -2736,7 +2703,7 @@ nsresult nsParser::Tokenize(PRBool aIsFinalChunk){ MOZ_TIMER_STOP(mTokenizeTime); } } - else{ + else { result = mInternalState = NS_ERROR_HTMLPARSER_BADTOKENIZER; } @@ -2752,20 +2719,19 @@ nsresult nsParser::Tokenize(PRBool aIsFinalChunk){ * @param * @return TRUE if all went well */ -PRBool nsParser::DidTokenize(PRBool aIsFinalChunk){ - PRBool result=PR_TRUE; - - nsITokenizer* theTokenizer=0; - nsresult rv = NS_OK; - if (mParserContext) { - PRInt32 type = mParserContext->mDTD ? mParserContext->mDTD->GetType() : NS_IPARSER_FLAG_HTML; - mParserContext->GetTokenizer(type, mSink, theTokenizer); +PRBool nsParser::DidTokenize(PRBool aIsFinalChunk) +{ + if (!mParserContext) { + return PR_TRUE; } - if (NS_SUCCEEDED(rv) && theTokenizer) { - result = theTokenizer->DidTokenize(aIsFinalChunk); - } - return result; + nsITokenizer* theTokenizer; + PRInt32 type = mParserContext->mDTD ? mParserContext->mDTD->GetType() : NS_IPARSER_FLAG_HTML; + nsresult rv = mParserContext->GetTokenizer(type, mSink, theTokenizer); + NS_ENSURE_SUCCESS(rv, PR_FALSE); + + rv = theTokenizer->DidTokenize(aIsFinalChunk); + return NS_SUCCEEDED(rv); } /** @@ -2794,7 +2760,7 @@ nsParser::GetDTD(nsIDTD** aDTD) { if (mParserContext) { *aDTD = mParserContext->mDTD; - NS_IF_ADDREF(mParserContext->mDTD); + NS_IF_ADDREF(*aDTD); } return NS_OK; diff --git a/mozilla/parser/htmlparser/src/nsParser.h b/mozilla/parser/htmlparser/src/nsParser.h index bbcc936451c..f771393ceb0 100644 --- a/mozilla/parser/htmlparser/src/nsParser.h +++ b/mozilla/parser/htmlparser/src/nsParser.h @@ -313,14 +313,6 @@ class nsParser : public nsIParser, CParserContext* PopContext(); CParserContext* PeekContext() {return mParserContext;} - /** - * - * @update gess 1/22/99 - * @param - * @return - */ - nsresult GetTokenizer(nsITokenizer*& aTokenizer); - /** * Get the channel associated with this parser * @update harishd,gagan 07/17/01