зеркало из https://github.com/mozilla/gecko-dev.git
added parse-system debugging hooks
This commit is contained in:
Родитель
808f265fa1
Коммит
2af9fb2e9f
|
@ -27,7 +27,8 @@
|
|||
#include "COtherDTD.h"
|
||||
#include "CNavDelegate.h"
|
||||
#include "CNavDTD.h"
|
||||
|
||||
#include "prenv.h" //this is here for debug reasons...
|
||||
#include <direct.h> //this is here for debug reasons...
|
||||
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
static NS_DEFINE_IID(kClassIID, NS_IHTML_PARSER_IID);
|
||||
|
@ -38,6 +39,7 @@ static const char* kNullTokenizer = "Error: Unable to construct tokenizer";
|
|||
static const char* kNullToken = "Error: Null token given";
|
||||
static const char* kInvalidTagStackPos = "Error: invalid tag stack position";
|
||||
|
||||
static char* gVerificationOutputDir=0;
|
||||
|
||||
/**
|
||||
* This method is defined in nsIParser. It is used to
|
||||
|
@ -97,6 +99,7 @@ nsHTMLParser::nsHTMLParser() {
|
|||
mDTD=0;
|
||||
mTokenHandlerCount=0;
|
||||
InitializeDefaultTokenHandlers();
|
||||
gVerificationOutputDir = PR_GetEnv("VERIFY_PARSER");
|
||||
}
|
||||
|
||||
|
||||
|
@ -321,19 +324,35 @@ nsIContentSink* nsHTMLParser::SetContentSink(nsIContentSink* aSink) {
|
|||
* @return TRUE if we know how to handle it, else false
|
||||
*/
|
||||
PRBool VerifyContextVector(eHTMLTags tags[],PRInt32 count,nsIDTD* aDTD) {
|
||||
PRBool result=PR_FALSE;
|
||||
if(aDTD){
|
||||
PRInt32 theArray[50];
|
||||
for(int i=0;i<count;i++){
|
||||
theArray[i]=tags[i];
|
||||
|
||||
PRBool result=PR_TRUE;
|
||||
|
||||
if(0!=gVerificationOutputDir) {
|
||||
|
||||
if(aDTD){
|
||||
PRInt32 theArray[50];
|
||||
char path[_MAX_PATH+1];
|
||||
|
||||
strcpy(path,gVerificationOutputDir);
|
||||
for(int i=0;i<count;i++){
|
||||
theArray[i]=tags[i];
|
||||
|
||||
#ifdef NS_WIN32
|
||||
strcat(path,"/");
|
||||
const char* name=GetTagName(tags[i]);
|
||||
strcat(path,name);
|
||||
mkdir(path);
|
||||
#endif
|
||||
}
|
||||
//ok, now see if we understand this vector
|
||||
result=aDTD->VerifyContextVector(theArray,count);
|
||||
}
|
||||
if(PR_FALSE==result){
|
||||
//add debugging code here to record the fact that we just encountered
|
||||
//a context vector we don't know how to handle.
|
||||
}
|
||||
//ok, now see if we understand this vector
|
||||
result=aDTD->VerifyContextVector(theArray,count);
|
||||
}
|
||||
if(PR_FALSE==result){
|
||||
//add debugging code here to record the fact that we just encountered
|
||||
//a context vector we don't know how to handle.
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -425,7 +444,14 @@ PRBool nsHTMLParser::IterateTokens() {
|
|||
* @return PR_TRUE if parse succeeded, PR_FALSE otherwise.
|
||||
*/
|
||||
PRBool nsHTMLParser::Parse(nsIURL* aURL){
|
||||
return Parse(aURL,eParseMode_navigator);
|
||||
eParseMode theMode=eParseMode_navigator;
|
||||
char* theModeStr= PR_GetEnv("PARSE_MODE");
|
||||
|
||||
if(theModeStr)
|
||||
if(0!=strnicmp("nav",theModeStr,3))
|
||||
theMode=eParseMode_other;
|
||||
|
||||
return Parse(aURL,theMode);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -108,6 +108,7 @@ struct HTMLTagEntry
|
|||
// the binary search code above will break!
|
||||
HTMLTagEntry gHTMLTagTable[] =
|
||||
{
|
||||
{"!!UNKNOWN", eHTMLTag_unknown},
|
||||
{"!DOCTYPE", eHTMLTag_doctype}, {"A", eHTMLTag_a},
|
||||
{"ACRONYM", eHTMLTag_acronym}, {"ADDRESS", eHTMLTag_address},
|
||||
{"APPLET", eHTMLTag_applet}, {"AREA", eHTMLTag_area},
|
||||
|
@ -139,7 +140,7 @@ HTMLTagEntry gHTMLTagTable[] =
|
|||
{"H5", eHTMLTag_h5}, {"H6", eHTMLTag_h6},
|
||||
{"HEAD", eHTMLTag_head}, {"HEADER", eHTMLTag_header},
|
||||
{"HR", eHTMLTag_hr}, {"HTML", eHTMLTag_html},
|
||||
|
||||
|
||||
{"I", eHTMLTag_italic}, {"IFRAME", eHTMLTag_iframe},
|
||||
{"ILAYER", eHTMLTag_ilayer}, {"IMG", eHTMLTag_img},
|
||||
{"INPUT", eHTMLTag_input}, {"INS", eHTMLTag_ins},
|
||||
|
@ -152,12 +153,14 @@ HTMLTagEntry gHTMLTagTable[] =
|
|||
{"LINK", eHTMLTag_link}, {"LISTING", eHTMLTag_listing},
|
||||
|
||||
{"MAP", eHTMLTag_map}, {"MARQUEE", eHTMLTag_marquee},
|
||||
{"MATH", eHTMLTag_math},
|
||||
{"MENU", eHTMLTag_menu}, {"META", eHTMLTag_meta},
|
||||
|
||||
{"NEWLINE", eHTMLTag_newline},
|
||||
|
||||
{"NOEMBED", eHTMLTag_noembed}, {"NOFRAMES", eHTMLTag_noframes},
|
||||
{"NOLAYER", eHTMLTag_nolayer}, {"NOSCRIPT", eHTMLTag_noscript},
|
||||
{"NOTE", eHTMLTag_note},
|
||||
|
||||
{"OBJECT", eHTMLTag_object}, {"OL", eHTMLTag_ol},
|
||||
{"OPTION", eHTMLTag_option},
|
||||
|
@ -182,12 +185,13 @@ HTMLTagEntry gHTMLTagTable[] =
|
|||
|
||||
{"TEXT", eHTMLTag_text},
|
||||
|
||||
{"TEXTAREA", eHTMLTag_textarea},
|
||||
{"TEXTAREA", eHTMLTag_textarea},
|
||||
{"TFOOT", eHTMLTag_tfoot}, {"TH", eHTMLTag_th},
|
||||
{"THEAD", eHTMLTag_thead}, {"TITLE", eHTMLTag_title},
|
||||
{"TR", eHTMLTag_tr}, {"TT", eHTMLTag_tt},
|
||||
|
||||
{"U", eHTMLTag_u}, {"UL", eHTMLTag_ul},
|
||||
{"USERDEF", eHTMLTag_userdefined},
|
||||
{"VAR", eHTMLTag_var}, {"WBR", eHTMLTag_wbr},
|
||||
{"WS", eHTMLTag_whitespace},
|
||||
|
||||
|
@ -1275,6 +1279,23 @@ eHTMLTags DetermineHTMLTagType(const nsString& aString)
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @update gess4/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
const char* GetTagName(eHTMLTags aTag) {
|
||||
const char* result=0;
|
||||
PRInt32 cnt=sizeof(gHTMLTagTable)/sizeof(HTMLTagEntry);
|
||||
|
||||
for(int i=0;i<cnt;i++){
|
||||
if(aTag==gHTMLTagTable[i].fTagID)
|
||||
return gHTMLTagTable[i].fName;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**-------------------------------------------------------
|
||||
* This method iterates the attribute-table to ensure that is
|
||||
* is proper sort order. This method only needs to be
|
||||
|
|
|
@ -83,13 +83,13 @@ enum eHTMLTags
|
|||
eHTMLTag_table, eHTMLTag_tbody, eHTMLTag_td,
|
||||
|
||||
eHTMLTag_text, //used for plain text; this is not really a tag.
|
||||
eHTMLTag_textarea,
|
||||
|
||||
eHTMLTag_tfoot,
|
||||
eHTMLTag_thead, eHTMLTag_th, eHTMLTag_tr, eHTMLTag_textarea,
|
||||
eHTMLTag_title, eHTMLTag_tt, eHTMLTag_monofont, eHTMLTag_u,
|
||||
eHTMLTag_ul, eHTMLTag_var, eHTMLTag_wbr, eHTMLTag_whitespace,
|
||||
eHTMLTag_xmp,
|
||||
eHTMLTag_userdefined
|
||||
eHTMLTag_th, eHTMLTag_thead, eHTMLTag_title, eHTMLTag_tr,
|
||||
eHTMLTag_tt, eHTMLTag_monofont, eHTMLTag_u, eHTMLTag_ul,
|
||||
eHTMLTag_var, eHTMLTag_wbr, eHTMLTag_whitespace,
|
||||
eHTMLTag_xmp, eHTMLTag_userdefined
|
||||
};
|
||||
|
||||
//*** This enum is used to define the known universe of HTML attributes.
|
||||
|
@ -113,6 +113,7 @@ PRInt32 ConsumeAttributeText(PRUnichar aChar,nsString& aString,CScanner&
|
|||
PRInt32 FindEntityIndex(const char* aBuffer,PRInt32 aBufLen=-1);
|
||||
eHTMLTags DetermineHTMLTagType(const nsString& aString);
|
||||
eHTMLTokenTypes DetermineTokenType(const nsString& aString);
|
||||
const char* GetTagName(eHTMLTags aTag);
|
||||
|
||||
|
||||
/** -----------------------------------------------------
|
||||
|
|
|
@ -27,7 +27,8 @@
|
|||
#include "COtherDTD.h"
|
||||
#include "CNavDelegate.h"
|
||||
#include "CNavDTD.h"
|
||||
|
||||
#include "prenv.h" //this is here for debug reasons...
|
||||
#include <direct.h> //this is here for debug reasons...
|
||||
|
||||
static NS_DEFINE_IID(kISupportsIID, NS_ISUPPORTS_IID);
|
||||
static NS_DEFINE_IID(kClassIID, NS_IHTML_PARSER_IID);
|
||||
|
@ -38,6 +39,7 @@ static const char* kNullTokenizer = "Error: Unable to construct tokenizer";
|
|||
static const char* kNullToken = "Error: Null token given";
|
||||
static const char* kInvalidTagStackPos = "Error: invalid tag stack position";
|
||||
|
||||
static char* gVerificationOutputDir=0;
|
||||
|
||||
/**
|
||||
* This method is defined in nsIParser. It is used to
|
||||
|
@ -97,6 +99,7 @@ nsHTMLParser::nsHTMLParser() {
|
|||
mDTD=0;
|
||||
mTokenHandlerCount=0;
|
||||
InitializeDefaultTokenHandlers();
|
||||
gVerificationOutputDir = PR_GetEnv("VERIFY_PARSER");
|
||||
}
|
||||
|
||||
|
||||
|
@ -321,19 +324,35 @@ nsIContentSink* nsHTMLParser::SetContentSink(nsIContentSink* aSink) {
|
|||
* @return TRUE if we know how to handle it, else false
|
||||
*/
|
||||
PRBool VerifyContextVector(eHTMLTags tags[],PRInt32 count,nsIDTD* aDTD) {
|
||||
PRBool result=PR_FALSE;
|
||||
if(aDTD){
|
||||
PRInt32 theArray[50];
|
||||
for(int i=0;i<count;i++){
|
||||
theArray[i]=tags[i];
|
||||
|
||||
PRBool result=PR_TRUE;
|
||||
|
||||
if(0!=gVerificationOutputDir) {
|
||||
|
||||
if(aDTD){
|
||||
PRInt32 theArray[50];
|
||||
char path[_MAX_PATH+1];
|
||||
|
||||
strcpy(path,gVerificationOutputDir);
|
||||
for(int i=0;i<count;i++){
|
||||
theArray[i]=tags[i];
|
||||
|
||||
#ifdef NS_WIN32
|
||||
strcat(path,"/");
|
||||
const char* name=GetTagName(tags[i]);
|
||||
strcat(path,name);
|
||||
mkdir(path);
|
||||
#endif
|
||||
}
|
||||
//ok, now see if we understand this vector
|
||||
result=aDTD->VerifyContextVector(theArray,count);
|
||||
}
|
||||
if(PR_FALSE==result){
|
||||
//add debugging code here to record the fact that we just encountered
|
||||
//a context vector we don't know how to handle.
|
||||
}
|
||||
//ok, now see if we understand this vector
|
||||
result=aDTD->VerifyContextVector(theArray,count);
|
||||
}
|
||||
if(PR_FALSE==result){
|
||||
//add debugging code here to record the fact that we just encountered
|
||||
//a context vector we don't know how to handle.
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -425,7 +444,14 @@ PRBool nsHTMLParser::IterateTokens() {
|
|||
* @return PR_TRUE if parse succeeded, PR_FALSE otherwise.
|
||||
*/
|
||||
PRBool nsHTMLParser::Parse(nsIURL* aURL){
|
||||
return Parse(aURL,eParseMode_navigator);
|
||||
eParseMode theMode=eParseMode_navigator;
|
||||
char* theModeStr= PR_GetEnv("PARSE_MODE");
|
||||
|
||||
if(theModeStr)
|
||||
if(0!=strnicmp("nav",theModeStr,3))
|
||||
theMode=eParseMode_other;
|
||||
|
||||
return Parse(aURL,theMode);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -108,6 +108,7 @@ struct HTMLTagEntry
|
|||
// the binary search code above will break!
|
||||
HTMLTagEntry gHTMLTagTable[] =
|
||||
{
|
||||
{"!!UNKNOWN", eHTMLTag_unknown},
|
||||
{"!DOCTYPE", eHTMLTag_doctype}, {"A", eHTMLTag_a},
|
||||
{"ACRONYM", eHTMLTag_acronym}, {"ADDRESS", eHTMLTag_address},
|
||||
{"APPLET", eHTMLTag_applet}, {"AREA", eHTMLTag_area},
|
||||
|
@ -139,7 +140,7 @@ HTMLTagEntry gHTMLTagTable[] =
|
|||
{"H5", eHTMLTag_h5}, {"H6", eHTMLTag_h6},
|
||||
{"HEAD", eHTMLTag_head}, {"HEADER", eHTMLTag_header},
|
||||
{"HR", eHTMLTag_hr}, {"HTML", eHTMLTag_html},
|
||||
|
||||
|
||||
{"I", eHTMLTag_italic}, {"IFRAME", eHTMLTag_iframe},
|
||||
{"ILAYER", eHTMLTag_ilayer}, {"IMG", eHTMLTag_img},
|
||||
{"INPUT", eHTMLTag_input}, {"INS", eHTMLTag_ins},
|
||||
|
@ -152,12 +153,14 @@ HTMLTagEntry gHTMLTagTable[] =
|
|||
{"LINK", eHTMLTag_link}, {"LISTING", eHTMLTag_listing},
|
||||
|
||||
{"MAP", eHTMLTag_map}, {"MARQUEE", eHTMLTag_marquee},
|
||||
{"MATH", eHTMLTag_math},
|
||||
{"MENU", eHTMLTag_menu}, {"META", eHTMLTag_meta},
|
||||
|
||||
{"NEWLINE", eHTMLTag_newline},
|
||||
|
||||
{"NOEMBED", eHTMLTag_noembed}, {"NOFRAMES", eHTMLTag_noframes},
|
||||
{"NOLAYER", eHTMLTag_nolayer}, {"NOSCRIPT", eHTMLTag_noscript},
|
||||
{"NOTE", eHTMLTag_note},
|
||||
|
||||
{"OBJECT", eHTMLTag_object}, {"OL", eHTMLTag_ol},
|
||||
{"OPTION", eHTMLTag_option},
|
||||
|
@ -182,12 +185,13 @@ HTMLTagEntry gHTMLTagTable[] =
|
|||
|
||||
{"TEXT", eHTMLTag_text},
|
||||
|
||||
{"TEXTAREA", eHTMLTag_textarea},
|
||||
{"TEXTAREA", eHTMLTag_textarea},
|
||||
{"TFOOT", eHTMLTag_tfoot}, {"TH", eHTMLTag_th},
|
||||
{"THEAD", eHTMLTag_thead}, {"TITLE", eHTMLTag_title},
|
||||
{"TR", eHTMLTag_tr}, {"TT", eHTMLTag_tt},
|
||||
|
||||
{"U", eHTMLTag_u}, {"UL", eHTMLTag_ul},
|
||||
{"USERDEF", eHTMLTag_userdefined},
|
||||
{"VAR", eHTMLTag_var}, {"WBR", eHTMLTag_wbr},
|
||||
{"WS", eHTMLTag_whitespace},
|
||||
|
||||
|
@ -1275,6 +1279,23 @@ eHTMLTags DetermineHTMLTagType(const nsString& aString)
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
*
|
||||
* @update gess4/25/98
|
||||
* @param
|
||||
* @return
|
||||
*/
|
||||
const char* GetTagName(eHTMLTags aTag) {
|
||||
const char* result=0;
|
||||
PRInt32 cnt=sizeof(gHTMLTagTable)/sizeof(HTMLTagEntry);
|
||||
|
||||
for(int i=0;i<cnt;i++){
|
||||
if(aTag==gHTMLTagTable[i].fTagID)
|
||||
return gHTMLTagTable[i].fName;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
/**-------------------------------------------------------
|
||||
* This method iterates the attribute-table to ensure that is
|
||||
* is proper sort order. This method only needs to be
|
||||
|
|
|
@ -83,13 +83,13 @@ enum eHTMLTags
|
|||
eHTMLTag_table, eHTMLTag_tbody, eHTMLTag_td,
|
||||
|
||||
eHTMLTag_text, //used for plain text; this is not really a tag.
|
||||
eHTMLTag_textarea,
|
||||
|
||||
eHTMLTag_tfoot,
|
||||
eHTMLTag_thead, eHTMLTag_th, eHTMLTag_tr, eHTMLTag_textarea,
|
||||
eHTMLTag_title, eHTMLTag_tt, eHTMLTag_monofont, eHTMLTag_u,
|
||||
eHTMLTag_ul, eHTMLTag_var, eHTMLTag_wbr, eHTMLTag_whitespace,
|
||||
eHTMLTag_xmp,
|
||||
eHTMLTag_userdefined
|
||||
eHTMLTag_th, eHTMLTag_thead, eHTMLTag_title, eHTMLTag_tr,
|
||||
eHTMLTag_tt, eHTMLTag_monofont, eHTMLTag_u, eHTMLTag_ul,
|
||||
eHTMLTag_var, eHTMLTag_wbr, eHTMLTag_whitespace,
|
||||
eHTMLTag_xmp, eHTMLTag_userdefined
|
||||
};
|
||||
|
||||
//*** This enum is used to define the known universe of HTML attributes.
|
||||
|
@ -113,6 +113,7 @@ PRInt32 ConsumeAttributeText(PRUnichar aChar,nsString& aString,CScanner&
|
|||
PRInt32 FindEntityIndex(const char* aBuffer,PRInt32 aBufLen=-1);
|
||||
eHTMLTags DetermineHTMLTagType(const nsString& aString);
|
||||
eHTMLTokenTypes DetermineTokenType(const nsString& aString);
|
||||
const char* GetTagName(eHTMLTags aTag);
|
||||
|
||||
|
||||
/** -----------------------------------------------------
|
||||
|
|
Загрузка…
Ссылка в новой задаче