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

@@ -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;
}
}