diff --git a/mozilla/htmlparser/src/CNavDTD.cpp b/mozilla/htmlparser/src/CNavDTD.cpp
index e578c7791d4..944a5c707f6 100644
--- a/mozilla/htmlparser/src/CNavDTD.cpp
+++ b/mozilla/htmlparser/src/CNavDTD.cpp
@@ -450,16 +450,19 @@ nsresult CNavDTD::BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer,nsIToke
if(mSink) {
if(!mBodyContext->GetCount()) {
- //if the content model is empty, then begin by opening ...
- CStartToken *theToken=(CStartToken*)mTokenRecycler->CreateTokenOfType(eToken_start,eHTMLTag_html,NS_ConvertToString("html"));
- HandleStartToken(theToken); //this token should get pushed on the context stack, don't recycle it.
-
+ CStartToken* theToken=nsnull;
if(ePlainText==mDocType) {
- //we do this little trick for text files, in both normal and viewsource mode...
- CStartToken *theToken2=(CStartToken*)mTokenRecycler->CreateTokenOfType(eToken_start,eHTMLTag_pre);
- HandleStartToken(theToken2);
+ //we do this little trick for text files, in both normal and viewsource mode...
+ theToken=(CStartToken*)mTokenRecycler->CreateTokenOfType(eToken_start,eHTMLTag_pre);
+ if(theToken) {
+ mTokenizer->PushTokenFront(theToken);
+ }
+ }
+ //if the content model is empty, then begin by opening ...
+ theToken=(CStartToken*)mTokenRecycler->CreateTokenOfType(eToken_start,eHTMLTag_html,NS_ConvertToString("html"));
+ if(theToken) {
+ mTokenizer->PushTokenFront(theToken); //this token should get pushed on the context stack.
}
-
}
while(NS_SUCCEEDED(result)){
@@ -524,6 +527,15 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse
result=HandleToken(theEndToken,mParser);
}
}
+ if(!mBodyContext->mHadDocTypeDecl) {
+ CToken* theDocTypeToken=mTokenRecycler->CreateTokenOfType(eToken_doctypeDecl,eHTMLTag_markupDecl);
+ if(theDocTypeToken) {
+ nsAutoString theDocTypeStr;
+ theDocTypeStr.AssignWithConversion("");
+ theDocTypeToken->Reinitialize(eHTMLTag_markupDecl,theDocTypeStr);
+ result=HandleToken(theDocTypeToken,mParser);
+ }
+ }
if(result==NS_OK) {
eHTMLTags theTarget;
@@ -2060,6 +2072,10 @@ nsresult CNavDTD::HandleDocTypeDeclToken(CToken* aToken){
nsresult result=NS_OK;
+ if(mBodyContext) {
+ mBodyContext->mHadDocTypeDecl=PR_TRUE;
+ }
+
#ifdef RICKG_DEBUG
WriteTokenToLog(aToken);
#endif
@@ -2542,7 +2558,8 @@ eHTMLTags CNavDTD::GetTopNode() const {
nsresult CNavDTD::OpenTransientStyles(eHTMLTags aChildTag){
nsresult result=NS_OK;
- if(mStyleHandlingEnabled && (eHTMLTag_newline!=aChildTag)) {
+ // No need to open transient styles in head context - Fix for 41427
+ if(mStyleHandlingEnabled && (eHTMLTag_newline!=aChildTag) && !mHasOpenHead) {
#ifdef ENABLE_RESIDUALSTYLE
diff --git a/mozilla/htmlparser/src/nsDTDUtils.cpp b/mozilla/htmlparser/src/nsDTDUtils.cpp
index 3f6872b4519..5e52917679c 100644
--- a/mozilla/htmlparser/src/nsDTDUtils.cpp
+++ b/mozilla/htmlparser/src/nsDTDUtils.cpp
@@ -371,6 +371,7 @@ nsDTDContext::nsDTDContext() : mStack(), mEntities(0){
mTableStates=0;
mHadBody=PR_FALSE;
mHadFrameset=PR_TRUE;
+ mHadDocTypeDecl=PR_FALSE;
ResetCounters();
#ifdef NS_DEBUG
diff --git a/mozilla/htmlparser/src/nsDTDUtils.h b/mozilla/htmlparser/src/nsDTDUtils.h
index de25793c90c..cecbafc6ab0 100644
--- a/mozilla/htmlparser/src/nsDTDUtils.h
+++ b/mozilla/htmlparser/src/nsDTDUtils.h
@@ -253,6 +253,7 @@ public:
PRInt32 mContextTopIndex;
PRBool mHadBody;
PRBool mHadFrameset;
+ PRBool mHadDocTypeDecl;
static CNodeRecycler* mNodeRecycler;
diff --git a/mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp b/mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp
index 89043f7b895..7167f5f2ba1 100644
--- a/mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp
+++ b/mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp
@@ -815,10 +815,21 @@ nsHTMLContentSinkStream::AddLeaf(const nsIParserNode& aNode)
if (mHTMLStackPos > 0)
tag = mHTMLTagStack[mHTMLStackPos-1];
- if (type == eHTMLTag_br ||
- type == eHTMLTag_hr ||
- type == eHTMLTag_meta ||
- type == eHTMLTag_style)
+ if (type == eHTMLTag_area ||
+ type == eHTMLTag_base ||
+ type == eHTMLTag_basefont ||
+ type == eHTMLTag_br ||
+ type == eHTMLTag_col ||
+ type == eHTMLTag_frame ||
+ type == eHTMLTag_hr ||
+ type == eHTMLTag_img ||
+ type == eHTMLTag_image ||
+ type == eHTMLTag_input ||
+ type == eHTMLTag_isindex ||
+ type == eHTMLTag_link ||
+ type == eHTMLTag_meta ||
+ type == eHTMLTag_param ||
+ type == eHTMLTag_sound)
{
AddStartTag(aNode);
mHTMLTagStack[--mHTMLStackPos] = eHTMLTag_unknown;
diff --git a/mozilla/htmlparser/src/nsHTMLTags.cpp b/mozilla/htmlparser/src/nsHTMLTags.cpp
index 14f18ae8433..af3848d568d 100644
--- a/mozilla/htmlparser/src/nsHTMLTags.cpp
+++ b/mozilla/htmlparser/src/nsHTMLTags.cpp
@@ -138,8 +138,9 @@ const nsCString&
nsHTMLTags::GetStringValue(nsHTMLTag aTag)
{
NS_ASSERTION(gTagArray, "no lookup table, needs addref");
+ // Note: NS_HTML_TAG_MAX=113
if ((eHTMLTag_unknown < aTag) &&
- (aTag < NS_HTML_TAG_MAX) && gTagArray) {
+ (aTag <= NS_HTML_TAG_MAX) && gTagArray) {
return gTagArray[aTag - 1].mStr;
}
else {
@@ -152,8 +153,9 @@ nsHTMLTags::GetStringValue(nsHTMLTag aTag)
const char* nsHTMLTags::GetCStringValue(nsHTMLTag aTag) {
NS_ASSERTION(gTagArray, "no lookup table, needs addref");
+ // Note: NS_HTML_TAG_MAX=113
if ((eHTMLTag_unknown < aTag) &&
- (aTag < NS_HTML_TAG_MAX) && gTagArray) {
+ (aTag <= NS_HTML_TAG_MAX) && gTagArray) {
return gTagArray[aTag - 1].mStr.mStr;
}
else {
diff --git a/mozilla/htmlparser/src/nsHTMLTags.h b/mozilla/htmlparser/src/nsHTMLTags.h
index d98163b9160..2b2d0ba8f88 100644
--- a/mozilla/htmlparser/src/nsHTMLTags.h
+++ b/mozilla/htmlparser/src/nsHTMLTags.h
@@ -48,6 +48,7 @@ enum nsHTMLTag {
};
#undef HTML_TAG
+// Currently there are 112 HTML tags. eHTMLTag_text = 114.
#define NS_HTML_TAG_MAX PRInt32(eHTMLTag_text - 1)
class NS_HTMLPARS nsHTMLTags {
diff --git a/mozilla/htmlparser/src/nsHTMLTokens.cpp b/mozilla/htmlparser/src/nsHTMLTokens.cpp
index bbfb7d2ca3c..4af9c2604b2 100644
--- a/mozilla/htmlparser/src/nsHTMLTokens.cpp
+++ b/mozilla/htmlparser/src/nsHTMLTokens.cpp
@@ -2094,10 +2094,21 @@ CDoctypeDeclToken::CDoctypeDeclToken(eHTMLTags aTag) : CHTMLToken(aTag) {
* @return
*/
nsresult CDoctypeDeclToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aMode) {
-
+
+ nsresult result =NS_OK;
+
+ nsString& theBuffer=aScanner.GetBuffer();
+ PRInt32 theCurrOffset=aScanner.GetOffset();
+ PRInt32 thePos=(aScanner.GetBuffer()).FindChar(kLessThan,PR_TRUE,theCurrOffset);
+
mTextValue.AssignWithConversion("-1) {
+ result=aScanner.ReadUntil(mTextValue,'<',PR_FALSE);
+ }
+ else {
+ result=aScanner.ReadUntil(mTextValue,'>',PR_TRUE);
+ }
return result;
}
diff --git a/mozilla/htmlparser/src/nsParser.cpp b/mozilla/htmlparser/src/nsParser.cpp
index 9cfa2f6093f..f8d69f431c3 100644
--- a/mozilla/htmlparser/src/nsParser.cpp
+++ b/mozilla/htmlparser/src/nsParser.cpp
@@ -658,7 +658,6 @@ void DetermineParseMode(nsString& aBuffer,nsDTDMode& aParseMode,eParserDocType&
}
else {
if(eDTDMode_unknown==aParseMode) {
- aBuffer.InsertWithConversion("\n",0);
aDocType=eHTML3Text;
aParseMode=eDTDMode_quirks;
}
@@ -1289,7 +1288,17 @@ aMimeType,PRBool aVerifyEnabled,PRBool aLastCall,nsDTDMode aMode){
pc->mMultipart |= pc->mPrevContext->mMultipart; //if available
}
- pc->mStreamListenerState = (pc->mMultipart) ? eOnDataAvail : eOnStop;
+ // start fix bug 40143
+ if(pc->mMultipart) {
+ pc->mStreamListenerState=eOnDataAvail;
+ if(pc->mScanner) pc->mScanner->SetIncremental(PR_TRUE);
+ }
+ else {
+ pc->mStreamListenerState=eOnStop;
+ if(pc->mScanner) pc->mScanner->SetIncremental(PR_FALSE);
+ }
+ // end fix for 40143
+
pc->mContextType=CParserContext::eCTString;
pc->SetMimeType(aMimeType);
mUnusedInput.Truncate(0);
diff --git a/mozilla/htmlparser/src/nsXIFDTD.cpp b/mozilla/htmlparser/src/nsXIFDTD.cpp
index 1799aa8cb31..e9df79eefec 100644
--- a/mozilla/htmlparser/src/nsXIFDTD.cpp
+++ b/mozilla/htmlparser/src/nsXIFDTD.cpp
@@ -944,9 +944,21 @@ PRBool nsXIFDTD::IsHTMLContainer(eHTMLTags aTag) const {
PRBool result=PR_TRUE; // by default everything is a container
switch(aTag) {
- case eHTMLTag_meta:
+ case eHTMLTag_area:
+ case eHTMLTag_base:
+ case eHTMLTag_basefont:
case eHTMLTag_br:
+ case eHTMLTag_col:
+ case eHTMLTag_frame:
case eHTMLTag_hr:
+ case eHTMLTag_img:
+ case eHTMLTag_image:
+ case eHTMLTag_input:
+ case eHTMLTag_isindex:
+ case eHTMLTag_link:
+ case eHTMLTag_meta:
+ case eHTMLTag_param:
+ case eHTMLTag_sound:
result=PR_FALSE;
break;
default:
diff --git a/mozilla/parser/htmlparser/src/CNavDTD.cpp b/mozilla/parser/htmlparser/src/CNavDTD.cpp
index e578c7791d4..944a5c707f6 100644
--- a/mozilla/parser/htmlparser/src/CNavDTD.cpp
+++ b/mozilla/parser/htmlparser/src/CNavDTD.cpp
@@ -450,16 +450,19 @@ nsresult CNavDTD::BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer,nsIToke
if(mSink) {
if(!mBodyContext->GetCount()) {
- //if the content model is empty, then begin by opening ...
- CStartToken *theToken=(CStartToken*)mTokenRecycler->CreateTokenOfType(eToken_start,eHTMLTag_html,NS_ConvertToString("html"));
- HandleStartToken(theToken); //this token should get pushed on the context stack, don't recycle it.
-
+ CStartToken* theToken=nsnull;
if(ePlainText==mDocType) {
- //we do this little trick for text files, in both normal and viewsource mode...
- CStartToken *theToken2=(CStartToken*)mTokenRecycler->CreateTokenOfType(eToken_start,eHTMLTag_pre);
- HandleStartToken(theToken2);
+ //we do this little trick for text files, in both normal and viewsource mode...
+ theToken=(CStartToken*)mTokenRecycler->CreateTokenOfType(eToken_start,eHTMLTag_pre);
+ if(theToken) {
+ mTokenizer->PushTokenFront(theToken);
+ }
+ }
+ //if the content model is empty, then begin by opening ...
+ theToken=(CStartToken*)mTokenRecycler->CreateTokenOfType(eToken_start,eHTMLTag_html,NS_ConvertToString("html"));
+ if(theToken) {
+ mTokenizer->PushTokenFront(theToken); //this token should get pushed on the context stack.
}
-
}
while(NS_SUCCEEDED(result)){
@@ -524,6 +527,15 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse
result=HandleToken(theEndToken,mParser);
}
}
+ if(!mBodyContext->mHadDocTypeDecl) {
+ CToken* theDocTypeToken=mTokenRecycler->CreateTokenOfType(eToken_doctypeDecl,eHTMLTag_markupDecl);
+ if(theDocTypeToken) {
+ nsAutoString theDocTypeStr;
+ theDocTypeStr.AssignWithConversion("");
+ theDocTypeToken->Reinitialize(eHTMLTag_markupDecl,theDocTypeStr);
+ result=HandleToken(theDocTypeToken,mParser);
+ }
+ }
if(result==NS_OK) {
eHTMLTags theTarget;
@@ -2060,6 +2072,10 @@ nsresult CNavDTD::HandleDocTypeDeclToken(CToken* aToken){
nsresult result=NS_OK;
+ if(mBodyContext) {
+ mBodyContext->mHadDocTypeDecl=PR_TRUE;
+ }
+
#ifdef RICKG_DEBUG
WriteTokenToLog(aToken);
#endif
@@ -2542,7 +2558,8 @@ eHTMLTags CNavDTD::GetTopNode() const {
nsresult CNavDTD::OpenTransientStyles(eHTMLTags aChildTag){
nsresult result=NS_OK;
- if(mStyleHandlingEnabled && (eHTMLTag_newline!=aChildTag)) {
+ // No need to open transient styles in head context - Fix for 41427
+ if(mStyleHandlingEnabled && (eHTMLTag_newline!=aChildTag) && !mHasOpenHead) {
#ifdef ENABLE_RESIDUALSTYLE
diff --git a/mozilla/parser/htmlparser/src/nsDTDUtils.cpp b/mozilla/parser/htmlparser/src/nsDTDUtils.cpp
index 3f6872b4519..5e52917679c 100644
--- a/mozilla/parser/htmlparser/src/nsDTDUtils.cpp
+++ b/mozilla/parser/htmlparser/src/nsDTDUtils.cpp
@@ -371,6 +371,7 @@ nsDTDContext::nsDTDContext() : mStack(), mEntities(0){
mTableStates=0;
mHadBody=PR_FALSE;
mHadFrameset=PR_TRUE;
+ mHadDocTypeDecl=PR_FALSE;
ResetCounters();
#ifdef NS_DEBUG
diff --git a/mozilla/parser/htmlparser/src/nsDTDUtils.h b/mozilla/parser/htmlparser/src/nsDTDUtils.h
index de25793c90c..cecbafc6ab0 100644
--- a/mozilla/parser/htmlparser/src/nsDTDUtils.h
+++ b/mozilla/parser/htmlparser/src/nsDTDUtils.h
@@ -253,6 +253,7 @@ public:
PRInt32 mContextTopIndex;
PRBool mHadBody;
PRBool mHadFrameset;
+ PRBool mHadDocTypeDecl;
static CNodeRecycler* mNodeRecycler;
diff --git a/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.cpp b/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.cpp
index 89043f7b895..7167f5f2ba1 100644
--- a/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.cpp
+++ b/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.cpp
@@ -815,10 +815,21 @@ nsHTMLContentSinkStream::AddLeaf(const nsIParserNode& aNode)
if (mHTMLStackPos > 0)
tag = mHTMLTagStack[mHTMLStackPos-1];
- if (type == eHTMLTag_br ||
- type == eHTMLTag_hr ||
- type == eHTMLTag_meta ||
- type == eHTMLTag_style)
+ if (type == eHTMLTag_area ||
+ type == eHTMLTag_base ||
+ type == eHTMLTag_basefont ||
+ type == eHTMLTag_br ||
+ type == eHTMLTag_col ||
+ type == eHTMLTag_frame ||
+ type == eHTMLTag_hr ||
+ type == eHTMLTag_img ||
+ type == eHTMLTag_image ||
+ type == eHTMLTag_input ||
+ type == eHTMLTag_isindex ||
+ type == eHTMLTag_link ||
+ type == eHTMLTag_meta ||
+ type == eHTMLTag_param ||
+ type == eHTMLTag_sound)
{
AddStartTag(aNode);
mHTMLTagStack[--mHTMLStackPos] = eHTMLTag_unknown;
diff --git a/mozilla/parser/htmlparser/src/nsHTMLTags.cpp b/mozilla/parser/htmlparser/src/nsHTMLTags.cpp
index 14f18ae8433..af3848d568d 100644
--- a/mozilla/parser/htmlparser/src/nsHTMLTags.cpp
+++ b/mozilla/parser/htmlparser/src/nsHTMLTags.cpp
@@ -138,8 +138,9 @@ const nsCString&
nsHTMLTags::GetStringValue(nsHTMLTag aTag)
{
NS_ASSERTION(gTagArray, "no lookup table, needs addref");
+ // Note: NS_HTML_TAG_MAX=113
if ((eHTMLTag_unknown < aTag) &&
- (aTag < NS_HTML_TAG_MAX) && gTagArray) {
+ (aTag <= NS_HTML_TAG_MAX) && gTagArray) {
return gTagArray[aTag - 1].mStr;
}
else {
@@ -152,8 +153,9 @@ nsHTMLTags::GetStringValue(nsHTMLTag aTag)
const char* nsHTMLTags::GetCStringValue(nsHTMLTag aTag) {
NS_ASSERTION(gTagArray, "no lookup table, needs addref");
+ // Note: NS_HTML_TAG_MAX=113
if ((eHTMLTag_unknown < aTag) &&
- (aTag < NS_HTML_TAG_MAX) && gTagArray) {
+ (aTag <= NS_HTML_TAG_MAX) && gTagArray) {
return gTagArray[aTag - 1].mStr.mStr;
}
else {
diff --git a/mozilla/parser/htmlparser/src/nsHTMLTags.h b/mozilla/parser/htmlparser/src/nsHTMLTags.h
index d98163b9160..2b2d0ba8f88 100644
--- a/mozilla/parser/htmlparser/src/nsHTMLTags.h
+++ b/mozilla/parser/htmlparser/src/nsHTMLTags.h
@@ -48,6 +48,7 @@ enum nsHTMLTag {
};
#undef HTML_TAG
+// Currently there are 112 HTML tags. eHTMLTag_text = 114.
#define NS_HTML_TAG_MAX PRInt32(eHTMLTag_text - 1)
class NS_HTMLPARS nsHTMLTags {
diff --git a/mozilla/parser/htmlparser/src/nsHTMLTokens.cpp b/mozilla/parser/htmlparser/src/nsHTMLTokens.cpp
index bbfb7d2ca3c..4af9c2604b2 100644
--- a/mozilla/parser/htmlparser/src/nsHTMLTokens.cpp
+++ b/mozilla/parser/htmlparser/src/nsHTMLTokens.cpp
@@ -2094,10 +2094,21 @@ CDoctypeDeclToken::CDoctypeDeclToken(eHTMLTags aTag) : CHTMLToken(aTag) {
* @return
*/
nsresult CDoctypeDeclToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aMode) {
-
+
+ nsresult result =NS_OK;
+
+ nsString& theBuffer=aScanner.GetBuffer();
+ PRInt32 theCurrOffset=aScanner.GetOffset();
+ PRInt32 thePos=(aScanner.GetBuffer()).FindChar(kLessThan,PR_TRUE,theCurrOffset);
+
mTextValue.AssignWithConversion("-1) {
+ result=aScanner.ReadUntil(mTextValue,'<',PR_FALSE);
+ }
+ else {
+ result=aScanner.ReadUntil(mTextValue,'>',PR_TRUE);
+ }
return result;
}
diff --git a/mozilla/parser/htmlparser/src/nsParser.cpp b/mozilla/parser/htmlparser/src/nsParser.cpp
index 9cfa2f6093f..f8d69f431c3 100644
--- a/mozilla/parser/htmlparser/src/nsParser.cpp
+++ b/mozilla/parser/htmlparser/src/nsParser.cpp
@@ -658,7 +658,6 @@ void DetermineParseMode(nsString& aBuffer,nsDTDMode& aParseMode,eParserDocType&
}
else {
if(eDTDMode_unknown==aParseMode) {
- aBuffer.InsertWithConversion("\n",0);
aDocType=eHTML3Text;
aParseMode=eDTDMode_quirks;
}
@@ -1289,7 +1288,17 @@ aMimeType,PRBool aVerifyEnabled,PRBool aLastCall,nsDTDMode aMode){
pc->mMultipart |= pc->mPrevContext->mMultipart; //if available
}
- pc->mStreamListenerState = (pc->mMultipart) ? eOnDataAvail : eOnStop;
+ // start fix bug 40143
+ if(pc->mMultipart) {
+ pc->mStreamListenerState=eOnDataAvail;
+ if(pc->mScanner) pc->mScanner->SetIncremental(PR_TRUE);
+ }
+ else {
+ pc->mStreamListenerState=eOnStop;
+ if(pc->mScanner) pc->mScanner->SetIncremental(PR_FALSE);
+ }
+ // end fix for 40143
+
pc->mContextType=CParserContext::eCTString;
pc->SetMimeType(aMimeType);
mUnusedInput.Truncate(0);
diff --git a/mozilla/parser/htmlparser/src/nsXIFDTD.cpp b/mozilla/parser/htmlparser/src/nsXIFDTD.cpp
index 1799aa8cb31..e9df79eefec 100644
--- a/mozilla/parser/htmlparser/src/nsXIFDTD.cpp
+++ b/mozilla/parser/htmlparser/src/nsXIFDTD.cpp
@@ -944,9 +944,21 @@ PRBool nsXIFDTD::IsHTMLContainer(eHTMLTags aTag) const {
PRBool result=PR_TRUE; // by default everything is a container
switch(aTag) {
- case eHTMLTag_meta:
+ case eHTMLTag_area:
+ case eHTMLTag_base:
+ case eHTMLTag_basefont:
case eHTMLTag_br:
+ case eHTMLTag_col:
+ case eHTMLTag_frame:
case eHTMLTag_hr:
+ case eHTMLTag_img:
+ case eHTMLTag_image:
+ case eHTMLTag_input:
+ case eHTMLTag_isindex:
+ case eHTMLTag_link:
+ case eHTMLTag_meta:
+ case eHTMLTag_param:
+ case eHTMLTag_sound:
result=PR_FALSE;
break;
default: