Make sure to flush the tokenizer stack after tokenizing SCRIPT content. Note: This checkin also includes code clean up. b=104856, r=heikki, sr=jst

git-svn-id: svn://10.0.0.236/trunk@114540 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
harishd%netscape.com
2002-02-14 23:45:20 +00:00
parent 1fe130f902
commit 1a9e99d353
16 changed files with 394 additions and 316 deletions

View File

@@ -204,7 +204,7 @@ public:
* @param
* @return
*/
NS_IMETHOD Terminate(nsIParser* aParser=nsnull) = 0;
NS_IMETHOD_(void) Terminate() = 0;
/* XXX Temporary measure, pending further work by RickG */
@@ -244,7 +244,7 @@ public:
NS_IMETHOD WillInterruptParse(nsIContentSink* aSink = 0);\
NS_IMETHOD_(PRBool) CanContain(PRInt32 aParent,PRInt32 aChild) const;\
NS_IMETHOD_(PRBool) IsContainer(PRInt32 aTag) const;\
NS_IMETHOD_(nsresult) Terminate(nsIParser* aParser=nsnull);\
NS_IMETHOD_(void) Terminate();\
NS_IMETHOD StringTagToIntTag(const nsAReadableString &aTag, PRInt32* aIntTag) const ;\
NS_IMETHOD_(const PRUnichar *) IntTagToStringTag(PRInt32 aIntTag) const ;\
NS_IMETHOD ConvertEntityToUnicode(const nsAReadableString& aEntity, PRInt32* aUnicode) const ;\

View File

