diff --git a/mozilla/htmlparser/src/CNavDTD.cpp b/mozilla/htmlparser/src/CNavDTD.cpp
index 91535a08480..7f95a4a3327 100644
--- a/mozilla/htmlparser/src/CNavDTD.cpp
+++ b/mozilla/htmlparser/src/CNavDTD.cpp
@@ -87,9 +87,6 @@ static char gShowCRC;
# define START_TIMER()
#endif
-
-
-
/************************************************************************
And now for the main class -- CNavDTD...
************************************************************************/
@@ -159,6 +156,7 @@ CNavDTD::CNavDTD() : nsIDTD(), mMisplacedContent(0), mSkippedContent(0), mShared
mStyleHandlingEnabled=PR_TRUE;
mIsText=PR_FALSE;
mRequestedHead=PR_FALSE;
+ mIsFormContainer=PR_FALSE;
if(!gHTMLElements) {
InitializeElementTable();
@@ -1371,11 +1369,6 @@ nsresult CNavDTD::HandleStartToken(CToken* aToken) {
aToken->SetTypeID(theChildTag=eHTMLTag_img);
break;
- //case eHTMLTag_userdefined:
- case eHTMLTag_noscript: //HACK XXX! Throw noscript on the floor for now.
- isTokenHandled=PR_TRUE;
- break;
-
case eHTMLTag_script:
theHeadIsParent=((!mHasOpenBody) || mRequestedHead);
mHasOpenScript=PR_TRUE;
@@ -1387,7 +1380,17 @@ nsresult CNavDTD::HandleStartToken(CToken* aToken) {
if(!isTokenHandled) {
if(theHeadIsParent ||
(mHasOpenHead && ((eHTMLTag_newline==theChildTag) || (eHTMLTag_whitespace==theChildTag)))) {
- result=AddHeadLeaf(theNode);
+ //Ref. Bug 21008 -- Creating model for NOSCRIPT content
+ static eHTMLTags gNoXTags[]={eHTMLTag_noembed,eHTMLTag_noframes,eHTMLTag_nolayer,eHTMLTag_noscript};
+ if(FindTagInSet(theChildTag,gNoXTags,sizeof(gNoXTags)/sizeof(theChildTag))) {
+ result=OpenContainer(theNode,theChildTag,PR_TRUE);
+ }
+ else if(HasOpenContainer(gNoXTags,sizeof(gNoXTags)/sizeof(eHTMLTag_unknown))) {
+ result=AddLeaf(theNode);
+ }
+ else {
+ result=AddHeadLeaf(theNode);
+ }
}
else result=HandleDefaultStartToken(aToken,theChildTag,theNode);
}
@@ -1665,6 +1668,13 @@ nsresult CNavDTD::HandleSavedTokens(PRInt32 anIndex) {
PRInt32 theTopIndex = anIndex + 1;
PRInt32 theTagCount = mBodyContext->GetCount();
eHTMLTags theParentTag= mBodyContext->TagAt(anIndex);
+
+ //XXX In the content sink, FORM behaves as a container for parents
+ //other than eHTMLTag_table,eHTMLTag_tbody,eHTMLTag_tr,eHTMLTag_col,
+ //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(mHasOpenForm && mIsFormContainer) anIndex++;
STOP_TIMER()
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::HandleSavedTokensAbove(), this=%p\n", this));
@@ -1681,6 +1691,7 @@ nsresult CNavDTD::HandleSavedTokens(PRInt32 anIndex) {
mTempContext->Push((nsCParserNode*)mBodyContext->Pop(theChildStyleStack));
}
+ PRInt32 theIndex;
// Now flush out all the bad contents.
while(theBadTokenCount > 0){
theToken=(CToken*)mMisplacedContent.PopFront();
@@ -1694,9 +1705,12 @@ nsresult CNavDTD::HandleSavedTokens(PRInt32 anIndex) {
mTokenizer->PushTokenFront(theAttrToken);
}
}
+
// Make sure that the BeginContext() is ended only by the call to
- // EndContext().
- if(theTag!=theParentTag || eToken_end!=theToken->GetTokenType())
+ // EndContext(). Ref: Bug 25202
+ if(eToken_end==theToken->GetTokenType()) theIndex=mBodyContext->LastOf(theTag);
+
+ if(!(theIndex!=kNotFound && theIndex<=mBodyContext->mContextTopIndex))
result=HandleToken(theToken,mParser);
else mTokenRecycler->RecycleToken(theToken);
}
@@ -2187,7 +2201,10 @@ PRBool CNavDTD::CanOmit(eHTMLTags aParent,eHTMLTags aChild,PRBool& aParentContai
}
}
else if (!aParentContains) {
- return PR_TRUE;
+ if(!gHTMLElements[aChild].HasSpecialProperty(kBadContentWatch)) {
+ return PR_TRUE;
+ }
+ return PR_FALSE; // Ref. Bug 25658
}
}
@@ -2643,8 +2660,12 @@ nsresult CNavDTD::CloseBody(const nsIParserNode *aNode){
* @return TRUE if ok, FALSE if error
*/
nsresult CNavDTD::OpenForm(const nsIParserNode *aNode){
+ static eHTMLTags gTableElements[]={eHTMLTag_table,eHTMLTag_tbody,eHTMLTag_tr,eHTMLTag_col,
+ eHTMLTag_tfoot,eHTMLTag_thead,eHTMLTag_colgroup};
if(mHasOpenForm)
CloseForm(aNode);
+
+ mIsFormContainer=!(FindTagInSet(mBodyContext->Last(),gTableElements,sizeof(gTableElements)/sizeof(eHTMLTag_unknown)));
STOP_TIMER();
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::OpenForm(), this=%p\n", this));
@@ -2680,6 +2701,9 @@ nsresult CNavDTD::CloseForm(const nsIParserNode *aNode){
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::CloseForm(), this=%p\n", this));
START_TIMER();
+
+ if(mIsFormContainer)
+ mIsFormContainer=PR_FALSE;
}
return result;
@@ -3283,17 +3307,8 @@ nsresult CNavDTD::AddLeaf(const nsIParserNode *aNode){
nsresult CNavDTD::AddHeadLeaf(nsIParserNode *aNode){
nsresult result=NS_OK;
- static eHTMLTags gNoXTags[]={eHTMLTag_noembed,eHTMLTag_noframes,eHTMLTag_nolayer,eHTMLTag_noscript};
-
- //this code has been added to prevent tags from being processed inside
- //the document if the tag itself was found in a , , or