finally landing residual style handling code; r=harishd; other changes include warning removal and comment handling fix, r=buster. This fixes over 50 bugs.

git-svn-id: svn://10.0.0.236/trunk@55489 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
rickg%netscape.com
1999-12-07 00:22:15 +00:00
parent 5e0931af82
commit 51c4bb8682
28 changed files with 540 additions and 346 deletions

View File

@@ -49,7 +49,7 @@
#endif
#include "prmem.h"
//#define ENABLE_RESIDUALSTYLE
#define ENABLE_RESIDUALSTYLE
//#define RICKG_DEBUG
//#define ENABLE_CRC
#ifdef RICKG_DEBUG
@@ -458,7 +458,8 @@ nsresult CNavDTD::WillBuildModel(nsString& aFilename,
mLineNumber=1;
mHasOpenScript=PR_FALSE;
mParseMode=aParseMode;
mStyleHandlingEnabled=(eParseMode_quirks==mParseMode);
if((aNotifySink) && (aSink)) {
STOP_TIMER();
@@ -577,6 +578,24 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse
}
}
}
else {
//If you're here, then an error occured, but we still have nodes on the stack.
//At a minimum, we should grab the nodes and recycle them.
//Just to be correct, we'll also recycle the nodes.
while(mBodyContext->GetCount() > 0) {
nsEntryStack *theChildStyles=0;
nsCParserNode* theNode=(nsCParserNode*)mBodyContext->Pop(theChildStyles);
theNode->mUseCount=0;
RecycleNode(theNode);
if(theChildStyles) {
delete theChildStyles;
}
}
}
STOP_TIMER();
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::DidBuildModel(), this=%p\n", this));
@@ -1006,7 +1025,7 @@ nsresult CNavDTD::HandleDefaultStartToken(CToken* aToken,eHTMLTags aChildTag,nsI
// The safest thing to do is to discard this tag.
return result;
}
CloseContainersTo(theIndex,theParentTag,PR_TRUE);
CloseContainersTo(theIndex,aChildTag,PR_TRUE);
}//if
else break;
}//if
@@ -1609,9 +1628,10 @@ nsresult CNavDTD::HandleSavedTokens(PRInt32 anIndex) {
// The body context should contain contents only upto the marked position.
PRInt32 i=0;
nsEntryStack *theStack=0;
nsEntryStack* theChildStyleStack=0;
for(i=0; i<(theTagCount - theTopIndex); i++) {
mTempContext->Push((nsCParserNode*)mBodyContext->Pop(theStack));
mTempContext->Push((nsCParserNode*)mBodyContext->Pop(theChildStyleStack));
}
// Now flush out all the bad contents.
@@ -1644,7 +1664,7 @@ nsresult CNavDTD::HandleSavedTokens(PRInt32 anIndex) {
// Bad-contents were successfully processed. Now, itz time to get
// back to the original body context state.
for(PRInt32 k=0; k<(theTagCount - theTopIndex); k++) {
mBodyContext->Push((nsCParserNode*)mTempContext->Pop(theStack));
mBodyContext->Push((nsCParserNode*)mTempContext->Pop(theChildStyleStack));
}
STOP_TIMER()
@@ -2312,35 +2332,41 @@ nsresult CNavDTD::OpenTransientStyles(eHTMLTags aChildTag){
//later, change this so that transients only open in containers that get leaked in to.
if(mStyleHandlingEnabled) {
#ifdef ENABLE_RESIDUALSTYLE
eHTMLTags theParentTag=mBodyContext->Last();
if(!gHTMLElements[theParentTag].HasSpecialProperty(kNoStyleLeaksIn)) {
//the following code builds the set of style tags to be opened...
PRUint32 theCount=mBodyContext->GetCount()-1;
PRUint32 theLevel=0;
for(theLevel=0;theLevel<theCount;theLevel++){
nsEntryStack* theStack=mBodyContext->GetStylesAt(theLevel);
if(theStack){
eHTMLTags theParentTag=mBodyContext->Last();
PRUint32 scount=theStack->mCount;
PRUint32 sindex=0;
if(CanContain(eHTMLTag_font,aChildTag)) {
if(!gHTMLElements[theParentTag].HasSpecialProperty(kNoStyleLeaksIn)) {
//the following code builds the set of style tags to be opened...
PRUint32 theCount=mBodyContext->GetCount();
PRUint32 theLevel=0;
for(theLevel=0;theLevel<theCount;theLevel++){
nsEntryStack* theStack=mBodyContext->GetStylesAt(theLevel);
if(theStack){
nsTagEntry *theEntry=theStack->mEntries;
for(sindex=0;sindex<scount;sindex++){
if(kNotFound==theEntry->mLevel) {
theEntry->mLevel=theLevel;
nsIParserNode* theNode=theEntry->mNode;
if(theNode) {
result=OpenContainer(theNode,(eHTMLTags)theNode->GetNodeType(),PR_FALSE,theLevel);
}
}
theEntry++;
PRUint32 scount=theStack->mCount;
PRUint32 sindex=0;
nsTagEntry *theEntry=theStack->mEntries;
for(sindex=0;sindex<scount;sindex++){
if(!theEntry->mParent) {
theEntry->mParent=theStack; //we do this too, because this entry differs from the new one we're pushing...
nsIParserNode* theNode=theEntry->mNode;
if(theNode) {
result=OpenContainer(theNode,(eHTMLTags)theNode->GetNodeType(),PR_FALSE,theStack);
}
}
theEntry++;
} //for
} //if
} //for
} //if
} //for
}
}
#endif
}//if
return result;
}
@@ -2359,21 +2385,24 @@ nsresult CNavDTD::OpenTransientStyles(eHTMLTags aChildTag){
nsresult CNavDTD::CloseTransientStyles(eHTMLTags aChildTag){
nsresult result=NS_OK;
if(mStyleHandlingEnabled) {
#ifdef ENABLE_RESIDUALSTYLE
#if 0
int theTagPos=0;
//now iterate style set, and close the containers...
int theTagPos=0;
//now iterate style set, and close the containers...
nsEntryStack* theStack=mBodyContext->GetStylesAt();
for(theTagPos=mBodyContext->mOpenStyles;theTagPos>0;theTagPos--){
eHTMLTags theTag=GetTopNode();
CStartToken token(theTag);
nsCParserNode theNode(&token,mLineNumber);
token.SetTypeID(theTag);
result=CloseContainer(theNode,theTag,PR_FALSE);
}
nsEntryStack* theStack=mBodyContext->GetStylesAt();
for(theTagPos=mBodyContext->mOpenStyles;theTagPos>0;theTagPos--){
eHTMLTags theTag=GetTopNode();
CStartToken token(theTag);
nsCParserNode theNode(&token,mLineNumber);
token.SetTypeID(theTag);
result=CloseContainer(theNode,theTag,PR_FALSE);
}
#endif
#endif
} //if
return result;
}
@@ -2388,14 +2417,16 @@ nsresult CNavDTD::CloseTransientStyles(eHTMLTags aChildTag){
nsresult CNavDTD::PopStyle(eHTMLTags aTag){
nsresult result=0;
if(mStyleHandlingEnabled) {
#ifdef ENABLE_RESIDUALSTYLE
if(nsHTMLElement::IsStyleTag(aTag)) {
nsCParserNode *theNode=(nsCParserNode*)mBodyContext->PopStyle(aTag);
if(theNode) {
RecycleNode(theNode);
if(nsHTMLElement::IsStyleTag(aTag)) {
nsCParserNode* theNode=(nsCParserNode*)mBodyContext->PopStyle(aTag);
if(theNode) {
RecycleNode(theNode);
}
}
}
#endif
} //if
return result;
}
@@ -2725,7 +2756,7 @@ nsresult CNavDTD::CloseFrameset(const nsIParserNode *aNode){
* @return TRUE if ok, FALSE if error
*/
nsresult
CNavDTD::OpenContainer(const nsIParserNode *aNode,eHTMLTags aTag,PRBool aClosedByStartTag,PRInt32 aResidualStyleLevel){
CNavDTD::OpenContainer(const nsIParserNode *aNode,eHTMLTags aTag,PRBool aClosedByStartTag,nsEntryStack* aStyleStack){
NS_PRECONDITION(mBodyContext->GetCount() >= 0, kInvalidTagStackPos);
nsresult result=NS_OK;
@@ -2804,7 +2835,7 @@ CNavDTD::OpenContainer(const nsIParserNode *aNode,eHTMLTags aTag,PRBool aClosedB
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::OpenContainer(), this=%p\n", this));
START_TIMER();
mBodyContext->Push(aNode,aResidualStyleLevel);
mBodyContext->Push(aNode,aStyleStack);
}
return result;
@@ -2897,8 +2928,9 @@ nsresult CNavDTD::CloseContainersTo(PRInt32 anIndex,eHTMLTags aTarget, PRBool aC
theTag=mBodyContext->Last();
nsEntryStack *theStyles=0;
nsCParserNode* theNode=(nsCParserNode*)mBodyContext->Pop(theStyles);
nsEntryStack *theChildStyleStack=0;
nsCParserNode* theNode=(nsCParserNode*)mBodyContext->Pop(theChildStyleStack);
result=CloseContainer(theNode,aTarget,aClosedByStartTag);
if(theNode) {
@@ -2907,11 +2939,18 @@ nsresult CNavDTD::CloseContainersTo(PRInt32 anIndex,eHTMLTags aTarget, PRBool aC
PRBool theTagIsStyle=nsHTMLElement::IsStyleTag(theTag);
if(mStyleHandlingEnabled) {
if(aClosedByStartTag) {
if(aClosedByStartTag && (0==theNode->mUseCount)) {
/***************************************************************************
The cases we're handing here:
1. <body><b><DIV> //<b> gets pushed onto <body>.mStyles.
***************************************************************************/
if(theTagIsStyle) {
if(theStyles) {
theStyles->PushFront(theNode);
mBodyContext->PushStyles(theStyles);
if(theChildStyleStack) {
theChildStyleStack->PushFront(theNode);
mBodyContext->PushStyles(theChildStyleStack);
}
else mBodyContext->PushStyle(theNode);
}
@@ -2920,53 +2959,78 @@ nsresult CNavDTD::CloseContainersTo(PRInt32 anIndex,eHTMLTags aTarget, PRBool aC
//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...
//up the stack or popping and recycling displaced nodes.
if(aTarget!=theTag) {
if(theTagIsStyle) {
if(theStyles) {
theStyles->PushFront(theNode);
mBodyContext->PushStyles(theStyles);
}
else mBodyContext->PushStyle(theNode);
}
else if(theStyles) {
mBodyContext->PushStyles(theStyles);
/***************************************************************************
There are 2 cases:
1. <body><b><div>text</DIV>
Here the <b> will leak into <div> (see case given above), and
when <div> closes the <b> is dropped since it's already residual.
2. <body><div><b>text</div>
Here the <b> will leak out of the <div> and get pushed onto
the RS stack for the <body>, since it originated in the <div>.
***************************************************************************/
if(theTagIsStyle) {
if(theChildStyleStack) {
theChildStyleStack->PushFront(theNode);
mBodyContext->PushStyles(theChildStyleStack);
}
else if (0==theNode->mUseCount) {
if(theTag!=aTarget) {
mBodyContext->PushStyle(theNode);
} //otherwise just let the node recycle, because it was explicty closed
//and does not live on a style stack.
}
else {
//Ah, at last, the final case. If you're here, then we just popped a
//style tag that got onto that tag stack from a stylestack somewhere.
//The the target==theTag, then pop it from the stylestack.
if(theTag==aTarget) {
nsIParserNode* theNextNode=mBodyContext->PopStyle(theTag);
}
}
}
else if(theChildStyleStack) {
mBodyContext->PushStyles(theChildStyleStack);
}
}
}
} //if
else {
//since stylehandling is disabled, let's recycle the associated nodes here...
}
#endif
RecycleNode(theNode);
}
}//if
RecycleNode(theNode);
}
if(eParseMode_quirks==mParseMode) {
#ifdef ENABLE_RESIDUALSTYLE
//This code takes any nodes in style stack for at this level and reopens
//then where they were originally.
//This code takes any nodes in style stack for at this level and reopens
//then where they were originally.
if(!aClosedByStartTag) {
nsEntryStack* theStack=mBodyContext->GetStylesAt(anIndex-1);
if(theStack){
if(!aClosedByStartTag) {
nsEntryStack* theStack=mBodyContext->GetStylesAt(anIndex-1);
if(theStack){
PRUint32 scount=theStack->mCount;
PRUint32 sindex=0;
PRUint32 scount=theStack->mCount;
PRUint32 sindex=0;
for(sindex=0;sindex<scount;sindex++){
nsIParserNode* theNode=theStack->NodeAt(sindex);
if(theNode) {
((nsCParserNode*)theNode)->mUseCount--;
result=OpenContainer(theNode,(eHTMLTags)theNode->GetNodeType(),PR_FALSE);
}
}
theStack->mCount=0;
for(sindex=0;sindex<scount;sindex++){
nsIParserNode* theNode=theStack->NodeAt(sindex);
if(theNode) {
((nsCParserNode*)theNode)->mUseCount--;
result=OpenContainer(theNode,(eHTMLTags)theNode->GetNodeType(),PR_FALSE);
}
}
theStack->mCount=0;
} //if
} //if
} //if
#endif
}//if
} //if
return result;

View File

@@ -448,7 +448,7 @@ CLASS_EXPORT_HTMLPARS CNavDTD : public nsIDTD {
nsresult OpenForm(const nsIParserNode *aNode);
nsresult OpenMap(const nsIParserNode *aNode);
nsresult OpenFrameset(const nsIParserNode *aNode);
nsresult OpenContainer(const nsIParserNode *aNode,eHTMLTags aTag,PRBool aClosedByStartTag,PRInt32 aResidualStyleLevel=-1);
nsresult OpenContainer(const nsIParserNode *aNode,eHTMLTags aTag,PRBool aClosedByStartTag,nsEntryStack* aStyleStack=0);
/**
* The next set of methods close the given HTML element.

View File

@@ -534,8 +534,8 @@ nsresult COtherDTD::CloseFrameset(const nsIParserNode *aNode){
* @param aNode -- next node to be added to model
* @return TRUE if ok, FALSE if error
*/
nsresult COtherDTD::OpenContainer(const nsIParserNode *aNode,eHTMLTags aTarget,PRBool aUpdateStyleStack,PRInt32 aResidualStyleLevel){
return CNavDTD::OpenContainer(aNode,aTarget,aUpdateStyleStack,aResidualStyleLevel);
nsresult COtherDTD::OpenContainer(const nsIParserNode *aNode,eHTMLTags aTarget,PRBool aUpdateStyleStack,nsEntryStack* aStyleStack){
return CNavDTD::OpenContainer(aNode,aTarget,aUpdateStyleStack,aStyleStack);
}
/**

View File

@@ -233,7 +233,7 @@ private:
nsresult OpenForm(const nsIParserNode *aNode);
nsresult OpenMap(const nsIParserNode *aNode);
nsresult OpenFrameset(const nsIParserNode *aNode);
nsresult OpenContainer(const nsIParserNode *aNode,eHTMLTags aTag,PRBool aUpdateStyleStack,PRInt32 aResidualStyleLevel=-1);
nsresult OpenContainer(const nsIParserNode *aNode,eHTMLTags aTag,PRBool aUpdateStyleStack,nsEntryStack* aStyleStack=0);
/**
* The next set of methods close the given HTML element.

View File

@@ -34,7 +34,18 @@ MOZ_DECL_CTOR_COUNTER(nsDTDContext);
MOZ_DECL_CTOR_COUNTER(CTokenRecycler);
MOZ_DECL_CTOR_COUNTER(CObserverService);
/**************************************************************************************
A few notes about how residual style handling is performed:
1. The style stack contains nsTagEntry elements.
2. Every tag on the containment stack can have it's own residual style stack.
3. When a style leaks, it's mParent member is set to the level on the stack where
it originated. A node with an mParent of 0 is not opened on tag stack,
but is open on stylestack.
4. An easy way to tell that a container on the element stack is a residual style tag
is that it's use count is >1.
**************************************************************************************/
/**
* Default constructor
@@ -117,7 +128,7 @@ void nsEntryStack::EnsureCapacityFor(PRInt32 aNewMax,PRInt32 aShiftOffset) {
*
* @update gess 04/22/99
*/
void nsEntryStack::Push(const nsIParserNode* aNode,PRInt32 aResidualStyleLevel) {
void nsEntryStack::Push(const nsIParserNode* aNode,nsEntryStack* aStyleStack) {
if(aNode) {
EnsureCapacityFor(mCount+1);
@@ -127,8 +138,7 @@ void nsEntryStack::Push(const nsIParserNode* aNode,PRInt32 aResidualStyleLevel)
mEntries[mCount].mTag=(eHTMLTags)aNode->GetNodeType();
mEntries[mCount].mNode=(nsIParserNode*)aNode;
mEntries[mCount].mLevel=aResidualStyleLevel;
mEntries[mCount].mParent=0;
mEntries[mCount].mParent=aStyleStack;
mEntries[mCount++].mStyles=0;
}
}
@@ -139,7 +149,7 @@ void nsEntryStack::Push(const nsIParserNode* aNode,PRInt32 aResidualStyleLevel)
*
* @update gess 11/10/99
*/
void nsEntryStack::PushFront(const nsIParserNode* aNode,PRInt32 aResidualStyleLevel) {
void nsEntryStack::PushFront(const nsIParserNode* aNode,nsEntryStack* aStyleStack) {
if(aNode) {
if(mCount<mCapacity) {
@@ -156,8 +166,7 @@ void nsEntryStack::PushFront(const nsIParserNode* aNode,PRInt32 aResidualStyleLe
mEntries[0].mTag=(eHTMLTags)aNode->GetNodeType();
mEntries[0].mNode=(nsIParserNode*)aNode;
mEntries[0].mLevel=aResidualStyleLevel;
mEntries[0].mParent=0;
mEntries[0].mParent=aStyleStack;
mEntries[0].mStyles=0;
mCount++;
}
@@ -177,7 +186,7 @@ void nsEntryStack::Append(nsEntryStack *aStack) {
PRInt32 theIndex=0;
for(theIndex=0;theIndex<theCount;theIndex++){
mEntries[mCount]=aStack->mEntries[theIndex];
mEntries[mCount++].mLevel=-1;
mEntries[mCount++].mParent=0;
}
}
}
@@ -190,7 +199,7 @@ void nsEntryStack::Append(nsEntryStack *aStack) {
*/
nsIParserNode* nsEntryStack::Pop(void) {
nsIParserNode *result=0;
nsIParserNode* result=0;
if(0<mCount) {
result=mEntries[--mCount].mNode;
@@ -199,6 +208,24 @@ nsIParserNode* nsEntryStack::Pop(void) {
((nsCParserNode*)result)->mToken->mUseCount--;
mEntries[mCount].mNode=0;
mEntries[mCount].mStyles=0;
nsEntryStack* theStyleStack=mEntries[mCount].mParent;
if(theStyleStack) {
//now we have to tell the residual style stack where this tag
//originated that it's no longer in use.
PRUint32 scount=theStyleStack->mCount;
PRUint32 sindex=0;
nsTagEntry *theStyleEntry=theStyleStack->mEntries;
for(sindex=scount-1;sindex>=0;sindex--){
if(theStyleEntry->mTag==mEntries[mCount].mTag) {
theStyleEntry->mParent=0; //this tells us that the style is not open at any level
break;
}
theStyleEntry++;
} //for
}
}
return result;
}
@@ -358,7 +385,7 @@ PRInt32 nsDTDContext::GetTopmostIndexOf(eHTMLTags aTag) const {
*
* @update gess7/9/98
*/
void nsDTDContext::Push(const nsIParserNode* aNode,PRInt32 aResidualStyleLevel) {
void nsDTDContext::Push(const nsIParserNode* aNode,nsEntryStack* aStyleStack) {
if(aNode) {
#ifdef NS_DEBUG
@@ -367,7 +394,7 @@ void nsDTDContext::Push(const nsIParserNode* aNode,PRInt32 aResidualStyleLevel)
if(size< eMaxTags)
mXTags[size]=theTag;
#endif
mStack.Push((nsIParserNode*)aNode,aResidualStyleLevel);
mStack.Push((nsIParserNode*)aNode,aStyleStack);
}
}
@@ -375,10 +402,10 @@ void nsDTDContext::Push(const nsIParserNode* aNode,PRInt32 aResidualStyleLevel)
* @update gess 11/11/99,
* harishd 04/04/99
*/
nsIParserNode* nsDTDContext::Pop(nsEntryStack *&aStack) {
nsIParserNode* nsDTDContext::Pop(nsEntryStack *&aChildStyleStack) {
PRInt32 theSize=mStack.mCount;
nsIParserNode *result=0;
PRInt32 theSize=mStack.mCount;
nsIParserNode* result=0;
if(0<theSize) {
@@ -390,10 +417,11 @@ nsIParserNode* nsDTDContext::Pop(nsEntryStack *&aStack) {
nsTagEntry* theEntry=mStack.EntryAt(mStack.mCount-1);
if(theEntry) {
aStack=theEntry->mStyles;
aChildStyleStack=theEntry->mStyles;
}
result=mStack.Pop();
theEntry->mParent=0;
}
return result;
@@ -457,10 +485,6 @@ void nsDTDContext::PushStyle(const nsIParserNode* aNode){
}
if(theStack) {
theStack->Push(aNode);
theEntry=&theStack->mEntries[theStack->mCount-1];
if(theEntry) {
theEntry->mParent=theStack;
}
}
} //if
}
@@ -480,6 +504,16 @@ void nsDTDContext::PushStyles(nsEntryStack *aStyles){
nsEntryStack* theStyles=theEntry->mStyles;
if(!theStyles) {
theEntry->mStyles=aStyles;
PRUint32 scount=aStyles->mCount;
PRUint32 sindex=0;
nsTagEntry *theEntry=aStyles->mEntries;
for(sindex=0;sindex<scount;sindex++){
theEntry->mParent=0; //this tells us that the style is not open at any level
theEntry++;
} //for
}
else theStyles->Append(aStyles);
} //if
@@ -492,15 +526,13 @@ void nsDTDContext::PushStyles(nsEntryStack *aStyles){
* @update gess 04/28/99
*/
nsIParserNode* nsDTDContext::PopStyle(void){
nsIParserNode* result=0;
nsIParserNode *result=0;
nsTagEntry *theEntry=mStack.EntryAt(mStack.mCount-1);
if(theEntry && (theEntry->mNode)) {
if(kNotFound<theEntry->mLevel){
nsEntryStack *theStack=mStack.mEntries[theEntry->mLevel].mStyles;
if(theStack) {
result=theStack->Pop();
}
nsEntryStack* theStyleStack=theEntry->mParent;
if(theStyleStack){
result=theStyleStack->Pop();
}
} //if
return result;

View File

@@ -75,7 +75,6 @@ class nsEntryStack; //forware declare to make compilers happy.
struct nsTagEntry {
eHTMLTags mTag; //for speedier access to tag id
nsIParserNode* mNode;
PRInt32 mLevel;
nsEntryStack* mParent;
nsEntryStack* mStyles;
};
@@ -86,8 +85,8 @@ public:
~nsEntryStack();
void EnsureCapacityFor(PRInt32 aNewMax, PRInt32 aShiftOffset=0);
void Push(const nsIParserNode* aNode,PRInt32 aResidualStyleLevel=-1);
void PushFront(const nsIParserNode* aNode,PRInt32 aResidualStyleLevel=-1);
void Push(const nsIParserNode* aNode,nsEntryStack* aStyleStack=0);
void PushFront(const nsIParserNode* aNode,nsEntryStack* aStyleStack=0);
void Append(nsEntryStack *theStack);
nsIParserNode* Pop(void);
nsIParserNode* NodeAt(PRInt32 anIndex) const;
@@ -132,8 +131,8 @@ public:
nsDTDContext();
~nsDTDContext();
void Push(const nsIParserNode* aNode,PRInt32 aResidualStyleLevel=-1);
nsIParserNode* Pop(nsEntryStack*& aStack);
void Push(const nsIParserNode* aNode,nsEntryStack* aStyleStack=0);
nsIParserNode* Pop(nsEntryStack*& aChildStack);
eHTMLTags First(void) const;
eHTMLTags Last(void) const;
eHTMLTags TagAt(PRInt32 anIndex) const;

View File

@@ -193,15 +193,11 @@ TagList gDontAutoClose={1,{eHTMLTag_td}};
//*********************************************************************************************
#define FSTYPE kInlineEntity
#define SPECIALTYPE kInlineEntity
const int kNoPropRange=0;
const int kDefaultPropRange=1;
const int kBodyPropRange=2;
//*********************************************************************************************
//
// Now let's dynamically build the element table...
@@ -213,19 +209,19 @@ nsHTMLElement* gHTMLElements=0;
void Initialize(eHTMLTags aTag,
eHTMLTags aRequiredAncestor,
eHTMLTags aExcludingAncestor,
TagList* aRootNodes,
TagList* aEndRootNodes,
TagList* aAutocloseStart,
TagList* aAutocloseEnd,
TagList* aSynonymousTags,
TagList* aDontAutocloseEnd,
TagList* aRootNodes,
TagList* aEndRootNodes,
TagList* aAutocloseStart,
TagList* aAutocloseEnd,
TagList* aSynonymousTags,
TagList* aDontAutocloseEnd,
int aParentBits,
int aInclusionBits,
int aExclusionBits,
int aSpecialProperties,
int aPropagateRange,
TagList* aSpecialParents,
TagList* aSpecialKids,
TagList* aSpecialParents,
TagList* aSpecialKids,
eHTMLTags aSkipTarget
)
{
@@ -273,7 +269,7 @@ 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*/ kSpecial, SPECIALTYPE|kBlockEntity, kNone,
/*parent,incl,exclgroups*/ kSpecial, kInlineEntity, kNone,
/*special props, prop-range*/ 0,kDefaultPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_unknown);
@@ -309,7 +305,7 @@ 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*/ kSpecial, (kSelf|SPECIALTYPE|kFlowEntity), kNone,
/*parent,incl,exclgroups*/ kSpecial, (kSelf|kInlineEntity|kFlowEntity), kNone,
/*special props, prop-range*/ 0,kDefaultPropRange,
/*special parents,kids,skip*/ 0,&gContainsParam,eHTMLTag_unknown);
@@ -327,7 +323,7 @@ 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*/ kFontStyle, (FSTYPE|kSelf), kNone,
/*parent,incl,exclgroups*/ kFontStyle, (kInlineEntity|kSelf), kNone,
/*special props, prop-range*/ 0,kDefaultPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_unknown);
@@ -345,7 +341,7 @@ 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*/ kSpecial, SPECIALTYPE, kNone,
/*parent,incl,exclgroups*/ kSpecial, kInlineEntity, kNone,
/*special props, prop-range*/ kNonContainer, kNoPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_unknown);
@@ -354,7 +350,7 @@ 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*/ kSpecial, (kSelf|SPECIALTYPE), kNone,
/*parent,incl,exclgroups*/ kSpecial, (kSelf|kInlineEntity), kNone,
/*special props, prop-range*/ 0,kDefaultPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_unknown);
@@ -372,7 +368,7 @@ 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*/ kFontStyle, (FSTYPE|kSelf), kNone,
/*parent,incl,exclgroups*/ kFontStyle, (kInlineEntity|kSelf), kNone,
/*special props, prop-range*/ 0,kDefaultPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_unknown);
@@ -579,7 +575,7 @@ 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*/ kSpecial|kFontStyle, (kSelf|SPECIALTYPE), kNone,
/*parent,incl,exclgroups*/ kSpecial|kFontStyle, (kSelf|kInlineEntity), kNone,
/*special props, prop-range*/ 0,kDefaultPropRange,
/*special parents,kids,skip*/ 0,&gFontKids,eHTMLTag_unknown);
@@ -697,7 +693,7 @@ 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*/ kFontStyle, (kSelf|FSTYPE), kNone,
/*parent,incl,exclgroups*/ kFontStyle, (kSelf|kInlineEntity), kNone,
/*special props, prop-range*/ 0, kDefaultPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_unknown);
@@ -814,7 +810,7 @@ void InitializeElementTable(void) {
/*req-parent excl-parent*/ eHTMLTag_unknown,eHTMLTag_unknown,
/*rootnodes,endrootnodes*/ &gLIRootTags,&gLIRootTags,
/*autoclose starttags and endtags*/ &gLIAutoClose,0,0,0,
/*parent,incl,exclgroups*/ kFlowEntity, kFlowEntity, kSelf,
/*parent,incl,exclgroups*/ kBlockEntity, kFlowEntity, kSelf,
/*special props, prop-range*/ kNoPropagate, kDefaultPropRange,
/*special parents,kids,skip*/ 0,&gLIKids,eHTMLTag_unknown);
@@ -841,7 +837,7 @@ 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*/ kSpecial, SPECIALTYPE|kBlockEntity, kNone,
/*parent,incl,exclgroups*/ kSpecial, kInlineEntity|kBlockEntity, kNone,
/*special props, prop-range*/ kOmitWS, kDefaultPropRange,
/*special parents,kids,skip*/ 0,&gMapKids,eHTMLTag_unknown);
@@ -922,7 +918,7 @@ 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*/ (kHeadMisc|kSpecial), (kFlowEntity|SPECIALTYPE|kSelf), kNone,
/*parent,incl,exclgroups*/ (kHeadMisc|kSpecial), (kFlowEntity|kInlineEntity|kSelf), kNone,
/*special props, prop-range*/ 0,kDefaultPropRange,
/*special parents,kids,skip*/ 0,&gContainsParam,eHTMLTag_unknown);
@@ -1003,7 +999,7 @@ 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*/ kSpecial, (kSelf|SPECIALTYPE), kNone,
/*parent,incl,exclgroups*/ kSpecial, (kSelf|kInlineEntity), kNone,
/*special props, prop-range*/ 0,kDefaultPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_unknown);
@@ -1012,7 +1008,7 @@ 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*/ kFontStyle, (kSelf|FSTYPE), kNone,
/*parent,incl,exclgroups*/ kFontStyle, (kSelf|kInlineEntity), kNone,
/*special props, prop-range*/ 0,kDefaultPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_unknown);
@@ -1057,7 +1053,7 @@ 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*/ kFontStyle, (kSelf|FSTYPE), kNone,
/*parent,incl,exclgroups*/ kFontStyle, (kSelf|kInlineEntity), kNone,
/*special props, prop-range*/ 0,kDefaultPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_unknown);
@@ -1106,7 +1102,7 @@ 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*/ kFontStyle, (kSelf|FSTYPE), kNone,
/*parent,incl,exclgroups*/ kFontStyle, (kSelf|kInlineEntity), kNone,
/*special props, prop-range*/ 0,kDefaultPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_unknown);
@@ -1135,7 +1131,7 @@ 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*/ kSpecial, (kSelf|SPECIALTYPE), kNone,
/*parent,incl,exclgroups*/ kSpecial, (kSelf|kInlineEntity), kNone,
/*special props, prop-range*/ 0,kDefaultPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_unknown);
@@ -1145,7 +1141,7 @@ 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*/ kSpecial, (kSelf|SPECIALTYPE), kNone,
/*parent,incl,exclgroups*/ kSpecial, (kSelf|kInlineEntity), kNone,
/*special props, prop-range*/ 0,kDefaultPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_unknown);
@@ -1235,7 +1231,7 @@ 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*/ kFontStyle, (kSelf|FSTYPE), kNone,
/*parent,incl,exclgroups*/ kFontStyle, (kSelf|kInlineEntity), kNone,
/*special props, prop-range*/ 0,kDefaultPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_unknown);
@@ -1244,7 +1240,7 @@ 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*/ kFontStyle, (kSelf|FSTYPE), kNone,
/*parent,incl,exclgroups*/ kFontStyle, (kSelf|kInlineEntity), kNone,
/*special props, prop-range*/ 0,kDefaultPropRange,
/*special parents,kids,skip*/ 0,0,eHTMLTag_unknown);
@@ -1681,33 +1677,34 @@ PRBool nsHTMLElement::IsStyleTag(eHTMLTags aChild) {
PRBool result=PR_FALSE;
switch(aChild) {
case eHTMLTag_a:
case eHTMLTag_acronym:
// case eHTMLTag_abbr:
// case eHTMLTag_acronym:
case eHTMLTag_b:
case eHTMLTag_bdo:
case eHTMLTag_big:
case eHTMLTag_blink:
case eHTMLTag_center:
case eHTMLTag_cite:
case eHTMLTag_code:
// case eHTMLTag_center:
// case eHTMLTag_cite:
// case eHTMLTag_code:
case eHTMLTag_del:
case eHTMLTag_dfn:
case eHTMLTag_em:
// case eHTMLTag_dfn:
// case eHTMLTag_em:
case eHTMLTag_font:
case eHTMLTag_i:
case eHTMLTag_ins:
case eHTMLTag_kbd:
// case eHTMLTag_kbd:
case eHTMLTag_q:
case eHTMLTag_s:
case eHTMLTag_samp:
// case eHTMLTag_samp:
case eHTMLTag_small:
case eHTMLTag_span:
case eHTMLTag_strike:
case eHTMLTag_strong:
// case eHTMLTag_strong:
case eHTMLTag_sub:
case eHTMLTag_sup:
case eHTMLTag_tt:
case eHTMLTag_u:
case eHTMLTag_var:
// case eHTMLTag_var:
result=PR_TRUE;
default:
break;
@@ -1811,7 +1808,7 @@ PRBool nsHTMLElement::CanContainSelf(void) const {
PRBool nsHTMLElement::CanAutoCloseTag(eHTMLTags aTag) const{
PRBool result=PR_TRUE;
if((mTagID>=eHTMLTag_unknown) & (mTagID<=eHTMLTag_userdefined)) {
TagList* theTagList=gHTMLElements[mTagID].GetNonAutoCloseEndTags();
TagList* theTagList=gHTMLElements[mTagID].mDontAutocloseEnd;
if(theTagList) {
result=!FindTagInSet(aTag,theTagList->mTags,theTagList->mCount);
}
@@ -1912,6 +1909,11 @@ PRBool nsHTMLElement::CanContain(eHTMLTags aChild) const{
return PR_FALSE;
}
if(nsHTMLElement::IsBlockEntity(aChild)){
if(nsHTMLElement::IsBlockParent(mTagID)){
return PR_TRUE;
}
}
if(nsHTMLElement::IsInlineEntity(aChild)){
if(nsHTMLElement::IsInlineParent(mTagID)){
@@ -1931,12 +1933,6 @@ PRBool nsHTMLElement::CanContain(eHTMLTags aChild) const{
}
}
if(nsHTMLElement::IsBlockEntity(aChild)){
if(nsHTMLElement::IsBlockParent(mTagID) || IsStyleTag(mTagID)){
return PR_TRUE;
}
}
if(CanContainType(gHTMLElements[aChild].mParentBits)) {
return PR_TRUE;
}

View File

@@ -73,7 +73,6 @@ struct nsHTMLElement {
TagList* GetEndRootTags(void) const {return mEndRootNodes;}
TagList* GetAutoCloseStartTags(void) const {return mAutocloseStart;}
TagList* GetAutoCloseEndTags(void) const {return mAutocloseEnd;}
TagList* GetNonAutoCloseEndTags(void) const {return mDontAutocloseEnd;}
eHTMLTags GetCloseTargetForEndTag(nsDTDContext& aContext,PRInt32 anIndex) const;
TagList* GetSpecialChildren(void) const {return mSpecialKids;}
@@ -114,7 +113,7 @@ struct nsHTMLElement {
TagList* mAutocloseStart; //these are the start tags that you can automatically close with this START tag
TagList* mAutocloseEnd; //these are the start tags that you can automatically close with this END tag
TagList* mSynonymousTags; //These are morally equivalent; an end tag for one can close a start tag for another (like <Hn>)
TagList* mDontAutocloseEnd; //these are the end tags that you cannot automatically close with this END tag
TagList* mDontAutocloseEnd; //...
int mParentBits; //defines groups that can contain this element
int mInclusionBits; //defines parental and containment rules
int mExclusionBits; //defines things you CANNOT contain

View File

@@ -359,8 +359,9 @@ nsresult nsHTMLTokenizer::ConsumeTag(PRUnichar aChar,CToken*& aToken,nsScanner&
PRUnichar theNextChar;
result=aScanner.Peek(theNextChar);
if(NS_OK==result) {
if(theNextChar==kMinus)
if((kMinus==theNextChar) || (kGreaterThan==theNextChar)) {
result=ConsumeComment(aChar,aToken,aScanner);
}
else
result=ConsumeSpecialMarkup(aChar,aToken,aScanner);
}

View File

@@ -770,8 +770,10 @@ nsresult ConsumeStrictComment(PRUnichar aChar, nsScanner& aScanner,nsString& aSt
}//if
}//while
if(NS_OK==result) {
//if you're here, we're consuming a "short-form" comment
result=aScanner.ReadUntil(aString,kGreaterThan,PR_TRUE);
//Read up to the closing '>', unless you already did! (such as <!>).
if(kGreaterThan!=aChar) {
result=aScanner.ReadUntil(aString,kGreaterThan,PR_TRUE);
}
}
return result;
}
@@ -864,8 +866,10 @@ nsresult ConsumeComment(PRUnichar aChar, nsScanner& aScanner,nsString& aString)
}//if
}//if
if(NS_OK==result) {
//Read up to the closing '>'
result=aScanner.ReadUntil(aString,kGreaterThan,PR_TRUE);
//Read up to the closing '>', unless you already did! (such as <!>).
if(kGreaterThan!=aChar) {
result=aScanner.ReadUntil(aString,kGreaterThan,PR_TRUE);
}
}
return result;
}

View File

@@ -926,7 +926,12 @@ nsresult nsParser::ParseFragment(const nsString& aSourceBuffer,void* aKey,nsITag
}
theContext.Append("<endnote>"); //XXXHack! I'll make this better later.
nsAutoString theBuffer(theContext);
#if 0
theBuffer.Append(aSourceBuffer);
#else
theBuffer.Append("<B><META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html; charset=iso-8859-1\">text</b>");
#endif
if(theBuffer.Length()){
//now it's time to try to build the model from this fragment

View File

@@ -57,7 +57,6 @@ nsCParserNode::nsCParserNode(CToken* aToken,PRInt32 aLineNumber,nsITokenRecycler
mToken=aToken;
mRecycler=aRecycler;
mUseCount=0;
mIsResidual=PR_FALSE;
}
static void RecycleTokens(nsITokenRecycler* aRecycler,nsDeque& aDeque) {
@@ -111,7 +110,6 @@ nsresult nsCParserNode::Init(CToken* aToken,PRInt32 aLineNumber,nsITokenRecycler
RecycleTokens(mRecycler,*mAttributes);
mToken=aToken;
mUseCount=0;
mIsResidual=PR_FALSE;
mSkippedContent.Truncate();
return NS_OK;
}

View File

@@ -179,7 +179,6 @@ class nsCParserNode : public nsIParserNode {
nsDeque* mAttributes;
nsAutoString mSkippedContent;
PRInt32 mUseCount;
PRBool mIsResidual;
nsITokenRecycler* mRecycler;
};

View File

@@ -323,7 +323,7 @@ PRBool nsScanner::Append(const char* aBuffer, PRUint32 aLen){
*/
PRBool nsScanner::Append(const PRUnichar* aBuffer, PRUint32 aLen){
if(-1==aLen)
if(-1==(PRInt32)aLen)
aLen=nsCRT::strlen(aBuffer);
CBufDescriptor theDesc(aBuffer,PR_TRUE, aLen+1,aLen);