diff --git a/mozilla/parser/htmlparser/public/nsHTMLTokens.h b/mozilla/parser/htmlparser/public/nsHTMLTokens.h
index 29b4cde26c6..e741352687d 100644
--- a/mozilla/parser/htmlparser/public/nsHTMLTokens.h
+++ b/mozilla/parser/htmlparser/public/nsHTMLTokens.h
@@ -153,7 +153,6 @@ public:
}
nsString mTextValue;
- nsString mTrailingContent;
protected:
eContainerInfo mContainerInfo;
PRPackedBool mEmpty;
@@ -282,9 +281,6 @@ public:
CTextToken();
CTextToken(const nsAString& aString);
virtual nsresult Consume(PRUnichar aChar,nsScanner& aScanner,PRInt32 aMode);
- nsresult ConsumeUntil(PRUnichar aChar, PRBool aIgnoreComments,
- nsScanner& aScanner, const nsAString& aEndTagName,
- PRInt32 aFlag, PRBool& aFlushTokens);
virtual PRInt32 GetTokenType(void);
virtual PRInt32 GetTextLength(void);
virtual void CopyTo(nsAString& aStr);
@@ -293,6 +289,21 @@ public:
nsScannerIterator& aEnd);
virtual void Bind(const nsAString& aStr);
+ nsresult ConsumeCharacterData(PRUnichar aChar,
+ PRBool aConservativeConsume,
+ PRBool aIgnoreComments,
+ nsScanner& aScanner,
+ const nsAString& aEndTagName,
+ PRInt32 aFlag,
+ PRBool& aFlushTokens);
+
+ nsresult ConsumeParsedCharacterData(PRUnichar aChar,
+ PRBool aConservativeConsume,
+ nsScanner& aScanner,
+ const nsAString& aEndTagName,
+ PRInt32 aFlag,
+ PRBool& aFound);
+
protected:
nsScannerSubstring mTextValue;
};
diff --git a/mozilla/parser/htmlparser/public/nsIParser.h b/mozilla/parser/htmlparser/public/nsIParser.h
index 9355c134ce9..f889ff88cde 100644
--- a/mozilla/parser/htmlparser/public/nsIParser.h
+++ b/mozilla/parser/htmlparser/public/nsIParser.h
@@ -310,7 +310,8 @@ class nsIParser : public nsISupports {
#define NS_ERROR_HTMLPARSER_STOPPARSING NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_HTMLPARSER,1015)
#define NS_ERROR_HTMLPARSER_UNTERMINATEDSTRINGLITERAL NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_HTMLPARSER,1016)
#define NS_ERROR_HTMLPARSER_HIERARCHYTOODEEP NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_HTMLPARSER,1017)
-
+#define NS_ERROR_HTMLPARSER_FAKE_ENDTAG NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_HTMLPARSER,1018)
+#define NS_ERROR_HTMLPARSER_INVALID_COMMENT NS_ERROR_GENERATE_FAILURE(NS_ERROR_MODULE_HTMLPARSER,1019)
#define NS_ERROR_HTMLPARSER_CONTINUE NS_OK
@@ -325,6 +326,8 @@ const PRUint32 kInvalidParserContext = NS_ERROR_HTMLPARSER_INVALIDPARSERCONTEXT
const PRUint32 kBlocked = NS_ERROR_HTMLPARSER_BLOCK;
const PRUint32 kBadStringLiteral = NS_ERROR_HTMLPARSER_UNTERMINATEDSTRINGLITERAL;
const PRUint32 kHierarchyTooDeep = NS_ERROR_HTMLPARSER_HIERARCHYTOODEEP;
+const PRUint32 kFakeEndTag = NS_ERROR_HTMLPARSER_FAKE_ENDTAG;
+const PRUint32 kNotAComment = NS_ERROR_HTMLPARSER_INVALID_COMMENT;
const PRUnichar kNewLine = '\n';
const PRUnichar kCR = '\r';
@@ -381,9 +384,10 @@ const PRUnichar kNullCh = '\0';
#define NS_IPARSER_FLAG_VIEW_NORMAL 0x00000020
#define NS_IPARSER_FLAG_VIEW_SOURCE 0x00000040
#define NS_IPARSER_FLAG_VIEW_ERRORS 0x00000080
-#define NS_IPARSER_FLAG_PRESERVE_CONTENT 0x00000100
-#define NS_IPARSER_FLAG_PLAIN_TEXT 0x00000200
-#define NS_IPARSER_FLAG_XML 0x00000400
-#define NS_IPARSER_FLAG_HTML 0x00000800
+#define NS_IPARSER_FLAG_PLAIN_TEXT 0x00000100
+#define NS_IPARSER_FLAG_XML 0x00000200
+#define NS_IPARSER_FLAG_HTML 0x00000400
+#define NS_IPARSER_FLAG_SCRIPT_ENABLED 0x00000800
+#define NS_IPARSER_FLAG_FRAMES_ENABLED 0x00001000
#endif
diff --git a/mozilla/parser/htmlparser/public/nsITokenizer.h b/mozilla/parser/htmlparser/public/nsITokenizer.h
index 11b24377025..3027b43d925 100644
--- a/mozilla/parser/htmlparser/public/nsITokenizer.h
+++ b/mozilla/parser/htmlparser/public/nsITokenizer.h
@@ -86,7 +86,6 @@ public:
NS_IMETHOD_(PRInt32) GetCount(void)=0;
NS_IMETHOD_(nsTokenAllocator*) GetTokenAllocator(void)=0;
NS_IMETHOD_(void) PrependTokens(nsDeque& aDeque)=0;
- NS_IMETHOD CopyState(nsITokenizer* aTokenizer) = 0;
};
@@ -101,8 +100,7 @@ public:
NS_IMETHOD_(CToken*) GetTokenAt(PRInt32 anIndex);\
NS_IMETHOD_(PRInt32) GetCount(void);\
NS_IMETHOD_(nsTokenAllocator*) GetTokenAllocator(void);\
- NS_IMETHOD_(void) PrependTokens(nsDeque& aDeque);\
- NS_IMETHOD CopyState(nsITokenizer* aTokenizer);
+ NS_IMETHOD_(void) PrependTokens(nsDeque& aDeque);
#endif
diff --git a/mozilla/parser/htmlparser/src/CNavDTD.cpp b/mozilla/parser/htmlparser/src/CNavDTD.cpp
index 1172aff20be..574b3d6234e 100644
--- a/mozilla/parser/htmlparser/src/CNavDTD.cpp
+++ b/mozilla/parser/htmlparser/src/CNavDTD.cpp
@@ -116,12 +116,10 @@ static char gShowCRC;
#define NS_DTD_FLAG_HAD_BODY 0x00000010
#define NS_DTD_FLAG_HAD_FRAMESET 0x00000020
#define NS_DTD_FLAG_ENABLE_RESIDUAL_STYLE 0x00000040
-#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_IN_MISPLACED_CONTENT 0x00001000
-#define NS_DTD_FLAG_STOP_PARSING 0x00002000
+#define NS_DTD_FLAG_ALTERNATE_CONTENT 0x00000080 // NOFRAMES, NOSCRIPT
+#define NS_DTD_FLAG_MISPLACED_CONTENT 0x00000100
+#define NS_DTD_FLAG_IN_MISPLACED_CONTENT 0x00000200
+#define NS_DTD_FLAG_STOP_PARSING 0x00000400
/**
* This method gets called as part of our COM-like interfaces.
@@ -384,15 +382,15 @@ nsresult CNavDTD::WillBuildModel(const CParserContext& aParserContext,
#endif
if(mSink) {
- PRBool enabled;
+ PRBool enabled = PR_TRUE;
mSink->IsEnabled(eHTMLTag_frameset, &enabled);
if(enabled) {
- mFlags |= NS_DTD_FLAG_FRAMES_ENABLED;
+ mFlags |= NS_IPARSER_FLAG_FRAMES_ENABLED;
}
mSink->IsEnabled(eHTMLTag_script, &enabled);
if(enabled) {
- mFlags |= NS_DTD_FLAG_SCRIPT_ENABLED;
+ mFlags |= NS_IPARSER_FLAG_SCRIPT_ENABLED;
}
}
@@ -439,7 +437,7 @@ nsresult CNavDTD::BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer,nsIToke
}
// always open a body if frames are disabled....
- if(!(mFlags & NS_DTD_FLAG_FRAMES_ENABLED)) {
+ if(!(mFlags & NS_IPARSER_FLAG_FRAMES_ENABLED)) {
theToken=NS_STATIC_CAST(CStartToken*,mTokenAllocator->CreateTokenOfType(eToken_start,eHTMLTag_body,NS_LITERAL_STRING("body")));
mTokenizer->PushTokenFront(theToken);
}
@@ -522,37 +520,6 @@ CNavDTD::BuildNeglectedTarget(eHTMLTags aTarget,
NS_ASSERTION(mTokenAllocator, "unable to create tokens without an allocator.");
if (!mTokenizer || !mTokenAllocator)
return NS_OK;
- if (eHTMLTag_unknown != mSkipTarget && eHTMLTag_title == aTarget) {
- PRInt32 size = mSkippedContent.GetSize();
- // Note: The first location of the skipped content
- // deque contains the opened-skip-target. Do not include
- // that when guessing title contents. The term "guessing"
- // is used because the document did not contain an end title
- // and hence it's almost impossible to know what markup
- // should belong in the title. The assumption used here is that
- // if the markup is anything other than "text", or "entity" or,
- // "whitespace" then it's least likely to belong in the title.
- PRInt32 index;
- for (index = 1; index < size; index++) {
- CHTMLToken* token =
- NS_REINTERPRET_CAST(CHTMLToken*, mSkippedContent.ObjectAt(index));
- NS_ASSERTION(token, "there is a null token in the skipped content list!");
- eHTMLTokenTypes type = eHTMLTokenTypes(token->GetTokenType());
- if (eToken_whitespace != type &&
- eToken_newline != type &&
- eToken_text != type &&
- eToken_entity != type &&
- eToken_attribute != type) {
- // Now pop the tokens that do not belong ( just a guess work )
- // in the title and push them into the tokens queue.
- while (size != index++) {
- token = NS_REINTERPRET_CAST(CHTMLToken*, mSkippedContent.Pop());
- mTokenizer->PushTokenFront(token);
- }
- break;
- }
- }
- }
CHTMLToken* target =
NS_STATIC_CAST(CHTMLToken*, mTokenAllocator->CreateTokenOfType(aType, aTarget));
mTokenizer->PushTokenFront(target);
@@ -846,30 +813,6 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
return result;
}
}
- 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) {
- aToken->AppendSourceTo(mScratch);
- }
- IF_FREE(aToken, mTokenAllocator);
- return result;
- }
- else {
- // If you're here then we have either seen a /noscript,
- // or /noframes, or /iframe. After handling the text token
- // intentionally fall thro' to handle the current end token.
- CTextToken theTextToken(mScratch);
- result=HandleStartToken(&theTextToken);
-
- if(NS_FAILED(result)) {
- return result;
- }
-
- mScratch.Truncate();
- mScratch.SetCapacity(0);
- }
- }
else if(mFlags & NS_DTD_FLAG_MISPLACED_CONTENT) {
// Included TD & TH to fix Bug# 20797
static eHTMLTags gLegalElements[]={eHTMLTag_table,eHTMLTag_thead,eHTMLTag_tbody,
@@ -949,7 +892,9 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
}
default:
if(!gHTMLElements[eHTMLTag_html].SectionContains(theTag,PR_FALSE)) {
- if(!(mFlags & (NS_DTD_FLAG_HAD_BODY | NS_DTD_FLAG_HAD_FRAMESET))) {
+ if(!(mFlags & (NS_DTD_FLAG_HAD_BODY |
+ NS_DTD_FLAG_HAD_FRAMESET |
+ NS_DTD_FLAG_ALTERNATE_CONTENT))) {
//For bug examples from this code, see bugs: 18928, 20989.
@@ -1075,28 +1020,6 @@ nsresult CNavDTD::DidHandleStartTag(nsIParserNode& aNode,eHTMLTags aChildTag){
}//if
}
break;
-
- case eHTMLTag_xmp:
- //grab the skipped content and dump it out as text...
- {
- STOP_TIMER()
- MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::DidHandleStartTag(), this=%p\n", this));
- nsAutoString theString;
- PRInt32 lineNo = 0;
-
- result = CollectSkippedContent(aChildTag, theString, lineNo);
- NS_ENSURE_SUCCESS(result, result);
-
- if(0CreateTokenOfType(eToken_text,eHTMLTag_text,theString));
- nsCParserNode theNode(theToken, mTokenAllocator);
- result=mSink->AddLeaf(theNode); //when the node get's destructed, so does the new token
- }
- MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::DidHandleStartTag(), this=%p\n", this));
- START_TIMER()
- }
- break;
-
#ifdef DEBUG
case eHTMLTag_counter:
{
@@ -2485,30 +2408,10 @@ CNavDTD::CollectSkippedContent(PRInt32 aTag, nsAString& aContent, PRInt32 &aLine
PRInt32 tagCount = mSkippedContent.GetSize();
for (i = 0; i< tagCount; ++i){
CHTMLToken* theNextToken = (CHTMLToken*)mSkippedContent.PopFront();
-
if (theNextToken) {
- eHTMLTokenTypes theTokenType = (eHTMLTokenTypes)theNextToken->GetTokenType();
-
- // Dont worry about attributes here because it's already stored in
- // the start token as mTrailing content and will get appended in
- // start token's GetSource();
- if (eToken_attribute!=theTokenType) {
- if ((eToken_entity==theTokenType) &&
- ((eHTMLTag_textarea == aTag) || (eHTMLTag_title == aTag))) {
- mScratch.Truncate();
- ((CEntityToken*)theNextToken)->TranslateToUnicodeStr(mScratch);
- if (!mScratch.IsEmpty()){
- aContent.Append(mScratch);
- }
- else {
- // We thought it was an entity but it is not! - bug 79492
- aContent.Append(PRUnichar('&'));
- aContent.Append(theNextToken->GetStringValue());
- }
- }
- else theNextToken->AppendSourceTo(aContent);
- }
+ theNextToken->AppendSourceTo(aContent);
}
+
IF_FREE(theNextToken, mTokenAllocator);
}
@@ -3433,8 +3336,7 @@ CNavDTD::OpenContainer(const nsCParserNode *aNode,
// 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_DTD_FLAG_SCRIPT_ENABLED) {
- mScratch.Truncate();
+ if(mFlags & NS_IPARSER_FLAG_SCRIPT_ENABLED) {
mFlags |= NS_DTD_FLAG_ALTERNATE_CONTENT;
}
break;
@@ -3442,8 +3344,7 @@ CNavDTD::OpenContainer(const nsCParserNode *aNode,
case eHTMLTag_iframe: // Bug 84491
case eHTMLTag_noframes:
done=PR_FALSE;
- if(mFlags & NS_DTD_FLAG_FRAMES_ENABLED) {
- mScratch.Truncate();
+ if(mFlags & NS_IPARSER_FLAG_FRAMES_ENABLED) {
mFlags |= NS_DTD_FLAG_ALTERNATE_CONTENT;
}
break;
diff --git a/mozilla/parser/htmlparser/src/CParserContext.cpp b/mozilla/parser/htmlparser/src/CParserContext.cpp
index 36f0b58181a..5197a6488bb 100644
--- a/mozilla/parser/htmlparser/src/CParserContext.cpp
+++ b/mozilla/parser/htmlparser/src/CParserContext.cpp
@@ -40,6 +40,7 @@
#include "CParserContext.h"
#include "nsToken.h"
#include "prenv.h"
+#include "nsIHTMLContentSink.h"
#include "nsHTMLTokenizer.h"
#include "nsExpatDriver.h"
@@ -169,16 +170,33 @@ void CParserContext::SetMimeType(const nsACString& aMimeType){
}
nsresult
-CParserContext::GetTokenizer(PRInt32 aType, nsITokenizer*& aTokenizer) {
+CParserContext::GetTokenizer(PRInt32 aType,
+ nsIContentSink* aSink,
+ nsITokenizer*& aTokenizer) {
nsresult result = NS_OK;
if(!mTokenizer) {
if (aType == NS_IPARSER_FLAG_HTML || mParserCommand == eViewSource) {
- result = NS_NewHTMLTokenizer(&mTokenizer,mDTDMode,mDocType,mParserCommand);
- // Propagate tokenizer state so that information is preserved
- // between document.write. This fixes bug 99467
- if (mTokenizer && mPrevContext)
- mTokenizer->CopyState(mPrevContext->mTokenizer);
+ nsCOMPtr theSink = do_QueryInterface(aSink);
+ PRUint16 theFlags = 0;
+
+ if (theSink) {
+ // XXX This code is repeated both here and in CNavDTD. Can the two
+ // callsites be combined?
+ PRBool enabled;
+ theSink->IsEnabled(eHTMLTag_frameset, &enabled);
+ if(enabled) {
+ theFlags |= NS_IPARSER_FLAG_FRAMES_ENABLED;
+ }
+
+ theSink->IsEnabled(eHTMLTag_script, &enabled);
+ if(enabled) {
+ theFlags |= NS_IPARSER_FLAG_SCRIPT_ENABLED;
+ }
+ }
+
+ result = NS_NewHTMLTokenizer(&mTokenizer,mDTDMode,mDocType,
+ mParserCommand,theFlags);
}
else if (aType == NS_IPARSER_FLAG_XML)
{
diff --git a/mozilla/parser/htmlparser/src/CParserContext.h b/mozilla/parser/htmlparser/src/CParserContext.h
index 695a8603d45..f73531b7ce3 100644
--- a/mozilla/parser/htmlparser/src/CParserContext.h
+++ b/mozilla/parser/htmlparser/src/CParserContext.h
@@ -76,7 +76,9 @@ public:
CParserContext( const CParserContext& aContext);
~CParserContext();
- nsresult GetTokenizer(PRInt32 aType, nsITokenizer*& aTokenizer);
+ nsresult GetTokenizer(PRInt32 aType,
+ nsIContentSink* aSink,
+ nsITokenizer*& aTokenizer);
void SetMimeType(const nsACString& aMimeType);
nsCOMPtr mRequest; // provided by necko to differnciate different input streams
diff --git a/mozilla/parser/htmlparser/src/nsElementTable.cpp b/mozilla/parser/htmlparser/src/nsElementTable.cpp
index d32ffc3e0b4..763e3111349 100644
--- a/mozilla/parser/htmlparser/src/nsElementTable.cpp
+++ b/mozilla/parser/htmlparser/src/nsElementTable.cpp
@@ -1228,9 +1228,9 @@ void InitializeElementTable(void) {
/*req-parent excl-parent*/ eHTMLTag_unknown,eHTMLTag_unknown,
/*rootnodes,endrootnodes*/ &gRootTags,&gRootTags,
/*autoclose starttags and endtags*/ 0,0,0,0,
- /*parent,incl,exclgroups*/ kInlineEntity|kPreformatted, kNone, kNone,
+ /*parent,incl,exclgroups*/ kInlineEntity|kPreformatted, kCDATA, kNone,
/*special props, prop-range*/ kNone,kDefaultPropRange,
- /*special parents,kids,skip*/ 0,0,eHTMLTag_xmp);
+ /*special parents,kids,skip*/ 0,0,eHTMLTag_unknown);
Initialize(
/*tag*/ eHTMLTag_text,
@@ -2270,7 +2270,8 @@ PRBool nsHTMLElement::CanContain(eHTMLTags aChild,nsDTDMode aMode) const{
}
if(nsHTMLElement::IsTextTag(aChild)) {
- if(nsHTMLElement::IsInlineParent(mTagID)){
+ // Allow to contain text.
+ if(nsHTMLElement::IsInlineParent(mTagID) || CanContainType(kCDATA)){
return PR_TRUE;
}
}
diff --git a/mozilla/parser/htmlparser/src/nsExpatDriver.cpp b/mozilla/parser/htmlparser/src/nsExpatDriver.cpp
index a559dca2de6..0c247bbad21 100644
--- a/mozilla/parser/htmlparser/src/nsExpatDriver.cpp
+++ b/mozilla/parser/htmlparser/src/nsExpatDriver.cpp
@@ -1168,12 +1168,6 @@ nsExpatDriver::PrependTokens(nsDeque& aDeque)
}
-NS_IMETHODIMP
-nsExpatDriver::CopyState(nsITokenizer* aTokenizer)
-{
- return NS_OK;
-}
-
NS_IMETHODIMP
nsExpatDriver::HandleToken(CToken* aToken,nsIParser* aParser)
{
diff --git a/mozilla/parser/htmlparser/src/nsHTMLTokenizer.cpp b/mozilla/parser/htmlparser/src/nsHTMLTokenizer.cpp
index fcab7d35c76..157172b826f 100644
--- a/mozilla/parser/htmlparser/src/nsHTMLTokenizer.cpp
+++ b/mozilla/parser/htmlparser/src/nsHTMLTokenizer.cpp
@@ -103,13 +103,14 @@ nsresult nsHTMLTokenizer::QueryInterface(const nsIID& aIID, void** aInstancePtr)
nsresult NS_NewHTMLTokenizer(nsITokenizer** aInstancePtrResult,
PRInt32 aFlag,
eParserDocType aDocType,
- eParserCommands aCommand)
+ eParserCommands aCommand,
+ PRInt32 aFlags)
{
NS_PRECONDITION(nsnull != aInstancePtrResult, "null ptr");
if (nsnull == aInstancePtrResult) {
return NS_ERROR_NULL_POINTER;
}
- nsHTMLTokenizer* it = new nsHTMLTokenizer(aFlag,aDocType,aCommand);
+ nsHTMLTokenizer* it = new nsHTMLTokenizer(aFlag,aDocType,aCommand,aFlags);
if (nsnull == it) {
return NS_ERROR_OUT_OF_MEMORY;
}
@@ -128,23 +129,24 @@ NS_IMPL_RELEASE(nsHTMLTokenizer)
* @param
* @return
*/
- nsHTMLTokenizer::nsHTMLTokenizer(PRInt32 aParseMode,
- eParserDocType aDocType,
- eParserCommands aCommand) :
- nsITokenizer(), mTokenDeque(0)
+nsHTMLTokenizer::nsHTMLTokenizer(PRInt32 aParseMode,
+ eParserDocType aDocType,
+ eParserCommands aCommand,
+ PRUint16 aFlags) :
+ nsITokenizer(), mTokenDeque(0), mFlags(aFlags)
{
if (aParseMode==eDTDMode_full_standards ||
aParseMode==eDTDMode_almost_standards) {
- mFlags = NS_IPARSER_FLAG_STRICT_MODE;
+ mFlags |= NS_IPARSER_FLAG_STRICT_MODE;
}
else if (aParseMode==eDTDMode_quirks) {
- mFlags = NS_IPARSER_FLAG_QUIRKS_MODE;
+ mFlags |= NS_IPARSER_FLAG_QUIRKS_MODE;
}
else if (aParseMode==eDTDMode_autodetect) {
- mFlags = NS_IPARSER_FLAG_AUTO_DETECT_MODE;
+ mFlags |= NS_IPARSER_FLAG_AUTO_DETECT_MODE;
}
else {
- mFlags = NS_IPARSER_FLAG_UNKNOWN_MODE;
+ mFlags |= NS_IPARSER_FLAG_UNKNOWN_MODE;
}
if (aDocType==ePlainText) {
@@ -167,7 +169,6 @@ NS_IMPL_RELEASE(nsHTMLTokenizer)
mTokenAllocator = nsnull;
mTokenScanPos = 0;
- mPreserveTarget = eHTMLTag_unknown;
}
@@ -311,19 +312,6 @@ void nsHTMLTokenizer::PrependTokens(nsDeque& aDeque){
}
-NS_IMETHODIMP
-nsHTMLTokenizer::CopyState(nsITokenizer* aTokenizer)
-{
- if (aTokenizer) {
- mFlags &= ~NS_IPARSER_FLAG_PRESERVE_CONTENT;
- mPreserveTarget =
- NS_STATIC_CAST(nsHTMLTokenizer*, aTokenizer)->mPreserveTarget;
- if (mPreserveTarget != eHTMLTag_unknown)
- mFlags |= NS_IPARSER_FLAG_PRESERVE_CONTENT;
- }
- return NS_OK;
-}
-
/**
* This is a utilty method for ScanDocStructure, which finds a given
* tag in the stack.
@@ -649,10 +637,11 @@ nsresult nsHTMLTokenizer::ConsumeAttributes(PRUnichar aChar,
const nsSubstring& key=theToken->GetKey();
const nsAString& text=theToken->GetValue();
- // support XML like syntax to fix bugs like 44186
if(!key.IsEmpty() && kForwardSlash==key.First() && text.IsEmpty()) {
- isUsableAttr = PRBool(mFlags & NS_IPARSER_FLAG_VIEW_SOURCE); // Fix bug 103095
- aToken->SetEmpty(isUsableAttr);
+ if(!(mFlags & NS_IPARSER_FLAG_VIEW_SOURCE)) {
+ // We only care about these in view-source.
+ isUsableAttr = PR_FALSE;
+ }
}
if(isUsableAttr) {
++theAttrCount;
@@ -721,10 +710,6 @@ nsresult nsHTMLTokenizer::ConsumeStartTag(PRUnichar aChar,CToken*& aToken,nsScan
aToken=theAllocator->CreateTokenOfType(eToken_start,eHTMLTag_unknown);
if(aToken) {
- // Save the position after '<' for use in recording traling contents. Ref: Bug. 15204.
- nsScannerIterator origin;
- aScanner.CurrentPosition(origin);
-
result= aToken->Consume(aChar,aScanner,mFlags); //tell new token to finish consuming text...
if(NS_SUCCEEDED(result)) {
@@ -757,68 +742,81 @@ nsresult nsHTMLTokenizer::ConsumeStartTag(PRUnichar aChar,CToken*& aToken,nsScan
*/
if(NS_SUCCEEDED(result) && !(mFlags & NS_IPARSER_FLAG_XML)) {
CStartToken* theStartToken = NS_STATIC_CAST(CStartToken*,aToken);
- //XXX - Find a better soution to record content
- if(!(mFlags & NS_IPARSER_FLAG_PRESERVE_CONTENT) &&
- (theTag == eHTMLTag_textarea ||
- theTag == eHTMLTag_xmp ||
- theTag == eHTMLTag_noscript ||
- theTag == eHTMLTag_noframes)) {
- NS_ASSERTION(mPreserveTarget == eHTMLTag_unknown,
- "mPreserveTarget set but not preserving content?");
- mPreserveTarget = theTag;
- mFlags |= NS_IPARSER_FLAG_PRESERVE_CONTENT;
+
+ PRBool isCDATA = gHTMLElements[theTag].CanContainType(kCDATA);
+ PRBool isPCDATA = eHTMLTag_textarea == theTag ||
+ eHTMLTag_title == theTag;
+
+ if ((eHTMLTag_iframe == theTag && (mFlags & NS_IPARSER_FLAG_FRAMES_ENABLED)) ||
+ (eHTMLTag_noframes == theTag && (mFlags & NS_IPARSER_FLAG_FRAMES_ENABLED)) ||
+ (eHTMLTag_noscript == theTag && (mFlags & NS_IPARSER_FLAG_SCRIPT_ENABLED))) {
+ isCDATA = PR_TRUE;
}
-
- if (mFlags & NS_IPARSER_FLAG_PRESERVE_CONTENT)
- PreserveToken(theStartToken, aScanner, origin);
-
- //if((eHTMLTag_style==theTag) || (eHTMLTag_script==theTag)) {
- if(gHTMLElements[theTag].CanContainType(kCDATA)) {
+
+
+ if (isCDATA || isPCDATA) {
+ PRBool done = PR_FALSE;
nsDependentString endTagName(nsHTMLTags::GetStringValue(theTag));
- CToken* text=theAllocator->CreateTokenOfType(eToken_text,eHTMLTag_text);
- CTextToken* textToken=NS_STATIC_CAST(CTextToken*,text);
+ CToken* text =
+ theAllocator->CreateTokenOfType(eToken_text,eHTMLTag_text);
+ CTextToken* textToken = NS_STATIC_CAST(CTextToken*,text);
- //tell new token to finish consuming text...
- result=textToken->ConsumeUntil(0,theTag!=eHTMLTag_script,
- aScanner,
- endTagName,
- mFlags,
- aFlushTokens);
-
- // Fix bug 44186
- // Support XML like syntax, i.e., ==
- // Note: if aFlushTokens is TRUE then we have seen an
- // We do NOT want to output the end token if we didn't see a
- // and have a preserve target. If that happens, then we'd
- // be messing up the text inside the