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:
@@ -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 ;\
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -360,7 +360,6 @@ protected:
|
||||
eParserCommands mParserCommand; //tells us to viewcontent/viewsource/viewerrors...
|
||||
|
||||
eHTMLTags mSkipTarget;
|
||||
nsresult mDTDState;
|
||||
PRInt32 mLineNumber;
|
||||
PRInt32 mOpenHeadCount;
|
||||
PRInt32 mOpenMapCount;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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 ***************************************/
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
|
||||
@@ -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() {
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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 ;\
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -360,7 +360,6 @@ protected:
|
||||
eParserCommands mParserCommand; //tells us to viewcontent/viewsource/viewerrors...
|
||||
|
||||
eHTMLTags mSkipTarget;
|
||||
nsresult mDTDState;
|
||||
PRInt32 mLineNumber;
|
||||
PRInt32 mOpenHeadCount;
|
||||
PRInt32 mOpenMapCount;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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 ***************************************/
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
|
||||
@@ -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() {
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user