@@ -109,18 +109,20 @@ static char gShowCRC;
************************************************************************/
#define NS_PARSER_FLAG_NONE 0x00000000
#define NS_PARSER_FLAG_HAS_OPEN_BODY 0x00000001
#define NS_PARSER_FLAG_HAS_OPEN_FORM 0x00000002
#define NS_PARSER_FLAG_HAS_OPEN_SCRIPT 0x00000004
#define NS_PARSER_FLAG_HAD_BODY 0x00000008
#define NS_PARSER_FLAG_HAD_FRAMESET 0x00000010
#define NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE 0x00000020
#define NS_PARSER_FLAG_REQUESTED_HEAD 0x00000040
#define NS_PARSER_FLAG_IS_FORM_CONTAINER 0x00000080
#define NS_PARSER_FLAG_SCRIPT_ENABLED 0x00000100
#define NS_PARSER_FLAG_FRAMES_ENABLED 0x00000200
#define NS_PARSER_FLAG_ALTERNATE_CONTENT 0x00000400 // NOFRAMES, NOSCRIPT
#define NS_DTD_FLAG_NONE 0x00000000
#define NS_DTD_FLAG_HAS_OPEN_BODY 0x00000001
#define NS_DTD_FLAG_HAS_OPEN_FORM 0x00000002
#define NS_DTD_FLAG_HAS_OPEN_SCRIPT 0x00000004
#define NS_DTD_FLAG_HAD_BODY 0x00000008
#define NS_DTD_FLAG_HAD_FRAMESET 0x00000010
#define NS_DTD_FLAG_ENABLE_RESIDUAL_STYLE 0x00000020
#define NS_DTD_FLAG_REQUESTED_HEAD 0x00000040
#define NS_DTD_FLAG_IS_FORM_CONTAINER 0x00000080
#define NS_DTD_FLAG_SCRIPT_ENABLED 0x00000100
#define NS_DTD_FLAG_FRAMES_ENABLED 0x00000200
#define NS_DTD_FLAG_ALTERNATE_CONTENT 0x00000400 // NOFRAMES, NOSCRIPT
#define NS_DTD_FLAG_MISPLACED_CONTENT 0x00000800
#define NS_DTD_FLAG_STOP_PARSING 0x00001000
/**
* This method gets called as part of our COM-like interfaces.
@@ -180,8 +182,7 @@ CNavDTD::CNavDTD() : nsIDTD(),
mDocType(eHTML3_Quirks), // why not eHTML_Quirks?
mParserCommand(eViewNormal),
mSkipTarget(eHTMLTag_unknown),
mDTDState(NS_OK),
mFlags(NS_PARSER_FLAG_NONE),
mFlags(NS_DTD_FLAG_NONE),
#ifdef ENABLE_CRC
mComputedCRC32(0),
mExpectedCRC32(0),
@@ -384,7 +385,7 @@ nsresult CNavDTD::WillBuildModel( const CParserContext& aParserContext,nsIConte
nsresult result=NS_OK;
mFilename=aParserContext.mScanner->GetFilename();
mFlags = NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE; // residual style is always on. This will also reset the flags
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;
@@ -431,12 +432,12 @@ nsresult CNavDTD::WillBuildModel( const CParserContext& aParserContext,nsIConte
PRBool enabled;
mSink->GetPref(eHTMLTag_frameset,enabled);
if(enabled) {
mFlags |= NS_PARSER_FLAG_FRAMES_ENABLED;
mFlags |= NS_DTD_FLAG_FRAMES_ENABLED;
}
mSink->GetPref(eHTMLTag_script,enabled);
if(enabled) {
mFlags |= NS_PARSER_FLAG_SCRIPT_ENABLED;
mFlags |= NS_DTD_FLAG_SCRIPT_ENABLED;
}
}
@@ -492,7 +493,7 @@ nsresult CNavDTD::BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer,nsIToke
}
// always open a body if frames are disabled....
if(!(mFlags & NS_PARSER_FLAG_FRAMES_ENABLED)) {
if(!(mFlags & NS_DTD_FLAG_FRAMES_ENABLED)) {
theToken=NS_STATIC_CAST(CStartToken*,mTokenAllocator->CreateTokenOfType(eToken_start,eHTMLTag_body,NS_LITERAL_STRING("body")));
mTokenizer->PushTokenFront(theToken);
}
@@ -519,7 +520,7 @@ nsresult CNavDTD::BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer,nsIToke
printf("\n");
#endif
if(mDTDState!=NS_ERROR_HTMLPARSER_STOPPARSING) {
if(!(mFlags & NS_DTD_FLAG_STOP_PARSING)) {
CToken* theToken=mTokenizer->PopToken();
if(theToken) {
result=HandleToken(theToken,aParser);
@@ -527,7 +528,7 @@ nsresult CNavDTD::BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer,nsIToke
else break;
}
else {
result=mDTDState;
result = NS_ERROR_HTMLPARSER_STOPPARSING;
break;
}
@@ -572,7 +573,7 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse
if(aSink) {
if((NS_OK==anErrorCode) && !(mFlags & (NS_PARSER_FLAG_HAD_BODY | NS_PARSER_FLAG_HAD_FRAMESET))) {
if((NS_OK==anErrorCode) && !(mFlags & (NS_DTD_FLAG_HAD_BODY | NS_DTD_FLAG_HAD_FRAMESET))) {
mSkipTarget=eHTMLTag_unknown; //clear this in case we were searching earlier.
@@ -591,7 +592,7 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse
result=HandleToken(theEndToken,mParser);
}
}
if(mDTDState==NS_ERROR_HTMLPARSER_MISPLACEDTABLECONTENT) {
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) {
@@ -602,7 +603,7 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse
eHTMLTags theTarget;
//now let's disable style handling to save time when closing remaining stack members...
mFlags &= ~NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE;
mFlags &= ~NS_DTD_FLAG_ENABLE_RESIDUAL_STYLE;
while(mBodyContext->GetCount() > 0) {
theTarget = mBodyContext->Last();
@@ -677,10 +678,10 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse
return result;
}
nsresult
CNavDTD::Terminate(nsIParser* aParser)
NS_IMETHODIMP_(void)
CNavDTD::Terminate()
{
return mDTDState=NS_ERROR_HTMLPARSER_STOPPARSING;
mFlags |= NS_DTD_FLAG_STOP_PARSING;
}
/**
@@ -765,7 +766,7 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
return result;
}
}
else if(mFlags & NS_PARSER_FLAG_ALTERNATE_CONTENT) {
else if(mFlags & NS_DTD_FLAG_ALTERNATE_CONTENT) {
if(theTag != mBodyContext->Last() || theType!=eToken_end) {
// attribute source is a part of start token.
if(theType!=eToken_attribute) {
@@ -789,7 +790,7 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
mScratch.SetCapacity(0);
}
}
else if(mDTDState==NS_ERROR_HTMLPARSER_MISPLACEDTABLECONTENT) {
else if(mFlags & NS_DTD_FLAG_MISPLACED_CONTENT) {
// Included TD & TH to fix Bug# 20797
static eHTMLTags gLegalElements[]={eHTMLTag_table,eHTMLTag_thead,eHTMLTag_tbody,
eHTMLTag_tr,eHTMLTag_td,eHTMLTag_th,eHTMLTag_tfoot};
@@ -799,7 +800,7 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
if((FindTagInSet(theTag,gLegalElements,sizeof(gLegalElements)/sizeof(theTag))) ||
(gHTMLElements[theParentTag].CanContain(theTag)) && (theTag!=eHTMLTag_comment)) { // Added comment -> bug 40855
mDTDState=NS_OK; // reset the state since all the misplaced tokens are about to get handled.
mFlags &= ~NS_DTD_FLAG_MISPLACED_CONTENT; // reset the state since all the misplaced tokens are about to get handled.
result=HandleSavedTokens(mBodyContext->mContextTopIndex);
mBodyContext->mContextTopIndex=-1;
@@ -843,7 +844,7 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
}
default:
if(!gHTMLElements[eHTMLTag_html].SectionContains(theTag,PR_FALSE)) {
if(!(mFlags & (NS_PARSER_FLAG_HAD_BODY | NS_PARSER_FLAG_HAD_FRAMESET))) {
if(!(mFlags & (NS_DTD_FLAG_HAD_BODY | NS_DTD_FLAG_HAD_FRAMESET))) {
//For bug examples from this code, see bugs: 18928, 20989.
@@ -923,7 +924,7 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
IF_FREE(theToken, mTokenAllocator);
}
else if(result==NS_ERROR_HTMLPARSER_STOPPARSING) {
mDTDState=result;
mFlags |= NS_DTD_FLAG_STOP_PARSING;
}
else {
return NS_OK;
@@ -1521,7 +1522,7 @@ nsresult CNavDTD::HandleOmittedTag(CToken* aToken,eHTMLTags aChildTag,eHTMLTags
mMisplacedContent.Push(mTokenAllocator->CreateTokenOfType(eToken_end,aChildTag));
}
mDTDState=NS_ERROR_HTMLPARSER_MISPLACEDTABLECONTENT; // This state would help us in gathering all the misplaced elements
mFlags |= NS_DTD_FLAG_MISPLACED_CONTENT; // This state would help us in gathering all the misplaced elements
}//if
}//if
@@ -1653,16 +1654,16 @@ nsresult CNavDTD::HandleStartToken(CToken* aToken) {
}
break;
case eHTMLTag_body:
if(mFlags & NS_PARSER_FLAG_HAS_OPEN_BODY) {
if(mFlags & NS_DTD_FLAG_HAS_OPEN_BODY) {
result=OpenContainer(theNode,theChildTag,PR_FALSE);
isTokenHandled=PR_TRUE;
}
break;
case eHTMLTag_head:
if(mFlags & (NS_PARSER_FLAG_HAD_BODY | NS_PARSER_FLAG_HAD_FRAMESET)) {
if(mFlags & (NS_DTD_FLAG_HAD_BODY | NS_DTD_FLAG_HAD_FRAMESET)) {
result=HandleOmittedTag(aToken,theChildTag,theParent,theNode);
isTokenHandled=PR_TRUE;
mFlags |= NS_PARSER_FLAG_REQUESTED_HEAD;
mFlags |= NS_DTD_FLAG_REQUESTED_HEAD;
}
break;
default:
@@ -1704,9 +1705,9 @@ nsresult CNavDTD::HandleStartToken(CToken* aToken) {
break;
case eHTMLTag_script:
theHeadIsParent=(!(mFlags & NS_PARSER_FLAG_HAS_OPEN_BODY) ||
(mFlags & NS_PARSER_FLAG_REQUESTED_HEAD));
mFlags |= NS_PARSER_FLAG_HAS_OPEN_SCRIPT;
theHeadIsParent=(!(mFlags & NS_DTD_FLAG_HAS_OPEN_BODY) ||
(mFlags & NS_DTD_FLAG_REQUESTED_HEAD));
mFlags |= NS_DTD_FLAG_HAS_OPEN_SCRIPT;
default:
break;
@@ -1906,7 +1907,7 @@ nsresult CNavDTD::HandleEndToken(CToken* aToken) {
switch(theChildTag) {
case eHTMLTag_script:
mFlags &= ~NS_PARSER_FLAG_HAS_OPEN_SCRIPT;
mFlags &= ~NS_DTD_FLAG_HAS_OPEN_SCRIPT;
case eHTMLTag_style:
case eHTMLTag_link:
case eHTMLTag_meta:
@@ -1916,7 +1917,7 @@ nsresult CNavDTD::HandleEndToken(CToken* aToken) {
case eHTMLTag_head:
StripWSFollowingTag(theChildTag,mTokenizer,mTokenAllocator,mLineNumber);
mFlags &= ~NS_PARSER_FLAG_REQUESTED_HEAD;
mFlags &= ~NS_DTD_FLAG_REQUESTED_HEAD;
//ok to fall through...
case eHTMLTag_form:
@@ -2041,7 +2042,7 @@ nsresult CNavDTD::HandleSavedTokens(PRInt32 anIndex) {
//eHTMLTag_tfoot,eHTMLTag_thead,eHTMLTag_colgroup.In those cases the stack
//position, in the parser, should be synchronized with the sink. -- Ref: Bug 20087.
if (!(~mFlags & (NS_PARSER_FLAG_HAS_OPEN_FORM | NS_PARSER_FLAG_IS_FORM_CONTAINER))) anIndex++;
if (!(~mFlags & (NS_DTD_FLAG_HAS_OPEN_FORM | NS_DTD_FLAG_IS_FORM_CONTAINER))) anIndex++;
STOP_TIMER()
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::HandleSavedTokensAbove(), this=%p\n", this));
@@ -2838,7 +2839,7 @@ PRBool CNavDTD::HasOpenContainer(eHTMLTags aContainer) const {
switch(aContainer) {
case eHTMLTag_form:
result= !(~mFlags & NS_PARSER_FLAG_HAS_OPEN_FORM); break;
result= !(~mFlags & NS_DTD_FLAG_HAS_OPEN_FORM); break;
case eHTMLTag_map:
result=mOpenMapCount>0; break;
default:
@@ -2900,7 +2901,7 @@ nsresult CNavDTD::OpenTransientStyles(eHTMLTags aChildTag){
nsresult result=NS_OK;
// No need to open transient styles in head context - Fix for 41427
if((mFlags & NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE) &&
if((mFlags & NS_DTD_FLAG_ENABLE_RESIDUAL_STYLE) &&
eHTMLTag_newline!=aChildTag && mOpenHeadCount==0) {
#ifdef ENABLE_RESIDUALSTYLE
@@ -2919,7 +2920,7 @@ nsresult CNavDTD::OpenTransientStyles(eHTMLTags aChildTag){
}
}
mFlags &= ~NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE;
mFlags &= ~NS_DTD_FLAG_ENABLE_RESIDUAL_STYLE;
for(;theLevel<theCount;theLevel++){
nsEntryStack* theStack=mBodyContext->GetStylesAt(theLevel);
if(theStack){
@@ -2960,7 +2961,7 @@ nsresult CNavDTD::OpenTransientStyles(eHTMLTags aChildTag){
} //for
} //if
} //for
mFlags |= NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE;
mFlags |= NS_DTD_FLAG_ENABLE_RESIDUAL_STYLE;
} //if
@@ -2984,7 +2985,7 @@ nsresult CNavDTD::OpenTransientStyles(eHTMLTags aChildTag){
nsresult CNavDTD::CloseTransientStyles(eHTMLTags aChildTag){
nsresult result=NS_OK;
if(mFlags & NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE) {
if(mFlags & NS_DTD_FLAG_ENABLE_RESIDUAL_STYLE) {
#ifdef ENABLE_RESIDUALSTYLE
#if 0
@@ -3016,7 +3017,7 @@ nsresult CNavDTD::CloseTransientStyles(eHTMLTags aChildTag){
nsresult CNavDTD::PopStyle(eHTMLTags aTag){
nsresult result=0;
if(mFlags & NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE) {
if(mFlags & NS_DTD_FLAG_ENABLE_RESIDUAL_STYLE) {
#ifdef ENABLE_RESIDUALSTYLE
if(nsHTMLElement::IsResidualStyleTag(aTag)) {
nsCParserNode* node=mBodyContext->PopStyle(aTag);
@@ -3141,9 +3142,9 @@ nsresult CNavDTD::OpenBody(const nsCParserNode *aNode){
nsresult result = NS_OK;
if (!(mFlags & NS_PARSER_FLAG_HAD_FRAMESET)) {
if (!(mFlags & NS_DTD_FLAG_HAD_FRAMESET)) {
mFlags |= NS_PARSER_FLAG_HAD_BODY;
mFlags |= NS_DTD_FLAG_HAD_BODY;
STOP_TIMER();
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::OpenBody(), this=%p\n", this));
@@ -3197,13 +3198,13 @@ nsresult CNavDTD::OpenForm(const nsIParserNode *aNode){
eHTMLTag_tfoot,eHTMLTag_thead,
eHTMLTag_col,eHTMLTag_colgroup};
nsresult result=NS_OK;
if(!(mFlags & NS_PARSER_FLAG_HAS_OPEN_FORM)) { // discard nested forms - bug 72639
if(!(mFlags & NS_DTD_FLAG_HAS_OPEN_FORM)) { // discard nested forms - bug 72639
// Check if the parent is a table, tbody, thead, tfoot, tr, col or
// colgroup. If so, treat form as a leaf content. [ Ex. bug 92530 ]
if(!FindTagInSet(mBodyContext->Last(),gTableElements,
sizeof(gTableElements)/sizeof(eHTMLTag_unknown))) {
mFlags |= NS_PARSER_FLAG_IS_FORM_CONTAINER;
mFlags |= NS_DTD_FLAG_IS_FORM_CONTAINER;
}
STOP_TIMER();
@@ -3215,7 +3216,7 @@ nsresult CNavDTD::OpenForm(const nsIParserNode *aNode){
START_TIMER();
if(NS_OK==result) {
mFlags |= NS_PARSER_FLAG_HAS_OPEN_FORM;
mFlags |= NS_DTD_FLAG_HAS_OPEN_FORM;
}
}
mOpenFormCount++;
@@ -3233,9 +3234,9 @@ nsresult CNavDTD::OpenForm(const nsIParserNode *aNode){
nsresult CNavDTD::CloseForm(const nsIParserNode *aNode){
// NS_PRECONDITION(mBodyContext->GetCount() > 0, kInvalidTagStackPos);
nsresult result=NS_OK;
if(mFlags & NS_PARSER_FLAG_HAS_OPEN_FORM) {
if(mFlags & NS_DTD_FLAG_HAS_OPEN_FORM) {
if (mOpenFormCount == 1) {
mFlags &= ~NS_PARSER_FLAG_HAS_OPEN_FORM;
mFlags &= ~NS_DTD_FLAG_HAS_OPEN_FORM;
STOP_TIMER();
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::CloseForm(), this=%p\n", this));
@@ -3245,7 +3246,7 @@ nsresult CNavDTD::CloseForm(const nsIParserNode *aNode){
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::CloseForm(), this=%p\n", this));
START_TIMER();
mFlags &= ~NS_PARSER_FLAG_IS_FORM_CONTAINER;
mFlags &= ~NS_DTD_FLAG_IS_FORM_CONTAINER;
}
--mOpenFormCount;
}
@@ -3314,7 +3315,7 @@ nsresult CNavDTD::CloseMap(const nsIParserNode *aNode){
nsresult CNavDTD::OpenFrameset(const nsCParserNode *aNode){
NS_PRECONDITION(mBodyContext->GetCount() >= 0, kInvalidTagStackPos);
mFlags |= NS_PARSER_FLAG_HAD_FRAMESET;
mFlags |= NS_DTD_FLAG_HAD_FRAMESET;
STOP_TIMER();
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::OpenFrameset(), this=%p\n", this));
@@ -3406,7 +3407,7 @@ CNavDTD::OpenContainer(const nsCParserNode *aNode,eHTMLTags aTag,PRBool aClosedB
// XXX - But what did we actually do in counting the heads?
mOpenHeadCount=1;
}
mFlags |= NS_PARSER_FLAG_HAS_OPEN_BODY;
mFlags |= NS_DTD_FLAG_HAS_OPEN_BODY;
CloseHead(aNode); //do this just in case someone left it open...
result=OpenBody(aNode);
}
@@ -3457,19 +3458,19 @@ CNavDTD::OpenContainer(const nsCParserNode *aNode,eHTMLTags aTag,PRBool aClosedB
// If the script is disabled noscript should not be
// in the content model until the layout can somehow
// turn noscript's display property to block <-- bug 67899
if(mFlags & NS_PARSER_FLAG_SCRIPT_ENABLED) {
if(mFlags & NS_DTD_FLAG_SCRIPT_ENABLED) {
done=PR_FALSE;
mScratch.Truncate();
mFlags |= NS_PARSER_FLAG_ALTERNATE_CONTENT;
mFlags |= NS_DTD_FLAG_ALTERNATE_CONTENT;
}
break;
case eHTMLTag_iframe: // Bug 84491
case eHTMLTag_noframes:
done=PR_FALSE;
if(mFlags & NS_PARSER_FLAG_FRAMES_ENABLED) {
if(mFlags & NS_DTD_FLAG_FRAMES_ENABLED) {
mScratch.Truncate();
mFlags |= NS_PARSER_FLAG_ALTERNATE_CONTENT;
mFlags |= NS_DTD_FLAG_ALTERNATE_CONTENT;
}
break;
@@ -3547,7 +3548,7 @@ CNavDTD::CloseContainer(const nsCParserNode *aNode,eHTMLTags aTarget,PRBool aClo
case eHTMLTag_noscript:
case eHTMLTag_noframes:
// switch from alternate content state to regular state
mFlags &= ~NS_PARSER_FLAG_ALTERNATE_CONTENT;
mFlags &= ~NS_DTD_FLAG_ALTERNATE_CONTENT;
// falling thro' intentionally....
case eHTMLTag_title:
default:
@@ -3607,7 +3608,7 @@ nsresult CNavDTD::CloseContainersTo(PRInt32 anIndex,eHTMLTags aTarget, PRBool aC
alternate content. This fixes bug 25214.
*************************************************************/
if(theTagIsStyle && !(mFlags & NS_PARSER_FLAG_ALTERNATE_CONTENT)) {
if(theTagIsStyle && !(mFlags & NS_DTD_FLAG_ALTERNATE_CONTENT)) {
PRBool theTargetTagIsStyle=nsHTMLElement::IsResidualStyleTag(aTarget);

View File

@@ -360,7 +360,6 @@ protected:
eParserCommands mParserCommand; //tells us to viewcontent/viewsource/viewerrors...
eHTMLTags mSkipTarget;
nsresult mDTDState;
PRInt32 mLineNumber;
PRInt32 mOpenHeadCount;
PRInt32 mOpenMapCount;

View File

@@ -487,10 +487,10 @@ nsresult COtherDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIPar
return result;
}
nsresult
COtherDTD::Terminate(nsIParser* aParser)
NS_IMETHODIMP_(void)
COtherDTD::Terminate()
{
return mDTDState=NS_ERROR_HTMLPARSER_STOPPARSING;
mDTDState = NS_ERROR_HTMLPARSER_STOPPARSING;
}
/**

View File

@@ -881,10 +881,11 @@ nsExpatDriver::GetMostDerivedIID(void) const
return NS_GET_IID(nsIDTD);
}
NS_IMETHODIMP nsExpatDriver::Terminate(nsIParser* aParser)
NS_IMETHODIMP_(void)
nsExpatDriver::Terminate()
{
XML_BlockParser(mExpatParser); // XXX - not sure what happens to the unparsed data.
return mInternalState = NS_ERROR_HTMLPARSER_STOPPARSING;
mInternalState = NS_ERROR_HTMLPARSER_STOPPARSING;
}
/*************************** Unused methods ***************************************/

View File

@@ -67,6 +67,13 @@
#include "nsExpatDriver.h"
//#define rickgdebug
#define NS_PARSER_FLAG_DTD_VERIFICATION 0x00000001
#define NS_PARSER_FLAG_PARSER_ENABLED 0x00000002
#define NS_PARSER_FLAG_OBSERVERS_ENABLED 0x00000004
#define NS_PARSER_FLAG_PENDING_CONTINUE_EVENT 0x00000008
#define NS_PARSER_FLAG_CAN_INTERRUPT 0x00000010
#define NS_PARSER_FLAG_FLUSH_TOKENS 0x00000020
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
static NS_DEFINE_CID(kCParserCID, NS_PARSER_CID);
static NS_DEFINE_IID(kIParserIID, NS_IPARSER_IID);
@@ -310,14 +317,10 @@ nsParser::nsParser(nsITokenObserver* anObserver) {
mParserContext=0;
mTokenObserver=anObserver;
mStreamStatus=0;
mDTDVerification=PR_FALSE;
mCharsetSource=kCharsetUninitialized;
mInternalState=NS_OK;
mObserversEnabled=PR_TRUE;
mInternalState=NS_OK;;
mCommand=eViewNormal;
mParserEnabled=PR_TRUE;
mPendingContinueEvent=PR_FALSE;
mCanInterrupt=PR_FALSE;
mFlags = NS_PARSER_FLAG_OBSERVERS_ENABLED | NS_PARSER_FLAG_PARSER_ENABLED;
MOZ_TIMER_DEBUGLOG(("Reset: Parse Time: nsParser::nsParser(), this=%p\n", this));
MOZ_TIMER_RESET(mParseTime);
@@ -368,7 +371,7 @@ nsParser::~nsParser() {
//what may be several contexts...
delete mParserContext;
if (mPendingContinueEvent) {
if (mFlags & NS_PARSER_FLAG_PENDING_CONTINUE_EVENT) {
NS_ASSERTION(mEventQueue != nsnull,"Event queue is null");
mEventQueue->RevokeEvents(this);
}
@@ -426,12 +429,12 @@ nsresult nsParser::QueryInterface(const nsIID& aIID, void** aInstancePtr)
nsresult
nsParser::PostContinueEvent()
{
if ((! mPendingContinueEvent) && (mEventQueue)) {
if (!(mFlags & NS_PARSER_FLAG_PENDING_CONTINUE_EVENT) && mEventQueue) {
nsParserContinueEvent* ev = new nsParserContinueEvent(NS_STATIC_CAST(nsIParser*, this));
NS_ENSURE_TRUE(ev,NS_ERROR_OUT_OF_MEMORY);
NS_ADDREF(this);
mEventQueue->PostEvent(ev);
mPendingContinueEvent = PR_TRUE;
mFlags |= NS_PARSER_FLAG_PENDING_CONTINUE_EVENT;
}
return NS_OK;
}
@@ -1309,14 +1312,14 @@ NS_IMETHODIMP nsParser::CreateCompatibleDTD(nsIDTD** aDTD,
NS_IMETHODIMP
nsParser::CancelParsingEvents() {
if (mPendingContinueEvent) {
if (mFlags & NS_PARSER_FLAG_PENDING_CONTINUE_EVENT) {
NS_ASSERTION(mEventQueue,"Event queue is null");
// Revoke all pending continue parsing events
if (mEventQueue != nsnull) {
mEventQueue->RevokeEvents(this);
}
mPendingContinueEvent=PR_FALSE;
mFlags &= ~NS_PARSER_FLAG_PENDING_CONTINUE_EVENT;
/* Since we are taking this off of the queue, we need to do the NS_RELEASE
* that nsParserContinueEvent::HandleEvent would have done.
*/
@@ -1450,24 +1453,21 @@ void nsParser::SetUnusedInput(nsString& aBuffer) {
* @return should return NS_OK once implemented
*/
nsresult nsParser::Terminate(void){
nsresult result=NS_OK;
if(mParserContext && mParserContext->mDTD) {
result=mParserContext->mDTD->Terminate(this);
if(result==NS_ERROR_HTMLPARSER_STOPPARSING) {
// XXX - [ until we figure out a way to break parser-sink circularity ]
// Hack - Hold a reference until we are completely done...
nsCOMPtr<nsIParser> kungFuDeathGrip(this);
mInternalState=result;
nsresult result = NS_OK;
if (mParserContext && mParserContext->mDTD) {
mParserContext->mDTD->Terminate();
// XXX - [ until we figure out a way to break parser-sink circularity ]
// Hack - Hold a reference until we are completely done...
nsCOMPtr<nsIParser> kungFuDeathGrip(this);
mInternalState = result = NS_ERROR_HTMLPARSER_STOPPARSING;
// CancelParsingEvents must be called to avoid leaking the nsParser object
// @see bug 108049
// If mPendingContinueEvents is PR_TRUE CancelParsingEvents will reset
// the mPendingContinueEvent to PR_FALSE so DidBuildModel will call
// DidBuildModel on the DTD. Note: The IsComplete() call inside of DidBuildModel
// looks at the mPendingContinueEvents flag.
CancelParsingEvents();
DidBuildModel(result);
}
// CancelParsingEvents must be called to avoid leaking the nsParser object
// @see bug 108049
// If NS_PARSER_FLAG_PENDING_CONTINUE_EVENT is set then CancelParsingEvents
// will reset it so DidBuildModel will call DidBuildModel on the DTD. Note:
// The IsComplete() call inside of DidBuildModel looks at the pendingContinueEvents flag.
CancelParsingEvents();
DidBuildModel(result);
}
return result;
}
@@ -1488,7 +1488,7 @@ nsresult nsParser::ContinueParsing(){
nsresult result=NS_OK;
nsCOMPtr<nsIParser> kungFuDeathGrip(this);
mParserEnabled=PR_TRUE;
mFlags |= NS_PARSER_FLAG_PARSER_ENABLED;
PRBool isFinalChunk=(mParserContext && mParserContext->mStreamListenerState==eOnStop)? PR_TRUE:PR_FALSE;
@@ -1508,7 +1508,7 @@ nsresult nsParser::ContinueParsing(){
* @return
*/
void nsParser::BlockParser() {
mParserEnabled=PR_FALSE;
mFlags &= ~NS_PARSER_FLAG_PARSER_ENABLED;
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: nsParser::BlockParser(), this=%p\n", this));
MOZ_TIMER_STOP(mParseTime);
}
@@ -1523,7 +1523,7 @@ void nsParser::BlockParser() {
* @return
*/
void nsParser::UnblockParser() {
mParserEnabled=PR_TRUE;
mFlags |= NS_PARSER_FLAG_PARSER_ENABLED;
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: nsParser::UnblockParser(), this=%p\n", this));
MOZ_TIMER_START(mParseTime);
}
@@ -1535,7 +1535,7 @@ void nsParser::UnblockParser() {
* @return current state
*/
PRBool nsParser::IsParserEnabled() {
return mParserEnabled;
return mFlags & NS_PARSER_FLAG_PARSER_ENABLED;
}
/**
@@ -1545,21 +1545,26 @@ PRBool nsParser::IsParserEnabled() {
* @return complete state
*/
PRBool nsParser::IsComplete() {
return (! mPendingContinueEvent);
return !(mFlags & NS_PARSER_FLAG_PENDING_CONTINUE_EVENT);
}
void nsParser::HandleParserContinueEvent() {
mPendingContinueEvent = PR_FALSE;
mFlags &= ~NS_PARSER_FLAG_PENDING_CONTINUE_EVENT;
ContinueParsing();
}
PRBool nsParser::CanInterrupt(void) {
return mCanInterrupt;
return mFlags & NS_PARSER_FLAG_CAN_INTERRUPT;
}
void nsParser::SetCanInterrupt(PRBool aCanInterrupt) {
mCanInterrupt = aCanInterrupt;
if (aCanInterrupt) {
mFlags |= NS_PARSER_FLAG_CAN_INTERRUPT;
}
else {
mFlags &= ~NS_PARSER_FLAG_CAN_INTERRUPT;
}
}
/**
@@ -1580,7 +1585,14 @@ nsresult nsParser::Parse(nsIURI* aURL,nsIRequestObserver* aListener,PRBool aVeri
nsresult result=kBadURL;
mObserver = aListener;
NS_IF_ADDREF(mObserver);
mDTDVerification=aVerifyEnabled;
if (aVerifyEnabled) {
mFlags |= NS_PARSER_FLAG_DTD_VERIFICATION;
}
else {
mFlags &= ~NS_PARSER_FLAG_DTD_VERIFICATION;
}
if(aURL) {
char* spec;
nsresult rv = aURL->GetSpec(&spec);
@@ -1615,7 +1627,13 @@ nsresult nsParser::Parse(nsIURI* aURL,nsIRequestObserver* aListener,PRBool aVeri
*/
nsresult nsParser::Parse(nsIInputStream& aStream,const nsAReadableString& aMimeType,PRBool aVerifyEnabled, void* aKey,nsDTDMode aMode){
mDTDVerification=aVerifyEnabled;
if (aVerifyEnabled) {
mFlags |= NS_PARSER_FLAG_DTD_VERIFICATION;
}
else {
mFlags &= ~NS_PARSER_FLAG_DTD_VERIFICATION;
}
nsresult result=NS_ERROR_OUT_OF_MEMORY;
//ok, time to create our tokenizer and begin the process
@@ -1678,7 +1696,14 @@ nsresult nsParser::Parse(const nsAReadableString& aSourceBuffer, void* aKey,
NS_ADDREF(me);
if(aSourceBuffer.Length() || mUnusedInput.Length()) {
mDTDVerification=aVerifyEnabled;
if (aVerifyEnabled) {
mFlags |= NS_PARSER_FLAG_DTD_VERIFICATION;
}
else {
mFlags &= ~NS_PARSER_FLAG_DTD_VERIFICATION;
}
CParserContext* pc=0;
if((!mParserContext) || (mParserContext->mKey!=aKey)) {
@@ -1780,9 +1805,9 @@ nsresult nsParser::ParseFragment(const nsAReadableString& aSourceBuffer,
//now it's time to try to build the model from this fragment
mObserversEnabled = PR_FALSE; //disable observers for fragments
mFlags &= ~NS_PARSER_FLAG_OBSERVERS_ENABLED; //disable observers for fragments
result = Parse(theContext + aSourceBuffer,(void*)&theContext,aMimeType,PR_FALSE,PR_TRUE, aMode);
mObserversEnabled = PR_TRUE; //now reenable.
mFlags |= NS_PARSER_FLAG_OBSERVERS_ENABLED; //now reenable.
return result;
}
@@ -1814,7 +1839,8 @@ nsresult nsParser::ResumeParse(PRBool allowIteration, PRBool aIsFinalChunk, PRBo
nsresult result=NS_OK;
if(mParserEnabled && mInternalState!=NS_ERROR_HTMLPARSER_STOPPARSING) {
if((mFlags & NS_PARSER_FLAG_PARSER_ENABLED) &&
mInternalState != NS_ERROR_HTMLPARSER_STOPPARSING) {
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: nsParser::ResumeParse(), this=%p\n", this));
@@ -1843,7 +1869,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 = Tokenize(aIsFinalChunk); // kEOF==2152596456
result=BuildModel();
if(result==NS_ERROR_HTMLPARSER_INTERRUPTED) {
@@ -2570,47 +2596,61 @@ PRBool nsParser::WillTokenize(PRBool aIsFinalChunk){
* @return error code -- 0 if ok, non-zero if error.
*/
nsresult nsParser::Tokenize(PRBool aIsFinalChunk){
nsITokenizer* theTokenizer = 0;
nsresult result =
(mParserContext && mParserContext->mDTD)? mParserContext->mDTD->GetTokenizer(theTokenizer) : NS_OK;
++mMajorIteration;
nsITokenizer* theTokenizer=0;
nsresult result = (mParserContext->mDTD)? mParserContext->mDTD->GetTokenizer(theTokenizer):NS_OK;
if(theTokenizer){
PRBool flushTokens=PR_FALSE;
MOZ_TIMER_START(mTokenizeTime);
WillTokenize(aIsFinalChunk);
while(NS_SUCCEEDED(result)) {
mParserContext->mScanner->Mark();
++mMinorIteration;
result=theTokenizer->ConsumeToken(*mParserContext->mScanner,flushTokens);
if(NS_FAILED(result)) {
mParserContext->mScanner->RewindToMark();
if(kEOF==result){
break;
}
else if(NS_ERROR_HTMLPARSER_STOPPARSING==result) {
result=Terminate();
break;
}
if (theTokenizer){
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
// stack got handled ). Flush 'em now. Ref. bug 104856
if (theTokenizer->GetCount() == 0) {
mFlags &= ~NS_PARSER_FLAG_FLUSH_TOKENS; // reset since the tokens have been flushed.
}
else if(flushTokens && mObserversEnabled) {
// I added the extra test of mObserversEnabled to fix Bug# 23931.
// Flush tokens on seeing </SCRIPT> -- Ref: Bug# 22485 --
// Also remember to update the marked position.
}
else {
++mMajorIteration;
PRBool flushTokens=PR_FALSE;
MOZ_TIMER_START(mTokenizeTime);
WillTokenize(aIsFinalChunk);
while (NS_SUCCEEDED(result)) {
mParserContext->mScanner->Mark();
break;
}
}
DidTokenize(aIsFinalChunk);
++mMinorIteration;
result=theTokenizer->ConsumeToken(*mParserContext->mScanner, flushTokens);
if (NS_FAILED(result)) {
mParserContext->mScanner->RewindToMark();
if (kEOF == result){
break;
}
else if(NS_ERROR_HTMLPARSER_STOPPARSING==result) {
result = Terminate();
break;
}
}
else if (flushTokens && (mFlags & NS_PARSER_FLAG_OBSERVERS_ENABLED)) {
// I added the extra test of NS_PARSER_FLAG_OBSERVERS_ENABLED to fix Bug# 23931.
// Flush tokens on seeing </SCRIPT> -- Ref: Bug# 22485 --
// Also remember to update the marked position.
mFlags |= NS_PARSER_FLAG_FLUSH_TOKENS;
mParserContext->mScanner->Mark();
break;
}
}
DidTokenize(aIsFinalChunk);
MOZ_TIMER_STOP(mTokenizeTime);
}
else{
result=mInternalState=NS_ERROR_HTMLPARSER_BADTOKENIZER;
MOZ_TIMER_STOP(mTokenizeTime);
}
}
else{
result = mInternalState = NS_ERROR_HTMLPARSER_BADTOKENIZER;
}
return result;
}

View File

@@ -469,16 +469,14 @@ protected:
PRInt32 mMajorIteration;
PRInt32 mMinorIteration;
PRInt32 mCharsetSource;
PRUint16 mFlags;
nsString mUnusedInput;
nsString mCharset;
nsString mCommandStr;
PRPackedBool mDTDVerification;
PRPackedBool mParserEnabled;
PRPackedBool mObserversEnabled;
PRPackedBool mPendingContinueEvent;
PRPackedBool mCanInterrupt;
public:

View File

@@ -723,8 +723,8 @@ NS_IMETHODIMP CViewSourceHTML::DidBuildModel(nsresult anErrorCode,PRBool aNotify
* @param
* @return
*/
nsresult CViewSourceHTML::Terminate(nsIParser* aParser) {
return NS_ERROR_HTMLPARSER_STOPPARSING;
NS_IMETHODIMP_(void)
CViewSourceHTML::Terminate() {
}

View File

@@ -204,7 +204,7 @@ public:
* @param
* @return
*/
NS_IMETHOD Terminate(nsIParser* aParser=nsnull) = 0;
NS_IMETHOD_(void) Terminate() = 0;
/* XXX Temporary measure, pending further work by RickG */
@@ -244,7 +244,7 @@ public:
NS_IMETHOD WillInterruptParse(nsIContentSink* aSink = 0);\
NS_IMETHOD_(PRBool) CanContain(PRInt32 aParent,PRInt32 aChild) const;\
NS_IMETHOD_(PRBool) IsContainer(PRInt32 aTag) const;\
NS_IMETHOD_(nsresult) Terminate(nsIParser* aParser=nsnull);\
NS_IMETHOD_(void) Terminate();\
NS_IMETHOD StringTagToIntTag(const nsAReadableString &aTag, PRInt32* aIntTag) const ;\
NS_IMETHOD_(const PRUnichar *) IntTagToStringTag(PRInt32 aIntTag) const ;\
NS_IMETHOD ConvertEntityToUnicode(const nsAReadableString& aEntity, PRInt32* aUnicode) const ;\

View File

@@ -109,18 +109,20 @@ static char gShowCRC;
************************************************************************/
#define NS_PARSER_FLAG_NONE 0x00000000
#define NS_PARSER_FLAG_HAS_OPEN_BODY 0x00000001
#define NS_PARSER_FLAG_HAS_OPEN_FORM 0x00000002
#define NS_PARSER_FLAG_HAS_OPEN_SCRIPT 0x00000004
#define NS_PARSER_FLAG_HAD_BODY 0x00000008
#define NS_PARSER_FLAG_HAD_FRAMESET 0x00000010
#define NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE 0x00000020
#define NS_PARSER_FLAG_REQUESTED_HEAD 0x00000040
#define NS_PARSER_FLAG_IS_FORM_CONTAINER 0x00000080
#define NS_PARSER_FLAG_SCRIPT_ENABLED 0x00000100
#define NS_PARSER_FLAG_FRAMES_ENABLED 0x00000200
#define NS_PARSER_FLAG_ALTERNATE_CONTENT 0x00000400 // NOFRAMES, NOSCRIPT
#define NS_DTD_FLAG_NONE 0x00000000
#define NS_DTD_FLAG_HAS_OPEN_BODY 0x00000001
#define NS_DTD_FLAG_HAS_OPEN_FORM 0x00000002
#define NS_DTD_FLAG_HAS_OPEN_SCRIPT 0x00000004
#define NS_DTD_FLAG_HAD_BODY 0x00000008
#define NS_DTD_FLAG_HAD_FRAMESET 0x00000010
#define NS_DTD_FLAG_ENABLE_RESIDUAL_STYLE 0x00000020
#define NS_DTD_FLAG_REQUESTED_HEAD 0x00000040
#define NS_DTD_FLAG_IS_FORM_CONTAINER 0x00000080
#define NS_DTD_FLAG_SCRIPT_ENABLED 0x00000100
#define NS_DTD_FLAG_FRAMES_ENABLED 0x00000200
#define NS_DTD_FLAG_ALTERNATE_CONTENT 0x00000400 // NOFRAMES, NOSCRIPT
#define NS_DTD_FLAG_MISPLACED_CONTENT 0x00000800
#define NS_DTD_FLAG_STOP_PARSING 0x00001000
/**
* This method gets called as part of our COM-like interfaces.
@@ -180,8 +182,7 @@ CNavDTD::CNavDTD() : nsIDTD(),
mDocType(eHTML3_Quirks), // why not eHTML_Quirks?
mParserCommand(eViewNormal),
mSkipTarget(eHTMLTag_unknown),
mDTDState(NS_OK),
mFlags(NS_PARSER_FLAG_NONE),
mFlags(NS_DTD_FLAG_NONE),
#ifdef ENABLE_CRC
mComputedCRC32(0),
mExpectedCRC32(0),
@@ -384,7 +385,7 @@ nsresult CNavDTD::WillBuildModel( const CParserContext& aParserContext,nsIConte
nsresult result=NS_OK;
mFilename=aParserContext.mScanner->GetFilename();
mFlags = NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE; // residual style is always on. This will also reset the flags
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;
@@ -431,12 +432,12 @@ nsresult CNavDTD::WillBuildModel( const CParserContext& aParserContext,nsIConte
PRBool enabled;
mSink->GetPref(eHTMLTag_frameset,enabled);
if(enabled) {
mFlags |= NS_PARSER_FLAG_FRAMES_ENABLED;
mFlags |= NS_DTD_FLAG_FRAMES_ENABLED;
}
mSink->GetPref(eHTMLTag_script,enabled);
if(enabled) {
mFlags |= NS_PARSER_FLAG_SCRIPT_ENABLED;
mFlags |= NS_DTD_FLAG_SCRIPT_ENABLED;
}
}
@@ -492,7 +493,7 @@ nsresult CNavDTD::BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer,nsIToke
}
// always open a body if frames are disabled....
if(!(mFlags & NS_PARSER_FLAG_FRAMES_ENABLED)) {
if(!(mFlags & NS_DTD_FLAG_FRAMES_ENABLED)) {
theToken=NS_STATIC_CAST(CStartToken*,mTokenAllocator->CreateTokenOfType(eToken_start,eHTMLTag_body,NS_LITERAL_STRING("body")));
mTokenizer->PushTokenFront(theToken);
}
@@ -519,7 +520,7 @@ nsresult CNavDTD::BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer,nsIToke
printf("\n");
#endif
if(mDTDState!=NS_ERROR_HTMLPARSER_STOPPARSING) {
if(!(mFlags & NS_DTD_FLAG_STOP_PARSING)) {
CToken* theToken=mTokenizer->PopToken();
if(theToken) {
result=HandleToken(theToken,aParser);
@@ -527,7 +528,7 @@ nsresult CNavDTD::BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer,nsIToke
else break;
}
else {
result=mDTDState;
result = NS_ERROR_HTMLPARSER_STOPPARSING;
break;
}
@@ -572,7 +573,7 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse
if(aSink) {
if((NS_OK==anErrorCode) && !(mFlags & (NS_PARSER_FLAG_HAD_BODY | NS_PARSER_FLAG_HAD_FRAMESET))) {
if((NS_OK==anErrorCode) && !(mFlags & (NS_DTD_FLAG_HAD_BODY | NS_DTD_FLAG_HAD_FRAMESET))) {
mSkipTarget=eHTMLTag_unknown; //clear this in case we were searching earlier.
@@ -591,7 +592,7 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse
result=HandleToken(theEndToken,mParser);
}
}
if(mDTDState==NS_ERROR_HTMLPARSER_MISPLACEDTABLECONTENT) {
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) {
@@ -602,7 +603,7 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse
eHTMLTags theTarget;
//now let's disable style handling to save time when closing remaining stack members...
mFlags &= ~NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE;
mFlags &= ~NS_DTD_FLAG_ENABLE_RESIDUAL_STYLE;
while(mBodyContext->GetCount() > 0) {
theTarget = mBodyContext->Last();
@@ -677,10 +678,10 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse
return result;
}
nsresult
CNavDTD::Terminate(nsIParser* aParser)
NS_IMETHODIMP_(void)
CNavDTD::Terminate()
{
return mDTDState=NS_ERROR_HTMLPARSER_STOPPARSING;
mFlags |= NS_DTD_FLAG_STOP_PARSING;
}
/**
@@ -765,7 +766,7 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
return result;
}
}
else if(mFlags & NS_PARSER_FLAG_ALTERNATE_CONTENT) {
else if(mFlags & NS_DTD_FLAG_ALTERNATE_CONTENT) {
if(theTag != mBodyContext->Last() || theType!=eToken_end) {
// attribute source is a part of start token.
if(theType!=eToken_attribute) {
@@ -789,7 +790,7 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
mScratch.SetCapacity(0);
}
}
else if(mDTDState==NS_ERROR_HTMLPARSER_MISPLACEDTABLECONTENT) {
else if(mFlags & NS_DTD_FLAG_MISPLACED_CONTENT) {
// Included TD & TH to fix Bug# 20797
static eHTMLTags gLegalElements[]={eHTMLTag_table,eHTMLTag_thead,eHTMLTag_tbody,
eHTMLTag_tr,eHTMLTag_td,eHTMLTag_th,eHTMLTag_tfoot};
@@ -799,7 +800,7 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
if((FindTagInSet(theTag,gLegalElements,sizeof(gLegalElements)/sizeof(theTag))) ||
(gHTMLElements[theParentTag].CanContain(theTag)) && (theTag!=eHTMLTag_comment)) { // Added comment -> bug 40855
mDTDState=NS_OK; // reset the state since all the misplaced tokens are about to get handled.
mFlags &= ~NS_DTD_FLAG_MISPLACED_CONTENT; // reset the state since all the misplaced tokens are about to get handled.
result=HandleSavedTokens(mBodyContext->mContextTopIndex);
mBodyContext->mContextTopIndex=-1;
@@ -843,7 +844,7 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
}
default:
if(!gHTMLElements[eHTMLTag_html].SectionContains(theTag,PR_FALSE)) {
if(!(mFlags & (NS_PARSER_FLAG_HAD_BODY | NS_PARSER_FLAG_HAD_FRAMESET))) {
if(!(mFlags & (NS_DTD_FLAG_HAD_BODY | NS_DTD_FLAG_HAD_FRAMESET))) {
//For bug examples from this code, see bugs: 18928, 20989.
@@ -923,7 +924,7 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
IF_FREE(theToken, mTokenAllocator);
}
else if(result==NS_ERROR_HTMLPARSER_STOPPARSING) {
mDTDState=result;
mFlags |= NS_DTD_FLAG_STOP_PARSING;
}
else {
return NS_OK;
@@ -1521,7 +1522,7 @@ nsresult CNavDTD::HandleOmittedTag(CToken* aToken,eHTMLTags aChildTag,eHTMLTags
mMisplacedContent.Push(mTokenAllocator->CreateTokenOfType(eToken_end,aChildTag));
}
mDTDState=NS_ERROR_HTMLPARSER_MISPLACEDTABLECONTENT; // This state would help us in gathering all the misplaced elements
mFlags |= NS_DTD_FLAG_MISPLACED_CONTENT; // This state would help us in gathering all the misplaced elements
}//if
}//if
@@ -1653,16 +1654,16 @@ nsresult CNavDTD::HandleStartToken(CToken* aToken) {
}
break;
case eHTMLTag_body:
if(mFlags & NS_PARSER_FLAG_HAS_OPEN_BODY) {
if(mFlags & NS_DTD_FLAG_HAS_OPEN_BODY) {
result=OpenContainer(theNode,theChildTag,PR_FALSE);
isTokenHandled=PR_TRUE;
}
break;
case eHTMLTag_head:
if(mFlags & (NS_PARSER_FLAG_HAD_BODY | NS_PARSER_FLAG_HAD_FRAMESET)) {
if(mFlags & (NS_DTD_FLAG_HAD_BODY | NS_DTD_FLAG_HAD_FRAMESET)) {
result=HandleOmittedTag(aToken,theChildTag,theParent,theNode);
isTokenHandled=PR_TRUE;
mFlags |= NS_PARSER_FLAG_REQUESTED_HEAD;
mFlags |= NS_DTD_FLAG_REQUESTED_HEAD;
}
break;
default:
@@ -1704,9 +1705,9 @@ nsresult CNavDTD::HandleStartToken(CToken* aToken) {
break;
case eHTMLTag_script:
theHeadIsParent=(!(mFlags & NS_PARSER_FLAG_HAS_OPEN_BODY) ||
(mFlags & NS_PARSER_FLAG_REQUESTED_HEAD));
mFlags |= NS_PARSER_FLAG_HAS_OPEN_SCRIPT;
theHeadIsParent=(!(mFlags & NS_DTD_FLAG_HAS_OPEN_BODY) ||
(mFlags & NS_DTD_FLAG_REQUESTED_HEAD));
mFlags |= NS_DTD_FLAG_HAS_OPEN_SCRIPT;
default:
break;
@@ -1906,7 +1907,7 @@ nsresult CNavDTD::HandleEndToken(CToken* aToken) {
switch(theChildTag) {
case eHTMLTag_script:
mFlags &= ~NS_PARSER_FLAG_HAS_OPEN_SCRIPT;
mFlags &= ~NS_DTD_FLAG_HAS_OPEN_SCRIPT;
case eHTMLTag_style:
case eHTMLTag_link:
case eHTMLTag_meta:
@@ -1916,7 +1917,7 @@ nsresult CNavDTD::HandleEndToken(CToken* aToken) {
case eHTMLTag_head:
StripWSFollowingTag(theChildTag,mTokenizer,mTokenAllocator,mLineNumber);
mFlags &= ~NS_PARSER_FLAG_REQUESTED_HEAD;
mFlags &= ~NS_DTD_FLAG_REQUESTED_HEAD;
//ok to fall through...
case eHTMLTag_form:
@@ -2041,7 +2042,7 @@ nsresult CNavDTD::HandleSavedTokens(PRInt32 anIndex) {
//eHTMLTag_tfoot,eHTMLTag_thead,eHTMLTag_colgroup.In those cases the stack
//position, in the parser, should be synchronized with the sink. -- Ref: Bug 20087.
if (!(~mFlags & (NS_PARSER_FLAG_HAS_OPEN_FORM | NS_PARSER_FLAG_IS_FORM_CONTAINER))) anIndex++;
if (!(~mFlags & (NS_DTD_FLAG_HAS_OPEN_FORM | NS_DTD_FLAG_IS_FORM_CONTAINER))) anIndex++;
STOP_TIMER()
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::HandleSavedTokensAbove(), this=%p\n", this));
@@ -2838,7 +2839,7 @@ PRBool CNavDTD::HasOpenContainer(eHTMLTags aContainer) const {
switch(aContainer) {
case eHTMLTag_form:
result= !(~mFlags & NS_PARSER_FLAG_HAS_OPEN_FORM); break;
result= !(~mFlags & NS_DTD_FLAG_HAS_OPEN_FORM); break;
case eHTMLTag_map:
result=mOpenMapCount>0; break;
default:
@@ -2900,7 +2901,7 @@ nsresult CNavDTD::OpenTransientStyles(eHTMLTags aChildTag){
nsresult result=NS_OK;
// No need to open transient styles in head context - Fix for 41427
if((mFlags & NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE) &&
if((mFlags & NS_DTD_FLAG_ENABLE_RESIDUAL_STYLE) &&
eHTMLTag_newline!=aChildTag && mOpenHeadCount==0) {
#ifdef ENABLE_RESIDUALSTYLE
@@ -2919,7 +2920,7 @@ nsresult CNavDTD::OpenTransientStyles(eHTMLTags aChildTag){
}
}
mFlags &= ~NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE;
mFlags &= ~NS_DTD_FLAG_ENABLE_RESIDUAL_STYLE;
for(;theLevel<theCount;theLevel++){
nsEntryStack* theStack=mBodyContext->GetStylesAt(theLevel);
if(theStack){
@@ -2960,7 +2961,7 @@ nsresult CNavDTD::OpenTransientStyles(eHTMLTags aChildTag){
} //for
} //if
} //for
mFlags |= NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE;
mFlags |= NS_DTD_FLAG_ENABLE_RESIDUAL_STYLE;
} //if
@@ -2984,7 +2985,7 @@ nsresult CNavDTD::OpenTransientStyles(eHTMLTags aChildTag){
nsresult CNavDTD::CloseTransientStyles(eHTMLTags aChildTag){
nsresult result=NS_OK;
if(mFlags & NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE) {
if(mFlags & NS_DTD_FLAG_ENABLE_RESIDUAL_STYLE) {
#ifdef ENABLE_RESIDUALSTYLE
#if 0
@@ -3016,7 +3017,7 @@ nsresult CNavDTD::CloseTransientStyles(eHTMLTags aChildTag){
nsresult CNavDTD::PopStyle(eHTMLTags aTag){
nsresult result=0;
if(mFlags & NS_PARSER_FLAG_ENABLE_RESIDUAL_STYLE) {
if(mFlags & NS_DTD_FLAG_ENABLE_RESIDUAL_STYLE) {
#ifdef ENABLE_RESIDUALSTYLE
if(nsHTMLElement::IsResidualStyleTag(aTag)) {
nsCParserNode* node=mBodyContext->PopStyle(aTag);
@@ -3141,9 +3142,9 @@ nsresult CNavDTD::OpenBody(const nsCParserNode *aNode){
nsresult result = NS_OK;
if (!(mFlags & NS_PARSER_FLAG_HAD_FRAMESET)) {
if (!(mFlags & NS_DTD_FLAG_HAD_FRAMESET)) {
mFlags |= NS_PARSER_FLAG_HAD_BODY;
mFlags |= NS_DTD_FLAG_HAD_BODY;
STOP_TIMER();
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::OpenBody(), this=%p\n", this));
@@ -3197,13 +3198,13 @@ nsresult CNavDTD::OpenForm(const nsIParserNode *aNode){
eHTMLTag_tfoot,eHTMLTag_thead,
eHTMLTag_col,eHTMLTag_colgroup};
nsresult result=NS_OK;
if(!(mFlags & NS_PARSER_FLAG_HAS_OPEN_FORM)) { // discard nested forms - bug 72639
if(!(mFlags & NS_DTD_FLAG_HAS_OPEN_FORM)) { // discard nested forms - bug 72639
// Check if the parent is a table, tbody, thead, tfoot, tr, col or
// colgroup. If so, treat form as a leaf content. [ Ex. bug 92530 ]
if(!FindTagInSet(mBodyContext->Last(),gTableElements,
sizeof(gTableElements)/sizeof(eHTMLTag_unknown))) {
mFlags |= NS_PARSER_FLAG_IS_FORM_CONTAINER;
mFlags |= NS_DTD_FLAG_IS_FORM_CONTAINER;
}
STOP_TIMER();
@@ -3215,7 +3216,7 @@ nsresult CNavDTD::OpenForm(const nsIParserNode *aNode){
START_TIMER();
if(NS_OK==result) {
mFlags |= NS_PARSER_FLAG_HAS_OPEN_FORM;
mFlags |= NS_DTD_FLAG_HAS_OPEN_FORM;
}
}
mOpenFormCount++;
@@ -3233,9 +3234,9 @@ nsresult CNavDTD::OpenForm(const nsIParserNode *aNode){
nsresult CNavDTD::CloseForm(const nsIParserNode *aNode){
// NS_PRECONDITION(mBodyContext->GetCount() > 0, kInvalidTagStackPos);
nsresult result=NS_OK;
if(mFlags & NS_PARSER_FLAG_HAS_OPEN_FORM) {
if(mFlags & NS_DTD_FLAG_HAS_OPEN_FORM) {
if (mOpenFormCount == 1) {
mFlags &= ~NS_PARSER_FLAG_HAS_OPEN_FORM;
mFlags &= ~NS_DTD_FLAG_HAS_OPEN_FORM;
STOP_TIMER();
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::CloseForm(), this=%p\n", this));
@@ -3245,7 +3246,7 @@ nsresult CNavDTD::CloseForm(const nsIParserNode *aNode){
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::CloseForm(), this=%p\n", this));
START_TIMER();
mFlags &= ~NS_PARSER_FLAG_IS_FORM_CONTAINER;
mFlags &= ~NS_DTD_FLAG_IS_FORM_CONTAINER;
}
--mOpenFormCount;
}
@@ -3314,7 +3315,7 @@ nsresult CNavDTD::CloseMap(const nsIParserNode *aNode){
nsresult CNavDTD::OpenFrameset(const nsCParserNode *aNode){
NS_PRECONDITION(mBodyContext->GetCount() >= 0, kInvalidTagStackPos);
mFlags |= NS_PARSER_FLAG_HAD_FRAMESET;
mFlags |= NS_DTD_FLAG_HAD_FRAMESET;
STOP_TIMER();
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::OpenFrameset(), this=%p\n", this));
@@ -3406,7 +3407,7 @@ CNavDTD::OpenContainer(const nsCParserNode *aNode,eHTMLTags aTag,PRBool aClosedB
// XXX - But what did we actually do in counting the heads?
mOpenHeadCount=1;
}
mFlags |= NS_PARSER_FLAG_HAS_OPEN_BODY;
mFlags |= NS_DTD_FLAG_HAS_OPEN_BODY;
CloseHead(aNode); //do this just in case someone left it open...
result=OpenBody(aNode);
}
@@ -3457,19 +3458,19 @@ CNavDTD::OpenContainer(const nsCParserNode *aNode,eHTMLTags aTag,PRBool aClosedB
// If the script is disabled noscript should not be
// in the content model until the layout can somehow
// turn noscript's display property to block <-- bug 67899
if(mFlags & NS_PARSER_FLAG_SCRIPT_ENABLED) {
if(mFlags & NS_DTD_FLAG_SCRIPT_ENABLED) {
done=PR_FALSE;
mScratch.Truncate();
mFlags |= NS_PARSER_FLAG_ALTERNATE_CONTENT;
mFlags |= NS_DTD_FLAG_ALTERNATE_CONTENT;
}
break;
case eHTMLTag_iframe: // Bug 84491
case eHTMLTag_noframes:
done=PR_FALSE;
if(mFlags & NS_PARSER_FLAG_FRAMES_ENABLED) {
if(mFlags & NS_DTD_FLAG_FRAMES_ENABLED) {
mScratch.Truncate();
mFlags |= NS_PARSER_FLAG_ALTERNATE_CONTENT;
mFlags |= NS_DTD_FLAG_ALTERNATE_CONTENT;
}
break;
@@ -3547,7 +3548,7 @@ CNavDTD::CloseContainer(const nsCParserNode *aNode,eHTMLTags aTarget,PRBool aClo
case eHTMLTag_noscript:
case eHTMLTag_noframes:
// switch from alternate content state to regular state
mFlags &= ~NS_PARSER_FLAG_ALTERNATE_CONTENT;
mFlags &= ~NS_DTD_FLAG_ALTERNATE_CONTENT;
// falling thro' intentionally....
case eHTMLTag_title:
default:
@@ -3607,7 +3608,7 @@ nsresult CNavDTD::CloseContainersTo(PRInt32 anIndex,eHTMLTags aTarget, PRBool aC
alternate content. This fixes bug 25214.
*************************************************************/
if(theTagIsStyle && !(mFlags & NS_PARSER_FLAG_ALTERNATE_CONTENT)) {
if(theTagIsStyle && !(mFlags & NS_DTD_FLAG_ALTERNATE_CONTENT)) {
PRBool theTargetTagIsStyle=nsHTMLElement::IsResidualStyleTag(aTarget);

View File

@@ -360,7 +360,6 @@ protected:
eParserCommands mParserCommand; //tells us to viewcontent/viewsource/viewerrors...
eHTMLTags mSkipTarget;
nsresult mDTDState;
PRInt32 mLineNumber;
PRInt32 mOpenHeadCount;
PRInt32 mOpenMapCount;

View File

@@ -487,10 +487,10 @@ nsresult COtherDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIPar
return result;
}
nsresult
COtherDTD::Terminate(nsIParser* aParser)
NS_IMETHODIMP_(void)
COtherDTD::Terminate()
{
return mDTDState=NS_ERROR_HTMLPARSER_STOPPARSING;
mDTDState = NS_ERROR_HTMLPARSER_STOPPARSING;
}
/**

View File

@@ -881,10 +881,11 @@ nsExpatDriver::GetMostDerivedIID(void) const
return NS_GET_IID(nsIDTD);
}
NS_IMETHODIMP nsExpatDriver::Terminate(nsIParser* aParser)
NS_IMETHODIMP_(void)
nsExpatDriver::Terminate()
{
XML_BlockParser(mExpatParser); // XXX - not sure what happens to the unparsed data.
return mInternalState = NS_ERROR_HTMLPARSER_STOPPARSING;
mInternalState = NS_ERROR_HTMLPARSER_STOPPARSING;
}
/*************************** Unused methods ***************************************/

View File

@@ -67,6 +67,13 @@
#include "nsExpatDriver.h"
//#define rickgdebug
#define NS_PARSER_FLAG_DTD_VERIFICATION 0x00000001
#define NS_PARSER_FLAG_PARSER_ENABLED 0x00000002
#define NS_PARSER_FLAG_OBSERVERS_ENABLED 0x00000004
#define NS_PARSER_FLAG_PENDING_CONTINUE_EVENT 0x00000008
#define NS_PARSER_FLAG_CAN_INTERRUPT 0x00000010
#define NS_PARSER_FLAG_FLUSH_TOKENS 0x00000020
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
static NS_DEFINE_CID(kCParserCID, NS_PARSER_CID);
static NS_DEFINE_IID(kIParserIID, NS_IPARSER_IID);
@@ -310,14 +317,10 @@ nsParser::nsParser(nsITokenObserver* anObserver) {
mParserContext=0;
mTokenObserver=anObserver;
mStreamStatus=0;
mDTDVerification=PR_FALSE;
mCharsetSource=kCharsetUninitialized;
mInternalState=NS_OK;
mObserversEnabled=PR_TRUE;
mInternalState=NS_OK;;
mCommand=eViewNormal;
mParserEnabled=PR_TRUE;
mPendingContinueEvent=PR_FALSE;
mCanInterrupt=PR_FALSE;
mFlags = NS_PARSER_FLAG_OBSERVERS_ENABLED | NS_PARSER_FLAG_PARSER_ENABLED;
MOZ_TIMER_DEBUGLOG(("Reset: Parse Time: nsParser::nsParser(), this=%p\n", this));
MOZ_TIMER_RESET(mParseTime);
@@ -368,7 +371,7 @@ nsParser::~nsParser() {
//what may be several contexts...
delete mParserContext;
if (mPendingContinueEvent) {
if (mFlags & NS_PARSER_FLAG_PENDING_CONTINUE_EVENT) {
NS_ASSERTION(mEventQueue != nsnull,"Event queue is null");
mEventQueue->RevokeEvents(this);
}
@@ -426,12 +429,12 @@ nsresult nsParser::QueryInterface(const nsIID& aIID, void** aInstancePtr)
nsresult
nsParser::PostContinueEvent()
{
if ((! mPendingContinueEvent) && (mEventQueue)) {
if (!(mFlags & NS_PARSER_FLAG_PENDING_CONTINUE_EVENT) && mEventQueue) {
nsParserContinueEvent* ev = new nsParserContinueEvent(NS_STATIC_CAST(nsIParser*, this));
NS_ENSURE_TRUE(ev,NS_ERROR_OUT_OF_MEMORY);
NS_ADDREF(this);
mEventQueue->PostEvent(ev);
mPendingContinueEvent = PR_TRUE;
mFlags |= NS_PARSER_FLAG_PENDING_CONTINUE_EVENT;
}
return NS_OK;
}
@@ -1309,14 +1312,14 @@ NS_IMETHODIMP nsParser::CreateCompatibleDTD(nsIDTD** aDTD,
NS_IMETHODIMP
nsParser::CancelParsingEvents() {
if (mPendingContinueEvent) {
if (mFlags & NS_PARSER_FLAG_PENDING_CONTINUE_EVENT) {
NS_ASSERTION(mEventQueue,"Event queue is null");
// Revoke all pending continue parsing events
if (mEventQueue != nsnull) {
mEventQueue->RevokeEvents(this);
}
mPendingContinueEvent=PR_FALSE;
mFlags &= ~NS_PARSER_FLAG_PENDING_CONTINUE_EVENT;
/* Since we are taking this off of the queue, we need to do the NS_RELEASE
* that nsParserContinueEvent::HandleEvent would have done.
*/
@@ -1450,24 +1453,21 @@ void nsParser::SetUnusedInput(nsString& aBuffer) {
* @return should return NS_OK once implemented
*/
nsresult nsParser::Terminate(void){
nsresult result=NS_OK;
if(mParserContext && mParserContext->mDTD) {
result=mParserContext->mDTD->Terminate(this);
if(result==NS_ERROR_HTMLPARSER_STOPPARSING) {
// XXX - [ until we figure out a way to break parser-sink circularity ]
// Hack - Hold a reference until we are completely done...
nsCOMPtr<nsIParser> kungFuDeathGrip(this);
mInternalState=result;
nsresult result = NS_OK;
if (mParserContext && mParserContext->mDTD) {
mParserContext->mDTD->Terminate();
// XXX - [ until we figure out a way to break parser-sink circularity ]
// Hack - Hold a reference until we are completely done...
nsCOMPtr<nsIParser> kungFuDeathGrip(this);
mInternalState = result = NS_ERROR_HTMLPARSER_STOPPARSING;
// CancelParsingEvents must be called to avoid leaking the nsParser object
// @see bug 108049
// If mPendingContinueEvents is PR_TRUE CancelParsingEvents will reset
// the mPendingContinueEvent to PR_FALSE so DidBuildModel will call
// DidBuildModel on the DTD. Note: The IsComplete() call inside of DidBuildModel
// looks at the mPendingContinueEvents flag.
CancelParsingEvents();
DidBuildModel(result);
}
// CancelParsingEvents must be called to avoid leaking the nsParser object
// @see bug 108049
// If NS_PARSER_FLAG_PENDING_CONTINUE_EVENT is set then CancelParsingEvents
// will reset it so DidBuildModel will call DidBuildModel on the DTD. Note:
// The IsComplete() call inside of DidBuildModel looks at the pendingContinueEvents flag.
CancelParsingEvents();
DidBuildModel(result);
}
return result;
}
@@ -1488,7 +1488,7 @@ nsresult nsParser::ContinueParsing(){
nsresult result=NS_OK;
nsCOMPtr<nsIParser> kungFuDeathGrip(this);
mParserEnabled=PR_TRUE;
mFlags |= NS_PARSER_FLAG_PARSER_ENABLED;
PRBool isFinalChunk=(mParserContext && mParserContext->mStreamListenerState==eOnStop)? PR_TRUE:PR_FALSE;
@@ -1508,7 +1508,7 @@ nsresult nsParser::ContinueParsing(){
* @return
*/
void nsParser::BlockParser() {
mParserEnabled=PR_FALSE;
mFlags &= ~NS_PARSER_FLAG_PARSER_ENABLED;
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: nsParser::BlockParser(), this=%p\n", this));
MOZ_TIMER_STOP(mParseTime);
}
@@ -1523,7 +1523,7 @@ void nsParser::BlockParser() {
* @return
*/
void nsParser::UnblockParser() {
mParserEnabled=PR_TRUE;
mFlags |= NS_PARSER_FLAG_PARSER_ENABLED;
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: nsParser::UnblockParser(), this=%p\n", this));
MOZ_TIMER_START(mParseTime);
}
@@ -1535,7 +1535,7 @@ void nsParser::UnblockParser() {
* @return current state
*/
PRBool nsParser::IsParserEnabled() {
return mParserEnabled;
return mFlags & NS_PARSER_FLAG_PARSER_ENABLED;
}
/**
@@ -1545,21 +1545,26 @@ PRBool nsParser::IsParserEnabled() {
* @return complete state
*/
PRBool nsParser::IsComplete() {
return (! mPendingContinueEvent);
return !(mFlags & NS_PARSER_FLAG_PENDING_CONTINUE_EVENT);
}
void nsParser::HandleParserContinueEvent() {
mPendingContinueEvent = PR_FALSE;
mFlags &= ~NS_PARSER_FLAG_PENDING_CONTINUE_EVENT;
ContinueParsing();
}
PRBool nsParser::CanInterrupt(void) {
return mCanInterrupt;
return mFlags & NS_PARSER_FLAG_CAN_INTERRUPT;
}
void nsParser::SetCanInterrupt(PRBool aCanInterrupt) {
mCanInterrupt = aCanInterrupt;
if (aCanInterrupt) {
mFlags |= NS_PARSER_FLAG_CAN_INTERRUPT;
}
else {
mFlags &= ~NS_PARSER_FLAG_CAN_INTERRUPT;
}
}
/**
@@ -1580,7 +1585,14 @@ nsresult nsParser::Parse(nsIURI* aURL,nsIRequestObserver* aListener,PRBool aVeri
nsresult result=kBadURL;
mObserver = aListener;
NS_IF_ADDREF(mObserver);
mDTDVerification=aVerifyEnabled;
if (aVerifyEnabled) {
mFlags |= NS_PARSER_FLAG_DTD_VERIFICATION;
}
else {
mFlags &= ~NS_PARSER_FLAG_DTD_VERIFICATION;
}
if(aURL) {
char* spec;
nsresult rv = aURL->GetSpec(&spec);
@@ -1615,7 +1627,13 @@ nsresult nsParser::Parse(nsIURI* aURL,nsIRequestObserver* aListener,PRBool aVeri
*/
nsresult nsParser::Parse(nsIInputStream& aStream,const nsAReadableString& aMimeType,PRBool aVerifyEnabled, void* aKey,nsDTDMode aMode){
mDTDVerification=aVerifyEnabled;
if (aVerifyEnabled) {
mFlags |= NS_PARSER_FLAG_DTD_VERIFICATION;
}
else {
mFlags &= ~NS_PARSER_FLAG_DTD_VERIFICATION;
}
nsresult result=NS_ERROR_OUT_OF_MEMORY;
//ok, time to create our tokenizer and begin the process
@@ -1678,7 +1696,14 @@ nsresult nsParser::Parse(const nsAReadableString& aSourceBuffer, void* aKey,
NS_ADDREF(me);
if(aSourceBuffer.Length() || mUnusedInput.Length()) {
mDTDVerification=aVerifyEnabled;
if (aVerifyEnabled) {
mFlags |= NS_PARSER_FLAG_DTD_VERIFICATION;
}
else {
mFlags &= ~NS_PARSER_FLAG_DTD_VERIFICATION;
}
CParserContext* pc=0;
if((!mParserContext) || (mParserContext->mKey!=aKey)) {
@@ -1780,9 +1805,9 @@ nsresult nsParser::ParseFragment(const nsAReadableString& aSourceBuffer,
//now it's time to try to build the model from this fragment
mObserversEnabled = PR_FALSE; //disable observers for fragments
mFlags &= ~NS_PARSER_FLAG_OBSERVERS_ENABLED; //disable observers for fragments
result = Parse(theContext + aSourceBuffer,(void*)&theContext,aMimeType,PR_FALSE,PR_TRUE, aMode);
mObserversEnabled = PR_TRUE; //now reenable.
mFlags |= NS_PARSER_FLAG_OBSERVERS_ENABLED; //now reenable.
return result;
}
@@ -1814,7 +1839,8 @@ nsresult nsParser::ResumeParse(PRBool allowIteration, PRBool aIsFinalChunk, PRBo
nsresult result=NS_OK;
if(mParserEnabled && mInternalState!=NS_ERROR_HTMLPARSER_STOPPARSING) {
if((mFlags & NS_PARSER_FLAG_PARSER_ENABLED) &&
mInternalState != NS_ERROR_HTMLPARSER_STOPPARSING) {
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: nsParser::ResumeParse(), this=%p\n", this));
@@ -1843,7 +1869,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 = Tokenize(aIsFinalChunk); // kEOF==2152596456
result=BuildModel();
if(result==NS_ERROR_HTMLPARSER_INTERRUPTED) {
@@ -2570,47 +2596,61 @@ PRBool nsParser::WillTokenize(PRBool aIsFinalChunk){
* @return error code -- 0 if ok, non-zero if error.
*/
nsresult nsParser::Tokenize(PRBool aIsFinalChunk){
nsITokenizer* theTokenizer = 0;
nsresult result =
(mParserContext && mParserContext->mDTD)? mParserContext->mDTD->GetTokenizer(theTokenizer) : NS_OK;
++mMajorIteration;
nsITokenizer* theTokenizer=0;
nsresult result = (mParserContext->mDTD)? mParserContext->mDTD->GetTokenizer(theTokenizer):NS_OK;
if(theTokenizer){
PRBool flushTokens=PR_FALSE;
MOZ_TIMER_START(mTokenizeTime);
WillTokenize(aIsFinalChunk);
while(NS_SUCCEEDED(result)) {
mParserContext->mScanner->Mark();
++mMinorIteration;
result=theTokenizer->ConsumeToken(*mParserContext->mScanner,flushTokens);
if(NS_FAILED(result)) {
mParserContext->mScanner->RewindToMark();
if(kEOF==result){
break;
}
else if(NS_ERROR_HTMLPARSER_STOPPARSING==result) {
result=Terminate();
break;
}
if (theTokenizer){
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
// stack got handled ). Flush 'em now. Ref. bug 104856
if (theTokenizer->GetCount() == 0) {
mFlags &= ~NS_PARSER_FLAG_FLUSH_TOKENS; // reset since the tokens have been flushed.
}
else if(flushTokens && mObserversEnabled) {
// I added the extra test of mObserversEnabled to fix Bug# 23931.
// Flush tokens on seeing </SCRIPT> -- Ref: Bug# 22485 --
// Also remember to update the marked position.
}
else {
++mMajorIteration;
PRBool flushTokens=PR_FALSE;
MOZ_TIMER_START(mTokenizeTime);
WillTokenize(aIsFinalChunk);
while (NS_SUCCEEDED(result)) {
mParserContext->mScanner->Mark();
break;
}
}
DidTokenize(aIsFinalChunk);
++mMinorIteration;
result=theTokenizer->ConsumeToken(*mParserContext->mScanner, flushTokens);
if (NS_FAILED(result)) {
mParserContext->mScanner->RewindToMark();
if (kEOF == result){
break;
}
else if(NS_ERROR_HTMLPARSER_STOPPARSING==result) {
result = Terminate();
break;
}
}
else if (flushTokens && (mFlags & NS_PARSER_FLAG_OBSERVERS_ENABLED)) {
// I added the extra test of NS_PARSER_FLAG_OBSERVERS_ENABLED to fix Bug# 23931.
// Flush tokens on seeing </SCRIPT> -- Ref: Bug# 22485 --
// Also remember to update the marked position.
mFlags |= NS_PARSER_FLAG_FLUSH_TOKENS;
mParserContext->mScanner->Mark();
break;
}
}
DidTokenize(aIsFinalChunk);
MOZ_TIMER_STOP(mTokenizeTime);
}
else{
result=mInternalState=NS_ERROR_HTMLPARSER_BADTOKENIZER;
MOZ_TIMER_STOP(mTokenizeTime);
}
}
else{
result = mInternalState = NS_ERROR_HTMLPARSER_BADTOKENIZER;
}
return result;
}

View File

@@ -469,16 +469,14 @@ protected:
PRInt32 mMajorIteration;
PRInt32 mMinorIteration;
PRInt32 mCharsetSource;
PRUint16 mFlags;
nsString mUnusedInput;
nsString mCharset;
nsString mCommandStr;
PRPackedBool mDTDVerification;
PRPackedBool mParserEnabled;
PRPackedBool mObserversEnabled;
PRPackedBool mPendingContinueEvent;
PRPackedBool mCanInterrupt;
public:

View File

@@ -723,8 +723,8 @@ NS_IMETHODIMP CViewSourceHTML::DidBuildModel(nsresult anErrorCode,PRBool aNotify
* @param
* @return
*/
nsresult CViewSourceHTML::Terminate(nsIParser* aParser) {
return NS_ERROR_HTMLPARSER_STOPPARSING;
NS_IMETHODIMP_(void)
CViewSourceHTML::Terminate() {
}