too many fixes to enumerate

git-svn-id: svn://10.0.0.236/trunk@6598 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
rickg%netscape.com
1998-07-28 01:08:12 +00:00
parent a85bc4645d
commit bce39df640
8 changed files with 332 additions and 258 deletions

View File

@@ -1001,6 +1001,88 @@ PRBool CNavDTD::CanContainFormElement(eHTMLTags aParent,eHTMLTags aChild) const
return result;
}
/***********************************************************************************
The following tables determine the set of elements each tag can contain...
***********************************************************************************/
static char gTagSet1[]={
eHTMLTag_a, eHTMLTag_acronym, eHTMLTag_address, eHTMLTag_applet,
eHTMLTag_blink, eHTMLTag_b, eHTMLTag_basefont, eHTMLTag_bdo,
eHTMLTag_big,
eHTMLTag_blockquote,eHTMLTag_br, eHTMLTag_button, eHTMLTag_center,
eHTMLTag_cite, eHTMLTag_code, eHTMLTag_dfn, eHTMLTag_dir,
eHTMLTag_div, eHTMLTag_dl, eHTMLTag_em, eHTMLTag_fieldset,
eHTMLTag_embed,
eHTMLTag_font, eHTMLTag_form, eHTMLTag_h1, eHTMLTag_h2,
eHTMLTag_h3, eHTMLTag_h4, eHTMLTag_h5, eHTMLTag_h6,
eHTMLTag_hr, eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_img,
eHTMLTag_input, eHTMLTag_isindex,
eHTMLTag_kbd, eHTMLTag_label, eHTMLTag_li,
eHTMLTag_map, eHTMLTag_menu, eHTMLTag_newline, eHTMLTag_nobr,
eHTMLTag_noframes, eHTMLTag_noscript,
eHTMLTag_object, eHTMLTag_ol, eHTMLTag_p, eHTMLTag_pre,
eHTMLTag_q, eHTMLTag_s, eHTMLTag_strike,
eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small,
eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strong,
eHTMLTag_sub, eHTMLTag_sup, eHTMLTag_table, eHTMLTag_text,
eHTMLTag_textarea, eHTMLTag_tt, eHTMLTag_u, eHTMLTag_ul,
eHTMLTag_userdefined, eHTMLTag_var, eHTMLTag_wbr,
eHTMLTag_whitespace,
0};
static char gTagSet2[]={
eHTMLTag_a, eHTMLTag_acronym, eHTMLTag_applet, eHTMLTag_blink,
eHTMLTag_b,
eHTMLTag_basefont, eHTMLTag_bdo, eHTMLTag_big, eHTMLTag_br,
eHTMLTag_button, eHTMLTag_cite, eHTMLTag_code, eHTMLTag_dfn,
eHTMLTag_div, eHTMLTag_em, eHTMLTag_font, eHTMLTag_hr,
eHTMLTag_embed,
eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_img, eHTMLTag_input,
eHTMLTag_kbd,
eHTMLTag_label, eHTMLTag_map, eHTMLTag_newline, eHTMLTag_nobr,
eHTMLTag_object, eHTMLTag_p,
eHTMLTag_q, eHTMLTag_s, eHTMLTag_strike,
eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small,
eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strong,
eHTMLTag_sub, eHTMLTag_sup, eHTMLTag_text, eHTMLTag_textarea,
eHTMLTag_table,// XXX kipp was here
eHTMLTag_tt, eHTMLTag_u, eHTMLTag_userdefined, eHTMLTag_var,
eHTMLTag_wbr, eHTMLTag_whitespace,
0};
static char gTagSet3[]={
eHTMLTag_a, eHTMLTag_acronym, eHTMLTag_applet, eHTMLTag_blink,
eHTMLTag_b,
eHTMLTag_bdo, eHTMLTag_big, eHTMLTag_br, eHTMLTag_blockquote,
eHTMLTag_body, eHTMLTag_caption, eHTMLTag_center, eHTMLTag_cite,
eHTMLTag_code, eHTMLTag_dd, eHTMLTag_del, eHTMLTag_dfn,
eHTMLTag_div, eHTMLTag_dt, eHTMLTag_em, eHTMLTag_fieldset,
eHTMLTag_embed,
eHTMLTag_font, eHTMLTag_form, eHTMLTag_h1, eHTMLTag_h2,
eHTMLTag_h3, eHTMLTag_h4, eHTMLTag_h5, eHTMLTag_h6,
eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_ins, eHTMLTag_kbd,
eHTMLTag_label, eHTMLTag_legend, eHTMLTag_li, eHTMLTag_newline,
eHTMLTag_noframes,
eHTMLTag_noscript, eHTMLTag_object, eHTMLTag_p, eHTMLTag_pre,
eHTMLTag_q, eHTMLTag_s, eHTMLTag_strike,
eHTMLTag_samp, eHTMLTag_small, eHTMLTag_spacer,
eHTMLTag_span, eHTMLTag_strong, eHTMLTag_sub, eHTMLTag_sup,
eHTMLTag_td, eHTMLTag_text,
eHTMLTag_th, eHTMLTag_tt, eHTMLTag_u, eHTMLTag_userdefined,
eHTMLTag_var, eHTMLTag_wbr, eHTMLTag_whitespace,
0};
/***********************************************************************************
The preceeding tables determine the set of elements each tag can contain...
***********************************************************************************/
/**
* This method is called to determine whether or not a tag
@@ -1015,81 +1097,6 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) {
PRBool result=PR_FALSE;
static char gTagSet1[]={
eHTMLTag_a, eHTMLTag_acronym, eHTMLTag_address, eHTMLTag_applet,
eHTMLTag_blink, eHTMLTag_b, eHTMLTag_basefont, eHTMLTag_bdo,
eHTMLTag_big,
eHTMLTag_blockquote,eHTMLTag_br, eHTMLTag_button, eHTMLTag_center,
eHTMLTag_cite, eHTMLTag_code, eHTMLTag_dfn, eHTMLTag_dir,
eHTMLTag_div, eHTMLTag_dl, eHTMLTag_em, eHTMLTag_fieldset,
eHTMLTag_embed,
eHTMLTag_font, eHTMLTag_form, eHTMLTag_h1, eHTMLTag_h2,
eHTMLTag_h3, eHTMLTag_h4, eHTMLTag_h5, eHTMLTag_h6,
eHTMLTag_hr, eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_img,
eHTMLTag_input, eHTMLTag_isindex,
eHTMLTag_kbd, eHTMLTag_label, eHTMLTag_li,
eHTMLTag_map, eHTMLTag_menu, eHTMLTag_newline, eHTMLTag_nobr,
eHTMLTag_noframes, eHTMLTag_noscript,
eHTMLTag_object, eHTMLTag_ol, eHTMLTag_p, eHTMLTag_pre,
eHTMLTag_q, eHTMLTag_s, eHTMLTag_strike,
eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small,
eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strong,
eHTMLTag_sub, eHTMLTag_sup, eHTMLTag_table, eHTMLTag_text,
eHTMLTag_textarea, eHTMLTag_tt, eHTMLTag_u, eHTMLTag_ul,
eHTMLTag_userdefined, eHTMLTag_var,
eHTMLTag_whitespace,
0};
static char gTagSet2[]={
eHTMLTag_a, eHTMLTag_acronym, eHTMLTag_applet, eHTMLTag_blink,
eHTMLTag_b,
eHTMLTag_basefont, eHTMLTag_bdo, eHTMLTag_big, eHTMLTag_br,
eHTMLTag_button, eHTMLTag_cite, eHTMLTag_code, eHTMLTag_dfn,
eHTMLTag_div, eHTMLTag_em, eHTMLTag_font, eHTMLTag_hr,
eHTMLTag_embed,
eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_img, eHTMLTag_input,
eHTMLTag_kbd,
eHTMLTag_label, eHTMLTag_map, eHTMLTag_newline, eHTMLTag_nobr,
eHTMLTag_object, eHTMLTag_p,
eHTMLTag_q, eHTMLTag_s, eHTMLTag_strike,
eHTMLTag_samp, eHTMLTag_script, eHTMLTag_select, eHTMLTag_small,
eHTMLTag_spacer, eHTMLTag_span, eHTMLTag_strong,
eHTMLTag_sub, eHTMLTag_sup, eHTMLTag_text, eHTMLTag_textarea,
eHTMLTag_table,// XXX kipp was here
eHTMLTag_tt, eHTMLTag_u, eHTMLTag_userdefined, eHTMLTag_var,
eHTMLTag_whitespace,
0};
static char gTagSet3[]={
eHTMLTag_a, eHTMLTag_acronym, eHTMLTag_applet, eHTMLTag_blink,
eHTMLTag_b,
eHTMLTag_bdo, eHTMLTag_big, eHTMLTag_br, eHTMLTag_blockquote,
eHTMLTag_body, eHTMLTag_caption, eHTMLTag_center, eHTMLTag_cite,
eHTMLTag_code, eHTMLTag_dd, eHTMLTag_del, eHTMLTag_dfn,
eHTMLTag_div, eHTMLTag_dt, eHTMLTag_em, eHTMLTag_fieldset,
eHTMLTag_embed,
eHTMLTag_font, eHTMLTag_form, eHTMLTag_h1, eHTMLTag_h2,
eHTMLTag_h3, eHTMLTag_h4, eHTMLTag_h5, eHTMLTag_h6,
eHTMLTag_i, eHTMLTag_iframe, eHTMLTag_ins, eHTMLTag_kbd,
eHTMLTag_label, eHTMLTag_legend, eHTMLTag_li, eHTMLTag_newline,
eHTMLTag_noframes,
eHTMLTag_noscript, eHTMLTag_object, eHTMLTag_p, eHTMLTag_pre,
eHTMLTag_q, eHTMLTag_s, eHTMLTag_strike,
eHTMLTag_samp, eHTMLTag_small, eHTMLTag_spacer,
eHTMLTag_span, eHTMLTag_strong, eHTMLTag_sub, eHTMLTag_sup,
eHTMLTag_td, eHTMLTag_text,
eHTMLTag_th, eHTMLTag_tt, eHTMLTag_u, eHTMLTag_userdefined,
eHTMLTag_var, eHTMLTag_whitespace,
0};
//This hack code is here because we don't yet know what to do
//with userdefined tags... XXX Hack
if(eHTMLTag_userdefined==aChild) // XXX Hack: For now...
@@ -1150,7 +1157,16 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) {
case eHTMLTag_tt:
case eHTMLTag_u:
case eHTMLTag_var:
result=PRBool(0!=strchr(gTagSet1,aChild));
{
static char listtags[]={eHTMLTag_li,0};
if(0!=strchr(listtags,aChild)) {
//This code was added to enforce the rule that listitems autoclose prior listitems.
//Stylistic tags (including <A>) that get in the way are simply out of luck.
result=false;
}
else result=PRBool(0!=strchr(gTagSet1,aChild));
}
break;
case eHTMLTag_blockquote:
@@ -1173,14 +1189,24 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) {
case eHTMLTag_colgroup:
break; //singletons can't contain anything...
case eHTMLTag_dd:
case eHTMLTag_dt:
{
static char datalistTags[]={eHTMLTag_dt,eHTMLTag_dd,0};
if(0!=strchr(datalistTags,aChild)) {
result=PR_TRUE;
}
else result=PRBool(0!=strchr(gTagSet1,aChild)); break;
}
break;
case eHTMLTag_dd:
case eHTMLTag_div:
result=PRBool(0!=strchr(gTagSet1,aChild)); break;
case eHTMLTag_dl:
{
char okTags[]={eHTMLTag_dd,eHTMLTag_dt,eHTMLTag_whitespace,eHTMLTag_newline,0};
char okTags[]={eHTMLTag_dd,eHTMLTag_dt,eHTMLTag_whitespace,eHTMLTag_newline,eHTMLTag_p,0};
result=PRBool(0!=strchr(okTags,aChild));
}
break;
@@ -1232,6 +1258,11 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) {
break;
case eHTMLTag_iframe:/* XXX wrong */
if(eHTMLTag_frame==aChild)
result=PR_FALSE;
else result=PRBool(0!=strchr(gTagSet1,aChild));
break;
case eHTMLTag_label:
case eHTMLTag_legend:/* XXX not sure */
result=PRBool(0!=strchr(gTagSet1,aChild)); break;
@@ -1284,9 +1315,18 @@ PRBool CNavDTD::CanContain(PRInt32 aParent,PRInt32 aChild) {
result=PRBool(eHTMLTag_option!=aChild); break;
case eHTMLTag_p:
if(eHTMLTag_p==aChild)
result=PR_FALSE;
else result=PRBool(0!=strchr(gTagSet2,aChild)); break;
{
static char datalistTags[]={eHTMLTag_dt,eHTMLTag_dd,0};
if(eHTMLTag_p==aChild)
result=PR_FALSE;
else if(0!=strchr(datalistTags,aChild)) {
//we now allow DT/DD inside a paragraph, so long as a DL is open...
if(PR_TRUE==HasOpenContainer(eHTMLTag_dl))
result=PR_TRUE;
}
else result=PRBool(0!=strchr(gTagSet2,aChild)); break;
}
break;
case eHTMLTag_object:
@@ -1456,7 +1496,7 @@ PRBool CNavDTD::CanOmit(eHTMLTags aParent,eHTMLTags aChild) const {
break;
case eHTMLTag_entity:
switch((eHTMLTags)aParent) {
switch(aParent) {
case eHTMLTag_tr: case eHTMLTag_table:
case eHTMLTag_thead: case eHTMLTag_tfoot:
case eHTMLTag_tbody:
@@ -1466,6 +1506,11 @@ PRBool CNavDTD::CanOmit(eHTMLTags aParent,eHTMLTags aChild) const {
} //switch
break;
case eHTMLTag_frame:
if(eHTMLTag_iframe==aParent)
result=PR_TRUE;
break;
default:
if(eHTMLTag_unknown==aParent)
result=PR_FALSE;
@@ -2719,7 +2764,7 @@ CNavDTD::ConsumeContentToEndTag(const nsString& aString,
* @return new token or null
*/
static char gSpecialTags[]={ eHTMLTag_script, eHTMLTag_style, eHTMLTag_title, eHTMLTag_textarea, 0};
static char gSkippedContentTags[]={ eHTMLTag_script, eHTMLTag_style, eHTMLTag_title, eHTMLTag_textarea, 0};
nsresult
CNavDTD::ConsumeStartTag(PRUnichar aChar,CScanner& aScanner,CToken*& aToken) {
@@ -2741,7 +2786,7 @@ CNavDTD::ConsumeStartTag(PRUnichar aChar,CScanner& aScanner,CToken*& aToken) {
eHTMLTags theTag=(eHTMLTags)aToken->GetTypeID();
if(0!=strchr(gSpecialTags,theTag)){
if(0!=strchr(gSkippedContentTags,theTag)){
//Do special case handling for <script>, <style>, <title> or <textarea>...
CToken* skippedToken=0;

View File

@@ -519,6 +519,7 @@ PRInt32 CTextToken::GetTokenType(void) {
*/
nsresult CTextToken::Consume(PRUnichar, CScanner& aScanner) {
static nsAutoString terminals("&<\r\n");
mStringInit=PR_TRUE;
nsresult result=aScanner.ReadUntil(mTextValue,terminals,PR_FALSE);
return result;
};
@@ -581,6 +582,7 @@ nsresult CCommentToken::Consume(PRUnichar, CScanner& aScanner) {
//if you're here, we're consuming a "short-form" comment
mTextValue+=ch;
result=aScanner.ReadUntil(mTextValue,terminals,PR_TRUE);
mStringInit=PR_TRUE;
return result;
};
@@ -694,6 +696,7 @@ nsresult CNewlineToken::Consume(PRUnichar aChar, CScanner& aScanner) {
break;
}
}
mStringInit=PR_TRUE;
return result;
}
@@ -883,6 +886,7 @@ nsresult CAttributeToken::Consume(PRUnichar aChar, CScanner& aScanner) {
mLastAttribute= PRBool((kGreaterThan==aChar) || (kEOF==result));
}
}
mStringInit=PR_TRUE;
return result;
}
@@ -966,6 +970,7 @@ nsresult CWhitespaceToken::Consume(PRUnichar aChar, CScanner& aScanner) {
if(NS_OK==result) {
mTextValue.StripChars("\r");
}
mStringInit=PR_TRUE;
return result;
}
@@ -1007,6 +1012,7 @@ nsresult CEntityToken::Consume(PRUnichar aChar, CScanner& aScanner) {
if(aChar)
mTextValue=aChar;
nsresult result=ConsumeEntity(aChar,mTextValue,aScanner);
mStringInit=PR_TRUE;
return result;
}
@@ -1341,10 +1347,8 @@ const char* CSkippedContentToken::GetClassName(void) {
}
/*
*
*
* @update gess 3/25/98
* @param
* Retrieve the token type as an int.
* @update gess 3/25/98
* @return
*/
PRInt32 CSkippedContentToken::GetTokenType(void) {
@@ -1352,11 +1356,14 @@ PRInt32 CSkippedContentToken::GetTokenType(void) {
}
/*
* Consume content until you find a sequence that matches
* this objects mTextValue.
* Consume content until you find an end sequence that matches
* this objects current mTextValue. Note that this is complicated
* by the fact that you can be parsing content that itself
* contains quoted content of the same type (like <SCRIPT>).
* That means we have to look for quote-pairs, and ignore the
* content inside them.
*
* @update gess 3/25/98
* @param aChar -- last char consumed from stream
* @update gess 7/25/98
* @param aScanner -- controller of underlying input source
* @return error result
*/
@@ -1364,14 +1371,27 @@ nsresult CSkippedContentToken::Consume(PRUnichar,CScanner& aScanner) {
PRBool done=PR_FALSE;
nsresult result=NS_OK;
nsString temp;
int parens=0;
char lastChar;
// while((!done) && (!aScanner.Eof())) {
static nsAutoString terminals(">()");
while((!done) && (NS_OK==result)) {
static nsAutoString terminals(">");
result=aScanner.ReadUntil(temp,terminals,PR_TRUE);
done=PRBool(kNotFound!=temp.RFind(mTextValue,PR_TRUE));
int len=temp.Length();
lastChar=char(temp[len-1]);
switch(lastChar){
case kLeftParen:
parens++; break;
case kRightParen:
parens--; break;
default:
break;
}
if((0==parens) && (kGreaterThan==lastChar))
done=PRBool(kNotFound!=temp.RFind(mTextValue,PR_TRUE));
}
mTextValue=temp;
mStringInit=PR_TRUE;
return result;
}

View File

@@ -63,7 +63,6 @@ CScanner::CScanner(nsString& aFilename,PRBool aCreateStream) :
{
mIncremental=PR_TRUE;
mOffset=0;
mMarkPos=-1;
mTotalRead=0;
mOwnsStream=aCreateStream;
mFileStream=0;
@@ -93,7 +92,6 @@ CScanner::CScanner(nsString& aFilename,fstream& aStream,PRBool assumeOwnership)
{
mIncremental=PR_TRUE;
mOffset=0;
mMarkPos=-1;
mTotalRead=0;
mOwnsStream=assumeOwnership;
mFileStream=&aStream;
@@ -127,10 +125,11 @@ CScanner::~CScanner() {
* @return
*/
PRInt32 CScanner::RewindToMark(void){
mOffset=mMarkPos;
mOffset=0;
return mOffset;
}
/**
* Records current offset position in input stream. This allows us
* to back up to this point if the need should arise, such as when
@@ -141,32 +140,10 @@ PRInt32 CScanner::RewindToMark(void){
* @return
*/
PRInt32 CScanner::Mark(void){
mMarkPos=mOffset;
return mMarkPos;
}
/**
*
* @update gess 5/12/98
*/
void _PreCompressBuffer(nsString& aBuffer,PRInt32& anOffset,PRInt32& aMarkPos){
//To determine how much of our internal buffer to truncate,
//we should check mMarkPos. That represents the point at which
//we've guaranteed the client we can back up to, so make sure
//you don't lose any of the data beyond that point.
PRInt32 len=aBuffer.Length();
if((aMarkPos<len) && (aMarkPos>0)) {
aBuffer.Cut(0,aMarkPos);
anOffset-=aMarkPos;
aMarkPos=0;
}
else if((anOffset==aMarkPos) && (0<aMarkPos)) {
aBuffer.Truncate();
anOffset=0;
}
// aMarkPos=0;
if(mOffset>0)
mBuffer.Cut(0,mOffset); //delete chars up to mark position
mOffset=0;
return 0;
}
@@ -178,7 +155,6 @@ void _PreCompressBuffer(nsString& aBuffer,PRInt32& anOffset,PRInt32& aMarkPos){
* @return error code
*/
PRBool CScanner::Append(nsString& aBuffer) {
_PreCompressBuffer(mBuffer,mOffset,mMarkPos);
mBuffer.Append(aBuffer);
mTotalRead+=aBuffer.Length();
return PR_TRUE;
@@ -192,7 +168,6 @@ PRBool CScanner::Append(nsString& aBuffer) {
* @return
*/
PRBool CScanner::Append(const char* aBuffer, PRInt32 aLen){
_PreCompressBuffer(mBuffer,mOffset,mMarkPos);
mBuffer.Append(aBuffer,aLen);
mTotalRead+=aLen;
return PR_TRUE;
@@ -207,8 +182,6 @@ PRBool CScanner::Append(const char* aBuffer, PRInt32 aLen){
nsresult CScanner::FillBuffer(void) {
nsresult anError=NS_OK;
_PreCompressBuffer(mBuffer,mOffset,mMarkPos);
if(!mFileStream) {
//This is DEBUG code!!!!!! XXX DEBUG XXX
//If you're here, it means someone tried to load a

View File

@@ -259,7 +259,6 @@ class CScanner {
nsString mBuffer;
nsString mFilename;
PRInt32 mOffset;
PRInt32 mMarkPos;
PRInt32 mTotalRead;
PRBool mOwnsStream;
PRBool mIncremental;