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:
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user