From cb2742db9857b6d49c069467988f8793124fae9c Mon Sep 17 00:00:00 2001 From: "rickg%netscape.com" Date: Tue, 12 Jan 1999 00:19:17 +0000 Subject: [PATCH] fixed a few parser problems having to do with dynamic enabling git-svn-id: svn://10.0.0.236/trunk@17525 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/htmlparser/src/CParserContext.cpp | 2 + mozilla/htmlparser/src/CParserContext.h | 3 + mozilla/htmlparser/src/nsIParser.h | 2 + mozilla/htmlparser/src/nsParser.cpp | 170 +++++++++--------- mozilla/htmlparser/src/nsParser.h | 5 +- .../parser/htmlparser/src/CParserContext.cpp | 2 + .../parser/htmlparser/src/CParserContext.h | 3 + mozilla/parser/htmlparser/src/nsIParser.h | 2 + mozilla/parser/htmlparser/src/nsParser.cpp | 170 +++++++++--------- mozilla/parser/htmlparser/src/nsParser.h | 5 +- 10 files changed, 190 insertions(+), 174 deletions(-) diff --git a/mozilla/htmlparser/src/CParserContext.cpp b/mozilla/htmlparser/src/CParserContext.cpp index 67850f48ed8..aab24ab4a34 100644 --- a/mozilla/htmlparser/src/CParserContext.cpp +++ b/mozilla/htmlparser/src/CParserContext.cpp @@ -56,6 +56,8 @@ CParserContext::CParserContext(nsScanner* aScanner,void* aKey,nsIStreamObserver* mTransferBuffer=0; mDTD=0; mTransferBufferSize=eTransferBufferSize; + mParserEnabled=PR_TRUE; + mStreamListenerState=eNone; } diff --git a/mozilla/htmlparser/src/CParserContext.h b/mozilla/htmlparser/src/CParserContext.h index 55b4fcbe72b..edbf73c591c 100644 --- a/mozilla/htmlparser/src/CParserContext.h +++ b/mozilla/htmlparser/src/CParserContext.h @@ -65,6 +65,9 @@ public: CParserContext* mPrevContext; void* mKey; PRUint32 mTransferBufferSize; + PRBool mParserEnabled; + eStreamState mStreamListenerState; //this is really only here for debug purposes. + // nsDeque mTokenDeque; }; diff --git a/mozilla/htmlparser/src/nsIParser.h b/mozilla/htmlparser/src/nsIParser.h index 5a387ac140d..650f7f2ed0a 100644 --- a/mozilla/htmlparser/src/nsIParser.h +++ b/mozilla/htmlparser/src/nsIParser.h @@ -59,6 +59,8 @@ enum eParseMode { eParseMode_autodetect }; +enum eStreamState {eNone,eOnStart,eOnDataAvail,eOnStop}; + /** * This class defines the iparser interface. This XPCOM * inteface is all that parser clients ever need to see. diff --git a/mozilla/htmlparser/src/nsParser.cpp b/mozilla/htmlparser/src/nsParser.cpp index bf34fa275d4..a3df68bf0e5 100644 --- a/mozilla/htmlparser/src/nsParser.cpp +++ b/mozilla/htmlparser/src/nsParser.cpp @@ -28,6 +28,7 @@ #include #include "nsIParserFilter.h" #include "nshtmlpars.h" +#include "CNavDTD.h" #include "nsWellFormedDTD.h" #include "nsViewSourceHTML.h" //uncomment this to partially enable viewsource... @@ -75,10 +76,9 @@ public: class CDTDFinder: public nsDequeFunctor{ public: CDTDFinder(nsIDTD* aDTD) { - NS_IF_ADDREF(mTargetDTD=aDTD); + mTargetDTD=aDTD; } virtual ~CDTDFinder() { - NS_IF_RELEASE(mTargetDTD); } virtual void* operator()(void* anObject) { nsIDTD* theDTD=(nsIDTD*)anObject; @@ -97,18 +97,30 @@ public: NS_NewWellFormed_DTD(&theDTD); RegisterDTD(theDTD); */ - nsIDTD* theDTD; - NS_NewViewSourceHTML(&theDTD); //do this so all html files can be viewed... - RegisterDTD(theDTD); + + nsIDTD* theDTD; + + NS_NewNavHTMLDTD(&theDTD); //do this as the default HTML DTD... + RegisterDTD(theDTD); + + NS_NewViewSourceHTML(&theDTD); //do this so all html files can be viewed... + RegisterDTD(theDTD); } ~CSharedParserObjects() { } void RegisterDTD(nsIDTD* aDTD){ - CDTDFinder theFinder(aDTD); - if(!mDTDDeque.FirstThat(theFinder)) - mDTDDeque.Push(aDTD); + if(aDTD) { + NS_ADDREF(aDTD); + CDTDFinder theFinder(aDTD); + if(!mDTDDeque.FirstThat(theFinder)) { + nsIDTD* theDTD; + aDTD->CreateNewInstance(&theDTD); + mDTDDeque.Push(theDTD); + } + NS_RELEASE(aDTD); + } } nsIDTD* FindDTD(nsIDTD* aDTD){ @@ -132,13 +144,11 @@ CSharedParserObjects gSharedParserObjects; */ nsParser::nsParser() : mCommand("") { NS_INIT_REFCNT(); - mStreamListenerState=eNone; mParserFilter = 0; mObserver = 0; mSink=0; mParserContext=0; mDTDVerification=PR_FALSE; - mParserEnabled=PR_TRUE; } @@ -150,10 +160,11 @@ nsParser::nsParser() : mCommand("") { * @return */ nsParser::~nsParser() { + NS_POSTCONDITION(eOnStop==mParserContext->mStreamListenerState,kOnStopNotCalled); + NS_IF_RELEASE(mObserver); NS_RELEASE(mSink); - NS_POSTCONDITION(eOnStop==mStreamListenerState,kOnStopNotCalled); //don't forget to add code here to delete //what may be several contexts... delete mParserContext; @@ -435,7 +446,7 @@ nsresult nsParser::WillBuildModel(nsString& aFilename,nsIDTD* aDefaultDTD){ nsresult result=NS_OK; - if(eOnStart==mStreamListenerState) { + if(eOnStart==mParserContext->mStreamListenerState) { mMajorIteration=-1; mMinorIteration=-1; if(eUnknownDetect==mParserContext->mAutoDetectStatus) { @@ -445,7 +456,7 @@ nsresult nsParser::WillBuildModel(nsString& aFilename,nsIDTD* aDefaultDTD){ mParserContext->mDTD=aDefaultDTD; if(PR_TRUE==FindSuitableDTD(*mParserContext,mCommand)) { //mParserContext->mDTD->SetContentSink(mSink); - mStreamListenerState=eOnDataAvail; + mParserContext->mStreamListenerState=eOnDataAvail; mParserContext->mDTD->WillBuildModel(aFilename,PRBool(0==mParserContext->mPrevContext),this); } } @@ -468,7 +479,7 @@ nsresult nsParser::DidBuildModel(nsresult anErrorCode) { //One last thing...close any open containers. nsresult result=anErrorCode; - if(mParserEnabled) { + if(mParserContext->mParserEnabled) { if((!mParserContext->mPrevContext) && (mParserContext->mDTD)) { result=mParserContext->mDTD->DidBuildModel(anErrorCode,PRBool(0==mParserContext->mPrevContext),this); } @@ -521,19 +532,14 @@ PRBool nsParser::EnableParser(PRBool aState){ // that we might start closing things down when the parser // is reenabled. To make sure that we're not deleted across // the reenabling process, hold a reference to ourselves. - if (eOnStop == mStreamListenerState) { + if (eOnStop == mParserContext->mStreamListenerState) { me = this; NS_ADDREF(me); } // If we're reenabling the parser - if ((PR_FALSE == mParserEnabled) && aState) { - mParserEnabled = PR_TRUE; - ResumeParse(); - } - else { - mParserEnabled=aState; - } + mParserContext->mParserEnabled=aState; + nsresult result=(aState) ? ResumeParse() : NS_OK; // Release reference if we added one at the top of this routine NS_IF_RELEASE(me); @@ -558,16 +564,17 @@ nsresult nsParser::Parse(nsIURL* aURL,nsIStreamObserver* aListener,PRBool aVerif nsresult result=kBadURL; mDTDVerification=aVerifyEnabled; - mStreamListenerState=eNone; - mIncremental=PR_TRUE; + mMultipart=PR_TRUE; if(aURL) { const char* spec; nsresult rv = aURL->GetSpec(&spec); if (rv != NS_OK) return rv; nsAutoString theName(spec); CParserContext* cp=new CParserContext(new nsScanner(theName,PR_FALSE),aURL,aListener); - PushContext(*cp); - result=NS_OK; + if(cp) { + PushContext(*cp); + result=NS_OK; + } } return result; } @@ -582,18 +589,20 @@ nsresult nsParser::Parse(nsIURL* aURL,nsIStreamObserver* aListener,PRBool aVerif nsresult nsParser::Parse(fstream& aStream,PRBool aVerifyEnabled){ mDTDVerification=aVerifyEnabled; - mStreamListenerState=eOnStart; + nsresult result=NS_ERROR_OUT_OF_MEMORY; //ok, time to create our tokenizer and begin the process CParserContext* pc=new CParserContext(new nsScanner(kUnknownFilename,aStream,PR_FALSE),&aStream,0); - PushContext(*pc); - pc->mSourceType="text/html"; - mParserContext->mScanner->Eof(); - mIncremental=PR_FALSE; - nsresult result=ResumeParse(); - pc=PopContext(); - delete pc; - + if(pc) { + PushContext(*pc); + pc->mSourceType="text/html"; + pc->mStreamListenerState=eOnStart; + mParserContext->mScanner->Eof(); + mMultipart=PR_FALSE; + result=ResumeParse(); + pc=PopContext(); + delete pc; + } return result; } @@ -609,8 +618,6 @@ nsresult nsParser::Parse(fstream& aStream,PRBool aVerifyEnabled){ * @return error code -- 0 if ok, non-zero if error. */ nsresult nsParser::Parse(nsString& aSourceBuffer,PRBool anHTMLString,PRBool aVerifyEnabled){ - mDTDVerification=aVerifyEnabled; - mStreamListenerState=eOnStart; #ifdef rickgdebug { @@ -619,20 +626,25 @@ nsresult nsParser::Parse(nsString& aSourceBuffer,PRBool anHTMLString,PRBool aVer } #endif + mDTDVerification=aVerifyEnabled; nsresult result=NS_OK; - if(0mDTD: 0; - - PushContext(*pc); - if(PR_TRUE==anHTMLString) - pc->mSourceType="text/html"; - mIncremental=PR_FALSE; - result=ResumeParse(); - mParserContext->mDTD=0; - pc=PopContext(); - delete pc; + if(0mDTD: 0; + PushContext(*pc); + pc->mStreamListenerState=eOnStart; + if(PR_TRUE==anHTMLString) + pc->mSourceType="text/html"; + mMultipart=PR_FALSE; + result=ResumeParse(); + // mParserContext->mDTD=0; + pc=PopContext(); + delete pc; + } + else result=NS_ERROR_OUT_OF_MEMORY; } return result; } @@ -650,27 +662,30 @@ nsresult nsParser::Parse(nsString& aSourceBuffer,PRBool anHTMLString,PRBool aVer */ nsresult nsParser::ResumeParse(nsIDTD* aDefaultDTD) { - nsresult result=WillBuildModel(mParserContext->mScanner->GetFilename(),aDefaultDTD); - mParserContext->mDTD->WillResumeParse(); - if(NS_OK==result) { + nsresult result=NS_OK; + if(mParserContext->mParserEnabled) { + result=WillBuildModel(mParserContext->mScanner->GetFilename(),aDefaultDTD); + mParserContext->mDTD->WillResumeParse(); + if(NS_OK==result) { - result=Tokenize(); - result=BuildModel(); + result=Tokenize(); + result=BuildModel(); - if((!mIncremental) || ((eOnStop==mStreamListenerState) && (NS_OK==result))){ - DidBuildModel(mStreamStatus); - } - else { - mParserContext->mDTD->WillInterruptParse(); - // If we're told to block the parser, we disable - // all further parsing (and cache any data coming - // in) until the parser is enabled. - PRUint32 b1=NS_ERROR_HTMLPARSER_BLOCK; - if(NS_ERROR_HTMLPARSER_BLOCK==result) { - EnableParser(PR_FALSE); + if((!mMultipart) || ((eOnStop==mParserContext->mStreamListenerState) && (NS_OK==result))){ + DidBuildModel(mStreamStatus); } + else { + mParserContext->mDTD->WillInterruptParse(); + // If we're told to block the parser, we disable + // all further parsing (and cache any data coming + // in) until the parser is enabled. + PRUint32 b1=NS_ERROR_HTMLPARSER_BLOCK; + if(NS_ERROR_HTMLPARSER_BLOCK==result) { + EnableParser(PR_FALSE); + } + }//if }//if - } + }//if return result; } @@ -768,12 +783,12 @@ nsParser::OnStatus(nsIURL* aURL, const PRUnichar* aMsg) * @return error code -- 0 if ok, non-zero if error. */ nsresult nsParser::OnStartBinding(nsIURL* aURL, const char *aSourceType){ - NS_PRECONDITION((eNone==mStreamListenerState),kBadListenerInit); + NS_PRECONDITION((eNone==mParserContext->mStreamListenerState),kBadListenerInit); if (nsnull != mObserver) { mObserver->OnStartBinding(aURL, aSourceType); } - mStreamListenerState=eOnStart; + mParserContext->mStreamListenerState=eOnStart; mParserContext->mAutoDetectStatus=eUnknownDetect; mParserContext->mDTD=0; mParserContext->mSourceType=aSourceType; @@ -800,7 +815,7 @@ nsresult nsParser::OnDataAvailable(nsIURL* aURL, nsIInputStream *pIStream, PRUin mListener->OnDataAvailable(pIStream, aLength); } */ - NS_PRECONDITION(((eOnStart==mStreamListenerState)||(eOnDataAvail==mStreamListenerState)),kOnStartNotCalled); + NS_PRECONDITION(((eOnStart==mParserContext->mStreamListenerState)||(eOnDataAvail==mParserContext->mStreamListenerState)),kOnStartNotCalled); if(eInvalidDetect==mParserContext->mAutoDetectStatus) { if(mParserContext->mScanner) { @@ -849,12 +864,7 @@ nsresult nsParser::OnDataAvailable(nsIURL* aURL, nsIInputStream *pIStream, PRUin theStartPos+=theNumRead; }//while - if (mParserEnabled) { - return ResumeParse(); - } - else { - return NS_OK; - } + return ResumeParse(); } /** @@ -866,18 +876,12 @@ nsresult nsParser::OnDataAvailable(nsIURL* aURL, nsIInputStream *pIStream, PRUin * @return */ nsresult nsParser::OnStopBinding(nsIURL* aURL, nsresult status, const PRUnichar* aMsg){ - mStreamListenerState=eOnStop; + mParserContext->mStreamListenerState=eOnStop; mStreamStatus=status; - nsresult result; + nsresult result=ResumeParse(); // If the parser isn't enabled, we don't finish parsing till // it is reenabled. - if (mParserEnabled) { - return ResumeParse(); - } - else { - return NS_OK; - } // XXX Should we wait to notify our observers as well if the // parser isn't yet enabled? diff --git a/mozilla/htmlparser/src/nsParser.h b/mozilla/htmlparser/src/nsParser.h index d7150792432..a6c70246d09 100644 --- a/mozilla/htmlparser/src/nsParser.h +++ b/mozilla/htmlparser/src/nsParser.h @@ -301,7 +301,6 @@ protected: // And now, some data members... //********************************************* - enum eStreamState {eNone,eOnStart,eOnDataAvail,eOnStop}; CParserContext* mParserContext; PRInt32 mMajorIteration; @@ -311,11 +310,9 @@ protected: nsIContentSink* mSink; nsIParserFilter* mParserFilter; PRBool mDTDVerification; - PRBool mParserEnabled; nsString mCommand; - eStreamState mStreamListenerState; //this is really only here for debug purposes. PRInt32 mStreamStatus; - PRBool mIncremental; + PRBool mMultipart; }; diff --git a/mozilla/parser/htmlparser/src/CParserContext.cpp b/mozilla/parser/htmlparser/src/CParserContext.cpp index 67850f48ed8..aab24ab4a34 100644 --- a/mozilla/parser/htmlparser/src/CParserContext.cpp +++ b/mozilla/parser/htmlparser/src/CParserContext.cpp @@ -56,6 +56,8 @@ CParserContext::CParserContext(nsScanner* aScanner,void* aKey,nsIStreamObserver* mTransferBuffer=0; mDTD=0; mTransferBufferSize=eTransferBufferSize; + mParserEnabled=PR_TRUE; + mStreamListenerState=eNone; } diff --git a/mozilla/parser/htmlparser/src/CParserContext.h b/mozilla/parser/htmlparser/src/CParserContext.h index 55b4fcbe72b..edbf73c591c 100644 --- a/mozilla/parser/htmlparser/src/CParserContext.h +++ b/mozilla/parser/htmlparser/src/CParserContext.h @@ -65,6 +65,9 @@ public: CParserContext* mPrevContext; void* mKey; PRUint32 mTransferBufferSize; + PRBool mParserEnabled; + eStreamState mStreamListenerState; //this is really only here for debug purposes. + // nsDeque mTokenDeque; }; diff --git a/mozilla/parser/htmlparser/src/nsIParser.h b/mozilla/parser/htmlparser/src/nsIParser.h index 5a387ac140d..650f7f2ed0a 100644 --- a/mozilla/parser/htmlparser/src/nsIParser.h +++ b/mozilla/parser/htmlparser/src/nsIParser.h @@ -59,6 +59,8 @@ enum eParseMode { eParseMode_autodetect }; +enum eStreamState {eNone,eOnStart,eOnDataAvail,eOnStop}; + /** * This class defines the iparser interface. This XPCOM * inteface is all that parser clients ever need to see. diff --git a/mozilla/parser/htmlparser/src/nsParser.cpp b/mozilla/parser/htmlparser/src/nsParser.cpp index bf34fa275d4..a3df68bf0e5 100644 --- a/mozilla/parser/htmlparser/src/nsParser.cpp +++ b/mozilla/parser/htmlparser/src/nsParser.cpp @@ -28,6 +28,7 @@ #include #include "nsIParserFilter.h" #include "nshtmlpars.h" +#include "CNavDTD.h" #include "nsWellFormedDTD.h" #include "nsViewSourceHTML.h" //uncomment this to partially enable viewsource... @@ -75,10 +76,9 @@ public: class CDTDFinder: public nsDequeFunctor{ public: CDTDFinder(nsIDTD* aDTD) { - NS_IF_ADDREF(mTargetDTD=aDTD); + mTargetDTD=aDTD; } virtual ~CDTDFinder() { - NS_IF_RELEASE(mTargetDTD); } virtual void* operator()(void* anObject) { nsIDTD* theDTD=(nsIDTD*)anObject; @@ -97,18 +97,30 @@ public: NS_NewWellFormed_DTD(&theDTD); RegisterDTD(theDTD); */ - nsIDTD* theDTD; - NS_NewViewSourceHTML(&theDTD); //do this so all html files can be viewed... - RegisterDTD(theDTD); + + nsIDTD* theDTD; + + NS_NewNavHTMLDTD(&theDTD); //do this as the default HTML DTD... + RegisterDTD(theDTD); + + NS_NewViewSourceHTML(&theDTD); //do this so all html files can be viewed... + RegisterDTD(theDTD); } ~CSharedParserObjects() { } void RegisterDTD(nsIDTD* aDTD){ - CDTDFinder theFinder(aDTD); - if(!mDTDDeque.FirstThat(theFinder)) - mDTDDeque.Push(aDTD); + if(aDTD) { + NS_ADDREF(aDTD); + CDTDFinder theFinder(aDTD); + if(!mDTDDeque.FirstThat(theFinder)) { + nsIDTD* theDTD; + aDTD->CreateNewInstance(&theDTD); + mDTDDeque.Push(theDTD); + } + NS_RELEASE(aDTD); + } } nsIDTD* FindDTD(nsIDTD* aDTD){ @@ -132,13 +144,11 @@ CSharedParserObjects gSharedParserObjects; */ nsParser::nsParser() : mCommand("") { NS_INIT_REFCNT(); - mStreamListenerState=eNone; mParserFilter = 0; mObserver = 0; mSink=0; mParserContext=0; mDTDVerification=PR_FALSE; - mParserEnabled=PR_TRUE; } @@ -150,10 +160,11 @@ nsParser::nsParser() : mCommand("") { * @return */ nsParser::~nsParser() { + NS_POSTCONDITION(eOnStop==mParserContext->mStreamListenerState,kOnStopNotCalled); + NS_IF_RELEASE(mObserver); NS_RELEASE(mSink); - NS_POSTCONDITION(eOnStop==mStreamListenerState,kOnStopNotCalled); //don't forget to add code here to delete //what may be several contexts... delete mParserContext; @@ -435,7 +446,7 @@ nsresult nsParser::WillBuildModel(nsString& aFilename,nsIDTD* aDefaultDTD){ nsresult result=NS_OK; - if(eOnStart==mStreamListenerState) { + if(eOnStart==mParserContext->mStreamListenerState) { mMajorIteration=-1; mMinorIteration=-1; if(eUnknownDetect==mParserContext->mAutoDetectStatus) { @@ -445,7 +456,7 @@ nsresult nsParser::WillBuildModel(nsString& aFilename,nsIDTD* aDefaultDTD){ mParserContext->mDTD=aDefaultDTD; if(PR_TRUE==FindSuitableDTD(*mParserContext,mCommand)) { //mParserContext->mDTD->SetContentSink(mSink); - mStreamListenerState=eOnDataAvail; + mParserContext->mStreamListenerState=eOnDataAvail; mParserContext->mDTD->WillBuildModel(aFilename,PRBool(0==mParserContext->mPrevContext),this); } } @@ -468,7 +479,7 @@ nsresult nsParser::DidBuildModel(nsresult anErrorCode) { //One last thing...close any open containers. nsresult result=anErrorCode; - if(mParserEnabled) { + if(mParserContext->mParserEnabled) { if((!mParserContext->mPrevContext) && (mParserContext->mDTD)) { result=mParserContext->mDTD->DidBuildModel(anErrorCode,PRBool(0==mParserContext->mPrevContext),this); } @@ -521,19 +532,14 @@ PRBool nsParser::EnableParser(PRBool aState){ // that we might start closing things down when the parser // is reenabled. To make sure that we're not deleted across // the reenabling process, hold a reference to ourselves. - if (eOnStop == mStreamListenerState) { + if (eOnStop == mParserContext->mStreamListenerState) { me = this; NS_ADDREF(me); } // If we're reenabling the parser - if ((PR_FALSE == mParserEnabled) && aState) { - mParserEnabled = PR_TRUE; - ResumeParse(); - } - else { - mParserEnabled=aState; - } + mParserContext->mParserEnabled=aState; + nsresult result=(aState) ? ResumeParse() : NS_OK; // Release reference if we added one at the top of this routine NS_IF_RELEASE(me); @@ -558,16 +564,17 @@ nsresult nsParser::Parse(nsIURL* aURL,nsIStreamObserver* aListener,PRBool aVerif nsresult result=kBadURL; mDTDVerification=aVerifyEnabled; - mStreamListenerState=eNone; - mIncremental=PR_TRUE; + mMultipart=PR_TRUE; if(aURL) { const char* spec; nsresult rv = aURL->GetSpec(&spec); if (rv != NS_OK) return rv; nsAutoString theName(spec); CParserContext* cp=new CParserContext(new nsScanner(theName,PR_FALSE),aURL,aListener); - PushContext(*cp); - result=NS_OK; + if(cp) { + PushContext(*cp); + result=NS_OK; + } } return result; } @@ -582,18 +589,20 @@ nsresult nsParser::Parse(nsIURL* aURL,nsIStreamObserver* aListener,PRBool aVerif nsresult nsParser::Parse(fstream& aStream,PRBool aVerifyEnabled){ mDTDVerification=aVerifyEnabled; - mStreamListenerState=eOnStart; + nsresult result=NS_ERROR_OUT_OF_MEMORY; //ok, time to create our tokenizer and begin the process CParserContext* pc=new CParserContext(new nsScanner(kUnknownFilename,aStream,PR_FALSE),&aStream,0); - PushContext(*pc); - pc->mSourceType="text/html"; - mParserContext->mScanner->Eof(); - mIncremental=PR_FALSE; - nsresult result=ResumeParse(); - pc=PopContext(); - delete pc; - + if(pc) { + PushContext(*pc); + pc->mSourceType="text/html"; + pc->mStreamListenerState=eOnStart; + mParserContext->mScanner->Eof(); + mMultipart=PR_FALSE; + result=ResumeParse(); + pc=PopContext(); + delete pc; + } return result; } @@ -609,8 +618,6 @@ nsresult nsParser::Parse(fstream& aStream,PRBool aVerifyEnabled){ * @return error code -- 0 if ok, non-zero if error. */ nsresult nsParser::Parse(nsString& aSourceBuffer,PRBool anHTMLString,PRBool aVerifyEnabled){ - mDTDVerification=aVerifyEnabled; - mStreamListenerState=eOnStart; #ifdef rickgdebug { @@ -619,20 +626,25 @@ nsresult nsParser::Parse(nsString& aSourceBuffer,PRBool anHTMLString,PRBool aVer } #endif + mDTDVerification=aVerifyEnabled; nsresult result=NS_OK; - if(0mDTD: 0; - - PushContext(*pc); - if(PR_TRUE==anHTMLString) - pc->mSourceType="text/html"; - mIncremental=PR_FALSE; - result=ResumeParse(); - mParserContext->mDTD=0; - pc=PopContext(); - delete pc; + if(0mDTD: 0; + PushContext(*pc); + pc->mStreamListenerState=eOnStart; + if(PR_TRUE==anHTMLString) + pc->mSourceType="text/html"; + mMultipart=PR_FALSE; + result=ResumeParse(); + // mParserContext->mDTD=0; + pc=PopContext(); + delete pc; + } + else result=NS_ERROR_OUT_OF_MEMORY; } return result; } @@ -650,27 +662,30 @@ nsresult nsParser::Parse(nsString& aSourceBuffer,PRBool anHTMLString,PRBool aVer */ nsresult nsParser::ResumeParse(nsIDTD* aDefaultDTD) { - nsresult result=WillBuildModel(mParserContext->mScanner->GetFilename(),aDefaultDTD); - mParserContext->mDTD->WillResumeParse(); - if(NS_OK==result) { + nsresult result=NS_OK; + if(mParserContext->mParserEnabled) { + result=WillBuildModel(mParserContext->mScanner->GetFilename(),aDefaultDTD); + mParserContext->mDTD->WillResumeParse(); + if(NS_OK==result) { - result=Tokenize(); - result=BuildModel(); + result=Tokenize(); + result=BuildModel(); - if((!mIncremental) || ((eOnStop==mStreamListenerState) && (NS_OK==result))){ - DidBuildModel(mStreamStatus); - } - else { - mParserContext->mDTD->WillInterruptParse(); - // If we're told to block the parser, we disable - // all further parsing (and cache any data coming - // in) until the parser is enabled. - PRUint32 b1=NS_ERROR_HTMLPARSER_BLOCK; - if(NS_ERROR_HTMLPARSER_BLOCK==result) { - EnableParser(PR_FALSE); + if((!mMultipart) || ((eOnStop==mParserContext->mStreamListenerState) && (NS_OK==result))){ + DidBuildModel(mStreamStatus); } + else { + mParserContext->mDTD->WillInterruptParse(); + // If we're told to block the parser, we disable + // all further parsing (and cache any data coming + // in) until the parser is enabled. + PRUint32 b1=NS_ERROR_HTMLPARSER_BLOCK; + if(NS_ERROR_HTMLPARSER_BLOCK==result) { + EnableParser(PR_FALSE); + } + }//if }//if - } + }//if return result; } @@ -768,12 +783,12 @@ nsParser::OnStatus(nsIURL* aURL, const PRUnichar* aMsg) * @return error code -- 0 if ok, non-zero if error. */ nsresult nsParser::OnStartBinding(nsIURL* aURL, const char *aSourceType){ - NS_PRECONDITION((eNone==mStreamListenerState),kBadListenerInit); + NS_PRECONDITION((eNone==mParserContext->mStreamListenerState),kBadListenerInit); if (nsnull != mObserver) { mObserver->OnStartBinding(aURL, aSourceType); } - mStreamListenerState=eOnStart; + mParserContext->mStreamListenerState=eOnStart; mParserContext->mAutoDetectStatus=eUnknownDetect; mParserContext->mDTD=0; mParserContext->mSourceType=aSourceType; @@ -800,7 +815,7 @@ nsresult nsParser::OnDataAvailable(nsIURL* aURL, nsIInputStream *pIStream, PRUin mListener->OnDataAvailable(pIStream, aLength); } */ - NS_PRECONDITION(((eOnStart==mStreamListenerState)||(eOnDataAvail==mStreamListenerState)),kOnStartNotCalled); + NS_PRECONDITION(((eOnStart==mParserContext->mStreamListenerState)||(eOnDataAvail==mParserContext->mStreamListenerState)),kOnStartNotCalled); if(eInvalidDetect==mParserContext->mAutoDetectStatus) { if(mParserContext->mScanner) { @@ -849,12 +864,7 @@ nsresult nsParser::OnDataAvailable(nsIURL* aURL, nsIInputStream *pIStream, PRUin theStartPos+=theNumRead; }//while - if (mParserEnabled) { - return ResumeParse(); - } - else { - return NS_OK; - } + return ResumeParse(); } /** @@ -866,18 +876,12 @@ nsresult nsParser::OnDataAvailable(nsIURL* aURL, nsIInputStream *pIStream, PRUin * @return */ nsresult nsParser::OnStopBinding(nsIURL* aURL, nsresult status, const PRUnichar* aMsg){ - mStreamListenerState=eOnStop; + mParserContext->mStreamListenerState=eOnStop; mStreamStatus=status; - nsresult result; + nsresult result=ResumeParse(); // If the parser isn't enabled, we don't finish parsing till // it is reenabled. - if (mParserEnabled) { - return ResumeParse(); - } - else { - return NS_OK; - } // XXX Should we wait to notify our observers as well if the // parser isn't yet enabled? diff --git a/mozilla/parser/htmlparser/src/nsParser.h b/mozilla/parser/htmlparser/src/nsParser.h index d7150792432..a6c70246d09 100644 --- a/mozilla/parser/htmlparser/src/nsParser.h +++ b/mozilla/parser/htmlparser/src/nsParser.h @@ -301,7 +301,6 @@ protected: // And now, some data members... //********************************************* - enum eStreamState {eNone,eOnStart,eOnDataAvail,eOnStop}; CParserContext* mParserContext; PRInt32 mMajorIteration; @@ -311,11 +310,9 @@ protected: nsIContentSink* mSink; nsIParserFilter* mParserFilter; PRBool mDTDVerification; - PRBool mParserEnabled; nsString mCommand; - eStreamState mStreamListenerState; //this is really only here for debug purposes. PRInt32 mStreamStatus; - PRBool mIncremental; + PRBool mMultipart; };