landing updates for harish, and residual style WIP; r=rickg

This commit is contained in:
rickg%netscape.com 1999-11-22 06:18:24 +00:00
Родитель e5c3b91656
Коммит 5bd71b8c2e
10 изменённых файлов: 232 добавлений и 112 удалений

Просмотреть файл

@ -247,6 +247,7 @@ CNavDTD::CNavDTD() : nsIDTD(), mMisplacedContent(0), mSkippedContent(0), mShared
mComputedCRC32=0;
mExpectedCRC32=0;
mDTDState=NS_OK;
mStyleHandlingEnabled=PR_TRUE;
if(!gHTMLElements) {
InitializeElementTable();
@ -294,7 +295,7 @@ nsCParserNode* CNavDTD::CreateNode(void) {
* This method recycles a given node
* @update gess1/8/99
* @param
* @return
* @return
*/
void CNavDTD::RecycleNode(nsCParserNode* aNode) {
if(aNode && (!aNode->mUseCount)) {
@ -464,29 +465,28 @@ nsresult CNavDTD::WillBuildModel(nsString& aFilename,
mHasOpenScript=PR_FALSE;
mParseMode=aParseMode;
nsString theString;
theString.Append("hello there rick",10);
if((aNotifySink) && (aSink)) {
STOP_TIMER();
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::WillBuildModel(), this=%p\n", this));
mTokenRecycler=0;
mStyleHandlingEnabled=PR_TRUE;
if(aSink && (!mSink)) {
result=aSink->QueryInterface(kIHTMLContentSinkIID, (void **)&mSink);
}
result = aSink->WillBuildModel();
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::WillBuildModel(), this=%p\n", this));
START_TIMER();
if(result==NS_OK) {
result = aSink->WillBuildModel();
mSkipTarget=eHTMLTag_unknown;
mComputedCRC32=0;
mExpectedCRC32=0;
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::WillBuildModel(), this=%p\n", this));
START_TIMER();
mSkipTarget=eHTMLTag_unknown;
mComputedCRC32=0;
mExpectedCRC32=0;
}
}
return result;
}
@ -573,6 +573,10 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse
}
if(result==NS_OK) {
eHTMLTags theTarget;
//now let's disable style handling to save time when closing remaining stack members...
mStyleHandlingEnabled=PR_FALSE;
while(mBodyContext->GetCount() > 0) {
theTarget = mBodyContext->Last();
CloseContainersTo(theTarget,PR_FALSE);
@ -682,8 +686,8 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
static eHTMLTags passThru[]= {
eHTMLTag_html,eHTMLTag_comment,eHTMLTag_newline,
eHTMLTag_whitespace,eHTMLTag_script,eHTMLTag_noscript,
eHTMLTag_nolayer,eHTMLTag_markupDecl,eHTMLTag_userdefined
eHTMLTag_whitespace,eHTMLTag_script,
eHTMLTag_markupDecl,eHTMLTag_userdefined
};
if(!FindTagInSet(theTag,passThru,sizeof(passThru)/sizeof(eHTMLTag_unknown))){
@ -1124,7 +1128,7 @@ nsresult CNavDTD::WillHandleStartTag(CToken* aToken,eHTMLTags aTag,nsCParserNode
return result;
}
void PushMisplacedAttributes(nsIParserNode& aNode,nsDeque& aDeque,PRInt32 aCount) {
void PushMisplacedAttributes(nsIParserNode& aNode,nsDeque& aDeque,PRInt32& aCount) {
if(aCount > 0) {
CToken* theAttrToken=nsnull;
nsCParserNode* theAttrNode = (nsCParserNode*)&aNode;
@ -1190,15 +1194,13 @@ nsresult CNavDTD::HandleOmittedTag(CToken* aToken,eHTMLTags aChildTag,eHTMLTags
if(attrCount > 0) PushMisplacedAttributes(*aNode,mMisplacedContent,attrCount);
theToken=mTokenizer->PeekToken();
PRBool theParentContains=-1; //set to -1 so that CanCmit will recompute.
if(theToken) {
theToken->mUseCount=0;
theTag=(eHTMLTags)theToken->GetTypeID();
if(!nsHTMLElement::IsWhitespaceTag(theTag) && theTag!=eHTMLTag_unknown) {
if((gHTMLElements[theTag].HasSpecialProperty(kBadContentWatch)) ||
(!gHTMLElements[mBodyContext->TagAt(theIndex)].CanContain(theTag))||
(!CanOmit(aParent,theTag,theParentContains))) {
if((gHTMLElements[theTag].HasSpecialProperty(kBadContentWatch)) ||
(gHTMLElements[aParent].CanContain(theTag))) {
done=PR_TRUE;
}
}
@ -1953,13 +1955,6 @@ nsresult CNavDTD::CollectSkippedContent(nsCParserNode& aNode,PRInt32 &aCount) {
* @return PR_TRUE if parent can contain child
*/
PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
if(mHasOpenForm) {
if(aParent==aChild)
return gHTMLElements[aParent].CanContainSelf();
if(FindTagInSet(aChild,gFormElementTags,sizeof(gFormElementTags)/sizeof(eHTMLTag_unknown))) {
return PR_TRUE;
}//if
}//if
return gHTMLElements[aParent].CanContain((eHTMLTags)aChild);
}
@ -2703,6 +2698,7 @@ CNavDTD::OpenContainer(const nsIParserNode *aNode,eHTMLTags aTag,PRBool aClosedB
NS_PRECONDITION(mBodyContext->GetCount() >= 0, kInvalidTagStackPos);
nsresult result=NS_OK;
PRBool isDefaultNode=PR_FALSE;
#ifdef ENABLE_CRC
#define K_OPENOP 100
@ -2721,11 +2717,17 @@ CNavDTD::OpenContainer(const nsIParserNode *aNode,eHTMLTags aTag,PRBool aClosedB
break;
case eHTMLTag_body:
mHasOpenBody=PR_TRUE;
if(mHasOpenHead)
mHasOpenHead=1;
CloseHead(aNode); //do this just in case someone left it open...
result=OpenBody(aNode);
{
eHTMLTags theParent=mBodyContext->Last();
if(!gHTMLElements[aTag].IsSpecialParent(theParent)) {
mHasOpenBody=PR_TRUE;
if(mHasOpenHead)
mHasOpenHead=1;
CloseHead(aNode); //do this just in case someone left it open...
result=OpenBody(aNode);
}
else isDefaultNode=PR_TRUE;
}
break;
case eHTMLTag_style:
@ -2757,6 +2759,11 @@ CNavDTD::OpenContainer(const nsIParserNode *aNode,eHTMLTags aTag,PRBool aClosedB
break;
default:
isDefaultNode=PR_TRUE;
break;
}
if(isDefaultNode) {
STOP_TIMER();
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::OpenContainer(), this=%p\n", this));
@ -2767,10 +2774,8 @@ CNavDTD::OpenContainer(const nsIParserNode *aNode,eHTMLTags aTag,PRBool aClosedB
START_TIMER();
mBodyContext->Push(aNode,aResidualStyleLevel);
break;
}
return result;
}
@ -2869,13 +2874,40 @@ nsresult CNavDTD::CloseContainersTo(PRInt32 anIndex,eHTMLTags aTarget, PRBool aC
#ifdef ENABLE_RESIDUALSTYLE
PRBool theTagIsStyle=nsHTMLElement::IsStyleTag(theTag);
if(theTagIsStyle && aClosedByStartTag) {
if(theStyles) {
theStyles->PushFront(theNode);
mBodyContext->PushStyles(theStyles);
if(mStyleHandlingEnabled) {
if(aClosedByStartTag) {
if(theTagIsStyle) {
if(theStyles) {
theStyles->PushFront(theNode);
mBodyContext->PushStyles(theStyles);
}
else mBodyContext->PushStyle(theNode);
}
}
else mBodyContext->PushStyle(theNode);
}
else {
//if you're here, then we're dealing with the closure of tags
//caused by a close tag (as opposed to an open tag).
//At a minimum, we should consider pushing residual styles up
//up the stack...
if(aTarget!=theTag) {
if(theTagIsStyle) {
if(theStyles) {
theStyles->PushFront(theNode);
mBodyContext->PushStyles(theStyles);
}
else mBodyContext->PushStyle(theNode);
}
else if(theStyles) {
mBodyContext->PushStyles(theStyles);
}
}
}
}
else {
//since stylehandling is disabled, let's recycle the associated nodes here...
}
#endif
RecycleNode(theNode);
}
@ -2995,8 +3027,6 @@ nsresult CNavDTD::AddLeaf(const nsIParserNode *aNode){
theToken=mTokenizer->PopToken();
theNode.Init(theToken,mLineNumber,0);
result=mSink->AddLeaf(theNode);
STOP_TIMER();
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::AddLeaf(), this=%p\n", this));

Просмотреть файл

@ -540,6 +540,7 @@ protected:
PRUint32 mComputedCRC32;
PRUint32 mExpectedCRC32;
nsAutoString mScratch; //used for various purposes; non-persistent
PRBool mStyleHandlingEnabled;
#ifdef NS_DEBUG
PRInt32 gNodeCount;

Просмотреть файл

@ -121,7 +121,7 @@ TagList gContainsOpts={3,{eHTMLTag_option,eHTMLTag_optgroup,eHTMLTag_script}};
TagList gContainsParam={1,{eHTMLTag_param}};
TagList gColgroupKids={1,{eHTMLTag_col}};
TagList gAddressKids={1,{eHTMLTag_p}};
TagList gBodyKids={5,{eHTMLTag_del,eHTMLTag_ins,eHTMLTag_noscript,eHTMLTag_script,eHTMLTag_li}};
TagList gBodyKids={6,{eHTMLTag_del,eHTMLTag_ins,eHTMLTag_noscript,eHTMLTag_nolayer,eHTMLTag_script,eHTMLTag_li}};
TagList gButtonKids={2,{eHTMLTag_caption,eHTMLTag_legend}};
TagList gDLKids={2,{eHTMLTag_dd,eHTMLTag_dt}};
TagList gDTKids={1,{eHTMLTag_dt}};
@ -130,8 +130,8 @@ TagList gFontKids={2,{eHTMLTag_legend,eHTMLTag_text}};
TagList gFormKids={1,{eHTMLTag_keygen}};
TagList gFramesetKids={3,{eHTMLTag_frame,eHTMLTag_frameset,eHTMLTag_noframes}};
TagList gHtmlKids={8,{eHTMLTag_body,eHTMLTag_frameset,eHTMLTag_head,eHTMLTag_map,eHTMLTag_noscript,eHTMLTag_script,eHTMLTag_newline,eHTMLTag_whitespace}};
TagList gHeadKids={9,{eHTMLTag_base,eHTMLTag_bgsound,eHTMLTag_link,eHTMLTag_meta,eHTMLTag_script,eHTMLTag_style,eHTMLTag_title,eHTMLTag_noembed,eHTMLTag_noscript}};
TagList gHtmlKids={9,{eHTMLTag_body,eHTMLTag_frameset,eHTMLTag_head,eHTMLTag_map,eHTMLTag_noscript,eHTMLTag_noframes,eHTMLTag_script,eHTMLTag_newline,eHTMLTag_whitespace}};
TagList gHeadKids={8,{eHTMLTag_base,eHTMLTag_bgsound,eHTMLTag_link,eHTMLTag_meta,eHTMLTag_script,eHTMLTag_style,eHTMLTag_title,eHTMLTag_noembed}};
TagList gLabelKids={1,{eHTMLTag_span}};
TagList gLIKids={2,{eHTMLTag_ol,eHTMLTag_ul}};
@ -896,26 +896,26 @@ void InitializeElementTable(void) {
/*rootnodes,endrootnodes*/ &gNoframeRoot,&gNoframeRoot,
/*autoclose starttags and endtags*/ 0,0,0,0,
/*parent,incl,exclgroups*/ kBlock, kFlowEntity, kNone,
/*special props, prop-range*/ kDiscardTag, kNoPropRange,
/*special parents,kids,skip*/ &gNoframeRoot,&gNoframesKids,eHTMLTag_noframes);
/*special props, prop-range*/ 0, kNoPropRange,
/*special parents,kids,skip*/ &gNoframeRoot,&gNoframesKids,eHTMLTag_unknown);
Initialize(
/*tag*/ eHTMLTag_nolayer,
/*req-parent excl-parent*/ eHTMLTag_unknown,eHTMLTag_unknown,
/*rootnodes,endrootnodes*/ &gRootTags,&gRootTags,
/*autoclose starttags and endtags*/ 0,0,0,0,
/*parent,incl,exclgroups*/ kNone, kNone, kNone,
/*special props, prop-range*/ kDiscardTag, kNoPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_nolayer);
/*parent,incl,exclgroups*/ kBlock, kFlowEntity, kNone,
/*special props, prop-range*/ 0, kNoPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_unknown);
Initialize(
/*tag*/ eHTMLTag_noscript,
/*req-parent excl-parent*/ eHTMLTag_unknown,eHTMLTag_unknown,
/*rootnodes,endrootnodes*/ &gRootTags,&gRootTags,
/*autoclose starttags and endtags*/ 0,0,0,0,
/*parent,incl,exclgroups*/ kBlock, kFlowEntity, kNone,
/*special props, prop-range*/ kDiscardTag, kNoPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_noscript);
/*parent,incl,exclgroups*/ kBlock, kFlowEntity|kSelf, kNone,
/*special props, prop-range*/ 0, kNoPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_unknown);
Initialize(
/*tag*/ eHTMLTag_object,
@ -1539,6 +1539,21 @@ PRBool nsHTMLElement::IsFlowParent(eHTMLTags aTag){
return result;
}
/**
*
* @update harishd 11/19/99
* @param
* @return
*/
PRBool nsHTMLElement::IsSpecialParent(eHTMLTags aTag) const{
PRBool result=PR_FALSE;
if(mSpecialParents) {
if(FindTagInSet(aTag,mSpecialParents->mTags,mSpecialParents->mCount))
result=PR_TRUE;
}
return result;
}
/**
* Tells us whether the given tag opens a section
* @update gess 01/04/99

Просмотреть файл

@ -90,6 +90,7 @@ struct nsHTMLElement {
PRBool CanContainSelf(void) const;
PRBool CanAutoCloseTag(eHTMLTags aTag) const;
PRBool HasSpecialProperty(PRInt32 aProperty) const;
PRBool IsSpecialParent(eHTMLTags aTag) const;
PRBool SectionContains(eHTMLTags aTag,PRBool allowDepthSearch);
static PRBool CanContain(eHTMLTags aParent,eHTMLTags aChild);

Просмотреть файл

@ -542,7 +542,7 @@ nsresult CTextToken::ConsumeUntil(PRUnichar aChar,PRBool aIgnoreComments,nsScann
result=aScanner.ReadUntil(mTextValue,kGreaterThan,PR_TRUE);
}
}
else if(('\b'==theChar) || ('\t'==theChar) || (' '==theChar)) {
else if(('\b'==aChar) || ('\t'==aChar) || (' '==aChar)) {
static CWhitespaceToken theWS;
result=theWS.Consume(aChar,aScanner,aMode);
if(NS_OK==result) {
@ -986,9 +986,22 @@ nsString& CNewlineToken::GetStringValueXXX(void) {
* @return error result
*/
nsresult CNewlineToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aMode) {
#if 0
mTextValue=kNewLine; //This is what I THINK we should be doing.
#endif
mTextValue=aChar;
//we already read the \r or \n, let's see what's next!
/*******************************************************************
Here's what the HTML spec says about newlines:
"A line break is defined to be a carriage return (
),
a line feed (
), or a carriage return/line feed pair.
All line breaks constitute white space."
*******************************************************************/
PRUnichar theChar;
nsresult result=aScanner.Peek(theChar);
@ -1000,10 +1013,10 @@ nsresult CNewlineToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aMo
mTextValue+=theChar;
}
break;
case kCR:
case kCR:
//convert CRLF into just CR
if(kNewLine==theChar) {
result=aScanner.GetChar(theChar);
mTextValue+=theChar;
}
break;
default:

Просмотреть файл

@ -247,6 +247,7 @@ CNavDTD::CNavDTD() : nsIDTD(), mMisplacedContent(0), mSkippedContent(0), mShared
mComputedCRC32=0;
mExpectedCRC32=0;
mDTDState=NS_OK;
mStyleHandlingEnabled=PR_TRUE;
if(!gHTMLElements) {
InitializeElementTable();
@ -294,7 +295,7 @@ nsCParserNode* CNavDTD::CreateNode(void) {
* This method recycles a given node
* @update gess1/8/99
* @param
* @return
* @return
*/
void CNavDTD::RecycleNode(nsCParserNode* aNode) {
if(aNode && (!aNode->mUseCount)) {
@ -464,29 +465,28 @@ nsresult CNavDTD::WillBuildModel(nsString& aFilename,
mHasOpenScript=PR_FALSE;
mParseMode=aParseMode;
nsString theString;
theString.Append("hello there rick",10);
if((aNotifySink) && (aSink)) {
STOP_TIMER();
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::WillBuildModel(), this=%p\n", this));
mTokenRecycler=0;
mStyleHandlingEnabled=PR_TRUE;
if(aSink && (!mSink)) {
result=aSink->QueryInterface(kIHTMLContentSinkIID, (void **)&mSink);
}
result = aSink->WillBuildModel();
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::WillBuildModel(), this=%p\n", this));
START_TIMER();
if(result==NS_OK) {
result = aSink->WillBuildModel();
mSkipTarget=eHTMLTag_unknown;
mComputedCRC32=0;
mExpectedCRC32=0;
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::WillBuildModel(), this=%p\n", this));
START_TIMER();
mSkipTarget=eHTMLTag_unknown;
mComputedCRC32=0;
mExpectedCRC32=0;
}
}
return result;
}
@ -573,6 +573,10 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse
}
if(result==NS_OK) {
eHTMLTags theTarget;
//now let's disable style handling to save time when closing remaining stack members...
mStyleHandlingEnabled=PR_FALSE;
while(mBodyContext->GetCount() > 0) {
theTarget = mBodyContext->Last();
CloseContainersTo(theTarget,PR_FALSE);
@ -682,8 +686,8 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
static eHTMLTags passThru[]= {
eHTMLTag_html,eHTMLTag_comment,eHTMLTag_newline,
eHTMLTag_whitespace,eHTMLTag_script,eHTMLTag_noscript,
eHTMLTag_nolayer,eHTMLTag_markupDecl,eHTMLTag_userdefined
eHTMLTag_whitespace,eHTMLTag_script,
eHTMLTag_markupDecl,eHTMLTag_userdefined
};
if(!FindTagInSet(theTag,passThru,sizeof(passThru)/sizeof(eHTMLTag_unknown))){
@ -1124,7 +1128,7 @@ nsresult CNavDTD::WillHandleStartTag(CToken* aToken,eHTMLTags aTag,nsCParserNode
return result;
}
void PushMisplacedAttributes(nsIParserNode& aNode,nsDeque& aDeque,PRInt32 aCount) {
void PushMisplacedAttributes(nsIParserNode& aNode,nsDeque& aDeque,PRInt32& aCount) {
if(aCount > 0) {
CToken* theAttrToken=nsnull;
nsCParserNode* theAttrNode = (nsCParserNode*)&aNode;
@ -1190,15 +1194,13 @@ nsresult CNavDTD::HandleOmittedTag(CToken* aToken,eHTMLTags aChildTag,eHTMLTags
if(attrCount > 0) PushMisplacedAttributes(*aNode,mMisplacedContent,attrCount);
theToken=mTokenizer->PeekToken();
PRBool theParentContains=-1; //set to -1 so that CanCmit will recompute.
if(theToken) {
theToken->mUseCount=0;
theTag=(eHTMLTags)theToken->GetTypeID();
if(!nsHTMLElement::IsWhitespaceTag(theTag) && theTag!=eHTMLTag_unknown) {
if((gHTMLElements[theTag].HasSpecialProperty(kBadContentWatch)) ||
(!gHTMLElements[mBodyContext->TagAt(theIndex)].CanContain(theTag))||
(!CanOmit(aParent,theTag,theParentContains))) {
if((gHTMLElements[theTag].HasSpecialProperty(kBadContentWatch)) ||
(gHTMLElements[aParent].CanContain(theTag))) {
done=PR_TRUE;
}
}
@ -1953,13 +1955,6 @@ nsresult CNavDTD::CollectSkippedContent(nsCParserNode& aNode,PRInt32 &aCount) {
* @return PR_TRUE if parent can contain child
*/
PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) const {
if(mHasOpenForm) {
if(aParent==aChild)
return gHTMLElements[aParent].CanContainSelf();
if(FindTagInSet(aChild,gFormElementTags,sizeof(gFormElementTags)/sizeof(eHTMLTag_unknown))) {
return PR_TRUE;
}//if
}//if
return gHTMLElements[aParent].CanContain((eHTMLTags)aChild);
}
@ -2703,6 +2698,7 @@ CNavDTD::OpenContainer(const nsIParserNode *aNode,eHTMLTags aTag,PRBool aClosedB
NS_PRECONDITION(mBodyContext->GetCount() >= 0, kInvalidTagStackPos);
nsresult result=NS_OK;
PRBool isDefaultNode=PR_FALSE;
#ifdef ENABLE_CRC
#define K_OPENOP 100
@ -2721,11 +2717,17 @@ CNavDTD::OpenContainer(const nsIParserNode *aNode,eHTMLTags aTag,PRBool aClosedB
break;
case eHTMLTag_body:
mHasOpenBody=PR_TRUE;
if(mHasOpenHead)
mHasOpenHead=1;
CloseHead(aNode); //do this just in case someone left it open...
result=OpenBody(aNode);
{
eHTMLTags theParent=mBodyContext->Last();
if(!gHTMLElements[aTag].IsSpecialParent(theParent)) {
mHasOpenBody=PR_TRUE;
if(mHasOpenHead)
mHasOpenHead=1;
CloseHead(aNode); //do this just in case someone left it open...
result=OpenBody(aNode);
}
else isDefaultNode=PR_TRUE;
}
break;
case eHTMLTag_style:
@ -2757,6 +2759,11 @@ CNavDTD::OpenContainer(const nsIParserNode *aNode,eHTMLTags aTag,PRBool aClosedB
break;
default:
isDefaultNode=PR_TRUE;
break;
}
if(isDefaultNode) {
STOP_TIMER();
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::OpenContainer(), this=%p\n", this));
@ -2767,10 +2774,8 @@ CNavDTD::OpenContainer(const nsIParserNode *aNode,eHTMLTags aTag,PRBool aClosedB
START_TIMER();
mBodyContext->Push(aNode,aResidualStyleLevel);
break;
}
return result;
}
@ -2869,13 +2874,40 @@ nsresult CNavDTD::CloseContainersTo(PRInt32 anIndex,eHTMLTags aTarget, PRBool aC
#ifdef ENABLE_RESIDUALSTYLE
PRBool theTagIsStyle=nsHTMLElement::IsStyleTag(theTag);
if(theTagIsStyle && aClosedByStartTag) {
if(theStyles) {
theStyles->PushFront(theNode);
mBodyContext->PushStyles(theStyles);
if(mStyleHandlingEnabled) {
if(aClosedByStartTag) {
if(theTagIsStyle) {
if(theStyles) {
theStyles->PushFront(theNode);
mBodyContext->PushStyles(theStyles);
}
else mBodyContext->PushStyle(theNode);
}
}
else mBodyContext->PushStyle(theNode);
}
else {
//if you're here, then we're dealing with the closure of tags
//caused by a close tag (as opposed to an open tag).
//At a minimum, we should consider pushing residual styles up
//up the stack...
if(aTarget!=theTag) {
if(theTagIsStyle) {
if(theStyles) {
theStyles->PushFront(theNode);
mBodyContext->PushStyles(theStyles);
}
else mBodyContext->PushStyle(theNode);
}
else if(theStyles) {
mBodyContext->PushStyles(theStyles);
}
}
}
}
else {
//since stylehandling is disabled, let's recycle the associated nodes here...
}
#endif
RecycleNode(theNode);
}
@ -2995,8 +3027,6 @@ nsresult CNavDTD::AddLeaf(const nsIParserNode *aNode){
theToken=mTokenizer->PopToken();
theNode.Init(theToken,mLineNumber,0);
result=mSink->AddLeaf(theNode);
STOP_TIMER();
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::AddLeaf(), this=%p\n", this));

Просмотреть файл

@ -540,6 +540,7 @@ protected:
PRUint32 mComputedCRC32;
PRUint32 mExpectedCRC32;
nsAutoString mScratch; //used for various purposes; non-persistent
PRBool mStyleHandlingEnabled;
#ifdef NS_DEBUG
PRInt32 gNodeCount;

Просмотреть файл

@ -121,7 +121,7 @@ TagList gContainsOpts={3,{eHTMLTag_option,eHTMLTag_optgroup,eHTMLTag_script}};
TagList gContainsParam={1,{eHTMLTag_param}};
TagList gColgroupKids={1,{eHTMLTag_col}};
TagList gAddressKids={1,{eHTMLTag_p}};
TagList gBodyKids={5,{eHTMLTag_del,eHTMLTag_ins,eHTMLTag_noscript,eHTMLTag_script,eHTMLTag_li}};
TagList gBodyKids={6,{eHTMLTag_del,eHTMLTag_ins,eHTMLTag_noscript,eHTMLTag_nolayer,eHTMLTag_script,eHTMLTag_li}};
TagList gButtonKids={2,{eHTMLTag_caption,eHTMLTag_legend}};
TagList gDLKids={2,{eHTMLTag_dd,eHTMLTag_dt}};
TagList gDTKids={1,{eHTMLTag_dt}};
@ -130,8 +130,8 @@ TagList gFontKids={2,{eHTMLTag_legend,eHTMLTag_text}};
TagList gFormKids={1,{eHTMLTag_keygen}};
TagList gFramesetKids={3,{eHTMLTag_frame,eHTMLTag_frameset,eHTMLTag_noframes}};
TagList gHtmlKids={8,{eHTMLTag_body,eHTMLTag_frameset,eHTMLTag_head,eHTMLTag_map,eHTMLTag_noscript,eHTMLTag_script,eHTMLTag_newline,eHTMLTag_whitespace}};
TagList gHeadKids={9,{eHTMLTag_base,eHTMLTag_bgsound,eHTMLTag_link,eHTMLTag_meta,eHTMLTag_script,eHTMLTag_style,eHTMLTag_title,eHTMLTag_noembed,eHTMLTag_noscript}};
TagList gHtmlKids={9,{eHTMLTag_body,eHTMLTag_frameset,eHTMLTag_head,eHTMLTag_map,eHTMLTag_noscript,eHTMLTag_noframes,eHTMLTag_script,eHTMLTag_newline,eHTMLTag_whitespace}};
TagList gHeadKids={8,{eHTMLTag_base,eHTMLTag_bgsound,eHTMLTag_link,eHTMLTag_meta,eHTMLTag_script,eHTMLTag_style,eHTMLTag_title,eHTMLTag_noembed}};
TagList gLabelKids={1,{eHTMLTag_span}};
TagList gLIKids={2,{eHTMLTag_ol,eHTMLTag_ul}};
@ -896,26 +896,26 @@ void InitializeElementTable(void) {
/*rootnodes,endrootnodes*/ &gNoframeRoot,&gNoframeRoot,
/*autoclose starttags and endtags*/ 0,0,0,0,
/*parent,incl,exclgroups*/ kBlock, kFlowEntity, kNone,
/*special props, prop-range*/ kDiscardTag, kNoPropRange,
/*special parents,kids,skip*/ &gNoframeRoot,&gNoframesKids,eHTMLTag_noframes);
/*special props, prop-range*/ 0, kNoPropRange,
/*special parents,kids,skip*/ &gNoframeRoot,&gNoframesKids,eHTMLTag_unknown);
Initialize(
/*tag*/ eHTMLTag_nolayer,
/*req-parent excl-parent*/ eHTMLTag_unknown,eHTMLTag_unknown,
/*rootnodes,endrootnodes*/ &gRootTags,&gRootTags,
/*autoclose starttags and endtags*/ 0,0,0,0,
/*parent,incl,exclgroups*/ kNone, kNone, kNone,
/*special props, prop-range*/ kDiscardTag, kNoPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_nolayer);
/*parent,incl,exclgroups*/ kBlock, kFlowEntity, kNone,
/*special props, prop-range*/ 0, kNoPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_unknown);
Initialize(
/*tag*/ eHTMLTag_noscript,
/*req-parent excl-parent*/ eHTMLTag_unknown,eHTMLTag_unknown,
/*rootnodes,endrootnodes*/ &gRootTags,&gRootTags,
/*autoclose starttags and endtags*/ 0,0,0,0,
/*parent,incl,exclgroups*/ kBlock, kFlowEntity, kNone,
/*special props, prop-range*/ kDiscardTag, kNoPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_noscript);
/*parent,incl,exclgroups*/ kBlock, kFlowEntity|kSelf, kNone,
/*special props, prop-range*/ 0, kNoPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_unknown);
Initialize(
/*tag*/ eHTMLTag_object,
@ -1539,6 +1539,21 @@ PRBool nsHTMLElement::IsFlowParent(eHTMLTags aTag){
return result;
}
/**
*
* @update harishd 11/19/99
* @param
* @return
*/
PRBool nsHTMLElement::IsSpecialParent(eHTMLTags aTag) const{
PRBool result=PR_FALSE;
if(mSpecialParents) {
if(FindTagInSet(aTag,mSpecialParents->mTags,mSpecialParents->mCount))
result=PR_TRUE;
}
return result;
}
/**
* Tells us whether the given tag opens a section
* @update gess 01/04/99

Просмотреть файл

@ -90,6 +90,7 @@ struct nsHTMLElement {
PRBool CanContainSelf(void) const;
PRBool CanAutoCloseTag(eHTMLTags aTag) const;
PRBool HasSpecialProperty(PRInt32 aProperty) const;
PRBool IsSpecialParent(eHTMLTags aTag) const;
PRBool SectionContains(eHTMLTags aTag,PRBool allowDepthSearch);
static PRBool CanContain(eHTMLTags aParent,eHTMLTags aChild);

Просмотреть файл

@ -542,7 +542,7 @@ nsresult CTextToken::ConsumeUntil(PRUnichar aChar,PRBool aIgnoreComments,nsScann
result=aScanner.ReadUntil(mTextValue,kGreaterThan,PR_TRUE);
}
}
else if(('\b'==theChar) || ('\t'==theChar) || (' '==theChar)) {
else if(('\b'==aChar) || ('\t'==aChar) || (' '==aChar)) {
static CWhitespaceToken theWS;
result=theWS.Consume(aChar,aScanner,aMode);
if(NS_OK==result) {
@ -986,9 +986,22 @@ nsString& CNewlineToken::GetStringValueXXX(void) {
* @return error result
*/
nsresult CNewlineToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aMode) {
#if 0
mTextValue=kNewLine; //This is what I THINK we should be doing.
#endif
mTextValue=aChar;
//we already read the \r or \n, let's see what's next!
/*******************************************************************
Here's what the HTML spec says about newlines:
"A line break is defined to be a carriage return (
),
a line feed (
), or a carriage return/line feed pair.
All line breaks constitute white space."
*******************************************************************/
PRUnichar theChar;
nsresult result=aScanner.Peek(theChar);
@ -1000,10 +1013,10 @@ nsresult CNewlineToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aMo
mTextValue+=theChar;
}
break;
case kCR:
case kCR:
//convert CRLF into just CR
if(kNewLine==theChar) {
result=aScanner.GetChar(theChar);
mTextValue+=theChar;
}
break;
default: