fixed bug 15290; eliminated a leak; r=kmcclusk

git-svn-id: svn://10.0.0.236/trunk@49805 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
rickg%netscape.com
1999-10-05 04:54:53 +00:00
parent ac0f716288
commit 685d8d596e
40 changed files with 480 additions and 476 deletions

View File

@@ -386,7 +386,7 @@ eAutoDetectResult CNavDTD::CanParse(nsString& aContentType, nsString& aCommand,
* @param
* @return
*/
nsresult CNavDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink){
nsresult CNavDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,eParseMode aParseMode,nsIContentSink* aSink){
nsresult result=NS_OK;
mFilename=aFilename;
@@ -395,6 +395,8 @@ nsresult CNavDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString
mHadFrameset=PR_FALSE;
mLineNumber=1;
mHasOpenScript=PR_FALSE;
mParseMode=aParseMode;
if((aNotifySink) && (aSink)) {
STOP_TIMER();
@@ -790,9 +792,9 @@ static
PRInt32 GetIndexOfChildOrSynonym(nsEntryStack& aTagStack,eHTMLTags aChildTag) {
PRInt32 theChildIndex=aTagStack.GetTopmostIndexOf(aChildTag);
if(kNotFound==theChildIndex) {
CTagList* theSynTags=gHTMLElements[aChildTag].GetSynonymousTags(); //get the list of tags that THIS tag can close
TagList* theSynTags=gHTMLElements[aChildTag].GetSynonymousTags(); //get the list of tags that THIS tag can close
if(theSynTags) {
theChildIndex=theSynTags->GetTopmostIndexOf(aTagStack);
theChildIndex=GetTopmostIndexOf(aTagStack,*theSynTags);
}
else{
theChildIndex=aTagStack.GetCount();
@@ -834,11 +836,11 @@ PRBool CanBeContained(eHTMLTags aChildTag,nsEntryStack& aTagStack) {
PRBool result=PR_TRUE;
if(aTagStack.GetCount()){
CTagList* theRootTags=gHTMLElements[aChildTag].GetRootTags();
CTagList* theSpecialParents=gHTMLElements[aChildTag].GetSpecialParents();
TagList* theRootTags=gHTMLElements[aChildTag].GetRootTags();
TagList* theSpecialParents=gHTMLElements[aChildTag].GetSpecialParents();
if(theRootTags) {
PRInt32 theRootIndex=theRootTags->GetTopmostIndexOf(aTagStack);
PRInt32 theSPIndex=(theSpecialParents) ? theSpecialParents->GetTopmostIndexOf(aTagStack) : kNotFound;
PRInt32 theRootIndex=GetTopmostIndexOf(aTagStack,*theRootTags);
PRInt32 theSPIndex=(theSpecialParents) ? GetTopmostIndexOf(aTagStack,*theSpecialParents) : kNotFound;
PRInt32 theChildIndex=GetIndexOfChildOrSynonym(aTagStack,aChildTag);
PRInt32 theBaseIndex=(theRootIndex>theSPIndex) ? theRootIndex : theSPIndex;
@@ -1275,13 +1277,13 @@ nsresult CNavDTD::HandleStartToken(CToken* aToken) {
* @return PR_TRUE if given tag can contain other tags
*/
static
PRBool HasCloseablePeerAboveRoot(CTagList& aRootTagList,nsEntryStack& aTagStack,eHTMLTags aTag,PRBool anEndTag) {
PRInt32 theRootIndex=aRootTagList.GetTopmostIndexOf(aTagStack);
CTagList* theCloseTags=(anEndTag) ? gHTMLElements[aTag].GetAutoCloseEndTags() : gHTMLElements[aTag].GetAutoCloseStartTags();
PRBool HasCloseablePeerAboveRoot(TagList& aRootTagList,nsEntryStack& aTagStack,eHTMLTags aTag,PRBool anEndTag) {
PRInt32 theRootIndex=GetTopmostIndexOf(aTagStack,aRootTagList);
TagList* theCloseTags=(anEndTag) ? gHTMLElements[aTag].GetAutoCloseEndTags() : gHTMLElements[aTag].GetAutoCloseStartTags();
PRInt32 theChildIndex=-1;
if(theCloseTags) {
theChildIndex=theCloseTags->GetTopmostIndexOf(aTagStack);
theChildIndex=GetTopmostIndexOf(aTagStack,*theCloseTags);
}
else {
if((anEndTag) || (!gHTMLElements[aTag].CanContainSelf()))
@@ -1330,16 +1332,16 @@ eHTMLTags FindAutoCloseTargetForEndTag(eHTMLTags aCurrentTag,nsEntryStack& aTagS
3. Otherwise its non-specified and we simply presume we can close it.
*/
CTagList* theCloseTags=gHTMLElements[aCurrentTag].GetAutoCloseEndTags();
CTagList* theRootTags=gHTMLElements[aCurrentTag].GetEndRootTags();
TagList* theCloseTags=gHTMLElements[aCurrentTag].GetAutoCloseEndTags();
TagList* theRootTags=gHTMLElements[aCurrentTag].GetEndRootTags();
if(theCloseTags){
//at a min., this code is needed for H1..H6
while(theChildIndex<--theTopIndex) {
eHTMLTags theNextTag=aTagStack[theTopIndex];
if(PR_FALSE==theCloseTags->Contains(theNextTag)) {
if(PR_TRUE==theRootTags->Contains(theNextTag)) {
if(PR_FALSE==Contains(theNextTag,*theCloseTags)) {
if(PR_TRUE==Contains(theNextTag,*theRootTags)) {
return eHTMLTag_unknown; //we encountered a tag in root list so fail (because we're gated).
}
//otherwise presume it's something we can simply ignore and continue search...
@@ -1408,8 +1410,12 @@ nsresult CNavDTD::HandleEndToken(CToken* aToken) {
case eHTMLTag_br:
{
CToken* theToken=(CHTMLToken*)gRecycler->CreateTokenOfType(eToken_start,eHTMLTag_br);
result=HandleStartToken(theToken);
//This is special NAV-QUIRKS code that allows users
//to use </BR>, even though that isn't a legitimate tag.
if(eParseMode_quirks==mParseMode) {
CStartToken theToken(eHTMLTag_br);
result=HandleStartToken(&theToken);
}
}
break;
@@ -1428,8 +1434,14 @@ nsresult CNavDTD::HandleEndToken(CToken* aToken) {
// Oh boy!! we found a "stray" block entity. Nav4.x and IE introduce line break in
// such cases. So, let's simulate that effect for compatibility.
// Ex. <html><body>Hello</P>There</body></html>
#if 0
mTokenizer->PushTokenFront(aToken); //put this end token back...
CHTMLToken* theToken = (CHTMLToken*)gRecycler->CreateTokenOfType(eToken_start,theChildTag);
mTokenizer->PushTokenFront(theToken); //put this new token onto stack...
#endif
CHTMLToken* theToken = (CHTMLToken*)gRecycler->CreateTokenOfType(eToken_start,theChildTag);
result=HandleToken(theToken,mParser);
}
else return result;
}
@@ -1849,8 +1861,8 @@ PRBool CNavDTD::CanPropagate(eHTMLTags aParentTag,eHTMLTags aChildTag) const {
result=PR_TRUE;
break;
}//if
CTagList* theTagList=gHTMLElements[aChildTag].GetRootTags();
aChildTag=theTagList->GetTagAt(0);
TagList* theTagList=gHTMLElements[aChildTag].GetRootTags();
aChildTag=GetTagAt(0,*theTagList);
if(aChildTag==theTempTag) break;
parentCanContain=CanContain(aParentTag,aChildTag);
++thePropLevel;
@@ -1999,9 +2011,9 @@ PRBool CNavDTD::BackwardPropagate(nsString& aSequence,eHTMLTags aParentTag,eHTML
eHTMLTags theParentTag=aParentTag; //just init to get past first condition...
do {
CTagList* theRootTags=gHTMLElements[aChildTag].GetRootTags();
TagList* theRootTags=gHTMLElements[aChildTag].GetRootTags();
if(theRootTags) {
theParentTag=theRootTags->GetTagAt(0);
theParentTag=GetTagAt(0,*theRootTags);
if(CanContain(theParentTag,aChildTag)) {
//we've found a complete sequence, so push the parent...
aChildTag=theParentTag;
@@ -2716,8 +2728,8 @@ nsresult CNavDTD::CloseContainersTo(eHTMLTags aTag,PRBool aClosedByStartTag){
}
nsresult result=NS_OK;
CTagList* theRootTags=gHTMLElements[aTag].GetRootTags();
eHTMLTags theParentTag=theRootTags->GetTagAt(0);
TagList* theRootTags=gHTMLElements[aTag].GetRootTags();
eHTMLTags theParentTag=GetTagAt(0,*theRootTags);
pos=GetTopmostIndexOf(theParentTag);
if(kNotFound!=pos) {
//the parent container is open, so close it instead
@@ -2765,24 +2777,42 @@ nsresult CNavDTD::AddLeaf(const nsIParserNode& aNode){
result=mSink->AddLeaf(aNode);
#if 1
PRBool done=PR_FALSE;
nsCParserNode* theNode=CreateNode();
CTokenRecycler* theRecycler=(CTokenRecycler*)mTokenizer->GetTokenRecycler();
while(!done) {
CToken* theToken=mTokenizer->PeekToken();
if(theToken) {
eHTMLTags theTag=(eHTMLTags)theToken->GetTypeID();
theTag=(eHTMLTags)theToken->GetTypeID();
switch(theTag) {
case eHTMLTag_newline:
mLineNumber++;
case eHTMLTag_text:
case eHTMLTag_whitespace:
{
theToken=mTokenizer->PopToken();
theNode->Init(theToken,mLineNumber,GetTokenRecycler());
theNode->Init(theToken,mLineNumber,0);
result=mSink->AddLeaf(*theNode);
if(theRecycler) {
theRecycler->RecycleToken(theToken);
}
else delete theToken;
}
break;
case eHTMLTag_text:
if(mHasOpenBody && (!mHasOpenHead)) {
theToken=mTokenizer->PopToken();
theNode->Init(theToken,mLineNumber);
result=mSink->AddLeaf(*theNode);
if(theRecycler) {
theRecycler->RecycleToken(theToken);
}
else delete theToken;
}
else done=PR_TRUE;
break;
default:
done=PR_TRUE;
} //switch
@@ -2790,8 +2820,6 @@ nsresult CNavDTD::AddLeaf(const nsIParserNode& aNode){
else done=PR_TRUE;
} //while
RecycleNode(theNode);
#endif
START_TIMER();

View File

@@ -179,7 +179,11 @@ CLASS_EXPORT_HTMLPARS CNavDTD : public nsIDTD {
* @param aFilename is the name of the file being parsed.
* @return error code (almost always 0)
*/
NS_IMETHOD WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink=0);
NS_IMETHOD WillBuildModel( nsString& aFilename,
PRBool aNotifySink,
nsString& aSourceType,
eParseMode aParseMode,
nsIContentSink* aSink=0);
/**
* The parser uses a code sandwich to wrap the parsing process. Before
@@ -524,6 +528,7 @@ protected:
eHTMLTags mSkipTarget;
nsDeque mSharedNodes;
nsresult mDTDState;
eParseMode mParseMode;
PRUint32 mComputedCRC32;
PRUint32 mExpectedCRC32;

View File

@@ -257,7 +257,7 @@ eAutoDetectResult CRtfDTD::CanParse(nsString& aContentType, nsString& aCommand,
* @param
* @return
*/
NS_IMETHODIMP CRtfDTD::WillBuildModel(nsString& aFileName,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink){
NS_IMETHODIMP CRtfDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,eParseMode aParseMode,nsIContentSink* aSink){
nsresult result=NS_OK;
return result;
}

View File

@@ -194,7 +194,11 @@ class CRtfDTD : public nsIDTD {
* @param aFilename is the name of the file being parsed.
* @return error code (almost always 0)
*/
NS_IMETHOD WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink=0);
NS_IMETHOD WillBuildModel( nsString& aFilename,
PRBool aNotifySink,
nsString& aSourceType,
eParseMode aParseMode,
nsIContentSink* aSink=0);
/**
* The parser uses a code sandwich to wrap the parsing process. Before

View File

@@ -32,12 +32,8 @@
* @param
* @return
*/
PRBool CTagList::Contains(eHTMLTags aTag){
PRBool result=PR_FALSE;
if(mTagList) {
result=FindTagInSet(aTag,mTagList,mCount);
}
else result=FindTagInSet(aTag,mTags,mCount);
PRBool Contains(eHTMLTags aTag,TagList& aTagList){
PRBool result=FindTagInSet(aTag,aTagList.mTags,aTagList.mCount);
return result;
}
@@ -47,11 +43,11 @@ PRBool CTagList::Contains(eHTMLTags aTag){
* @param
* @return
*/
PRInt32 CTagList::GetTopmostIndexOf(nsEntryStack& aTagStack){
PRInt32 GetTopmostIndexOf(nsEntryStack& aTagStack,TagList& aTagList){
int max = aTagStack.GetCount();
int index;
int index=0;
for(index=max-1;index>=0;index--){
if(Contains(aTagStack[index])) {
if(FindTagInSet(aTagStack[index],aTagList.mTags,aTagList.mCount)) {
return index;
}
}
@@ -64,154 +60,120 @@ PRInt32 CTagList::GetTopmostIndexOf(nsEntryStack& aTagStack){
* @param
* @return
*/
PRInt32 CTagList::GetBottommostIndexOf(nsEntryStack& aTagStack,PRInt32 aStartOffset){
int max = aTagStack.GetCount();
int index;
for(index=aStartOffset;index<max;index++){
if(Contains(aTagStack[index])) {
return index;
}
}
return kNotFound;
}
/**
*
* @update gess 01/04/99
* @param
* @return
*/
eHTMLTags CTagList::GetTagAt(PRUint32 anIndex) const{
eHTMLTags GetTagAt(PRUint32 anIndex,TagList& aTagList) {
eHTMLTags result=eHTMLTag_unknown;
if(anIndex<mCount){
result=(mTagList) ? mTagList[anIndex] : mTags[anIndex];
if(anIndex<aTagList.mCount){
result=aTagList.mTags[anIndex];
}
return result;
}
/*****************************************************************************
Now it's time to list all the html elements all with their capabilities...
******************************************************************************/
//First, define the set of taglists for tags with special parents...
CTagList gAParents(1,0,eHTMLTag_map);
CTagList gInAddress(1,0,eHTMLTag_address);
CTagList gInHead(1,0,eHTMLTag_head);
CTagList gInTable(1,0,eHTMLTag_table);
CTagList gInHTML(1,0,eHTMLTag_html);
CTagList gInBody(1,0,eHTMLTag_body);
CTagList gInForm(1,0,eHTMLTag_form);
CTagList gInFieldset(1,0,eHTMLTag_fieldset);
CTagList gInTR(1,0,eHTMLTag_tr);
CTagList gInDL(2,0,eHTMLTag_dl,eHTMLTag_body);
CTagList gInFrameset(1,0,eHTMLTag_frameset);
CTagList gInNoframes(1,0,eHTMLTag_noframes);
CTagList gInP(4,0,eHTMLTag_address,eHTMLTag_form,eHTMLTag_span,eHTMLTag_table);
CTagList gOptgroupParents(2,0,eHTMLTag_optgroup,eHTMLTag_select);
CTagList gBodyParents(2,0,eHTMLTag_html,eHTMLTag_noframes);
CTagList gColParents(2,0,eHTMLTag_table,eHTMLTag_colgroup);
CTagList gFramesetParents(2,0,eHTMLTag_html,eHTMLTag_frameset);
CTagList gLegendParents(1,0,eHTMLTag_fieldset);
CTagList gAreaParent(1,0,eHTMLTag_map);
CTagList gParamParents(2,0,eHTMLTag_applet,eHTMLTag_object);
CTagList gTRParents(4,0,eHTMLTag_tbody,eHTMLTag_tfoot,eHTMLTag_thead,eHTMLTag_table);
static eHTMLTags gTREndParentList[]={eHTMLTag_tbody,eHTMLTag_tfoot,eHTMLTag_thead,eHTMLTag_table,eHTMLTag_td,eHTMLTag_th};
CTagList gTREndParents(sizeof(gTREndParentList)/sizeof(eHTMLTag_unknown),gTREndParentList);
TagList gAParents={1,eHTMLTag_map};
TagList gInAddress={1,eHTMLTag_address};
TagList gInHead={1,eHTMLTag_head};
TagList gInTable={1,eHTMLTag_table};
TagList gInHTML={1,eHTMLTag_html};
TagList gInBody={1,eHTMLTag_body};
TagList gInForm={1,eHTMLTag_form};
TagList gInFieldset={1,eHTMLTag_fieldset};
TagList gInTR={1,eHTMLTag_tr};
TagList gInDL={2,eHTMLTag_dl,eHTMLTag_body};
TagList gInFrameset={1,eHTMLTag_frameset};
TagList gInNoframes={1,eHTMLTag_noframes};
TagList gInP={4,eHTMLTag_address,eHTMLTag_form,eHTMLTag_span,eHTMLTag_table};
TagList gOptgroupParents={2,eHTMLTag_optgroup,eHTMLTag_select};
TagList gBodyParents={2,eHTMLTag_html,eHTMLTag_noframes};
TagList gColParents={2,eHTMLTag_table,eHTMLTag_colgroup};
TagList gFramesetParents={2,eHTMLTag_html,eHTMLTag_frameset};
TagList gLegendParents={1,eHTMLTag_fieldset};
TagList gAreaParent={1,eHTMLTag_map};
TagList gParamParents={2,eHTMLTag_applet,eHTMLTag_object};
TagList gTRParents={4,eHTMLTag_tbody,eHTMLTag_tfoot,eHTMLTag_thead,eHTMLTag_table};
TagList gTREndParents={6,eHTMLTag_tbody,eHTMLTag_tfoot,eHTMLTag_thead,eHTMLTag_table,eHTMLTag_td,eHTMLTag_th};
//*********************************************************************************************
// Next, define the set of taglists for tags with special kids...
//*********************************************************************************************
CTagList gContainsText(4,0,eHTMLTag_text,eHTMLTag_newline,eHTMLTag_whitespace,eHTMLTag_entity);
CTagList gUnknownKids(2,0,eHTMLTag_html,eHTMLTag_frameset);
CTagList gContainsOpts(3,0,eHTMLTag_option,eHTMLTag_optgroup,eHTMLTag_script);
CTagList gContainsParam(1,0,eHTMLTag_param);
CTagList gColgroupKids(1,0,eHTMLTag_col);
CTagList gAddressKids(1,0,eHTMLTag_p);
CTagList gBodyKids(5,0,eHTMLTag_del,eHTMLTag_ins,eHTMLTag_noscript,eHTMLTag_script,eHTMLTag_li);
CTagList gButtonKids(2,0,eHTMLTag_caption,eHTMLTag_legend);
CTagList gDLKids(2,0,eHTMLTag_dd,eHTMLTag_dt);
CTagList gDTKids(1,0,eHTMLTag_dt);
CTagList gFieldsetKids(2,0,eHTMLTag_legend,eHTMLTag_text);
CTagList gFontKids(2,0,eHTMLTag_legend,eHTMLTag_text);
CTagList gFormKids(1,0,eHTMLTag_keygen);
CTagList gFramesetKids(3,0,eHTMLTag_frame,eHTMLTag_frameset,eHTMLTag_noframes);
TagList gContainsText={4,eHTMLTag_text,eHTMLTag_newline,eHTMLTag_whitespace,eHTMLTag_entity};
TagList gUnknownKids={2,eHTMLTag_html,eHTMLTag_frameset};
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 gButtonKids={2,eHTMLTag_caption,eHTMLTag_legend};
TagList gDLKids={2,eHTMLTag_dd,eHTMLTag_dt};
TagList gDTKids={1,eHTMLTag_dt};
TagList gFieldsetKids={2,eHTMLTag_legend,eHTMLTag_text};
TagList gFontKids={2,eHTMLTag_legend,eHTMLTag_text};
TagList gFormKids={1,eHTMLTag_keygen};
TagList gFramesetKids={3,eHTMLTag_frame,eHTMLTag_frameset,eHTMLTag_noframes};
static eHTMLTags gHTMLKidList[]={eHTMLTag_body,eHTMLTag_frameset,eHTMLTag_head,eHTMLTag_map,eHTMLTag_noscript,eHTMLTag_script,eHTMLTag_newline,eHTMLTag_whitespace};
CTagList gHtmlKids(sizeof(gHTMLKidList)/sizeof(eHTMLTag_unknown),gHTMLKidList);
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};
static eHTMLTags gHeadKidList[]=
{eHTMLTag_base,eHTMLTag_bgsound,eHTMLTag_link,eHTMLTag_meta,eHTMLTag_script,eHTMLTag_style,eHTMLTag_title,eHTMLTag_noembed,eHTMLTag_noscript};
CTagList gHeadKids(sizeof(gHeadKidList)/sizeof(eHTMLTag_unknown),gHeadKidList);
TagList gLIKids={2,eHTMLTag_ol,eHTMLTag_ul};
TagList gMapKids={1,eHTMLTag_area};
TagList gNoframesKids={1,eHTMLTag_body};
TagList gPreKids={2,eHTMLTag_hr,eHTMLTag_center}; //note that CENTER is here for backward compatibility; it's not 4.0 spec.
CTagList gLIKids(2,0,eHTMLTag_ol,eHTMLTag_ul);
CTagList gMapKids(1,0,eHTMLTag_area);
CTagList gNoframesKids(1,0,eHTMLTag_body);
CTagList gPreKids(2,0,eHTMLTag_hr,eHTMLTag_center); //note that CENTER is here for backward compatibility; it's not 4.0 spec.
static eHTMLTags gTableList[]={ eHTMLTag_caption,eHTMLTag_col,eHTMLTag_colgroup,eHTMLTag_form,
// eHTMLTag_td,
eHTMLTag_thead,eHTMLTag_tbody,eHTMLTag_tfoot,
eHTMLTag_map,eHTMLTag_script,eHTMLTag_input};
CTagList gTableKids(sizeof(gTableList)/sizeof(eHTMLTag_unknown),gTableList);
static eHTMLTags gTableElemList[]={eHTMLTag_form,eHTMLTag_map,eHTMLTag_noscript,eHTMLTag_script,eHTMLTag_td,eHTMLTag_th,eHTMLTag_tr};
CTagList gTableElemKids(sizeof(gTableElemList)/sizeof(eHTMLTag_unknown),gTableElemList);
static eHTMLTags gTRList[]= {eHTMLTag_td,eHTMLTag_th,eHTMLTag_map,eHTMLTag_form,eHTMLTag_script,eHTMLTag_input};
CTagList gTRKids(sizeof(gTRList)/sizeof(eHTMLTag_unknown),gTRList);
CTagList gTBodyKids(3,0,eHTMLTag_tr,eHTMLTag_form,eHTMLTag_input);
CTagList gULKids(2,0,eHTMLTag_li,eHTMLTag_p);
TagList gTableKids={10,eHTMLTag_caption,eHTMLTag_col,eHTMLTag_colgroup,eHTMLTag_form,
eHTMLTag_thead,eHTMLTag_tbody,eHTMLTag_tfoot,
eHTMLTag_map,eHTMLTag_script,eHTMLTag_input};
TagList gTableElemKids={7,eHTMLTag_form,eHTMLTag_map,eHTMLTag_noscript,eHTMLTag_script,eHTMLTag_td,eHTMLTag_th,eHTMLTag_tr};
TagList gTRKids={6,eHTMLTag_td,eHTMLTag_th,eHTMLTag_map,eHTMLTag_form,eHTMLTag_script,eHTMLTag_input};
TagList gTBodyKids={3,eHTMLTag_tr,eHTMLTag_form,eHTMLTag_input};
TagList gULKids={2,eHTMLTag_li,eHTMLTag_p};
//*********************************************************************************************
// The following tag lists are used to define common set of root notes for the HTML elements...
//*********************************************************************************************
CTagList gRootTags(3,0,eHTMLTag_body,eHTMLTag_td,eHTMLTag_table);
CTagList gHTMLRootTags(1,0,eHTMLTag_unknown);
TagList gRootTags={3,eHTMLTag_body,eHTMLTag_td,eHTMLTag_table};
TagList gHTMLRootTags={1,eHTMLTag_unknown};
static eHTMLTags gLIList[]={eHTMLTag_ul,eHTMLTag_ol,eHTMLTag_dir,eHTMLTag_menu,eHTMLTag_p,eHTMLTag_body,eHTMLTag_td};
CTagList gLIRootTags(sizeof(gLIList)/sizeof(eHTMLTag_unknown),gLIList);
CTagList gOLRootTags(3,0,eHTMLTag_body,eHTMLTag_li,eHTMLTag_td);
CTagList gTDRootTags(3,0,eHTMLTag_tr,eHTMLTag_tbody,eHTMLTag_table);
CTagList gNoframeRoot(2,0,eHTMLTag_body,eHTMLTag_frameset);
TagList gLIRootTags={7,eHTMLTag_ul,eHTMLTag_ol,eHTMLTag_dir,eHTMLTag_menu,eHTMLTag_p,eHTMLTag_body,eHTMLTag_td};
TagList gOLRootTags={3,eHTMLTag_body,eHTMLTag_li,eHTMLTag_td};
TagList gTDRootTags={3,eHTMLTag_tr,eHTMLTag_tbody,eHTMLTag_table};
TagList gNoframeRoot={2,eHTMLTag_body,eHTMLTag_frameset};
//*********************************************************************************************
// The following tag lists are used to define the autoclose properties of the html elements...
//*********************************************************************************************
CTagList gAutoClose(2,0,eHTMLTag_body,eHTMLTag_td);
CTagList gBodyAutoClose(1,0,eHTMLTag_head);
CTagList gTBodyAutoClose(3,0,eHTMLTag_thead,eHTMLTag_tfoot,eHTMLTag_tbody);
CTagList gCaptionAutoClose(1,0,eHTMLTag_tbody);
CTagList gLIAutoClose(2,0,eHTMLTag_p,eHTMLTag_li);
CTagList gPAutoClose(2,0,eHTMLTag_p,eHTMLTag_li);
CTagList gHRAutoClose(1,0,eHTMLTag_p);
CTagList gOLAutoClose(3,0,eHTMLTag_p,eHTMLTag_ol,eHTMLTag_ul);
CTagList gDivAutoClose(1,0,eHTMLTag_p);
TagList gBodyAutoClose={1,eHTMLTag_head};
TagList gTBodyAutoClose={3,eHTMLTag_thead,eHTMLTag_tfoot,eHTMLTag_tbody};
TagList gCaptionAutoClose={1,eHTMLTag_tbody};
TagList gLIAutoClose={2,eHTMLTag_p,eHTMLTag_li};
TagList gPAutoClose={2,eHTMLTag_p,eHTMLTag_li};
TagList gHRAutoClose={1,eHTMLTag_p};
TagList gOLAutoClose={3,eHTMLTag_p,eHTMLTag_ol,eHTMLTag_ul};
TagList gDivAutoClose={1,eHTMLTag_p};
static eHTMLTags gHxList[]={eHTMLTag_h1,eHTMLTag_h2,eHTMLTag_h3,eHTMLTag_h4,eHTMLTag_h5,eHTMLTag_h6};
CTagList gHeadingTags(sizeof(gHxList)/sizeof(eHTMLTag_unknown),gHxList);
TagList gHeadingTags={6,eHTMLTag_h1,eHTMLTag_h2,eHTMLTag_h3,eHTMLTag_h4,eHTMLTag_h5,eHTMLTag_h6};
CTagList gTRCloseTags(3,0,eHTMLTag_tr,eHTMLTag_td,eHTMLTag_th);
CTagList gTDCloseTags(2,0,eHTMLTag_td,eHTMLTag_th);
CTagList gDTCloseTags(3,0,eHTMLTag_dt,eHTMLTag_dd,eHTMLTag_p);
CTagList gULCloseTags(1,0,eHTMLTag_li);
TagList gTRCloseTags={3,eHTMLTag_tr,eHTMLTag_td,eHTMLTag_th};
TagList gTDCloseTags={2,eHTMLTag_td,eHTMLTag_th};
TagList gDTCloseTags={3,eHTMLTag_dt,eHTMLTag_dd,eHTMLTag_p};
TagList gULCloseTags={1,eHTMLTag_li};
//*********************************************************************************************
// The following tag lists are used to define the non-autoclose properties of the html elements...
//*********************************************************************************************
CTagList gDontAutoClose(1,0,eHTMLTag_td);
TagList gDontAutoClose={1,eHTMLTag_td};
//*********************************************************************************************
//Lastly, bind tags with their rules, their special parents and special kids.
@@ -238,19 +200,19 @@ nsHTMLElement* gHTMLElements=0;
void Initialize(eHTMLTags aTag,
eHTMLTags aRequiredAncestor,
eHTMLTags aExcludingAncestor,
CTagList* aRootNodes,
CTagList* aEndRootNodes,
CTagList* aAutocloseStart,
CTagList* aAutocloseEnd,
CTagList* aSynonymousTags,
CTagList* aDontAutocloseEnd,
TagList* aRootNodes,
TagList* aEndRootNodes,
TagList* aAutocloseStart,
TagList* aAutocloseEnd,
TagList* aSynonymousTags,
TagList* aDontAutocloseEnd,
int aParentBits,
int aInclusionBits,
int aExclusionBits,
int aSpecialProperties,
int aPropagateRange,
CTagList* aSpecialParents,
CTagList* aSpecialKids,
TagList* aSpecialParents,
TagList* aSpecialKids,
eHTMLTags aSkipTarget
)
{
@@ -1610,7 +1572,7 @@ PRBool nsHTMLElement::CanExclude(eHTMLTags aChild) const{
//Note that special kids takes precedence over exclusions...
if(mSpecialKids) {
if(mSpecialKids->Contains(aChild)) {
if(Contains(aChild,*mSpecialKids)) {
return PR_FALSE;
}
}
@@ -1654,7 +1616,7 @@ PRBool nsHTMLElement::CanOmitStartTag(eHTMLTags aChild) const{
* @return
*/
PRBool nsHTMLElement::IsChildOfHead(eHTMLTags aChild) {
PRBool result=FindTagInSet(aChild,gHeadKidList,sizeof(gHeadKidList)/sizeof(eHTMLTag_body));
PRBool result=Contains(aChild,gHeadKids);
return result;
}
@@ -1667,10 +1629,10 @@ PRBool nsHTMLElement::IsChildOfHead(eHTMLTags aChild) {
*/
PRBool nsHTMLElement::SectionContains(eHTMLTags aChild,PRBool allowDepthSearch) {
PRBool result=PR_FALSE;
CTagList* theRootTags=gHTMLElements[aChild].GetRootTags();
TagList* theRootTags=gHTMLElements[aChild].GetRootTags();
if(theRootTags){
if(!theRootTags->Contains(mTagID)){
eHTMLTags theRootBase=(theRootTags->mTagList) ? theRootTags->mTagList[0] : theRootTags->mTags[0];
if(!Contains(mTagID,*theRootTags)){
eHTMLTags theRootBase=GetTagAt(0,*theRootTags);
if((eHTMLTag_unknown!=theRootBase) && (allowDepthSearch))
result=SectionContains(theRootBase,allowDepthSearch);
}
@@ -1711,7 +1673,7 @@ PRBool nsHTMLElement::IsStyleTag(eHTMLTags aChild) {
* @return
*/
PRBool nsHTMLElement::IsHeadingTag(eHTMLTags aChild) {
return gHeadingTags.Contains(aChild);
return Contains(aChild,gHeadingTags);
}
@@ -1782,8 +1744,10 @@ PRBool nsHTMLElement::CanContainSelf(void) const {
PRBool nsHTMLElement::CanAutoCloseTag(eHTMLTags aTag) const{
PRBool result=PR_TRUE;
if((mTagID>=eHTMLTag_unknown) & (mTagID<=eHTMLTag_userdefined)) {
CTagList* theTagList=gHTMLElements[mTagID].GetNonAutoCloseEndTags();
if(theTagList) return !theTagList->Contains(aTag);
TagList* theTagList=gHTMLElements[mTagID].GetNonAutoCloseEndTags();
if(theTagList) {
result=!Contains(aTag,*theTagList);
}
}
return result;
}
@@ -1875,9 +1839,9 @@ PRBool nsHTMLElement::CanContain(eHTMLTags aChild) const{
return CanContainSelf(); //not many tags can contain themselves...
}
CTagList* theCloseTags=gHTMLElements[aChild].GetAutoCloseStartTags();
TagList* theCloseTags=gHTMLElements[aChild].GetAutoCloseStartTags();
if(theCloseTags){
if(theCloseTags->Contains(mTagID))
if(Contains(mTagID,*theCloseTags))
return PR_FALSE;
}
@@ -1911,7 +1875,7 @@ PRBool nsHTMLElement::CanContain(eHTMLTags aChild) const{
}
if(mSpecialKids) {
if(mSpecialKids->Contains(aChild)) {
if(Contains(aChild,*mSpecialKids)) {
return PR_TRUE;
}
}

View File

@@ -31,31 +31,15 @@
#include "nsHTMLTokens.h"
#include "nsDTDUtils.h"
class CTagList {
public:
CTagList( int aCount,
eHTMLTags* aTagList=0,
eHTMLTags aTag1=eHTMLTag_unknown,
eHTMLTags aTag2=eHTMLTag_unknown,
eHTMLTags aTag3=eHTMLTag_unknown,
eHTMLTags aTag4=eHTMLTag_unknown,
eHTMLTags aTag5=eHTMLTag_unknown)
{
mCount=aCount;
mTags[0]=aTag1; mTags[1]=aTag2; mTags[2]=aTag3; mTags[3]=aTag4; mTags[4]=aTag5;
mTagList=aTagList;
}
PRInt32 GetTopmostIndexOf(nsEntryStack& aTagStack);
PRInt32 GetBottommostIndexOf(nsEntryStack& aTagStack,PRInt32 aStartOffset);
PRBool Contains(eHTMLTags aTag);
eHTMLTags GetTagAt(PRUint32 anIndex) const;
eHTMLTags mTags[5];
eHTMLTags* mTagList;
struct TagList {
PRUint32 mCount;
eHTMLTags mTags[10];
};
extern PRBool Contains(eHTMLTags aTag,TagList& aTagList);
extern PRInt32 GetTopmostIndexOf(nsEntryStack& aTagStack,TagList& aTagList);
extern eHTMLTags GetTagAt(PRUint32 anIndex,TagList& aTagList);
//*********************************************************************************************
// The following ints define the standard groups of HTML elements...
//*********************************************************************************************
@@ -81,16 +65,16 @@ struct nsHTMLElement {
static PRBool IsBlockCloser(eHTMLTags aTag);
static int GetSynonymousGroups(int aGroup);
CTagList* GetSynonymousTags(void) const {return mSynonymousTags;}
CTagList* GetRootTags(void) const {return mRootNodes;}
CTagList* GetEndRootTags(void) const {return mEndRootNodes;}
CTagList* GetAutoCloseStartTags(void) const {return mAutocloseStart;}
CTagList* GetAutoCloseEndTags(void) const {return mAutocloseEnd;}
CTagList* GetNonAutoCloseEndTags(void) const {return mDontAutocloseEnd;}
TagList* GetSynonymousTags(void) const {return mSynonymousTags;}
TagList* GetRootTags(void) const {return mRootNodes;}
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(nsEntryStack& aTagStack,PRInt32 anIndex) const;
CTagList* GetSpecialChildren(void) const {return mSpecialKids;}
CTagList* GetSpecialParents(void) const {return mSpecialParents;}
TagList* GetSpecialChildren(void) const {return mSpecialKids;}
TagList* GetSpecialParents(void) const {return mSpecialParents;}
PRBool IsMemberOf(PRInt32 aType) const;
PRBool CanContainType(PRInt32 aType) const;
@@ -121,19 +105,19 @@ struct nsHTMLElement {
eHTMLTags mTagID;
eHTMLTags mRequiredAncestor;
eHTMLTags mExcludingAncestor; //If set, the presence of the excl-ancestor prevents this from opening.
CTagList* mRootNodes; //These are the tags above which you many not autoclose a START tag
CTagList* mEndRootNodes; //These are the tags above which you many not autoclose an END tag
CTagList* mAutocloseStart; //these are the start tags that you can automatically close with this START tag
CTagList* mAutocloseEnd; //these are the start tags that you can automatically close with this END tag
CTagList* mSynonymousTags; //These are morally equivalent; an end tag for one can close a start tag for another (like <Hn>)
CTagList* mDontAutocloseEnd; //these are the end tags that you cannot automatically close with this END tag
TagList* mRootNodes; //These are the tags above which you many not autoclose a START tag
TagList* mEndRootNodes; //These are the tags above which you many not autoclose an END tag
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
int mParentBits; //defines groups that can contain this element
int mInclusionBits; //defines parental and containment rules
int mExclusionBits; //defines things you CANNOT contain
int mSpecialProperties; //used for various special purposes...
int mPropagateRange; //tells us how far a parent is willing to prop. badly formed children
CTagList* mSpecialParents; //These are the special tags that contain this tag (directly)
CTagList* mSpecialKids; //These are the extra things you can contain
TagList* mSpecialParents; //These are the special tags that contain this tag (directly)
TagList* mSpecialKids; //These are the extra things you can contain
eHTMLTags mSkipTarget; //If set, then we skip all content until this tag is seen
};

View File

@@ -196,7 +196,7 @@ eAutoDetectResult nsExpatDTD::CanParse(nsString& aContentType, nsString& aComman
* @param
* @return
*/
NS_IMETHODIMP nsExpatDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aString,nsIContentSink* aSink){
NS_IMETHODIMP nsExpatDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,eParseMode aParseMode,nsIContentSink* aSink){
nsresult result=NS_OK;
mFilename=aFilename;

View File

@@ -102,7 +102,11 @@ class nsExpatDTD : public nsIDTD {
* @param aFilename is the name of the file being parsed.
* @return error code (almost always 0)
*/
NS_IMETHOD WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aString,nsIContentSink* aSink=0);
NS_IMETHOD WillBuildModel( nsString& aFilename,
PRBool aNotifySink,
nsString& aSourceType,
eParseMode aParseMode,
nsIContentSink* aSink=0);
/**
* The parser uses a code sandwich to wrap the parsing process. Before

View File

@@ -46,6 +46,14 @@ enum eAutoDetectResult {
eInvalidDetect
};
enum eParseMode {
eParseMode_unknown=0,
eParseMode_quirks, //pre 5.0 versions
eParseMode_noquirks, //raptor versions...)
eParseMode_other,
eParseMode_autodetect
};
class nsIParser;
class CToken;
@@ -94,7 +102,11 @@ class nsIDTD : public nsISupports {
* @param aFilename--string that contains name of file being parsed (if applicable)
* @return
*/
NS_IMETHOD WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink=0)=0;
NS_IMETHOD WillBuildModel( nsString& aFilename,
PRBool aNotifySink,
nsString& aSourceType,
eParseMode aParseMode,
nsIContentSink* aSink=0)=0;
/**
* Called by the parser after the parsing process has concluded

View File

@@ -49,16 +49,6 @@ class nsString;
class nsIURI;
enum eParseMode {
eParseMode_unknown=0,
eParseMode_raptor, //5.0 version of nav. and greater
eParseMode_navigator, //pre 5.0 versions
eParseMode_noquirks, //pre 5.0 without quirks (as best as we can...)
eParseMode_other,
eParseMode_autodetect
};
enum eCRCQuality {
eCRCGood = 0,
eCRCFair,

View File

@@ -463,12 +463,12 @@ eParseMode DetermineParseMode(nsParser& aParser) {
theSubIndex=theBufCopy.Find("HTML4.0",PR_TRUE,theIndex+8);
if(kNotFound<theSubIndex) {
if(theBufCopy.Find("TRANSITIONAL",PR_TRUE,theSubIndex)>kNotFound)
return eParseMode_navigator;
return eParseMode_quirks;
else if((theBufCopy.Find("FRAMESET",PR_TRUE,theSubIndex)>kNotFound) ||
(theBufCopy.Find("LATIN1", PR_TRUE,theSubIndex) >kNotFound) ||
(theBufCopy.Find("SYMBOLS",PR_TRUE,theSubIndex) >kNotFound) ||
(theBufCopy.Find("SPECIAL",PR_TRUE,theSubIndex) >kNotFound))
return eParseMode_navigator; // XXX -HACK- Set the appropriate mode.
return eParseMode_quirks; // XXX -HACK- Set the appropriate mode.
else
return eParseMode_noquirks;
}
@@ -490,7 +490,7 @@ eParseMode DetermineParseMode(nsParser& aParser) {
if(theModeStr)
if(0==nsCRT::strcasecmp(other,theModeStr))
return eParseMode_other;
return eParseMode_navigator;
return eParseMode_quirks;
}
@@ -521,6 +521,7 @@ nsresult nsParser::WillBuildModel(nsString& aFilename,nsIDTD* aDefaultDTD){
mParserContext->mDTD->WillBuildModel( aFilename,
PRBool(0==mParserContext->mPrevContext),
mParserContext->mSourceType,
mParserContext->mParseMode,
mSink);
}//if
}//if

View File

@@ -566,22 +566,23 @@ nsresult nsScanner::SkipTo(nsString& aValidSet){
return result;
}
#if 0
void DoErrTest(nsString& aString) {
PRInt32 pos=aString.FindChar(0);
if(kNotFound<pos) {
if(aString.Length()-1!=pos)
int x=10;
if(aString.Length()-1!=pos) {
}
}
}
void DoErrTest(nsCString& aString) {
PRInt32 pos=aString.FindChar(0);
if(kNotFound<pos) {
if(aString.Length()-1!=pos)
int x=10;
if(aString.Length()-1!=pos) {
}
}
}
#endif
/**
* Skip over chars as long as they're in aValidSet
@@ -1019,7 +1020,6 @@ nsresult nsScanner::ReadUntil(nsString& aString,
PRBool addTerminal){
PRUnichar theChar=0;
nsresult result=NS_OK;
PRInt32 thePos=0;
const PRUnichar* theBuf=mBuffer.GetUnicode();
PRInt32 theOrigin=mOffset;

View File

@@ -191,7 +191,7 @@ PRBool CValidDTD::CanConvert(nsString& aSourceType, nsString& aTargetType, PRInt
* @param
* @return
*/
NS_IMETHODIMP CValidDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink){
NS_IMETHODIMP CValidDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,eParseMode aParseMode,nsIContentSink* aSink){
nsresult result=NS_OK;
return result;
}

View File

@@ -111,7 +111,7 @@ class CValidDTD : public nsIDTD {
* @param aFilename is the name of the file being parsed.
* @return error code (almost always 0)
*/
NS_IMETHOD WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink=0);
NS_IMETHOD WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,eParseMode aParseMode,nsIContentSink* aSink=0);
/**
* The parser uses a code sandwich to wrap the parsing process. Before
* the process begins, WillBuildModel() is called. Afterwards the parser

View File

@@ -331,7 +331,7 @@ eAutoDetectResult CViewSourceHTML::CanParse(nsString& aContentType, nsString& aC
* @param
* @return
*/
NS_IMETHODIMP CViewSourceHTML::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink){
NS_IMETHODIMP CViewSourceHTML::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,eParseMode aParseMode,nsIContentSink* aSink){
nsresult result=NS_OK;
mFilename=aFilename;

View File

@@ -103,7 +103,11 @@ class CViewSourceHTML: public nsIDTD {
* @param aFilename is the name of the file being parsed.
* @return error code (almost always 0)
*/
NS_IMETHOD WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink=0);
NS_IMETHOD WillBuildModel( nsString& aFilename,
PRBool aNotifySink,
nsString& aSourceType,
eParseMode aParseMode,
nsIContentSink* aSink=0);
/**
* The parser uses a code sandwich to wrap the parsing process. Before

View File

@@ -202,7 +202,7 @@ eAutoDetectResult CWellFormedDTD::CanParse(nsString& aContentType, nsString& aCo
* @param
* @return
*/
NS_IMETHODIMP CWellFormedDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink){
NS_IMETHODIMP CWellFormedDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,eParseMode aParseMode,nsIContentSink* aSink){
nsresult result=NS_OK;
mFilename=aFilename;

View File

@@ -98,8 +98,11 @@ class CWellFormedDTD : public nsIDTD {
* @param aFilename is the name of the file being parsed.
* @return error code (almost always 0)
*/
NS_IMETHOD WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink=0);
NS_IMETHOD WillBuildModel( nsString& aFilename,
PRBool aNotifySink,
nsString& aSourceType,
eParseMode aParseMode,
nsIContentSink* aSink=0);
/**
* The parser uses a code sandwich to wrap the parsing process. Before
* the process begins, WillBuildModel() is called. Afterwards the parser

View File

@@ -424,7 +424,7 @@ eAutoDetectResult nsXIFDTD::CanParse(nsString& aContentType, nsString& aCommand,
* @param
* @return
*/
nsresult nsXIFDTD::WillBuildModel(nsString& aFileName,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink){
nsresult nsXIFDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,eParseMode aParseMode,nsIContentSink* aSink){
nsresult result=NS_OK;
mSink=(nsIHTMLContentSink*)aSink;

View File

@@ -152,8 +152,11 @@ class nsXIFDTD : public nsIDTD {
* @param
* @return
*/
NS_IMETHOD WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink=0);
NS_IMETHOD WillBuildModel( nsString& aFilename,
PRBool aNotifySink,
nsString& aSourceType,
eParseMode aParseMode,
nsIContentSink* aSink=0);
/**
* The parser uses a code sandwich to wrap the parsing process. Before
* the process begins, WillBuildModel() is called. Afterwards the parser

View File

@@ -386,7 +386,7 @@ eAutoDetectResult CNavDTD::CanParse(nsString& aContentType, nsString& aCommand,
* @param
* @return
*/
nsresult CNavDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink){
nsresult CNavDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,eParseMode aParseMode,nsIContentSink* aSink){
nsresult result=NS_OK;
mFilename=aFilename;
@@ -395,6 +395,8 @@ nsresult CNavDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString
mHadFrameset=PR_FALSE;
mLineNumber=1;
mHasOpenScript=PR_FALSE;
mParseMode=aParseMode;
if((aNotifySink) && (aSink)) {
STOP_TIMER();
@@ -790,9 +792,9 @@ static
PRInt32 GetIndexOfChildOrSynonym(nsEntryStack& aTagStack,eHTMLTags aChildTag) {
PRInt32 theChildIndex=aTagStack.GetTopmostIndexOf(aChildTag);
if(kNotFound==theChildIndex) {
CTagList* theSynTags=gHTMLElements[aChildTag].GetSynonymousTags(); //get the list of tags that THIS tag can close
TagList* theSynTags=gHTMLElements[aChildTag].GetSynonymousTags(); //get the list of tags that THIS tag can close
if(theSynTags) {
theChildIndex=theSynTags->GetTopmostIndexOf(aTagStack);
theChildIndex=GetTopmostIndexOf(aTagStack,*theSynTags);
}
else{
theChildIndex=aTagStack.GetCount();
@@ -834,11 +836,11 @@ PRBool CanBeContained(eHTMLTags aChildTag,nsEntryStack& aTagStack) {
PRBool result=PR_TRUE;
if(aTagStack.GetCount()){
CTagList* theRootTags=gHTMLElements[aChildTag].GetRootTags();
CTagList* theSpecialParents=gHTMLElements[aChildTag].GetSpecialParents();
TagList* theRootTags=gHTMLElements[aChildTag].GetRootTags();
TagList* theSpecialParents=gHTMLElements[aChildTag].GetSpecialParents();
if(theRootTags) {
PRInt32 theRootIndex=theRootTags->GetTopmostIndexOf(aTagStack);
PRInt32 theSPIndex=(theSpecialParents) ? theSpecialParents->GetTopmostIndexOf(aTagStack) : kNotFound;
PRInt32 theRootIndex=GetTopmostIndexOf(aTagStack,*theRootTags);
PRInt32 theSPIndex=(theSpecialParents) ? GetTopmostIndexOf(aTagStack,*theSpecialParents) : kNotFound;
PRInt32 theChildIndex=GetIndexOfChildOrSynonym(aTagStack,aChildTag);
PRInt32 theBaseIndex=(theRootIndex>theSPIndex) ? theRootIndex : theSPIndex;
@@ -1275,13 +1277,13 @@ nsresult CNavDTD::HandleStartToken(CToken* aToken) {
* @return PR_TRUE if given tag can contain other tags
*/
static
PRBool HasCloseablePeerAboveRoot(CTagList& aRootTagList,nsEntryStack& aTagStack,eHTMLTags aTag,PRBool anEndTag) {
PRInt32 theRootIndex=aRootTagList.GetTopmostIndexOf(aTagStack);
CTagList* theCloseTags=(anEndTag) ? gHTMLElements[aTag].GetAutoCloseEndTags() : gHTMLElements[aTag].GetAutoCloseStartTags();
PRBool HasCloseablePeerAboveRoot(TagList& aRootTagList,nsEntryStack& aTagStack,eHTMLTags aTag,PRBool anEndTag) {
PRInt32 theRootIndex=GetTopmostIndexOf(aTagStack,aRootTagList);
TagList* theCloseTags=(anEndTag) ? gHTMLElements[aTag].GetAutoCloseEndTags() : gHTMLElements[aTag].GetAutoCloseStartTags();
PRInt32 theChildIndex=-1;
if(theCloseTags) {
theChildIndex=theCloseTags->GetTopmostIndexOf(aTagStack);
theChildIndex=GetTopmostIndexOf(aTagStack,*theCloseTags);
}
else {
if((anEndTag) || (!gHTMLElements[aTag].CanContainSelf()))
@@ -1330,16 +1332,16 @@ eHTMLTags FindAutoCloseTargetForEndTag(eHTMLTags aCurrentTag,nsEntryStack& aTagS
3. Otherwise its non-specified and we simply presume we can close it.
*/
CTagList* theCloseTags=gHTMLElements[aCurrentTag].GetAutoCloseEndTags();
CTagList* theRootTags=gHTMLElements[aCurrentTag].GetEndRootTags();
TagList* theCloseTags=gHTMLElements[aCurrentTag].GetAutoCloseEndTags();
TagList* theRootTags=gHTMLElements[aCurrentTag].GetEndRootTags();
if(theCloseTags){
//at a min., this code is needed for H1..H6
while(theChildIndex<--theTopIndex) {
eHTMLTags theNextTag=aTagStack[theTopIndex];
if(PR_FALSE==theCloseTags->Contains(theNextTag)) {
if(PR_TRUE==theRootTags->Contains(theNextTag)) {
if(PR_FALSE==Contains(theNextTag,*theCloseTags)) {
if(PR_TRUE==Contains(theNextTag,*theRootTags)) {
return eHTMLTag_unknown; //we encountered a tag in root list so fail (because we're gated).
}
//otherwise presume it's something we can simply ignore and continue search...
@@ -1408,8 +1410,12 @@ nsresult CNavDTD::HandleEndToken(CToken* aToken) {
case eHTMLTag_br:
{
CToken* theToken=(CHTMLToken*)gRecycler->CreateTokenOfType(eToken_start,eHTMLTag_br);
result=HandleStartToken(theToken);
//This is special NAV-QUIRKS code that allows users
//to use </BR>, even though that isn't a legitimate tag.
if(eParseMode_quirks==mParseMode) {
CStartToken theToken(eHTMLTag_br);
result=HandleStartToken(&theToken);
}
}
break;
@@ -1428,8 +1434,14 @@ nsresult CNavDTD::HandleEndToken(CToken* aToken) {
// Oh boy!! we found a "stray" block entity. Nav4.x and IE introduce line break in
// such cases. So, let's simulate that effect for compatibility.
// Ex. <html><body>Hello</P>There</body></html>
#if 0
mTokenizer->PushTokenFront(aToken); //put this end token back...
CHTMLToken* theToken = (CHTMLToken*)gRecycler->CreateTokenOfType(eToken_start,theChildTag);
mTokenizer->PushTokenFront(theToken); //put this new token onto stack...
#endif
CHTMLToken* theToken = (CHTMLToken*)gRecycler->CreateTokenOfType(eToken_start,theChildTag);
result=HandleToken(theToken,mParser);
}
else return result;
}
@@ -1849,8 +1861,8 @@ PRBool CNavDTD::CanPropagate(eHTMLTags aParentTag,eHTMLTags aChildTag) const {
result=PR_TRUE;
break;
}//if
CTagList* theTagList=gHTMLElements[aChildTag].GetRootTags();
aChildTag=theTagList->GetTagAt(0);
TagList* theTagList=gHTMLElements[aChildTag].GetRootTags();
aChildTag=GetTagAt(0,*theTagList);
if(aChildTag==theTempTag) break;
parentCanContain=CanContain(aParentTag,aChildTag);
++thePropLevel;
@@ -1999,9 +2011,9 @@ PRBool CNavDTD::BackwardPropagate(nsString& aSequence,eHTMLTags aParentTag,eHTML
eHTMLTags theParentTag=aParentTag; //just init to get past first condition...
do {
CTagList* theRootTags=gHTMLElements[aChildTag].GetRootTags();
TagList* theRootTags=gHTMLElements[aChildTag].GetRootTags();
if(theRootTags) {
theParentTag=theRootTags->GetTagAt(0);
theParentTag=GetTagAt(0,*theRootTags);
if(CanContain(theParentTag,aChildTag)) {
//we've found a complete sequence, so push the parent...
aChildTag=theParentTag;
@@ -2716,8 +2728,8 @@ nsresult CNavDTD::CloseContainersTo(eHTMLTags aTag,PRBool aClosedByStartTag){
}
nsresult result=NS_OK;
CTagList* theRootTags=gHTMLElements[aTag].GetRootTags();
eHTMLTags theParentTag=theRootTags->GetTagAt(0);
TagList* theRootTags=gHTMLElements[aTag].GetRootTags();
eHTMLTags theParentTag=GetTagAt(0,*theRootTags);
pos=GetTopmostIndexOf(theParentTag);
if(kNotFound!=pos) {
//the parent container is open, so close it instead
@@ -2765,24 +2777,42 @@ nsresult CNavDTD::AddLeaf(const nsIParserNode& aNode){
result=mSink->AddLeaf(aNode);
#if 1
PRBool done=PR_FALSE;
nsCParserNode* theNode=CreateNode();
CTokenRecycler* theRecycler=(CTokenRecycler*)mTokenizer->GetTokenRecycler();
while(!done) {
CToken* theToken=mTokenizer->PeekToken();
if(theToken) {
eHTMLTags theTag=(eHTMLTags)theToken->GetTypeID();
theTag=(eHTMLTags)theToken->GetTypeID();
switch(theTag) {
case eHTMLTag_newline:
mLineNumber++;
case eHTMLTag_text:
case eHTMLTag_whitespace:
{
theToken=mTokenizer->PopToken();
theNode->Init(theToken,mLineNumber,GetTokenRecycler());
theNode->Init(theToken,mLineNumber,0);
result=mSink->AddLeaf(*theNode);
if(theRecycler) {
theRecycler->RecycleToken(theToken);
}
else delete theToken;
}
break;
case eHTMLTag_text:
if(mHasOpenBody && (!mHasOpenHead)) {
theToken=mTokenizer->PopToken();
theNode->Init(theToken,mLineNumber);
result=mSink->AddLeaf(*theNode);
if(theRecycler) {
theRecycler->RecycleToken(theToken);
}
else delete theToken;
}
else done=PR_TRUE;
break;
default:
done=PR_TRUE;
} //switch
@@ -2790,8 +2820,6 @@ nsresult CNavDTD::AddLeaf(const nsIParserNode& aNode){
else done=PR_TRUE;
} //while
RecycleNode(theNode);
#endif
START_TIMER();

View File

@@ -179,7 +179,11 @@ CLASS_EXPORT_HTMLPARS CNavDTD : public nsIDTD {
* @param aFilename is the name of the file being parsed.
* @return error code (almost always 0)
*/
NS_IMETHOD WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink=0);
NS_IMETHOD WillBuildModel( nsString& aFilename,
PRBool aNotifySink,
nsString& aSourceType,
eParseMode aParseMode,
nsIContentSink* aSink=0);
/**
* The parser uses a code sandwich to wrap the parsing process. Before
@@ -524,6 +528,7 @@ protected:
eHTMLTags mSkipTarget;
nsDeque mSharedNodes;
nsresult mDTDState;
eParseMode mParseMode;
PRUint32 mComputedCRC32;
PRUint32 mExpectedCRC32;

View File

@@ -257,7 +257,7 @@ eAutoDetectResult CRtfDTD::CanParse(nsString& aContentType, nsString& aCommand,
* @param
* @return
*/
NS_IMETHODIMP CRtfDTD::WillBuildModel(nsString& aFileName,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink){
NS_IMETHODIMP CRtfDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,eParseMode aParseMode,nsIContentSink* aSink){
nsresult result=NS_OK;
return result;
}

View File

@@ -194,7 +194,11 @@ class CRtfDTD : public nsIDTD {
* @param aFilename is the name of the file being parsed.
* @return error code (almost always 0)
*/
NS_IMETHOD WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink=0);
NS_IMETHOD WillBuildModel( nsString& aFilename,
PRBool aNotifySink,
nsString& aSourceType,
eParseMode aParseMode,
nsIContentSink* aSink=0);
/**
* The parser uses a code sandwich to wrap the parsing process. Before

View File

@@ -32,12 +32,8 @@
* @param
* @return
*/
PRBool CTagList::Contains(eHTMLTags aTag){
PRBool result=PR_FALSE;
if(mTagList) {
result=FindTagInSet(aTag,mTagList,mCount);
}
else result=FindTagInSet(aTag,mTags,mCount);
PRBool Contains(eHTMLTags aTag,TagList& aTagList){
PRBool result=FindTagInSet(aTag,aTagList.mTags,aTagList.mCount);
return result;
}
@@ -47,11 +43,11 @@ PRBool CTagList::Contains(eHTMLTags aTag){
* @param
* @return
*/
PRInt32 CTagList::GetTopmostIndexOf(nsEntryStack& aTagStack){
PRInt32 GetTopmostIndexOf(nsEntryStack& aTagStack,TagList& aTagList){
int max = aTagStack.GetCount();
int index;
int index=0;
for(index=max-1;index>=0;index--){
if(Contains(aTagStack[index])) {
if(FindTagInSet(aTagStack[index],aTagList.mTags,aTagList.mCount)) {
return index;
}
}
@@ -64,154 +60,120 @@ PRInt32 CTagList::GetTopmostIndexOf(nsEntryStack& aTagStack){
* @param
* @return
*/
PRInt32 CTagList::GetBottommostIndexOf(nsEntryStack& aTagStack,PRInt32 aStartOffset){
int max = aTagStack.GetCount();
int index;
for(index=aStartOffset;index<max;index++){
if(Contains(aTagStack[index])) {
return index;
}
}
return kNotFound;
}
/**
*
* @update gess 01/04/99
* @param
* @return
*/
eHTMLTags CTagList::GetTagAt(PRUint32 anIndex) const{
eHTMLTags GetTagAt(PRUint32 anIndex,TagList& aTagList) {
eHTMLTags result=eHTMLTag_unknown;
if(anIndex<mCount){
result=(mTagList) ? mTagList[anIndex] : mTags[anIndex];
if(anIndex<aTagList.mCount){
result=aTagList.mTags[anIndex];
}
return result;
}
/*****************************************************************************
Now it's time to list all the html elements all with their capabilities...
******************************************************************************/
//First, define the set of taglists for tags with special parents...
CTagList gAParents(1,0,eHTMLTag_map);
CTagList gInAddress(1,0,eHTMLTag_address);
CTagList gInHead(1,0,eHTMLTag_head);
CTagList gInTable(1,0,eHTMLTag_table);
CTagList gInHTML(1,0,eHTMLTag_html);
CTagList gInBody(1,0,eHTMLTag_body);
CTagList gInForm(1,0,eHTMLTag_form);
CTagList gInFieldset(1,0,eHTMLTag_fieldset);
CTagList gInTR(1,0,eHTMLTag_tr);
CTagList gInDL(2,0,eHTMLTag_dl,eHTMLTag_body);
CTagList gInFrameset(1,0,eHTMLTag_frameset);
CTagList gInNoframes(1,0,eHTMLTag_noframes);
CTagList gInP(4,0,eHTMLTag_address,eHTMLTag_form,eHTMLTag_span,eHTMLTag_table);
CTagList gOptgroupParents(2,0,eHTMLTag_optgroup,eHTMLTag_select);
CTagList gBodyParents(2,0,eHTMLTag_html,eHTMLTag_noframes);
CTagList gColParents(2,0,eHTMLTag_table,eHTMLTag_colgroup);
CTagList gFramesetParents(2,0,eHTMLTag_html,eHTMLTag_frameset);
CTagList gLegendParents(1,0,eHTMLTag_fieldset);
CTagList gAreaParent(1,0,eHTMLTag_map);
CTagList gParamParents(2,0,eHTMLTag_applet,eHTMLTag_object);
CTagList gTRParents(4,0,eHTMLTag_tbody,eHTMLTag_tfoot,eHTMLTag_thead,eHTMLTag_table);
static eHTMLTags gTREndParentList[]={eHTMLTag_tbody,eHTMLTag_tfoot,eHTMLTag_thead,eHTMLTag_table,eHTMLTag_td,eHTMLTag_th};
CTagList gTREndParents(sizeof(gTREndParentList)/sizeof(eHTMLTag_unknown),gTREndParentList);
TagList gAParents={1,eHTMLTag_map};
TagList gInAddress={1,eHTMLTag_address};
TagList gInHead={1,eHTMLTag_head};
TagList gInTable={1,eHTMLTag_table};
TagList gInHTML={1,eHTMLTag_html};
TagList gInBody={1,eHTMLTag_body};
TagList gInForm={1,eHTMLTag_form};
TagList gInFieldset={1,eHTMLTag_fieldset};
TagList gInTR={1,eHTMLTag_tr};
TagList gInDL={2,eHTMLTag_dl,eHTMLTag_body};
TagList gInFrameset={1,eHTMLTag_frameset};
TagList gInNoframes={1,eHTMLTag_noframes};
TagList gInP={4,eHTMLTag_address,eHTMLTag_form,eHTMLTag_span,eHTMLTag_table};
TagList gOptgroupParents={2,eHTMLTag_optgroup,eHTMLTag_select};
TagList gBodyParents={2,eHTMLTag_html,eHTMLTag_noframes};
TagList gColParents={2,eHTMLTag_table,eHTMLTag_colgroup};
TagList gFramesetParents={2,eHTMLTag_html,eHTMLTag_frameset};
TagList gLegendParents={1,eHTMLTag_fieldset};
TagList gAreaParent={1,eHTMLTag_map};
TagList gParamParents={2,eHTMLTag_applet,eHTMLTag_object};
TagList gTRParents={4,eHTMLTag_tbody,eHTMLTag_tfoot,eHTMLTag_thead,eHTMLTag_table};
TagList gTREndParents={6,eHTMLTag_tbody,eHTMLTag_tfoot,eHTMLTag_thead,eHTMLTag_table,eHTMLTag_td,eHTMLTag_th};
//*********************************************************************************************
// Next, define the set of taglists for tags with special kids...
//*********************************************************************************************
CTagList gContainsText(4,0,eHTMLTag_text,eHTMLTag_newline,eHTMLTag_whitespace,eHTMLTag_entity);
CTagList gUnknownKids(2,0,eHTMLTag_html,eHTMLTag_frameset);
CTagList gContainsOpts(3,0,eHTMLTag_option,eHTMLTag_optgroup,eHTMLTag_script);
CTagList gContainsParam(1,0,eHTMLTag_param);
CTagList gColgroupKids(1,0,eHTMLTag_col);
CTagList gAddressKids(1,0,eHTMLTag_p);
CTagList gBodyKids(5,0,eHTMLTag_del,eHTMLTag_ins,eHTMLTag_noscript,eHTMLTag_script,eHTMLTag_li);
CTagList gButtonKids(2,0,eHTMLTag_caption,eHTMLTag_legend);
CTagList gDLKids(2,0,eHTMLTag_dd,eHTMLTag_dt);
CTagList gDTKids(1,0,eHTMLTag_dt);
CTagList gFieldsetKids(2,0,eHTMLTag_legend,eHTMLTag_text);
CTagList gFontKids(2,0,eHTMLTag_legend,eHTMLTag_text);
CTagList gFormKids(1,0,eHTMLTag_keygen);
CTagList gFramesetKids(3,0,eHTMLTag_frame,eHTMLTag_frameset,eHTMLTag_noframes);
TagList gContainsText={4,eHTMLTag_text,eHTMLTag_newline,eHTMLTag_whitespace,eHTMLTag_entity};
TagList gUnknownKids={2,eHTMLTag_html,eHTMLTag_frameset};
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 gButtonKids={2,eHTMLTag_caption,eHTMLTag_legend};
TagList gDLKids={2,eHTMLTag_dd,eHTMLTag_dt};
TagList gDTKids={1,eHTMLTag_dt};
TagList gFieldsetKids={2,eHTMLTag_legend,eHTMLTag_text};
TagList gFontKids={2,eHTMLTag_legend,eHTMLTag_text};
TagList gFormKids={1,eHTMLTag_keygen};
TagList gFramesetKids={3,eHTMLTag_frame,eHTMLTag_frameset,eHTMLTag_noframes};
static eHTMLTags gHTMLKidList[]={eHTMLTag_body,eHTMLTag_frameset,eHTMLTag_head,eHTMLTag_map,eHTMLTag_noscript,eHTMLTag_script,eHTMLTag_newline,eHTMLTag_whitespace};
CTagList gHtmlKids(sizeof(gHTMLKidList)/sizeof(eHTMLTag_unknown),gHTMLKidList);
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};
static eHTMLTags gHeadKidList[]=
{eHTMLTag_base,eHTMLTag_bgsound,eHTMLTag_link,eHTMLTag_meta,eHTMLTag_script,eHTMLTag_style,eHTMLTag_title,eHTMLTag_noembed,eHTMLTag_noscript};
CTagList gHeadKids(sizeof(gHeadKidList)/sizeof(eHTMLTag_unknown),gHeadKidList);
TagList gLIKids={2,eHTMLTag_ol,eHTMLTag_ul};
TagList gMapKids={1,eHTMLTag_area};
TagList gNoframesKids={1,eHTMLTag_body};
TagList gPreKids={2,eHTMLTag_hr,eHTMLTag_center}; //note that CENTER is here for backward compatibility; it's not 4.0 spec.
CTagList gLIKids(2,0,eHTMLTag_ol,eHTMLTag_ul);
CTagList gMapKids(1,0,eHTMLTag_area);
CTagList gNoframesKids(1,0,eHTMLTag_body);
CTagList gPreKids(2,0,eHTMLTag_hr,eHTMLTag_center); //note that CENTER is here for backward compatibility; it's not 4.0 spec.
static eHTMLTags gTableList[]={ eHTMLTag_caption,eHTMLTag_col,eHTMLTag_colgroup,eHTMLTag_form,
// eHTMLTag_td,
eHTMLTag_thead,eHTMLTag_tbody,eHTMLTag_tfoot,
eHTMLTag_map,eHTMLTag_script,eHTMLTag_input};
CTagList gTableKids(sizeof(gTableList)/sizeof(eHTMLTag_unknown),gTableList);
static eHTMLTags gTableElemList[]={eHTMLTag_form,eHTMLTag_map,eHTMLTag_noscript,eHTMLTag_script,eHTMLTag_td,eHTMLTag_th,eHTMLTag_tr};
CTagList gTableElemKids(sizeof(gTableElemList)/sizeof(eHTMLTag_unknown),gTableElemList);
static eHTMLTags gTRList[]= {eHTMLTag_td,eHTMLTag_th,eHTMLTag_map,eHTMLTag_form,eHTMLTag_script,eHTMLTag_input};
CTagList gTRKids(sizeof(gTRList)/sizeof(eHTMLTag_unknown),gTRList);
CTagList gTBodyKids(3,0,eHTMLTag_tr,eHTMLTag_form,eHTMLTag_input);
CTagList gULKids(2,0,eHTMLTag_li,eHTMLTag_p);
TagList gTableKids={10,eHTMLTag_caption,eHTMLTag_col,eHTMLTag_colgroup,eHTMLTag_form,
eHTMLTag_thead,eHTMLTag_tbody,eHTMLTag_tfoot,
eHTMLTag_map,eHTMLTag_script,eHTMLTag_input};
TagList gTableElemKids={7,eHTMLTag_form,eHTMLTag_map,eHTMLTag_noscript,eHTMLTag_script,eHTMLTag_td,eHTMLTag_th,eHTMLTag_tr};
TagList gTRKids={6,eHTMLTag_td,eHTMLTag_th,eHTMLTag_map,eHTMLTag_form,eHTMLTag_script,eHTMLTag_input};
TagList gTBodyKids={3,eHTMLTag_tr,eHTMLTag_form,eHTMLTag_input};
TagList gULKids={2,eHTMLTag_li,eHTMLTag_p};
//*********************************************************************************************
// The following tag lists are used to define common set of root notes for the HTML elements...
//*********************************************************************************************
CTagList gRootTags(3,0,eHTMLTag_body,eHTMLTag_td,eHTMLTag_table);
CTagList gHTMLRootTags(1,0,eHTMLTag_unknown);
TagList gRootTags={3,eHTMLTag_body,eHTMLTag_td,eHTMLTag_table};
TagList gHTMLRootTags={1,eHTMLTag_unknown};
static eHTMLTags gLIList[]={eHTMLTag_ul,eHTMLTag_ol,eHTMLTag_dir,eHTMLTag_menu,eHTMLTag_p,eHTMLTag_body,eHTMLTag_td};
CTagList gLIRootTags(sizeof(gLIList)/sizeof(eHTMLTag_unknown),gLIList);
CTagList gOLRootTags(3,0,eHTMLTag_body,eHTMLTag_li,eHTMLTag_td);
CTagList gTDRootTags(3,0,eHTMLTag_tr,eHTMLTag_tbody,eHTMLTag_table);
CTagList gNoframeRoot(2,0,eHTMLTag_body,eHTMLTag_frameset);
TagList gLIRootTags={7,eHTMLTag_ul,eHTMLTag_ol,eHTMLTag_dir,eHTMLTag_menu,eHTMLTag_p,eHTMLTag_body,eHTMLTag_td};
TagList gOLRootTags={3,eHTMLTag_body,eHTMLTag_li,eHTMLTag_td};
TagList gTDRootTags={3,eHTMLTag_tr,eHTMLTag_tbody,eHTMLTag_table};
TagList gNoframeRoot={2,eHTMLTag_body,eHTMLTag_frameset};
//*********************************************************************************************
// The following tag lists are used to define the autoclose properties of the html elements...
//*********************************************************************************************
CTagList gAutoClose(2,0,eHTMLTag_body,eHTMLTag_td);
CTagList gBodyAutoClose(1,0,eHTMLTag_head);
CTagList gTBodyAutoClose(3,0,eHTMLTag_thead,eHTMLTag_tfoot,eHTMLTag_tbody);
CTagList gCaptionAutoClose(1,0,eHTMLTag_tbody);
CTagList gLIAutoClose(2,0,eHTMLTag_p,eHTMLTag_li);
CTagList gPAutoClose(2,0,eHTMLTag_p,eHTMLTag_li);
CTagList gHRAutoClose(1,0,eHTMLTag_p);
CTagList gOLAutoClose(3,0,eHTMLTag_p,eHTMLTag_ol,eHTMLTag_ul);
CTagList gDivAutoClose(1,0,eHTMLTag_p);
TagList gBodyAutoClose={1,eHTMLTag_head};
TagList gTBodyAutoClose={3,eHTMLTag_thead,eHTMLTag_tfoot,eHTMLTag_tbody};
TagList gCaptionAutoClose={1,eHTMLTag_tbody};
TagList gLIAutoClose={2,eHTMLTag_p,eHTMLTag_li};
TagList gPAutoClose={2,eHTMLTag_p,eHTMLTag_li};
TagList gHRAutoClose={1,eHTMLTag_p};
TagList gOLAutoClose={3,eHTMLTag_p,eHTMLTag_ol,eHTMLTag_ul};
TagList gDivAutoClose={1,eHTMLTag_p};
static eHTMLTags gHxList[]={eHTMLTag_h1,eHTMLTag_h2,eHTMLTag_h3,eHTMLTag_h4,eHTMLTag_h5,eHTMLTag_h6};
CTagList gHeadingTags(sizeof(gHxList)/sizeof(eHTMLTag_unknown),gHxList);
TagList gHeadingTags={6,eHTMLTag_h1,eHTMLTag_h2,eHTMLTag_h3,eHTMLTag_h4,eHTMLTag_h5,eHTMLTag_h6};
CTagList gTRCloseTags(3,0,eHTMLTag_tr,eHTMLTag_td,eHTMLTag_th);
CTagList gTDCloseTags(2,0,eHTMLTag_td,eHTMLTag_th);
CTagList gDTCloseTags(3,0,eHTMLTag_dt,eHTMLTag_dd,eHTMLTag_p);
CTagList gULCloseTags(1,0,eHTMLTag_li);
TagList gTRCloseTags={3,eHTMLTag_tr,eHTMLTag_td,eHTMLTag_th};
TagList gTDCloseTags={2,eHTMLTag_td,eHTMLTag_th};
TagList gDTCloseTags={3,eHTMLTag_dt,eHTMLTag_dd,eHTMLTag_p};
TagList gULCloseTags={1,eHTMLTag_li};
//*********************************************************************************************
// The following tag lists are used to define the non-autoclose properties of the html elements...
//*********************************************************************************************
CTagList gDontAutoClose(1,0,eHTMLTag_td);
TagList gDontAutoClose={1,eHTMLTag_td};
//*********************************************************************************************
//Lastly, bind tags with their rules, their special parents and special kids.
@@ -238,19 +200,19 @@ nsHTMLElement* gHTMLElements=0;
void Initialize(eHTMLTags aTag,
eHTMLTags aRequiredAncestor,
eHTMLTags aExcludingAncestor,
CTagList* aRootNodes,
CTagList* aEndRootNodes,
CTagList* aAutocloseStart,
CTagList* aAutocloseEnd,
CTagList* aSynonymousTags,
CTagList* aDontAutocloseEnd,
TagList* aRootNodes,
TagList* aEndRootNodes,
TagList* aAutocloseStart,
TagList* aAutocloseEnd,
TagList* aSynonymousTags,
TagList* aDontAutocloseEnd,
int aParentBits,
int aInclusionBits,
int aExclusionBits,
int aSpecialProperties,
int aPropagateRange,
CTagList* aSpecialParents,
CTagList* aSpecialKids,
TagList* aSpecialParents,
TagList* aSpecialKids,
eHTMLTags aSkipTarget
)
{
@@ -1610,7 +1572,7 @@ PRBool nsHTMLElement::CanExclude(eHTMLTags aChild) const{
//Note that special kids takes precedence over exclusions...
if(mSpecialKids) {
if(mSpecialKids->Contains(aChild)) {
if(Contains(aChild,*mSpecialKids)) {
return PR_FALSE;
}
}
@@ -1654,7 +1616,7 @@ PRBool nsHTMLElement::CanOmitStartTag(eHTMLTags aChild) const{
* @return
*/
PRBool nsHTMLElement::IsChildOfHead(eHTMLTags aChild) {
PRBool result=FindTagInSet(aChild,gHeadKidList,sizeof(gHeadKidList)/sizeof(eHTMLTag_body));
PRBool result=Contains(aChild,gHeadKids);
return result;
}
@@ -1667,10 +1629,10 @@ PRBool nsHTMLElement::IsChildOfHead(eHTMLTags aChild) {
*/
PRBool nsHTMLElement::SectionContains(eHTMLTags aChild,PRBool allowDepthSearch) {
PRBool result=PR_FALSE;
CTagList* theRootTags=gHTMLElements[aChild].GetRootTags();
TagList* theRootTags=gHTMLElements[aChild].GetRootTags();
if(theRootTags){
if(!theRootTags->Contains(mTagID)){
eHTMLTags theRootBase=(theRootTags->mTagList) ? theRootTags->mTagList[0] : theRootTags->mTags[0];
if(!Contains(mTagID,*theRootTags)){
eHTMLTags theRootBase=GetTagAt(0,*theRootTags);
if((eHTMLTag_unknown!=theRootBase) && (allowDepthSearch))
result=SectionContains(theRootBase,allowDepthSearch);
}
@@ -1711,7 +1673,7 @@ PRBool nsHTMLElement::IsStyleTag(eHTMLTags aChild) {
* @return
*/
PRBool nsHTMLElement::IsHeadingTag(eHTMLTags aChild) {
return gHeadingTags.Contains(aChild);
return Contains(aChild,gHeadingTags);
}
@@ -1782,8 +1744,10 @@ PRBool nsHTMLElement::CanContainSelf(void) const {
PRBool nsHTMLElement::CanAutoCloseTag(eHTMLTags aTag) const{
PRBool result=PR_TRUE;
if((mTagID>=eHTMLTag_unknown) & (mTagID<=eHTMLTag_userdefined)) {
CTagList* theTagList=gHTMLElements[mTagID].GetNonAutoCloseEndTags();
if(theTagList) return !theTagList->Contains(aTag);
TagList* theTagList=gHTMLElements[mTagID].GetNonAutoCloseEndTags();
if(theTagList) {
result=!Contains(aTag,*theTagList);
}
}
return result;
}
@@ -1875,9 +1839,9 @@ PRBool nsHTMLElement::CanContain(eHTMLTags aChild) const{
return CanContainSelf(); //not many tags can contain themselves...
}
CTagList* theCloseTags=gHTMLElements[aChild].GetAutoCloseStartTags();
TagList* theCloseTags=gHTMLElements[aChild].GetAutoCloseStartTags();
if(theCloseTags){
if(theCloseTags->Contains(mTagID))
if(Contains(mTagID,*theCloseTags))
return PR_FALSE;
}
@@ -1911,7 +1875,7 @@ PRBool nsHTMLElement::CanContain(eHTMLTags aChild) const{
}
if(mSpecialKids) {
if(mSpecialKids->Contains(aChild)) {
if(Contains(aChild,*mSpecialKids)) {
return PR_TRUE;
}
}

View File

@@ -31,31 +31,15 @@
#include "nsHTMLTokens.h"
#include "nsDTDUtils.h"
class CTagList {
public:
CTagList( int aCount,
eHTMLTags* aTagList=0,
eHTMLTags aTag1=eHTMLTag_unknown,
eHTMLTags aTag2=eHTMLTag_unknown,
eHTMLTags aTag3=eHTMLTag_unknown,
eHTMLTags aTag4=eHTMLTag_unknown,
eHTMLTags aTag5=eHTMLTag_unknown)
{
mCount=aCount;
mTags[0]=aTag1; mTags[1]=aTag2; mTags[2]=aTag3; mTags[3]=aTag4; mTags[4]=aTag5;
mTagList=aTagList;
}
PRInt32 GetTopmostIndexOf(nsEntryStack& aTagStack);
PRInt32 GetBottommostIndexOf(nsEntryStack& aTagStack,PRInt32 aStartOffset);
PRBool Contains(eHTMLTags aTag);
eHTMLTags GetTagAt(PRUint32 anIndex) const;
eHTMLTags mTags[5];
eHTMLTags* mTagList;
struct TagList {
PRUint32 mCount;
eHTMLTags mTags[10];
};
extern PRBool Contains(eHTMLTags aTag,TagList& aTagList);
extern PRInt32 GetTopmostIndexOf(nsEntryStack& aTagStack,TagList& aTagList);
extern eHTMLTags GetTagAt(PRUint32 anIndex,TagList& aTagList);
//*********************************************************************************************
// The following ints define the standard groups of HTML elements...
//*********************************************************************************************
@@ -81,16 +65,16 @@ struct nsHTMLElement {
static PRBool IsBlockCloser(eHTMLTags aTag);
static int GetSynonymousGroups(int aGroup);
CTagList* GetSynonymousTags(void) const {return mSynonymousTags;}
CTagList* GetRootTags(void) const {return mRootNodes;}
CTagList* GetEndRootTags(void) const {return mEndRootNodes;}
CTagList* GetAutoCloseStartTags(void) const {return mAutocloseStart;}
CTagList* GetAutoCloseEndTags(void) const {return mAutocloseEnd;}
CTagList* GetNonAutoCloseEndTags(void) const {return mDontAutocloseEnd;}
TagList* GetSynonymousTags(void) const {return mSynonymousTags;}
TagList* GetRootTags(void) const {return mRootNodes;}
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(nsEntryStack& aTagStack,PRInt32 anIndex) const;
CTagList* GetSpecialChildren(void) const {return mSpecialKids;}
CTagList* GetSpecialParents(void) const {return mSpecialParents;}
TagList* GetSpecialChildren(void) const {return mSpecialKids;}
TagList* GetSpecialParents(void) const {return mSpecialParents;}
PRBool IsMemberOf(PRInt32 aType) const;
PRBool CanContainType(PRInt32 aType) const;
@@ -121,19 +105,19 @@ struct nsHTMLElement {
eHTMLTags mTagID;
eHTMLTags mRequiredAncestor;
eHTMLTags mExcludingAncestor; //If set, the presence of the excl-ancestor prevents this from opening.
CTagList* mRootNodes; //These are the tags above which you many not autoclose a START tag
CTagList* mEndRootNodes; //These are the tags above which you many not autoclose an END tag
CTagList* mAutocloseStart; //these are the start tags that you can automatically close with this START tag
CTagList* mAutocloseEnd; //these are the start tags that you can automatically close with this END tag
CTagList* mSynonymousTags; //These are morally equivalent; an end tag for one can close a start tag for another (like <Hn>)
CTagList* mDontAutocloseEnd; //these are the end tags that you cannot automatically close with this END tag
TagList* mRootNodes; //These are the tags above which you many not autoclose a START tag
TagList* mEndRootNodes; //These are the tags above which you many not autoclose an END tag
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
int mParentBits; //defines groups that can contain this element
int mInclusionBits; //defines parental and containment rules
int mExclusionBits; //defines things you CANNOT contain
int mSpecialProperties; //used for various special purposes...
int mPropagateRange; //tells us how far a parent is willing to prop. badly formed children
CTagList* mSpecialParents; //These are the special tags that contain this tag (directly)
CTagList* mSpecialKids; //These are the extra things you can contain
TagList* mSpecialParents; //These are the special tags that contain this tag (directly)
TagList* mSpecialKids; //These are the extra things you can contain
eHTMLTags mSkipTarget; //If set, then we skip all content until this tag is seen
};

View File

@@ -196,7 +196,7 @@ eAutoDetectResult nsExpatDTD::CanParse(nsString& aContentType, nsString& aComman
* @param
* @return
*/
NS_IMETHODIMP nsExpatDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aString,nsIContentSink* aSink){
NS_IMETHODIMP nsExpatDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,eParseMode aParseMode,nsIContentSink* aSink){
nsresult result=NS_OK;
mFilename=aFilename;

View File

@@ -102,7 +102,11 @@ class nsExpatDTD : public nsIDTD {
* @param aFilename is the name of the file being parsed.
* @return error code (almost always 0)
*/
NS_IMETHOD WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aString,nsIContentSink* aSink=0);
NS_IMETHOD WillBuildModel( nsString& aFilename,
PRBool aNotifySink,
nsString& aSourceType,
eParseMode aParseMode,
nsIContentSink* aSink=0);
/**
* The parser uses a code sandwich to wrap the parsing process. Before

View File

@@ -46,6 +46,14 @@ enum eAutoDetectResult {
eInvalidDetect
};
enum eParseMode {
eParseMode_unknown=0,
eParseMode_quirks, //pre 5.0 versions
eParseMode_noquirks, //raptor versions...)
eParseMode_other,
eParseMode_autodetect
};
class nsIParser;
class CToken;
@@ -94,7 +102,11 @@ class nsIDTD : public nsISupports {
* @param aFilename--string that contains name of file being parsed (if applicable)
* @return
*/
NS_IMETHOD WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink=0)=0;
NS_IMETHOD WillBuildModel( nsString& aFilename,
PRBool aNotifySink,
nsString& aSourceType,
eParseMode aParseMode,
nsIContentSink* aSink=0)=0;
/**
* Called by the parser after the parsing process has concluded

View File

@@ -49,16 +49,6 @@ class nsString;
class nsIURI;
enum eParseMode {
eParseMode_unknown=0,
eParseMode_raptor, //5.0 version of nav. and greater
eParseMode_navigator, //pre 5.0 versions
eParseMode_noquirks, //pre 5.0 without quirks (as best as we can...)
eParseMode_other,
eParseMode_autodetect
};
enum eCRCQuality {
eCRCGood = 0,
eCRCFair,

View File

@@ -463,12 +463,12 @@ eParseMode DetermineParseMode(nsParser& aParser) {
theSubIndex=theBufCopy.Find("HTML4.0",PR_TRUE,theIndex+8);
if(kNotFound<theSubIndex) {
if(theBufCopy.Find("TRANSITIONAL",PR_TRUE,theSubIndex)>kNotFound)
return eParseMode_navigator;
return eParseMode_quirks;
else if((theBufCopy.Find("FRAMESET",PR_TRUE,theSubIndex)>kNotFound) ||
(theBufCopy.Find("LATIN1", PR_TRUE,theSubIndex) >kNotFound) ||
(theBufCopy.Find("SYMBOLS",PR_TRUE,theSubIndex) >kNotFound) ||
(theBufCopy.Find("SPECIAL",PR_TRUE,theSubIndex) >kNotFound))
return eParseMode_navigator; // XXX -HACK- Set the appropriate mode.
return eParseMode_quirks; // XXX -HACK- Set the appropriate mode.
else
return eParseMode_noquirks;
}
@@ -490,7 +490,7 @@ eParseMode DetermineParseMode(nsParser& aParser) {
if(theModeStr)
if(0==nsCRT::strcasecmp(other,theModeStr))
return eParseMode_other;
return eParseMode_navigator;
return eParseMode_quirks;
}
@@ -521,6 +521,7 @@ nsresult nsParser::WillBuildModel(nsString& aFilename,nsIDTD* aDefaultDTD){
mParserContext->mDTD->WillBuildModel( aFilename,
PRBool(0==mParserContext->mPrevContext),
mParserContext->mSourceType,
mParserContext->mParseMode,
mSink);
}//if
}//if

View File

@@ -566,22 +566,23 @@ nsresult nsScanner::SkipTo(nsString& aValidSet){
return result;
}
#if 0
void DoErrTest(nsString& aString) {
PRInt32 pos=aString.FindChar(0);
if(kNotFound<pos) {
if(aString.Length()-1!=pos)
int x=10;
if(aString.Length()-1!=pos) {
}
}
}
void DoErrTest(nsCString& aString) {
PRInt32 pos=aString.FindChar(0);
if(kNotFound<pos) {
if(aString.Length()-1!=pos)
int x=10;
if(aString.Length()-1!=pos) {
}
}
}
#endif
/**
* Skip over chars as long as they're in aValidSet
@@ -1019,7 +1020,6 @@ nsresult nsScanner::ReadUntil(nsString& aString,
PRBool addTerminal){
PRUnichar theChar=0;
nsresult result=NS_OK;
PRInt32 thePos=0;
const PRUnichar* theBuf=mBuffer.GetUnicode();
PRInt32 theOrigin=mOffset;

View File

@@ -191,7 +191,7 @@ PRBool CValidDTD::CanConvert(nsString& aSourceType, nsString& aTargetType, PRInt
* @param
* @return
*/
NS_IMETHODIMP CValidDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink){
NS_IMETHODIMP CValidDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,eParseMode aParseMode,nsIContentSink* aSink){
nsresult result=NS_OK;
return result;
}

View File

@@ -111,7 +111,7 @@ class CValidDTD : public nsIDTD {
* @param aFilename is the name of the file being parsed.
* @return error code (almost always 0)
*/
NS_IMETHOD WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink=0);
NS_IMETHOD WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,eParseMode aParseMode,nsIContentSink* aSink=0);
/**
* The parser uses a code sandwich to wrap the parsing process. Before
* the process begins, WillBuildModel() is called. Afterwards the parser

View File

@@ -331,7 +331,7 @@ eAutoDetectResult CViewSourceHTML::CanParse(nsString& aContentType, nsString& aC
* @param
* @return
*/
NS_IMETHODIMP CViewSourceHTML::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink){
NS_IMETHODIMP CViewSourceHTML::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,eParseMode aParseMode,nsIContentSink* aSink){
nsresult result=NS_OK;
mFilename=aFilename;

View File

@@ -103,7 +103,11 @@ class CViewSourceHTML: public nsIDTD {
* @param aFilename is the name of the file being parsed.
* @return error code (almost always 0)
*/
NS_IMETHOD WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink=0);
NS_IMETHOD WillBuildModel( nsString& aFilename,
PRBool aNotifySink,
nsString& aSourceType,
eParseMode aParseMode,
nsIContentSink* aSink=0);
/**
* The parser uses a code sandwich to wrap the parsing process. Before

View File

@@ -202,7 +202,7 @@ eAutoDetectResult CWellFormedDTD::CanParse(nsString& aContentType, nsString& aCo
* @param
* @return
*/
NS_IMETHODIMP CWellFormedDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink){
NS_IMETHODIMP CWellFormedDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,eParseMode aParseMode,nsIContentSink* aSink){
nsresult result=NS_OK;
mFilename=aFilename;

View File

@@ -98,8 +98,11 @@ class CWellFormedDTD : public nsIDTD {
* @param aFilename is the name of the file being parsed.
* @return error code (almost always 0)
*/
NS_IMETHOD WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink=0);
NS_IMETHOD WillBuildModel( nsString& aFilename,
PRBool aNotifySink,
nsString& aSourceType,
eParseMode aParseMode,
nsIContentSink* aSink=0);
/**
* The parser uses a code sandwich to wrap the parsing process. Before
* the process begins, WillBuildModel() is called. Afterwards the parser

View File

@@ -424,7 +424,7 @@ eAutoDetectResult nsXIFDTD::CanParse(nsString& aContentType, nsString& aCommand,
* @param
* @return
*/
nsresult nsXIFDTD::WillBuildModel(nsString& aFileName,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink){
nsresult nsXIFDTD::WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,eParseMode aParseMode,nsIContentSink* aSink){
nsresult result=NS_OK;
mSink=(nsIHTMLContentSink*)aSink;

View File

@@ -152,8 +152,11 @@ class nsXIFDTD : public nsIDTD {
* @param
* @return
*/
NS_IMETHOD WillBuildModel(nsString& aFilename,PRBool aNotifySink,nsString& aSourceType,nsIContentSink* aSink=0);
NS_IMETHOD WillBuildModel( nsString& aFilename,
PRBool aNotifySink,
nsString& aSourceType,
eParseMode aParseMode,
nsIContentSink* aSink=0);
/**
* The parser uses a code sandwich to wrap the parsing process. Before
* the process begins, WillBuildModel() is called. Afterwards the parser