This commit is contained in:
rickg%netscape.com 2000-04-24 07:35:37 +00:00
Родитель 6f62c8a691
Коммит 5dff0c3d8f
4 изменённых файлов: 140 добавлений и 102 удалений

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

@ -4,7 +4,7 @@
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
@ -20,7 +20,7 @@
* Contributor(s):
*/
//#define ENABLE_CRC
//#define ENABLE_CRC
//#define RICKG_DEBUG
@ -55,7 +55,7 @@ static NS_DEFINE_IID(kIHTMLContentSinkIID, NS_IHTML_CONTENT_SINK_IID);
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
static NS_DEFINE_IID(kIDTDIID, NS_IDTD_IID);
static NS_DEFINE_IID(kClassIID, NS_IOTHERHTML_DTD_IID);
static const char* kNullToken = "Error: Null token given";
static const char* kInvalidTagStackPos = "Error: invalid tag stack position";
static char* kVerificationDir = "c:/temp";
@ -1457,22 +1457,22 @@ nsresult COtherDTD::CloseBody(const nsIParserNode *aNode){
STOP_TIMER();
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: COtherDTD::CloseBody(), this=%p\n", this));
nsresult result=(mSink) ? mSink->CloseBody(*aNode) : NS_OK;
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: COtherDTD::CloseBody(), this=%p\n", this));
START_TIMER();
return result;
}
return result;
}
/**
* This method does two things: 1st, help construct
* our own internal model of the content-stack; and
* 2nd, pass this message on to the sink.
* @update gess4/6/98
* @param aNode -- next node to be added to model
* @return TRUE if ok, FALSE if error
* @return TRUE if ok, FALSE if error
*/
nsresult COtherDTD::OpenForm(const nsIParserNode *aNode){
if(mHasOpenForm)

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

@ -106,7 +106,7 @@ public:
PRUint32 mForDTDUseOnly:1;
PRUint32 mDiscardTag:1;
PRUint32 mPropagateDepth:4;
PRUint32 mBadContentWatch:1;
PRUint32 mDeprecated:1;
PRUint32 mMustCloseSelf:1;
PRUint32 mOmitWS:1;
};
@ -134,6 +134,11 @@ public:
mDelegate=eHTMLTag_unknown;
}
static CGroupMembers& GetEmptyGroup(void) {
static CGroupMembers theGroup={0};
return theGroup;
}
static void Initialize(CElement& anElement,eHTMLTags aTag){
anElement.mProperties.mIsContainer=0;
anElement.mTag=aTag;
@ -238,8 +243,13 @@ public:
class CDeprecatedElement: public CElement {
public:
static void Initialize(CElement& anElement,eHTMLTags aTag){
CElement::Initialize(anElement,aTag);
anElement.mProperties.mDeprecated=1;
}
CDeprecatedElement(eHTMLTags aTag) : CElement(aTag) {
CElement::Initialize(*this,aTag);
CDeprecatedElement::Initialize(*this,aTag);
}
};
@ -265,7 +275,7 @@ public:
theGroup.mBits.mFontStyle =1;
theGroup.mBits.mPhrase=1;
theGroup.mBits.mSpecial=1;
theGroup.mBits.mList=1;
theGroup.mBits.mList=0; //intentionally remove list from inline group
theGroup.mBits.mPreformatted=1;
theGroup.mBits.mSelf=1;
theGroup.mBits.mLeaf=1;
@ -1047,6 +1057,7 @@ public:
This is for the body element...
**********************************************************/
static eHTMLTags gBodyKids[] = {eHTMLTag_del, eHTMLTag_ins, eHTMLTag_script, eHTMLTag_unknown};
static eHTMLTags gBodyExcludeKids[] = {eHTMLTag_applet, eHTMLTag_button, eHTMLTag_iframe, eHTMLTag_object, eHTMLTag_unknown};
class CBodyElement: public CElement {
public:
@ -1070,6 +1081,7 @@ public:
#endif
CElement::Initialize(*this,aTag,CBodyElement::GetGroup(),theGroups);
mIncludeKids=gBodyKids;
mExcludeKids=gBodyExcludeKids;
}
virtual nsresult HandleStartToken(nsIParserNode* aNode,eHTMLTags aTag,nsDTDContext* aContext,nsIHTMLContentSink* aSink) {
@ -1125,7 +1137,7 @@ public:
{
memset(mElements,0,sizeof(mElements));
InitializeElements();
DebugDumpContainment("all elements");
//DebugDumpContainment("all elements");
}
@ -1192,19 +1204,20 @@ void CElementTable::InitializeElements() {
CBlockElement::Initialize( mDfltElements[eHTMLTag_address], eHTMLTag_address);
CElement::Initialize( mDfltElements[eHTMLTag_applet], eHTMLTag_applet,CSpecialElement::GetGroup(), CFlowElement::GetContainedGroups());
mDfltElements[eHTMLTag_applet].mGroup.mBits.mBlock=1; //treat applet like a block, too.
mDfltElements[eHTMLTag_applet].mIncludeKids=kAppletKids;
CElement::Initialize( mDfltElements[eHTMLTag_area], eHTMLTag_area);
mDfltElements[eHTMLTag_area].mContainsGroups.mBits.mSelf=0;
CFontStyleElement::Initialize( mDfltElements[eHTMLTag_b], eHTMLTag_b);
CElement::InitializeLeaf( mDfltElements[eHTMLTag_base], eHTMLTag_base, CHeadElement::GetGroup(), CLeafElement::GetContainedGroups());
CElement::InitializeLeaf( mDfltElements[eHTMLTag_base], eHTMLTag_base, CHeadElement::GetMiscGroup(), CLeafElement::GetContainedGroups());
CElement::InitializeLeaf( mDfltElements[eHTMLTag_basefont], eHTMLTag_basefont, CSpecialElement::GetGroup(), CLeafElement::GetContainedGroups());
CSpecialElement::Initialize( mDfltElements[eHTMLTag_bdo], eHTMLTag_bdo);
CFontStyleElement::Initialize( mDfltElements[eHTMLTag_big], eHTMLTag_big);
CLeafElement::Initialize( mDfltElements[eHTMLTag_bgsound], eHTMLTag_bgsound);
CDeprecatedElement::Initialize( mDfltElements[eHTMLTag_bgsound], eHTMLTag_bgsound);
CElement::Initialize( mDfltElements[eHTMLTag_blockquote], eHTMLTag_blockquote, CBlockElement::GetGroup(), CBlockElement::GetBlockGroupMembers());
mDfltElements[eHTMLTag_blockquote].mIncludeKids=kBlockQuoteKids;
@ -1212,6 +1225,7 @@ void CElementTable::InitializeElements() {
CElement::InitializeLeaf( mDfltElements[eHTMLTag_br], eHTMLTag_br, CSpecialElement::GetGroup(), CLeafElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_button], eHTMLTag_button, CFormControlElement::GetGroup(), CFlowElement::GetContainedGroups());
mDfltElements[eHTMLTag_button].mGroup.mBits.mBlock=1; //make this a member of the block group.
mDfltElements[eHTMLTag_button].mExcludeKids=kButtonExcludeKids;
@ -1232,6 +1246,7 @@ void CElementTable::InitializeElements() {
mDfltElements[eHTMLTag_dd].mContainsGroups.mBits.mSelf=0;
CElement::Initialize( mDfltElements[eHTMLTag_del], eHTMLTag_del, CPhraseElement::GetGroup(), CFlowElement::GetContainedGroups());
mDfltElements[eHTMLTag_del].mGroup.mBits.mBlock=1; //make this a member of the block group.
CElement::Initialize( mDfltElements[eHTMLTag_dfn], eHTMLTag_dfn, CPhraseElement::GetGroup(), CInlineElement::GetContainedGroups());
CBlockElement::Initialize( mDfltElements[eHTMLTag_dir], eHTMLTag_dir);
@ -1280,22 +1295,26 @@ void CElementTable::InitializeElements() {
CFontStyleElement::Initialize( mDfltElements[eHTMLTag_i], eHTMLTag_i);
CElement::Initialize( mDfltElements[eHTMLTag_iframe], eHTMLTag_iframe, CSpecialElement::GetGroup(), CFlowElement::GetContainedGroups());
mDfltElements[eHTMLTag_iframe].mGroup.mBits.mBlock=1; //make this a member of the block group.
CElement::Initialize( mDfltElements[eHTMLTag_ilayer], eHTMLTag_ilayer);
CElement::InitializeLeaf( mDfltElements[eHTMLTag_img], eHTMLTag_img, CSpecialElement::GetGroup(), CLeafElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_image], eHTMLTag_image);
CElement::InitializeLeaf( mDfltElements[eHTMLTag_input], eHTMLTag_input, CFormControlElement::GetGroup(),CLeafElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_ins], eHTMLTag_ins, CPhraseElement::GetGroup(), CFlowElement::GetContainedGroups());
mDfltElements[eHTMLTag_ins].mGroup.mBits.mBlock=1; //make this a member of the block group.
CElement::InitializeLeaf( mDfltElements[eHTMLTag_isindex], eHTMLTag_isindex, CHeadElement::GetMiscGroup(), CLeafElement::GetContainedGroups());
CPhraseElement::Initialize( mDfltElements[eHTMLTag_kbd], eHTMLTag_kbd);
CPhraseElement::Initialize( mDfltElements[eHTMLTag_keygen], eHTMLTag_keygen);
CDeprecatedElement::Initialize( mDfltElements[eHTMLTag_keygen], eHTMLTag_keygen);
CElement::Initialize( mDfltElements[eHTMLTag_label], eHTMLTag_label, CFormControlElement::GetGroup(), CInlineElement::GetContainedGroups());
mDfltElements[eHTMLTag_label].mContainsGroups.mBits.mSelf=0;
CElement::Initialize( mDfltElements[eHTMLTag_layer], eHTMLTag_layer);
CElement::Initialize( mDfltElements[eHTMLTag_legend], eHTMLTag_legend, CFormControlElement::GetGroup(), CInlineElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_li], eHTMLTag_li, CListElement::GetGroup(), CFlowElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_legend], eHTMLTag_legend, CElement::GetEmptyGroup(), CInlineElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_li], eHTMLTag_li, CListElement::GetGroup(), CFlowElement::GetContainedGroups());
mDfltElements[eHTMLTag_li].mExcludeKids=kLIExcludeKids;
CElement::InitializeLeaf( mDfltElements[eHTMLTag_link], eHTMLTag_link, CHeadElement::GetMiscGroup(), CLeafElement::GetContainedGroups());
@ -1320,6 +1339,7 @@ void CElementTable::InitializeElements() {
CElement::Initialize( mDfltElements[eHTMLTag_noscript], eHTMLTag_noscript, CBlockElement::GetGroup(), CFlowElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_object], eHTMLTag_object, CBlockElement::GetGroup(), CFlowElement::GetContainedGroups());
mDfltElements[eHTMLTag_object].mGroup.mBits.mBlock=1; //make this a member of the block group.
mDfltElements[eHTMLTag_object].mGroup.mBits.mHeadMisc=1;
mDfltElements[eHTMLTag_object].mIncludeKids=kObjectKids;
@ -1328,16 +1348,16 @@ void CElementTable::InitializeElements() {
mDfltElements[eHTMLTag_ol].mIncludeKids=kDirKids;
mDfltElements[eHTMLTag_ol].mContainsGroups.mAllBits=0;
CFormControlElement::Initialize( mDfltElements[eHTMLTag_optgroup], eHTMLTag_optgroup);
CElement::Initialize( mDfltElements[eHTMLTag_optgroup], eHTMLTag_optgroup, CElement::GetEmptyGroup(), CElement::GetEmptyGroup());
mDfltElements[eHTMLTag_optgroup].mContainsGroups.mAllBits=0;
mDfltElements[eHTMLTag_optgroup].mIncludeKids=kOptionGroupKids;
CFormControlElement::Initialize( mDfltElements[eHTMLTag_option], eHTMLTag_option);
CElement::Initialize( mDfltElements[eHTMLTag_option], eHTMLTag_option, CElement::GetEmptyGroup(), CElement::GetEmptyGroup());
mDfltElements[eHTMLTag_option].mContainsGroups.mAllBits=0;
mDfltElements[eHTMLTag_option].mContainsGroups.mBits.mLeaf=1;
CElement::Initialize( mDfltElements[eHTMLTag_p], eHTMLTag_p, CBlockElement::GetGroup(), CInlineElement::GetContainedGroups());
CElement::InitializeLeaf( mDfltElements[eHTMLTag_param], eHTMLTag_param, CSpecialElement::GetGroup(), CLeafElement::GetContainedGroups());
CElement::InitializeLeaf( mDfltElements[eHTMLTag_param], eHTMLTag_param, CElement::GetEmptyGroup(), CLeafElement::GetContainedGroups());
CBlockElement::Initialize( mDfltElements[eHTMLTag_parsererror],eHTMLTag_parsererror);
CElement::Initialize( mDfltElements[eHTMLTag_plaintext], eHTMLTag_plaintext);
CBlockElement::Initialize( mDfltElements[eHTMLTag_pre], eHTMLTag_pre);
@ -1349,6 +1369,7 @@ void CElementTable::InitializeElements() {
CFontStyleElement::Initialize( mDfltElements[eHTMLTag_s], eHTMLTag_s);
CPhraseElement::Initialize( mDfltElements[eHTMLTag_samp], eHTMLTag_samp );
CSpecialElement::Initialize( mDfltElements[eHTMLTag_script], eHTMLTag_script);
mDfltElements[eHTMLTag_script].mGroup.mBits.mBlock=1; //make this a member of the block group.
mDfltElements[eHTMLTag_script].mGroup.mBits.mHeadMisc=1;
CFormControlElement::Initialize( mDfltElements[eHTMLTag_select], eHTMLTag_select);
@ -1370,7 +1391,7 @@ void CElementTable::InitializeElements() {
CElement::Initialize( mDfltElements[eHTMLTag_tbody], eHTMLTag_tbody, CTableElement::GetGroup(), CLeafElement::GetContainedGroups());
mDfltElements[eHTMLTag_tbody].mIncludeKids=kTBodyKids;
CElement::Initialize( mDfltElements[eHTMLTag_td], eHTMLTag_td, CTableElement::GetGroup(), CFlowElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_td], eHTMLTag_td, CElement::GetEmptyGroup(), CFlowElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_textarea], eHTMLTag_textarea, CFormControlElement::GetGroup(), CLeafElement::GetContainedGroups());
mDfltElements[eHTMLTag_textarea].mContainsGroups.mBits.mLeaf=1;
@ -1379,11 +1400,11 @@ void CElementTable::InitializeElements() {
CElement::Initialize( mDfltElements[eHTMLTag_tfoot], eHTMLTag_tfoot, CTableElement::GetGroup(), CLeafElement::GetContainedGroups());
mDfltElements[eHTMLTag_tfoot].mIncludeKids=kTBodyKids;
CElement::Initialize( mDfltElements[eHTMLTag_th], eHTMLTag_th, CTableElement::GetGroup(), CFlowElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_th], eHTMLTag_th, CElement::GetEmptyGroup(), CFlowElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_thead], eHTMLTag_thead, CTableElement::GetGroup(), CLeafElement::GetContainedGroups());
mDfltElements[eHTMLTag_thead].mIncludeKids=kTBodyKids;
CElement::Initialize( mDfltElements[eHTMLTag_tr], eHTMLTag_tr, CTableElement::GetGroup(), CFlowElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_tr], eHTMLTag_tr, CElement::GetEmptyGroup(), CFlowElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_title], eHTMLTag_title);
@ -1508,13 +1529,14 @@ void CElementTable::DebugDumpContainment(CElement* anElement){
printf(prefix);
int count=0;
for(int i=0;i<eHTMLTag_unknown;i++){
int i=0;
for(i=0;i<NS_HTML_TAG_MAX;i++){
CElement* theChild=mElements[i];
if(anElement->CanContain(theChild,0)){
tag=nsHTMLTags::GetCStringValue(theChild->mTag);
printf("%s ",tag);
count++;
if(10==count) {
if(18==count) {
count=0;
printf("\n%s",prefix);
}
@ -1523,26 +1545,21 @@ void CElementTable::DebugDumpContainment(CElement* anElement){
}
void CElementTable::DebugDumpContainment(const char* aTitle){
DebugDumpGroups(mElements[eHTMLTag_blockquote]);
DebugDumpGroups(mElements[eHTMLTag_button]);
DebugDumpGroups(mElements[eHTMLTag_dfn]);
DebugDumpGroups(mElements[eHTMLTag_dt]);
DebugDumpGroups(mElements[eHTMLTag_form]);
DebugDumpGroups(mElements[eHTMLTag_frameset]);
DebugDumpGroups(mElements[eHTMLTag_label]);
DebugDumpGroups(mElements[eHTMLTag_li]);
DebugDumpGroups(mElements[eHTMLTag_map]);
DebugDumpGroups(mElements[eHTMLTag_object]);
#if 0
DebugDumpContainment(mElements[eHTMLTag_head]);
DebugDumpContainment(mElements[eHTMLTag_html]);
DebugDumpContainment(mElements[eHTMLTag_table]);
printf("\n");
#endif
printf("==================================================\n");
printf("%s\n",aTitle);
printf("==================================================\n");
int i=0;
for(i=1;i<eHTMLTag_text;i++){
//DebugDumpContainment(mElements[i]);
DebugDumpGroups(mElements[i]);
for(i=1;i<NS_HTML_TAG_MAX;i++){
DebugDumpContainment(mElements[i]);
//DebugDumpGroups(mElements[i]);
} //for
}
@ -1611,18 +1628,20 @@ PRBool CElement::CanContain(CElement* anElement,nsDTDContext* aContext) {
//first, let's see if we can contain the given tag based on group info...
if(anElement) {
if(anElement!=this) {
if(ListContainsTag(mExcludeKids,anElement->mTag)) {
return PR_FALSE;
if(!anElement->mProperties.mDeprecated) {
if(anElement!=this) {
if(ListContainsTag(mExcludeKids,anElement->mTag)) {
return PR_FALSE;
}
else if(ContainsGroup(mContainsGroups,anElement->mGroup)) {
result=PR_TRUE;
}
else if(ListContainsTag(mIncludeKids,anElement->mTag)) {
return PR_TRUE;
}
}
else if(ContainsGroup(mContainsGroups,anElement->mGroup)) {
result=PR_TRUE;
}
else if(ListContainsTag(mIncludeKids,anElement->mTag)) {
return PR_TRUE;
}
}
else result=mContainsGroups.mBits.mSelf;
else result=mContainsGroups.mBits.mSelf;
}
}
return result;
}

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

@ -4,7 +4,7 @@
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/NPL/
*
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
@ -20,7 +20,7 @@
* Contributor(s):
*/
//#define ENABLE_CRC
//#define ENABLE_CRC
//#define RICKG_DEBUG
@ -55,7 +55,7 @@ static NS_DEFINE_IID(kIHTMLContentSinkIID, NS_IHTML_CONTENT_SINK_IID);
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
static NS_DEFINE_IID(kIDTDIID, NS_IDTD_IID);
static NS_DEFINE_IID(kClassIID, NS_IOTHERHTML_DTD_IID);
static const char* kNullToken = "Error: Null token given";
static const char* kInvalidTagStackPos = "Error: invalid tag stack position";
static char* kVerificationDir = "c:/temp";
@ -1457,22 +1457,22 @@ nsresult COtherDTD::CloseBody(const nsIParserNode *aNode){
STOP_TIMER();
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: COtherDTD::CloseBody(), this=%p\n", this));
nsresult result=(mSink) ? mSink->CloseBody(*aNode) : NS_OK;
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: COtherDTD::CloseBody(), this=%p\n", this));
START_TIMER();
return result;
}
return result;
}
/**
* This method does two things: 1st, help construct
* our own internal model of the content-stack; and
* 2nd, pass this message on to the sink.
* @update gess4/6/98
* @param aNode -- next node to be added to model
* @return TRUE if ok, FALSE if error
* @return TRUE if ok, FALSE if error
*/
nsresult COtherDTD::OpenForm(const nsIParserNode *aNode){
if(mHasOpenForm)

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

@ -106,7 +106,7 @@ public:
PRUint32 mForDTDUseOnly:1;
PRUint32 mDiscardTag:1;
PRUint32 mPropagateDepth:4;
PRUint32 mBadContentWatch:1;
PRUint32 mDeprecated:1;
PRUint32 mMustCloseSelf:1;
PRUint32 mOmitWS:1;
};
@ -134,6 +134,11 @@ public:
mDelegate=eHTMLTag_unknown;
}
static CGroupMembers& GetEmptyGroup(void) {
static CGroupMembers theGroup={0};
return theGroup;
}
static void Initialize(CElement& anElement,eHTMLTags aTag){
anElement.mProperties.mIsContainer=0;
anElement.mTag=aTag;
@ -238,8 +243,13 @@ public:
class CDeprecatedElement: public CElement {
public:
static void Initialize(CElement& anElement,eHTMLTags aTag){
CElement::Initialize(anElement,aTag);
anElement.mProperties.mDeprecated=1;
}
CDeprecatedElement(eHTMLTags aTag) : CElement(aTag) {
CElement::Initialize(*this,aTag);
CDeprecatedElement::Initialize(*this,aTag);
}
};
@ -265,7 +275,7 @@ public:
theGroup.mBits.mFontStyle =1;
theGroup.mBits.mPhrase=1;
theGroup.mBits.mSpecial=1;
theGroup.mBits.mList=1;
theGroup.mBits.mList=0; //intentionally remove list from inline group
theGroup.mBits.mPreformatted=1;
theGroup.mBits.mSelf=1;
theGroup.mBits.mLeaf=1;
@ -1047,6 +1057,7 @@ public:
This is for the body element...
**********************************************************/
static eHTMLTags gBodyKids[] = {eHTMLTag_del, eHTMLTag_ins, eHTMLTag_script, eHTMLTag_unknown};
static eHTMLTags gBodyExcludeKids[] = {eHTMLTag_applet, eHTMLTag_button, eHTMLTag_iframe, eHTMLTag_object, eHTMLTag_unknown};
class CBodyElement: public CElement {
public:
@ -1070,6 +1081,7 @@ public:
#endif
CElement::Initialize(*this,aTag,CBodyElement::GetGroup(),theGroups);
mIncludeKids=gBodyKids;
mExcludeKids=gBodyExcludeKids;
}
virtual nsresult HandleStartToken(nsIParserNode* aNode,eHTMLTags aTag,nsDTDContext* aContext,nsIHTMLContentSink* aSink) {
@ -1125,7 +1137,7 @@ public:
{
memset(mElements,0,sizeof(mElements));
InitializeElements();
DebugDumpContainment("all elements");
//DebugDumpContainment("all elements");
}
@ -1192,19 +1204,20 @@ void CElementTable::InitializeElements() {
CBlockElement::Initialize( mDfltElements[eHTMLTag_address], eHTMLTag_address);
CElement::Initialize( mDfltElements[eHTMLTag_applet], eHTMLTag_applet,CSpecialElement::GetGroup(), CFlowElement::GetContainedGroups());
mDfltElements[eHTMLTag_applet].mGroup.mBits.mBlock=1; //treat applet like a block, too.
mDfltElements[eHTMLTag_applet].mIncludeKids=kAppletKids;
CElement::Initialize( mDfltElements[eHTMLTag_area], eHTMLTag_area);
mDfltElements[eHTMLTag_area].mContainsGroups.mBits.mSelf=0;
CFontStyleElement::Initialize( mDfltElements[eHTMLTag_b], eHTMLTag_b);
CElement::InitializeLeaf( mDfltElements[eHTMLTag_base], eHTMLTag_base, CHeadElement::GetGroup(), CLeafElement::GetContainedGroups());
CElement::InitializeLeaf( mDfltElements[eHTMLTag_base], eHTMLTag_base, CHeadElement::GetMiscGroup(), CLeafElement::GetContainedGroups());
CElement::InitializeLeaf( mDfltElements[eHTMLTag_basefont], eHTMLTag_basefont, CSpecialElement::GetGroup(), CLeafElement::GetContainedGroups());
CSpecialElement::Initialize( mDfltElements[eHTMLTag_bdo], eHTMLTag_bdo);
CFontStyleElement::Initialize( mDfltElements[eHTMLTag_big], eHTMLTag_big);
CLeafElement::Initialize( mDfltElements[eHTMLTag_bgsound], eHTMLTag_bgsound);
CDeprecatedElement::Initialize( mDfltElements[eHTMLTag_bgsound], eHTMLTag_bgsound);
CElement::Initialize( mDfltElements[eHTMLTag_blockquote], eHTMLTag_blockquote, CBlockElement::GetGroup(), CBlockElement::GetBlockGroupMembers());
mDfltElements[eHTMLTag_blockquote].mIncludeKids=kBlockQuoteKids;
@ -1212,6 +1225,7 @@ void CElementTable::InitializeElements() {
CElement::InitializeLeaf( mDfltElements[eHTMLTag_br], eHTMLTag_br, CSpecialElement::GetGroup(), CLeafElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_button], eHTMLTag_button, CFormControlElement::GetGroup(), CFlowElement::GetContainedGroups());
mDfltElements[eHTMLTag_button].mGroup.mBits.mBlock=1; //make this a member of the block group.
mDfltElements[eHTMLTag_button].mExcludeKids=kButtonExcludeKids;
@ -1232,6 +1246,7 @@ void CElementTable::InitializeElements() {
mDfltElements[eHTMLTag_dd].mContainsGroups.mBits.mSelf=0;
CElement::Initialize( mDfltElements[eHTMLTag_del], eHTMLTag_del, CPhraseElement::GetGroup(), CFlowElement::GetContainedGroups());
mDfltElements[eHTMLTag_del].mGroup.mBits.mBlock=1; //make this a member of the block group.
CElement::Initialize( mDfltElements[eHTMLTag_dfn], eHTMLTag_dfn, CPhraseElement::GetGroup(), CInlineElement::GetContainedGroups());
CBlockElement::Initialize( mDfltElements[eHTMLTag_dir], eHTMLTag_dir);
@ -1280,22 +1295,26 @@ void CElementTable::InitializeElements() {
CFontStyleElement::Initialize( mDfltElements[eHTMLTag_i], eHTMLTag_i);
CElement::Initialize( mDfltElements[eHTMLTag_iframe], eHTMLTag_iframe, CSpecialElement::GetGroup(), CFlowElement::GetContainedGroups());
mDfltElements[eHTMLTag_iframe].mGroup.mBits.mBlock=1; //make this a member of the block group.
CElement::Initialize( mDfltElements[eHTMLTag_ilayer], eHTMLTag_ilayer);
CElement::InitializeLeaf( mDfltElements[eHTMLTag_img], eHTMLTag_img, CSpecialElement::GetGroup(), CLeafElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_image], eHTMLTag_image);
CElement::InitializeLeaf( mDfltElements[eHTMLTag_input], eHTMLTag_input, CFormControlElement::GetGroup(),CLeafElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_ins], eHTMLTag_ins, CPhraseElement::GetGroup(), CFlowElement::GetContainedGroups());
mDfltElements[eHTMLTag_ins].mGroup.mBits.mBlock=1; //make this a member of the block group.
CElement::InitializeLeaf( mDfltElements[eHTMLTag_isindex], eHTMLTag_isindex, CHeadElement::GetMiscGroup(), CLeafElement::GetContainedGroups());
CPhraseElement::Initialize( mDfltElements[eHTMLTag_kbd], eHTMLTag_kbd);
CPhraseElement::Initialize( mDfltElements[eHTMLTag_keygen], eHTMLTag_keygen);
CDeprecatedElement::Initialize( mDfltElements[eHTMLTag_keygen], eHTMLTag_keygen);
CElement::Initialize( mDfltElements[eHTMLTag_label], eHTMLTag_label, CFormControlElement::GetGroup(), CInlineElement::GetContainedGroups());
mDfltElements[eHTMLTag_label].mContainsGroups.mBits.mSelf=0;
CElement::Initialize( mDfltElements[eHTMLTag_layer], eHTMLTag_layer);
CElement::Initialize( mDfltElements[eHTMLTag_legend], eHTMLTag_legend, CFormControlElement::GetGroup(), CInlineElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_li], eHTMLTag_li, CListElement::GetGroup(), CFlowElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_legend], eHTMLTag_legend, CElement::GetEmptyGroup(), CInlineElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_li], eHTMLTag_li, CListElement::GetGroup(), CFlowElement::GetContainedGroups());
mDfltElements[eHTMLTag_li].mExcludeKids=kLIExcludeKids;
CElement::InitializeLeaf( mDfltElements[eHTMLTag_link], eHTMLTag_link, CHeadElement::GetMiscGroup(), CLeafElement::GetContainedGroups());
@ -1320,6 +1339,7 @@ void CElementTable::InitializeElements() {
CElement::Initialize( mDfltElements[eHTMLTag_noscript], eHTMLTag_noscript, CBlockElement::GetGroup(), CFlowElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_object], eHTMLTag_object, CBlockElement::GetGroup(), CFlowElement::GetContainedGroups());
mDfltElements[eHTMLTag_object].mGroup.mBits.mBlock=1; //make this a member of the block group.
mDfltElements[eHTMLTag_object].mGroup.mBits.mHeadMisc=1;
mDfltElements[eHTMLTag_object].mIncludeKids=kObjectKids;
@ -1328,16 +1348,16 @@ void CElementTable::InitializeElements() {
mDfltElements[eHTMLTag_ol].mIncludeKids=kDirKids;
mDfltElements[eHTMLTag_ol].mContainsGroups.mAllBits=0;
CFormControlElement::Initialize( mDfltElements[eHTMLTag_optgroup], eHTMLTag_optgroup);
CElement::Initialize( mDfltElements[eHTMLTag_optgroup], eHTMLTag_optgroup, CElement::GetEmptyGroup(), CElement::GetEmptyGroup());
mDfltElements[eHTMLTag_optgroup].mContainsGroups.mAllBits=0;
mDfltElements[eHTMLTag_optgroup].mIncludeKids=kOptionGroupKids;
CFormControlElement::Initialize( mDfltElements[eHTMLTag_option], eHTMLTag_option);
CElement::Initialize( mDfltElements[eHTMLTag_option], eHTMLTag_option, CElement::GetEmptyGroup(), CElement::GetEmptyGroup());
mDfltElements[eHTMLTag_option].mContainsGroups.mAllBits=0;
mDfltElements[eHTMLTag_option].mContainsGroups.mBits.mLeaf=1;
CElement::Initialize( mDfltElements[eHTMLTag_p], eHTMLTag_p, CBlockElement::GetGroup(), CInlineElement::GetContainedGroups());
CElement::InitializeLeaf( mDfltElements[eHTMLTag_param], eHTMLTag_param, CSpecialElement::GetGroup(), CLeafElement::GetContainedGroups());
CElement::InitializeLeaf( mDfltElements[eHTMLTag_param], eHTMLTag_param, CElement::GetEmptyGroup(), CLeafElement::GetContainedGroups());
CBlockElement::Initialize( mDfltElements[eHTMLTag_parsererror],eHTMLTag_parsererror);
CElement::Initialize( mDfltElements[eHTMLTag_plaintext], eHTMLTag_plaintext);
CBlockElement::Initialize( mDfltElements[eHTMLTag_pre], eHTMLTag_pre);
@ -1349,6 +1369,7 @@ void CElementTable::InitializeElements() {
CFontStyleElement::Initialize( mDfltElements[eHTMLTag_s], eHTMLTag_s);
CPhraseElement::Initialize( mDfltElements[eHTMLTag_samp], eHTMLTag_samp );
CSpecialElement::Initialize( mDfltElements[eHTMLTag_script], eHTMLTag_script);
mDfltElements[eHTMLTag_script].mGroup.mBits.mBlock=1; //make this a member of the block group.
mDfltElements[eHTMLTag_script].mGroup.mBits.mHeadMisc=1;
CFormControlElement::Initialize( mDfltElements[eHTMLTag_select], eHTMLTag_select);
@ -1370,7 +1391,7 @@ void CElementTable::InitializeElements() {
CElement::Initialize( mDfltElements[eHTMLTag_tbody], eHTMLTag_tbody, CTableElement::GetGroup(), CLeafElement::GetContainedGroups());
mDfltElements[eHTMLTag_tbody].mIncludeKids=kTBodyKids;
CElement::Initialize( mDfltElements[eHTMLTag_td], eHTMLTag_td, CTableElement::GetGroup(), CFlowElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_td], eHTMLTag_td, CElement::GetEmptyGroup(), CFlowElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_textarea], eHTMLTag_textarea, CFormControlElement::GetGroup(), CLeafElement::GetContainedGroups());
mDfltElements[eHTMLTag_textarea].mContainsGroups.mBits.mLeaf=1;
@ -1379,11 +1400,11 @@ void CElementTable::InitializeElements() {
CElement::Initialize( mDfltElements[eHTMLTag_tfoot], eHTMLTag_tfoot, CTableElement::GetGroup(), CLeafElement::GetContainedGroups());
mDfltElements[eHTMLTag_tfoot].mIncludeKids=kTBodyKids;
CElement::Initialize( mDfltElements[eHTMLTag_th], eHTMLTag_th, CTableElement::GetGroup(), CFlowElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_th], eHTMLTag_th, CElement::GetEmptyGroup(), CFlowElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_thead], eHTMLTag_thead, CTableElement::GetGroup(), CLeafElement::GetContainedGroups());
mDfltElements[eHTMLTag_thead].mIncludeKids=kTBodyKids;
CElement::Initialize( mDfltElements[eHTMLTag_tr], eHTMLTag_tr, CTableElement::GetGroup(), CFlowElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_tr], eHTMLTag_tr, CElement::GetEmptyGroup(), CFlowElement::GetContainedGroups());
CElement::Initialize( mDfltElements[eHTMLTag_title], eHTMLTag_title);
@ -1508,13 +1529,14 @@ void CElementTable::DebugDumpContainment(CElement* anElement){
printf(prefix);
int count=0;
for(int i=0;i<eHTMLTag_unknown;i++){
int i=0;
for(i=0;i<NS_HTML_TAG_MAX;i++){
CElement* theChild=mElements[i];
if(anElement->CanContain(theChild,0)){
tag=nsHTMLTags::GetCStringValue(theChild->mTag);
printf("%s ",tag);
count++;
if(10==count) {
if(18==count) {
count=0;
printf("\n%s",prefix);
}
@ -1523,26 +1545,21 @@ void CElementTable::DebugDumpContainment(CElement* anElement){
}
void CElementTable::DebugDumpContainment(const char* aTitle){
DebugDumpGroups(mElements[eHTMLTag_blockquote]);
DebugDumpGroups(mElements[eHTMLTag_button]);
DebugDumpGroups(mElements[eHTMLTag_dfn]);
DebugDumpGroups(mElements[eHTMLTag_dt]);
DebugDumpGroups(mElements[eHTMLTag_form]);
DebugDumpGroups(mElements[eHTMLTag_frameset]);
DebugDumpGroups(mElements[eHTMLTag_label]);
DebugDumpGroups(mElements[eHTMLTag_li]);
DebugDumpGroups(mElements[eHTMLTag_map]);
DebugDumpGroups(mElements[eHTMLTag_object]);
#if 0
DebugDumpContainment(mElements[eHTMLTag_head]);
DebugDumpContainment(mElements[eHTMLTag_html]);
DebugDumpContainment(mElements[eHTMLTag_table]);
printf("\n");
#endif
printf("==================================================\n");
printf("%s\n",aTitle);
printf("==================================================\n");
int i=0;
for(i=1;i<eHTMLTag_text;i++){
//DebugDumpContainment(mElements[i]);
DebugDumpGroups(mElements[i]);
for(i=1;i<NS_HTML_TAG_MAX;i++){
DebugDumpContainment(mElements[i]);
//DebugDumpGroups(mElements[i]);
} //for
}
@ -1611,18 +1628,20 @@ PRBool CElement::CanContain(CElement* anElement,nsDTDContext* aContext) {
//first, let's see if we can contain the given tag based on group info...
if(anElement) {
if(anElement!=this) {
if(ListContainsTag(mExcludeKids,anElement->mTag)) {
return PR_FALSE;
if(!anElement->mProperties.mDeprecated) {
if(anElement!=this) {
if(ListContainsTag(mExcludeKids,anElement->mTag)) {
return PR_FALSE;
}
else if(ContainsGroup(mContainsGroups,anElement->mGroup)) {
result=PR_TRUE;
}
else if(ListContainsTag(mIncludeKids,anElement->mTag)) {
return PR_TRUE;
}
}
else if(ContainsGroup(mContainsGroups,anElement->mGroup)) {
result=PR_TRUE;
}
else if(ListContainsTag(mIncludeKids,anElement->mTag)) {
return PR_TRUE;
}
}
else result=mContainsGroups.mBits.mSelf;
else result=mContainsGroups.mBits.mSelf;
}
}
return result;
}