diff --git a/mozilla/htmlparser/src/CNavDTD.cpp b/mozilla/htmlparser/src/CNavDTD.cpp
index b0a8d855236..6e53684acfc 100644
--- a/mozilla/htmlparser/src/CNavDTD.cpp
+++ b/mozilla/htmlparser/src/CNavDTD.cpp
@@ -389,69 +389,65 @@ nsresult CNavDTD::WillBuildModel(const CParserContext& aParserContext,
mFilename=aParserContext.mScanner->GetFilename();
mFlags = NS_DTD_FLAG_ENABLE_RESIDUAL_STYLE; // residual style is always on. This will also reset the flags
- mLineNumber=1;
- mDTDMode=aParserContext.mDTDMode;
- mParserCommand=aParserContext.mParserCommand;
- mMimeType=aParserContext.mMimeType;
+ mLineNumber = 1;
+ mDTDMode = aParserContext.mDTDMode;
+ mParserCommand = aParserContext.mParserCommand;
+ mMimeType = aParserContext.mMimeType;
+ mDocType = aParserContext.mDocType;
+ mSkipTarget = eHTMLTag_unknown;
mTokenizer = aTokenizer;
mBodyContext->SetNodeAllocator(&mNodeAllocator);
- if((!aParserContext.mPrevContext) && (aSink)) {
-
- STOP_TIMER();
- MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::WillBuildModel(), this=%p\n", this));
+ if(!aParserContext.mPrevContext && aSink) {
#ifdef DEBUG
mBodyContext->ResetCounters();
#endif
- mDocType=aParserContext.mDocType;
+ STOP_TIMER();
+ MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::WillBuildModel(), this=%p\n", this));
+
+ result = aSink->WillBuildModel();
+
+ MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::WillBuildModel(), this=%p\n", this));
+ START_TIMER();
- if(aSink && (!mSink)) {
- result=aSink->QueryInterface(kIHTMLContentSinkIID, (void **)&mSink);
- }
-
- if(result==NS_OK) {
-
- //let's see if the environment is set up for us to write output to
- //a logging sink. If so, then we'll create one, and make it the
- //proxy for the real sink we're given from the parser.
-
-#ifdef NS_DEBUG
- nsLoggingSink *theLogSink=GetLoggingSink();
- if(theLogSink) {
- theLogSink->SetProxySink(mSink);
- mSink=theLogSink;
+ if (NS_SUCCEEDED(result) && !mSink) {
+ result = CallQueryInterface(aSink, &mSink);
+ if (NS_FAILED(result)) {
+ mFlags |= NS_DTD_FLAG_STOP_PARSING;
+ return result;
}
+ }
+
+ //let's see if the environment is set up for us to write output to
+ //a logging sink. If so, then we'll create one, and make it the
+ //proxy for the real sink we're given from the parser.
+#ifdef NS_DEBUG
+ nsLoggingSink *theLogSink=GetLoggingSink();
+ if(theLogSink) {
+ theLogSink->SetProxySink(mSink);
+ mSink=theLogSink;
+ }
#endif
- result = aSink->WillBuildModel();
-
- MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::WillBuildModel(), this=%p\n", this));
- START_TIMER();
-
-
- if(mSink) {
- PRBool enabled;
- mSink->GetPref(eHTMLTag_frameset,enabled);
- if(enabled) {
- mFlags |= NS_DTD_FLAG_FRAMES_ENABLED;
- }
-
- mSink->GetPref(eHTMLTag_script,enabled);
- if(enabled) {
- mFlags |= NS_DTD_FLAG_SCRIPT_ENABLED;
- }
+ if(mSink) {
+ PRBool enabled;
+ mSink->GetPref(eHTMLTag_frameset,enabled);
+ if(enabled) {
+ mFlags |= NS_DTD_FLAG_FRAMES_ENABLED;
}
- mSkipTarget=eHTMLTag_unknown;
-
-#ifdef ENABLE_CRC
- mComputedCRC32=0;
- mExpectedCRC32=0;
-#endif
-
+ mSink->GetPref(eHTMLTag_script,enabled);
+ if(enabled) {
+ mFlags |= NS_DTD_FLAG_SCRIPT_ENABLED;
+ }
}
+
+#ifdef ENABLE_CRC
+ mComputedCRC32=0;
+ mExpectedCRC32=0;
+#endif
}
return result;
@@ -537,6 +533,9 @@ nsresult CNavDTD::BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer,nsIToke
}//while
mTokenizer = oldTokenizer;
}
+ else {
+ result = mFlags & NS_DTD_FLAG_STOP_PARSING ? NS_ERROR_HTMLPARSER_STOPPARSING : result;
+ }
}
return result;
@@ -557,26 +556,30 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse
mSkipTarget=eHTMLTag_unknown; //clear this in case we were searching earlier.
- CStartToken *theToken=NS_STATIC_CAST(CStartToken*,mTokenAllocator->CreateTokenOfType(eToken_start,eHTMLTag_body,NS_LITERAL_STRING("body")));
- mTokenizer->PushTokenFront(theToken); //this token should get pushed on the context stack, don't recycle it
- result=BuildModel(aParser,mTokenizer,0,aSink);
+ if (mTokenAllocator) {
+ CStartToken *theToken = NS_STATIC_CAST(CStartToken*, mTokenAllocator->CreateTokenOfType(eToken_start,eHTMLTag_body,NS_LITERAL_STRING("body")));
+ mTokenizer->PushTokenFront(theToken); //this token should get pushed on the context stack, don't recycle it
+ result = BuildModel(aParser,mTokenizer, 0, aSink);
+ }
}
if(aParser && (NS_OK==result)){
if(aNotifySink){
if((NS_OK==anErrorCode) && (mBodyContext->GetCount()>0)) {
- if(mSkipTarget) {
- CHTMLToken* theEndToken=nsnull;
- theEndToken=NS_STATIC_CAST(CHTMLToken*,mTokenAllocator->CreateTokenOfType(eToken_end,mSkipTarget));
- if(theEndToken) {
- result=HandleToken(theEndToken,mParser);
+ if (mTokenAllocator) {
+ if(mSkipTarget) {
+ CHTMLToken* theEndToken=nsnull;
+ theEndToken=NS_STATIC_CAST(CHTMLToken*,mTokenAllocator->CreateTokenOfType(eToken_end,mSkipTarget));
+ if(theEndToken) {
+ result=HandleToken(theEndToken,mParser);
+ }
}
- }
- if(mFlags & NS_DTD_FLAG_MISPLACED_CONTENT) {
- // Create an end table token to flush tokens off the misplaced list...
- CHTMLToken* theTableToken=NS_STATIC_CAST(CHTMLToken*,mTokenAllocator->CreateTokenOfType(eToken_end,eHTMLTag_table));
- if(theTableToken) {
- result=HandleToken(theTableToken,mParser);
+ if(mFlags & NS_DTD_FLAG_MISPLACED_CONTENT) {
+ // Create an end table token to flush tokens off the misplaced list...
+ CHTMLToken* theTableToken=NS_STATIC_CAST(CHTMLToken*,mTokenAllocator->CreateTokenOfType(eToken_end,eHTMLTag_table));
+ if(theTableToken) {
+ result=HandleToken(theTableToken,mParser);
+ }
}
}
if(NS_SUCCEEDED(result)) {
diff --git a/mozilla/htmlparser/src/nsParser.cpp b/mozilla/htmlparser/src/nsParser.cpp
index 1501341a180..356340decdb 100644
--- a/mozilla/htmlparser/src/nsParser.cpp
+++ b/mozilla/htmlparser/src/nsParser.cpp
@@ -73,6 +73,7 @@
#define NS_PARSER_FLAG_PENDING_CONTINUE_EVENT 0x00000008
#define NS_PARSER_FLAG_CAN_INTERRUPT 0x00000010
#define NS_PARSER_FLAG_FLUSH_TOKENS 0x00000020
+#define NS_PARSER_FLAG_CAN_TOKENIZE 0x00000040
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
static NS_DEFINE_CID(kCParserCID, NS_PARSER_CID);
@@ -310,7 +311,7 @@ nsParser::nsParser(nsITokenObserver* anObserver) {
mCharsetSource=kCharsetUninitialized;
mInternalState=NS_OK;;
mCommand=eViewNormal;
- mFlags = NS_PARSER_FLAG_OBSERVERS_ENABLED | NS_PARSER_FLAG_PARSER_ENABLED;
+ mFlags = NS_PARSER_FLAG_OBSERVERS_ENABLED | NS_PARSER_FLAG_PARSER_ENABLED | NS_PARSER_FLAG_CAN_TOKENIZE;
MOZ_TIMER_DEBUGLOG(("Reset: Parse Time: nsParser::nsParser(), this=%p\n", this));
MOZ_TIMER_RESET(mParseTime);
@@ -1224,7 +1225,7 @@ nsresult nsParser::WillBuildModel(nsString& aFilename){
if(PR_TRUE==FindSuitableDTD(*mParserContext,theBuffer)) {
nsITokenizer* tokenizer;
mParserContext->GetTokenizer(mParserContext->mDTD->GetType(), tokenizer);
- mParserContext->mDTD->WillBuildModel(*mParserContext, tokenizer, mSink);
+ result = mParserContext->mDTD->WillBuildModel(*mParserContext, tokenizer, mSink);
}//if
}//if
}
@@ -1705,6 +1706,11 @@ nsresult nsParser::ResumeParse(PRBool allowIteration, PRBool aIsFinalChunk, PRBo
MOZ_TIMER_START(mParseTime);
result=WillBuildModel(mParserContext->mScanner->GetFilename());
+ if (NS_FAILED(result)) {
+ mFlags &= ~NS_PARSER_FLAG_CAN_TOKENIZE;
+ return result;
+ }
+
if(mParserContext->mDTD) {
mParserContext->mDTD->WillResumeParse(mSink);
@@ -1727,7 +1733,7 @@ nsresult nsParser::ResumeParse(PRBool allowIteration, PRBool aIsFinalChunk, PRBo
//Only allow parsing to be interuptted in the subsequent call
//to build model.
SetCanInterrupt(aCanInterrupt);
- nsresult theTokenizerResult = Tokenize(aIsFinalChunk); // kEOF==2152596456
+ nsresult theTokenizerResult = mFlags & NS_PARSER_FLAG_CAN_TOKENIZE ? Tokenize(aIsFinalChunk) : NS_OK; // kEOF==2152596456
result=BuildModel();
if(result==NS_ERROR_HTMLPARSER_INTERRUPTED) {
diff --git a/mozilla/parser/htmlparser/src/CNavDTD.cpp b/mozilla/parser/htmlparser/src/CNavDTD.cpp
index b0a8d855236..6e53684acfc 100644
--- a/mozilla/parser/htmlparser/src/CNavDTD.cpp
+++ b/mozilla/parser/htmlparser/src/CNavDTD.cpp
@@ -389,69 +389,65 @@ nsresult CNavDTD::WillBuildModel(const CParserContext& aParserContext,
mFilename=aParserContext.mScanner->GetFilename();
mFlags = NS_DTD_FLAG_ENABLE_RESIDUAL_STYLE; // residual style is always on. This will also reset the flags
- mLineNumber=1;
- mDTDMode=aParserContext.mDTDMode;
- mParserCommand=aParserContext.mParserCommand;
- mMimeType=aParserContext.mMimeType;
+ mLineNumber = 1;
+ mDTDMode = aParserContext.mDTDMode;
+ mParserCommand = aParserContext.mParserCommand;
+ mMimeType = aParserContext.mMimeType;
+ mDocType = aParserContext.mDocType;
+ mSkipTarget = eHTMLTag_unknown;
mTokenizer = aTokenizer;
mBodyContext->SetNodeAllocator(&mNodeAllocator);
- if((!aParserContext.mPrevContext) && (aSink)) {
-
- STOP_TIMER();
- MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::WillBuildModel(), this=%p\n", this));
+ if(!aParserContext.mPrevContext && aSink) {
#ifdef DEBUG
mBodyContext->ResetCounters();
#endif
- mDocType=aParserContext.mDocType;
+ STOP_TIMER();
+ MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::WillBuildModel(), this=%p\n", this));
+
+ result = aSink->WillBuildModel();
+
+ MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::WillBuildModel(), this=%p\n", this));
+ START_TIMER();
- if(aSink && (!mSink)) {
- result=aSink->QueryInterface(kIHTMLContentSinkIID, (void **)&mSink);
- }
-
- if(result==NS_OK) {
-
- //let's see if the environment is set up for us to write output to
- //a logging sink. If so, then we'll create one, and make it the
- //proxy for the real sink we're given from the parser.
-
-#ifdef NS_DEBUG
- nsLoggingSink *theLogSink=GetLoggingSink();
- if(theLogSink) {
- theLogSink->SetProxySink(mSink);
- mSink=theLogSink;
+ if (NS_SUCCEEDED(result) && !mSink) {
+ result = CallQueryInterface(aSink, &mSink);
+ if (NS_FAILED(result)) {
+ mFlags |= NS_DTD_FLAG_STOP_PARSING;
+ return result;
}
+ }
+
+ //let's see if the environment is set up for us to write output to
+ //a logging sink. If so, then we'll create one, and make it the
+ //proxy for the real sink we're given from the parser.
+#ifdef NS_DEBUG
+ nsLoggingSink *theLogSink=GetLoggingSink();
+ if(theLogSink) {
+ theLogSink->SetProxySink(mSink);
+ mSink=theLogSink;
+ }
#endif
- result = aSink->WillBuildModel();
-
- MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::WillBuildModel(), this=%p\n", this));
- START_TIMER();
-
-
- if(mSink) {
- PRBool enabled;
- mSink->GetPref(eHTMLTag_frameset,enabled);
- if(enabled) {
- mFlags |= NS_DTD_FLAG_FRAMES_ENABLED;
- }
-
- mSink->GetPref(eHTMLTag_script,enabled);
- if(enabled) {
- mFlags |= NS_DTD_FLAG_SCRIPT_ENABLED;
- }
+ if(mSink) {
+ PRBool enabled;
+ mSink->GetPref(eHTMLTag_frameset,enabled);
+ if(enabled) {
+ mFlags |= NS_DTD_FLAG_FRAMES_ENABLED;
}
- mSkipTarget=eHTMLTag_unknown;
-
-#ifdef ENABLE_CRC
- mComputedCRC32=0;
- mExpectedCRC32=0;
-#endif
-
+ mSink->GetPref(eHTMLTag_script,enabled);
+ if(enabled) {
+ mFlags |= NS_DTD_FLAG_SCRIPT_ENABLED;
+ }
}
+
+#ifdef ENABLE_CRC
+ mComputedCRC32=0;
+ mExpectedCRC32=0;
+#endif
}
return result;
@@ -537,6 +533,9 @@ nsresult CNavDTD::BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer,nsIToke
}//while
mTokenizer = oldTokenizer;
}
+ else {
+ result = mFlags & NS_DTD_FLAG_STOP_PARSING ? NS_ERROR_HTMLPARSER_STOPPARSING : result;
+ }
}
return result;
@@ -557,26 +556,30 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse
mSkipTarget=eHTMLTag_unknown; //clear this in case we were searching earlier.
- CStartToken *theToken=NS_STATIC_CAST(CStartToken*,mTokenAllocator->CreateTokenOfType(eToken_start,eHTMLTag_body,NS_LITERAL_STRING("body")));
- mTokenizer->PushTokenFront(theToken); //this token should get pushed on the context stack, don't recycle it
- result=BuildModel(aParser,mTokenizer,0,aSink);
+ if (mTokenAllocator) {
+ CStartToken *theToken = NS_STATIC_CAST(CStartToken*, mTokenAllocator->CreateTokenOfType(eToken_start,eHTMLTag_body,NS_LITERAL_STRING("body")));
+ mTokenizer->PushTokenFront(theToken); //this token should get pushed on the context stack, don't recycle it
+ result = BuildModel(aParser,mTokenizer, 0, aSink);
+ }
}
if(aParser && (NS_OK==result)){
if(aNotifySink){
if((NS_OK==anErrorCode) && (mBodyContext->GetCount()>0)) {
- if(mSkipTarget) {
- CHTMLToken* theEndToken=nsnull;
- theEndToken=NS_STATIC_CAST(CHTMLToken*,mTokenAllocator->CreateTokenOfType(eToken_end,mSkipTarget));
- if(theEndToken) {
- result=HandleToken(theEndToken,mParser);
+ if (mTokenAllocator) {
+ if(mSkipTarget) {
+ CHTMLToken* theEndToken=nsnull;
+ theEndToken=NS_STATIC_CAST(CHTMLToken*,mTokenAllocator->CreateTokenOfType(eToken_end,mSkipTarget));
+ if(theEndToken) {
+ result=HandleToken(theEndToken,mParser);
+ }
}
- }
- if(mFlags & NS_DTD_FLAG_MISPLACED_CONTENT) {
- // Create an end table token to flush tokens off the misplaced list...
- CHTMLToken* theTableToken=NS_STATIC_CAST(CHTMLToken*,mTokenAllocator->CreateTokenOfType(eToken_end,eHTMLTag_table));
- if(theTableToken) {
- result=HandleToken(theTableToken,mParser);
+ if(mFlags & NS_DTD_FLAG_MISPLACED_CONTENT) {
+ // Create an end table token to flush tokens off the misplaced list...
+ CHTMLToken* theTableToken=NS_STATIC_CAST(CHTMLToken*,mTokenAllocator->CreateTokenOfType(eToken_end,eHTMLTag_table));
+ if(theTableToken) {
+ result=HandleToken(theTableToken,mParser);
+ }
}
}
if(NS_SUCCEEDED(result)) {
diff --git a/mozilla/parser/htmlparser/src/nsParser.cpp b/mozilla/parser/htmlparser/src/nsParser.cpp
index 1501341a180..356340decdb 100644
--- a/mozilla/parser/htmlparser/src/nsParser.cpp
+++ b/mozilla/parser/htmlparser/src/nsParser.cpp
@@ -73,6 +73,7 @@
#define NS_PARSER_FLAG_PENDING_CONTINUE_EVENT 0x00000008
#define NS_PARSER_FLAG_CAN_INTERRUPT 0x00000010
#define NS_PARSER_FLAG_FLUSH_TOKENS 0x00000020
+#define NS_PARSER_FLAG_CAN_TOKENIZE 0x00000040
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
static NS_DEFINE_CID(kCParserCID, NS_PARSER_CID);
@@ -310,7 +311,7 @@ nsParser::nsParser(nsITokenObserver* anObserver) {
mCharsetSource=kCharsetUninitialized;
mInternalState=NS_OK;;
mCommand=eViewNormal;
- mFlags = NS_PARSER_FLAG_OBSERVERS_ENABLED | NS_PARSER_FLAG_PARSER_ENABLED;
+ mFlags = NS_PARSER_FLAG_OBSERVERS_ENABLED | NS_PARSER_FLAG_PARSER_ENABLED | NS_PARSER_FLAG_CAN_TOKENIZE;
MOZ_TIMER_DEBUGLOG(("Reset: Parse Time: nsParser::nsParser(), this=%p\n", this));
MOZ_TIMER_RESET(mParseTime);
@@ -1224,7 +1225,7 @@ nsresult nsParser::WillBuildModel(nsString& aFilename){
if(PR_TRUE==FindSuitableDTD(*mParserContext,theBuffer)) {
nsITokenizer* tokenizer;
mParserContext->GetTokenizer(mParserContext->mDTD->GetType(), tokenizer);
- mParserContext->mDTD->WillBuildModel(*mParserContext, tokenizer, mSink);
+ result = mParserContext->mDTD->WillBuildModel(*mParserContext, tokenizer, mSink);
}//if
}//if
}
@@ -1705,6 +1706,11 @@ nsresult nsParser::ResumeParse(PRBool allowIteration, PRBool aIsFinalChunk, PRBo
MOZ_TIMER_START(mParseTime);
result=WillBuildModel(mParserContext->mScanner->GetFilename());
+ if (NS_FAILED(result)) {
+ mFlags &= ~NS_PARSER_FLAG_CAN_TOKENIZE;
+ return result;
+ }
+
if(mParserContext->mDTD) {
mParserContext->mDTD->WillResumeParse(mSink);
@@ -1727,7 +1733,7 @@ nsresult nsParser::ResumeParse(PRBool allowIteration, PRBool aIsFinalChunk, PRBo
//Only allow parsing to be interuptted in the subsequent call
//to build model.
SetCanInterrupt(aCanInterrupt);
- nsresult theTokenizerResult = Tokenize(aIsFinalChunk); // kEOF==2152596456
+ nsresult theTokenizerResult = mFlags & NS_PARSER_FLAG_CAN_TOKENIZE ? Tokenize(aIsFinalChunk) : NS_OK; // kEOF==2152596456
result=BuildModel();
if(result==NS_ERROR_HTMLPARSER_INTERRUPTED) {