diff --git a/mozilla/htmlparser/src/CNavDTD.cpp b/mozilla/htmlparser/src/CNavDTD.cpp
index 88dc292738d..78b7115204d 100644
--- a/mozilla/htmlparser/src/CNavDTD.cpp
+++ b/mozilla/htmlparser/src/CNavDTD.cpp
@@ -1128,8 +1128,8 @@ nsresult CNavDTD::WillHandleStartTag(CToken* aToken,eHTMLTags aTag,nsCParserNode
if(theService) {
CParserContext* pc=mParser->PeekContext();
void* theDocID=(pc)? pc->mKey:0;
-
- result=theService->Notify(aTag,aNode,(PRUint32)theDocID, NS_ConvertToString(kHTMLTextContentType), mParser);
+
+ result=theService->Notify(aTag,aNode,theDocID, NS_ConvertToString(kHTMLTextContentType), mParser);
}
}
@@ -1334,12 +1334,12 @@ nsresult CNavDTD::HandleStartToken(CToken* aToken) {
if(nsHTMLElement::IsSectionTag(theChildTag)){
switch(theChildTag){
- /*case eHTMLTag_html:
+ case eHTMLTag_html:
if(mBodyContext->GetCount()>0) {
result=OpenContainer(theNode,theChildTag,PR_FALSE);
isTokenHandled=PR_TRUE;
}
- break;*/
+ break;
case eHTMLTag_body:
if(mHasOpenBody) {
result=OpenContainer(theNode,theChildTag,PR_FALSE);
@@ -2561,7 +2561,7 @@ nsresult CNavDTD::OpenHTML(const nsIParserNode *aNode){
START_TIMER();
// Don't push more than one HTML tag into the stack...
- //if(mBodyContext->GetCount()==0)
+ if(mBodyContext->GetCount()==0)
mBodyContext->Push(aNode);
return result;
diff --git a/mozilla/htmlparser/src/COtherDTD.cpp b/mozilla/htmlparser/src/COtherDTD.cpp
index b6c4b8f2fa5..0504c20f150 100644
--- a/mozilla/htmlparser/src/COtherDTD.cpp
+++ b/mozilla/htmlparser/src/COtherDTD.cpp
@@ -1204,7 +1204,7 @@ nsresult COtherDTD::WillHandleStartTag(CToken* aToken,eHTMLTags aTag,nsCParserNo
CParserContext* pc=mParser->PeekContext();
void* theDocID=(pc)? pc->mKey:0;
- result=theService->Notify(aTag,aNode,(PRUint32)theDocID, NS_ConvertToString(kHTMLTextContentType), mParser);
+ result=theService->Notify(aTag,aNode,theDocID, NS_ConvertToString(kHTMLTextContentType), mParser);
}
}
diff --git a/mozilla/htmlparser/src/nsDTDUtils.cpp b/mozilla/htmlparser/src/nsDTDUtils.cpp
index fdf03e1ee37..14372b763bc 100644
--- a/mozilla/htmlparser/src/nsDTDUtils.cpp
+++ b/mozilla/htmlparser/src/nsDTDUtils.cpp
@@ -899,8 +899,14 @@ public:
registering tags.
**************************************************************/
-nsObserverTopic::nsObserverTopic(const nsString& aTopic) : mTopic(aTopic){
- nsCRT::zero(mObservers,sizeof(mObservers));
+nsObserverTopic::nsObserverTopic(const nsString& aTopic) : mTopic(aTopic),
+ mKeys(0),
+ mValues(0) {
+
+ nsCRT::zero(mObservers,sizeof(mObservers));
+ mCharsetKey.AssignWithConversion("charset");
+ mSourceKey.AssignWithConversion("charsetSource");
+ mDTDKey.AssignWithConversion("X_COMMAND");
}
nsObserverTopic::~nsObserverTopic() {
@@ -951,7 +957,7 @@ void nsObserverTopic::RegisterObserverForTag(nsIElementObserver *anObserver,eHTM
* @param aCharsetSource -
* @return if SUCCESS return NS_OK else return ERROR code.
*/
-nsresult nsObserverTopic::Notify(eHTMLTags aTag,nsIParserNode& aNode,PRUint32 aUniqueID,nsIParser* aParser) {
+nsresult nsObserverTopic::Notify(eHTMLTags aTag,nsIParserNode& aNode,void* aUniqueID,nsIParser* aParser) {
nsresult result=NS_OK;
nsDeque* theDeque=GetObserversForTag(aTag);
@@ -964,44 +970,31 @@ nsresult nsObserverTopic::Notify(eHTMLTags aTag,nsIParserNode& aNode,PRUint32 aU
PRInt32 theAttrCount =aNode.GetAttributeCount();
PRUint32 theDequeSize=theDeque->GetSize();
if(0=47) index=47; //XXX HACK HACK HACK!!!!!
- //We really need to do a better job with attributes here.
+ mKeys.Push((PRUnichar*)mCharsetKey.GetUnicode());
+ mValues.Push((PRUnichar*)theCharsetValue.GetUnicode());
+
+
+ mKeys.Push((PRUnichar*)mSourceKey.GetUnicode());
+ intValue.Append(PRInt32(theCharsetSource),10);
+ mValues.Push((PRUnichar*)intValue.GetUnicode());
+ mKeys.Push((PRUnichar*)mDTDKey.GetUnicode());
+ mValues.Push((PRUnichar*)mTopic.GetUnicode());
- if(index < 50) {
- theKeys[index]=theCharsetKey.GetUnicode();
- theValues[index] = theCharsetValue.GetUnicode();
- index++;
- }
- if(index < 50) {
- theKeys[index]=theSourceKey.GetUnicode();
- PRInt32 sourceInt = theCharsetSource;
- intValue.AppendWithConversion(sourceInt,10);
- theValues[index] = intValue.GetUnicode();
- index++;
- }
- nsAutoString theDTDKey; theDTDKey.AssignWithConversion("X_COMMAND");
- // nsAutoString theDTDValue(aCommand);
- if(index < 50) {
- theKeys[index]=theDTDKey.GetUnicode();
- theValues[index]=mTopic.GetUnicode();
- index++;
- }
nsAutoString theTagStr(nsHTMLTags::GetStringValue(aTag));
- nsObserverNotifier theNotifier(theTagStr.GetUnicode(),aUniqueID,index,theKeys,theValues);
+ nsObserverNotifier theNotifier(theTagStr.GetUnicode(),(nsISupports*)aUniqueID,&mKeys,&mValues);
theDeque->FirstThat(theNotifier);
result=theNotifier.mResult;
}//if
@@ -1145,7 +1138,7 @@ void CObserverService::UnregisterObservers(const nsString& aTopic) {
*/
nsresult CObserverService::Notify( eHTMLTags aTag,
nsIParserNode& aNode,
- PRUint32 aUniqueID,
+ void* aUniqueID,
const nsString& aTopic,
nsIParser* aParser) {
nsresult result=NS_OK;
diff --git a/mozilla/htmlparser/src/nsDTDUtils.h b/mozilla/htmlparser/src/nsDTDUtils.h
index 20916d062fb..db599941107 100644
--- a/mozilla/htmlparser/src/nsDTDUtils.h
+++ b/mozilla/htmlparser/src/nsDTDUtils.h
@@ -301,9 +301,14 @@ public:
PRBool Matches(const nsString& aTopic);
void RegisterObserverForTag(nsIElementObserver *anObserver,eHTMLTags aTag);
nsDeque* GetObserversForTag(eHTMLTags aTag);
- nsresult Notify(eHTMLTags aTag,nsIParserNode& aNode,PRUint32 aUniqueID,nsIParser* aParser);
+ nsresult Notify(eHTMLTags aTag,nsIParserNode& aNode,void* aUniqueID,nsIParser* aParser);
nsString mTopic;
+ nsDeque mKeys;
+ nsDeque mValues;
+ nsString mCharsetKey;
+ nsString mSourceKey;
+ nsString mDTDKey;
nsDeque* mObservers[NS_HTML_TAG_MAX + 1];
};
@@ -322,7 +327,7 @@ public:
nsDeque* GetObserversForTagInTopic(eHTMLTags aTag,const nsString& aTopic);
nsresult Notify( eHTMLTags aTag,
nsIParserNode& aNode,
- PRUint32 aUniqueID,
+ void* aUniqueID,
const nsString& aTopic,
nsIParser* aParser);
nsObserverTopic* GetTopic(const nsString& aTopic);
@@ -339,9 +344,8 @@ protected:
**************************************************************/
class nsObserverNotifier: public nsDequeFunctor{
public:
- nsObserverNotifier(const PRUnichar* aTagName,PRUint32 aUniqueKey,PRUint32 aCount=0,
- const PRUnichar** aKeys=nsnull,const PRUnichar** aValues=nsnull){
- mCount=aCount;
+ nsObserverNotifier(const PRUnichar* aTagName,nsISupports* aUniqueKey,
+ const nsDeque* aKeys=0,const nsDeque* aValues=0){
mKeys=aKeys;
mValues=aValues;
mUniqueKey=aUniqueKey;
@@ -351,19 +355,18 @@ public:
virtual void* operator()(void* anObject) {
nsIElementObserver* theObserver= (nsIElementObserver*)anObject;
if(theObserver) {
- mResult = theObserver->Notify(mUniqueKey,mTagName,mCount,mKeys,mValues);
+ mResult = theObserver->Notify(mUniqueKey,mTagName,mKeys,mValues);
}
if(NS_OK==mResult)
return 0;
return anObject;
}
- const PRUnichar** mKeys;
- const PRUnichar** mValues;
- PRUint32 mCount;
- PRUint32 mUniqueKey;
- nsresult mResult;
+ const nsDeque* mKeys;
+ const nsDeque* mValues;
const PRUnichar* mTagName;
+ nsISupports* mUniqueKey;
+ nsresult mResult;
};
diff --git a/mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp b/mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp
index 9d9e6990e84..652e867b622 100644
--- a/mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp
+++ b/mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp
@@ -128,6 +128,7 @@ nsHTMLContentSinkStream::nsHTMLContentSinkStream()
mBufferSize = 0;
mBufferLength = 0;
mFlags = 0;
+ mHasOpenHtmlTag=PR_FALSE;
}
NS_IMETHODIMP
@@ -512,14 +513,21 @@ nsHTMLContentSinkStream::OpenHTML(const nsIParserNode& aNode)
eHTMLTags tag = (eHTMLTags)aNode.GetNodeType();
if (tag == eHTMLTag_html)
{
- // See bug 20246: the html tag doesn't have "html" in its text,
- // so AddStartTag will do the wrong thing
- Write(kLessThan);
-
- nsString temp; temp.AssignWithConversion(nsHTMLTags::GetStringValue(tag));
- nsAutoCString tagname(temp);
- Write(tagname);
- Write(kGreaterThan);
+ if(!mHasOpenHtmlTag) {
+ AddStartTag(aNode);
+ mHasOpenHtmlTag=PR_TRUE;
+ }
+ else {
+ PRInt32 ac=aNode.GetAttributeCount();
+ if(ac>0) {
+ Write(kLessThan);
+ nsAutoString tagname;
+ tagname.AssignWithConversion(nsHTMLTags::GetStringValue(tag));
+ Write(tagname);
+ WriteAttributes(aNode);
+ Write(kGreaterThan);
+ }
+ }
}
return NS_OK;
}
diff --git a/mozilla/htmlparser/src/nsHTMLContentSinkStream.h b/mozilla/htmlparser/src/nsHTMLContentSinkStream.h
index b244ba595f6..9d8dbf28c99 100644
--- a/mozilla/htmlparser/src/nsHTMLContentSinkStream.h
+++ b/mozilla/htmlparser/src/nsHTMLContentSinkStream.h
@@ -191,6 +191,7 @@ protected:
PRBool mDoFormat;
PRBool mDoHeader;
PRBool mBodyOnly;
+ PRBool mHasOpenHtmlTag;
PRInt32 mMaxColumn;
diff --git a/mozilla/htmlparser/src/nsIElementObserver.h b/mozilla/htmlparser/src/nsIElementObserver.h
index 9c60756c0b2..b047970f60c 100644
--- a/mozilla/htmlparser/src/nsIElementObserver.h
+++ b/mozilla/htmlparser/src/nsIElementObserver.h
@@ -33,6 +33,7 @@
#include "nsISupports.h"
#include "prtypes.h"
#include "nsHTMLTokens.h"
+#include "nsDeque.h"
// {4672AA04-F6AE-11d2-B3B7-00805F8A6670}
@@ -64,6 +65,9 @@ public:
NS_IMETHOD Notify(PRUint32 aDocumentID, const PRUnichar* aTag,
PRUint32 numOfAttributes, const PRUnichar* nameArray[],
const PRUnichar* valueArray[]) = 0;
+
+ NS_IMETHOD Notify(nsISupports* aDocumentID, const PRUnichar* aTag,
+ const nsDeque* aKeys, const nsDeque* aValues) = 0;
};
diff --git a/mozilla/htmlparser/src/nsParser.cpp b/mozilla/htmlparser/src/nsParser.cpp
index e68f2867e98..e203af7acba 100644
--- a/mozilla/htmlparser/src/nsParser.cpp
+++ b/mozilla/htmlparser/src/nsParser.cpp
@@ -997,7 +997,7 @@ aMimeType,PRBool aVerifyEnabled,PRBool aLastCall,eParseMode aMode){
NS_RELEASE(me);
return NS_ERROR_OUT_OF_MEMORY;
}
-
+ NS_IF_RELEASE(theDTD);
}
else {
mParserContext->mScanner->Append(aSourceBuffer);
diff --git a/mozilla/htmlparser/src/nsViewSourceHTML.cpp b/mozilla/htmlparser/src/nsViewSourceHTML.cpp
index d39081e4e2b..bd036e6da8d 100644
--- a/mozilla/htmlparser/src/nsViewSourceHTML.cpp
+++ b/mozilla/htmlparser/src/nsViewSourceHTML.cpp
@@ -902,7 +902,7 @@ NS_IMETHODIMP CViewSourceHTML::HandleToken(CToken* aToken,nsIParser* aParser) {
void* theDocID=(pc)? pc->mKey:0;
eHTMLTags theTag=(eHTMLTags)theToken->GetTypeID();
- result=theService->Notify(theTag,theContext.mTokenNode,(PRUint32)theDocID, NS_ConvertToString(kViewSourceCommand), mParser);
+ result=theService->Notify(theTag,theContext.mTokenNode,theDocID, NS_ConvertToString(kViewSourceCommand), mParser);
}
}
theContext.mTokenNode.Init(0,0,gTokenRecycler); //now recycle.
diff --git a/mozilla/parser/htmlparser/src/CNavDTD.cpp b/mozilla/parser/htmlparser/src/CNavDTD.cpp
index 88dc292738d..78b7115204d 100644
--- a/mozilla/parser/htmlparser/src/CNavDTD.cpp
+++ b/mozilla/parser/htmlparser/src/CNavDTD.cpp
@@ -1128,8 +1128,8 @@ nsresult CNavDTD::WillHandleStartTag(CToken* aToken,eHTMLTags aTag,nsCParserNode
if(theService) {
CParserContext* pc=mParser->PeekContext();
void* theDocID=(pc)? pc->mKey:0;
-
- result=theService->Notify(aTag,aNode,(PRUint32)theDocID, NS_ConvertToString(kHTMLTextContentType), mParser);
+
+ result=theService->Notify(aTag,aNode,theDocID, NS_ConvertToString(kHTMLTextContentType), mParser);
}
}
@@ -1334,12 +1334,12 @@ nsresult CNavDTD::HandleStartToken(CToken* aToken) {
if(nsHTMLElement::IsSectionTag(theChildTag)){
switch(theChildTag){
- /*case eHTMLTag_html:
+ case eHTMLTag_html:
if(mBodyContext->GetCount()>0) {
result=OpenContainer(theNode,theChildTag,PR_FALSE);
isTokenHandled=PR_TRUE;
}
- break;*/
+ break;
case eHTMLTag_body:
if(mHasOpenBody) {
result=OpenContainer(theNode,theChildTag,PR_FALSE);
@@ -2561,7 +2561,7 @@ nsresult CNavDTD::OpenHTML(const nsIParserNode *aNode){
START_TIMER();
// Don't push more than one HTML tag into the stack...
- //if(mBodyContext->GetCount()==0)
+ if(mBodyContext->GetCount()==0)
mBodyContext->Push(aNode);
return result;
diff --git a/mozilla/parser/htmlparser/src/COtherDTD.cpp b/mozilla/parser/htmlparser/src/COtherDTD.cpp
index b6c4b8f2fa5..0504c20f150 100644
--- a/mozilla/parser/htmlparser/src/COtherDTD.cpp
+++ b/mozilla/parser/htmlparser/src/COtherDTD.cpp
@@ -1204,7 +1204,7 @@ nsresult COtherDTD::WillHandleStartTag(CToken* aToken,eHTMLTags aTag,nsCParserNo
CParserContext* pc=mParser->PeekContext();
void* theDocID=(pc)? pc->mKey:0;
- result=theService->Notify(aTag,aNode,(PRUint32)theDocID, NS_ConvertToString(kHTMLTextContentType), mParser);
+ result=theService->Notify(aTag,aNode,theDocID, NS_ConvertToString(kHTMLTextContentType), mParser);
}
}
diff --git a/mozilla/parser/htmlparser/src/nsDTDUtils.cpp b/mozilla/parser/htmlparser/src/nsDTDUtils.cpp
index fdf03e1ee37..14372b763bc 100644
--- a/mozilla/parser/htmlparser/src/nsDTDUtils.cpp
+++ b/mozilla/parser/htmlparser/src/nsDTDUtils.cpp
@@ -899,8 +899,14 @@ public:
registering tags.
**************************************************************/
-nsObserverTopic::nsObserverTopic(const nsString& aTopic) : mTopic(aTopic){
- nsCRT::zero(mObservers,sizeof(mObservers));
+nsObserverTopic::nsObserverTopic(const nsString& aTopic) : mTopic(aTopic),
+ mKeys(0),
+ mValues(0) {
+
+ nsCRT::zero(mObservers,sizeof(mObservers));
+ mCharsetKey.AssignWithConversion("charset");
+ mSourceKey.AssignWithConversion("charsetSource");
+ mDTDKey.AssignWithConversion("X_COMMAND");
}
nsObserverTopic::~nsObserverTopic() {
@@ -951,7 +957,7 @@ void nsObserverTopic::RegisterObserverForTag(nsIElementObserver *anObserver,eHTM
* @param aCharsetSource -
* @return if SUCCESS return NS_OK else return ERROR code.
*/
-nsresult nsObserverTopic::Notify(eHTMLTags aTag,nsIParserNode& aNode,PRUint32 aUniqueID,nsIParser* aParser) {
+nsresult nsObserverTopic::Notify(eHTMLTags aTag,nsIParserNode& aNode,void* aUniqueID,nsIParser* aParser) {
nsresult result=NS_OK;
nsDeque* theDeque=GetObserversForTag(aTag);
@@ -964,44 +970,31 @@ nsresult nsObserverTopic::Notify(eHTMLTags aTag,nsIParserNode& aNode,PRUint32 aU
PRInt32 theAttrCount =aNode.GetAttributeCount();
PRUint32 theDequeSize=theDeque->GetSize();
if(0=47) index=47; //XXX HACK HACK HACK!!!!!
- //We really need to do a better job with attributes here.
+ mKeys.Push((PRUnichar*)mCharsetKey.GetUnicode());
+ mValues.Push((PRUnichar*)theCharsetValue.GetUnicode());
+
+
+ mKeys.Push((PRUnichar*)mSourceKey.GetUnicode());
+ intValue.Append(PRInt32(theCharsetSource),10);
+ mValues.Push((PRUnichar*)intValue.GetUnicode());
+ mKeys.Push((PRUnichar*)mDTDKey.GetUnicode());
+ mValues.Push((PRUnichar*)mTopic.GetUnicode());
- if(index < 50) {
- theKeys[index]=theCharsetKey.GetUnicode();
- theValues[index] = theCharsetValue.GetUnicode();
- index++;
- }
- if(index < 50) {
- theKeys[index]=theSourceKey.GetUnicode();
- PRInt32 sourceInt = theCharsetSource;
- intValue.AppendWithConversion(sourceInt,10);
- theValues[index] = intValue.GetUnicode();
- index++;
- }
- nsAutoString theDTDKey; theDTDKey.AssignWithConversion("X_COMMAND");
- // nsAutoString theDTDValue(aCommand);
- if(index < 50) {
- theKeys[index]=theDTDKey.GetUnicode();
- theValues[index]=mTopic.GetUnicode();
- index++;
- }
nsAutoString theTagStr(nsHTMLTags::GetStringValue(aTag));
- nsObserverNotifier theNotifier(theTagStr.GetUnicode(),aUniqueID,index,theKeys,theValues);
+ nsObserverNotifier theNotifier(theTagStr.GetUnicode(),(nsISupports*)aUniqueID,&mKeys,&mValues);
theDeque->FirstThat(theNotifier);
result=theNotifier.mResult;
}//if
@@ -1145,7 +1138,7 @@ void CObserverService::UnregisterObservers(const nsString& aTopic) {
*/
nsresult CObserverService::Notify( eHTMLTags aTag,
nsIParserNode& aNode,
- PRUint32 aUniqueID,
+ void* aUniqueID,
const nsString& aTopic,
nsIParser* aParser) {
nsresult result=NS_OK;
diff --git a/mozilla/parser/htmlparser/src/nsDTDUtils.h b/mozilla/parser/htmlparser/src/nsDTDUtils.h
index 20916d062fb..db599941107 100644
--- a/mozilla/parser/htmlparser/src/nsDTDUtils.h
+++ b/mozilla/parser/htmlparser/src/nsDTDUtils.h
@@ -301,9 +301,14 @@ public:
PRBool Matches(const nsString& aTopic);
void RegisterObserverForTag(nsIElementObserver *anObserver,eHTMLTags aTag);
nsDeque* GetObserversForTag(eHTMLTags aTag);
- nsresult Notify(eHTMLTags aTag,nsIParserNode& aNode,PRUint32 aUniqueID,nsIParser* aParser);
+ nsresult Notify(eHTMLTags aTag,nsIParserNode& aNode,void* aUniqueID,nsIParser* aParser);
nsString mTopic;
+ nsDeque mKeys;
+ nsDeque mValues;
+ nsString mCharsetKey;
+ nsString mSourceKey;
+ nsString mDTDKey;
nsDeque* mObservers[NS_HTML_TAG_MAX + 1];
};
@@ -322,7 +327,7 @@ public:
nsDeque* GetObserversForTagInTopic(eHTMLTags aTag,const nsString& aTopic);
nsresult Notify( eHTMLTags aTag,
nsIParserNode& aNode,
- PRUint32 aUniqueID,
+ void* aUniqueID,
const nsString& aTopic,
nsIParser* aParser);
nsObserverTopic* GetTopic(const nsString& aTopic);
@@ -339,9 +344,8 @@ protected:
**************************************************************/
class nsObserverNotifier: public nsDequeFunctor{
public:
- nsObserverNotifier(const PRUnichar* aTagName,PRUint32 aUniqueKey,PRUint32 aCount=0,
- const PRUnichar** aKeys=nsnull,const PRUnichar** aValues=nsnull){
- mCount=aCount;
+ nsObserverNotifier(const PRUnichar* aTagName,nsISupports* aUniqueKey,
+ const nsDeque* aKeys=0,const nsDeque* aValues=0){
mKeys=aKeys;
mValues=aValues;
mUniqueKey=aUniqueKey;
@@ -351,19 +355,18 @@ public:
virtual void* operator()(void* anObject) {
nsIElementObserver* theObserver= (nsIElementObserver*)anObject;
if(theObserver) {
- mResult = theObserver->Notify(mUniqueKey,mTagName,mCount,mKeys,mValues);
+ mResult = theObserver->Notify(mUniqueKey,mTagName,mKeys,mValues);
}
if(NS_OK==mResult)
return 0;
return anObject;
}
- const PRUnichar** mKeys;
- const PRUnichar** mValues;
- PRUint32 mCount;
- PRUint32 mUniqueKey;
- nsresult mResult;
+ const nsDeque* mKeys;
+ const nsDeque* mValues;
const PRUnichar* mTagName;
+ nsISupports* mUniqueKey;
+ nsresult mResult;
};
diff --git a/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.cpp b/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.cpp
index 9d9e6990e84..652e867b622 100644
--- a/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.cpp
+++ b/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.cpp
@@ -128,6 +128,7 @@ nsHTMLContentSinkStream::nsHTMLContentSinkStream()
mBufferSize = 0;
mBufferLength = 0;
mFlags = 0;
+ mHasOpenHtmlTag=PR_FALSE;
}
NS_IMETHODIMP
@@ -512,14 +513,21 @@ nsHTMLContentSinkStream::OpenHTML(const nsIParserNode& aNode)
eHTMLTags tag = (eHTMLTags)aNode.GetNodeType();
if (tag == eHTMLTag_html)
{
- // See bug 20246: the html tag doesn't have "html" in its text,
- // so AddStartTag will do the wrong thing
- Write(kLessThan);
-
- nsString temp; temp.AssignWithConversion(nsHTMLTags::GetStringValue(tag));
- nsAutoCString tagname(temp);
- Write(tagname);
- Write(kGreaterThan);
+ if(!mHasOpenHtmlTag) {
+ AddStartTag(aNode);
+ mHasOpenHtmlTag=PR_TRUE;
+ }
+ else {
+ PRInt32 ac=aNode.GetAttributeCount();
+ if(ac>0) {
+ Write(kLessThan);
+ nsAutoString tagname;
+ tagname.AssignWithConversion(nsHTMLTags::GetStringValue(tag));
+ Write(tagname);
+ WriteAttributes(aNode);
+ Write(kGreaterThan);
+ }
+ }
}
return NS_OK;
}
diff --git a/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.h b/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.h
index b244ba595f6..9d8dbf28c99 100644
--- a/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.h
+++ b/mozilla/parser/htmlparser/src/nsHTMLContentSinkStream.h
@@ -191,6 +191,7 @@ protected:
PRBool mDoFormat;
PRBool mDoHeader;
PRBool mBodyOnly;
+ PRBool mHasOpenHtmlTag;
PRInt32 mMaxColumn;
diff --git a/mozilla/parser/htmlparser/src/nsIElementObserver.h b/mozilla/parser/htmlparser/src/nsIElementObserver.h
index 9c60756c0b2..b047970f60c 100644
--- a/mozilla/parser/htmlparser/src/nsIElementObserver.h
+++ b/mozilla/parser/htmlparser/src/nsIElementObserver.h
@@ -33,6 +33,7 @@
#include "nsISupports.h"
#include "prtypes.h"
#include "nsHTMLTokens.h"
+#include "nsDeque.h"
// {4672AA04-F6AE-11d2-B3B7-00805F8A6670}
@@ -64,6 +65,9 @@ public:
NS_IMETHOD Notify(PRUint32 aDocumentID, const PRUnichar* aTag,
PRUint32 numOfAttributes, const PRUnichar* nameArray[],
const PRUnichar* valueArray[]) = 0;
+
+ NS_IMETHOD Notify(nsISupports* aDocumentID, const PRUnichar* aTag,
+ const nsDeque* aKeys, const nsDeque* aValues) = 0;
};
diff --git a/mozilla/parser/htmlparser/src/nsParser.cpp b/mozilla/parser/htmlparser/src/nsParser.cpp
index e68f2867e98..e203af7acba 100644
--- a/mozilla/parser/htmlparser/src/nsParser.cpp
+++ b/mozilla/parser/htmlparser/src/nsParser.cpp
@@ -997,7 +997,7 @@ aMimeType,PRBool aVerifyEnabled,PRBool aLastCall,eParseMode aMode){
NS_RELEASE(me);
return NS_ERROR_OUT_OF_MEMORY;
}
-
+ NS_IF_RELEASE(theDTD);
}
else {
mParserContext->mScanner->Append(aSourceBuffer);
diff --git a/mozilla/parser/htmlparser/src/nsViewSourceHTML.cpp b/mozilla/parser/htmlparser/src/nsViewSourceHTML.cpp
index d39081e4e2b..bd036e6da8d 100644
--- a/mozilla/parser/htmlparser/src/nsViewSourceHTML.cpp
+++ b/mozilla/parser/htmlparser/src/nsViewSourceHTML.cpp
@@ -902,7 +902,7 @@ NS_IMETHODIMP CViewSourceHTML::HandleToken(CToken* aToken,nsIParser* aParser) {
void* theDocID=(pc)? pc->mKey:0;
eHTMLTags theTag=(eHTMLTags)theToken->GetTypeID();
- result=theService->Notify(theTag,theContext.mTokenNode,(PRUint32)theDocID, NS_ConvertToString(kViewSourceCommand), mParser);
+ result=theService->Notify(theTag,theContext.mTokenNode,theDocID, NS_ConvertToString(kViewSourceCommand), mParser);
}
}
theContext.mTokenNode.Init(0,0,gTokenRecycler); //now recycle.