diff --git a/mozilla/htmlparser/robot/nsRobotSink.cpp b/mozilla/htmlparser/robot/nsRobotSink.cpp
index 0ebf4280ef1..1b0d6ebd512 100644
--- a/mozilla/htmlparser/robot/nsRobotSink.cpp
+++ b/mozilla/htmlparser/robot/nsRobotSink.cpp
@@ -226,9 +226,8 @@ NS_IMETHODIMP RobotSink::OpenContainer(const nsIParserNode& aNode)
PRInt32 ac = aNode.GetAttributeCount();
for (PRInt32 i = 0; i < ac; i++) {
// Get upper-cased key
- const nsString& key = aNode.GetKeyAt(i);
- k.Truncate();
- k.Append(key);
+ const nsAReadableString& key = aNode.GetKeyAt(i);
+ k.Assign(key);
k.ToLowerCase();
if (k.EqualsWithConversion("href")) {
// Get value and remove mandatory quotes
diff --git a/mozilla/htmlparser/src/CNavDTD.cpp b/mozilla/htmlparser/src/CNavDTD.cpp
index 101fce2d5a6..eb034927890 100644
--- a/mozilla/htmlparser/src/CNavDTD.cpp
+++ b/mozilla/htmlparser/src/CNavDTD.cpp
@@ -52,6 +52,7 @@
#include "nsLinebreakConverter.h"
#include "nsIFormProcessor.h"
#include "nsVoidArray.h"
+#include "nsReadableUtils.h"
#include "prmem.h"
@@ -164,10 +165,6 @@ CNavDTD::CNavDTD() : nsIDTD(),
mHeadContext=new nsDTDContext();
mBodyContext=new nsDTDContext();
- if(!gHTMLElements) {
- InitializeElementTable();
- }
-
mNodeRecycler=0;
#ifdef RICKG_DEBUG
@@ -178,13 +175,6 @@ CNavDTD::CNavDTD() : nsIDTD(),
#endif
}
-void CNavDTD::ReleaseTable(void) {
- if(gHTMLElements) {
- delete [] gHTMLElements; //fixed bug 49564
- gHTMLElements=0;
- }
-}
-
/**
* This method recycles the nodes on a nodestack.
* NOTE: Unlike recycleNode(), we force the usecount
@@ -347,7 +337,7 @@ eAutoDetectResult CNavDTD::CanParse(CParserContext& aParserContext,nsString& aBu
if(BufferContainsHTML(aBuffer,theBufHasXML)){
result = eValidDetect ;
if(0==aParserContext.mMimeType.Length()) {
- aParserContext.SetMimeType(NS_ConvertToString(kHTMLTextContentType));
+ aParserContext.SetMimeType(NS_ConvertASCIItoUCS2(kHTMLTextContentType, sizeof(kHTMLTextContentType)));
if(!theBufHasXML) {
switch(aParserContext.mDTDMode) {
case eDTDMode_strict:
@@ -455,13 +445,13 @@ nsresult CNavDTD::BuildModel(nsIParser* aParser,nsITokenizer* aTokenizer,nsIToke
CStartToken* theToken=nsnull;
if(ePlainText==mDocType) {
//we do this little trick for text files, in both normal and viewsource mode...
- theToken=(CStartToken*)mTokenAllocator->CreateTokenOfType(eToken_start,eHTMLTag_pre);
+ theToken=NS_STATIC_CAST(CStartToken*,mTokenAllocator->CreateTokenOfType(eToken_start,eHTMLTag_pre));
if(theToken) {
mTokenizer->PushTokenFront(theToken);
}
}
//if the content model is empty, then begin by opening ...
- theToken=(CStartToken*)mTokenAllocator->CreateTokenOfType(eToken_start,eHTMLTag_html,NS_ConvertToString("html"));
+ theToken=NS_STATIC_CAST(CStartToken*,mTokenAllocator->CreateTokenOfType(eToken_start,eHTMLTag_html,NS_ConvertToString("html")));
if(theToken) {
mTokenizer->PushTokenFront(theToken); //this token should get pushed on the context stack.
}
@@ -514,7 +504,7 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse
mSkipTarget=eHTMLTag_unknown; //clear this in case we were searching earlier.
- CStartToken *theToken=(CStartToken*)mTokenAllocator->CreateTokenOfType(eToken_start,eHTMLTag_body,NS_ConvertToString("body"));
+ CStartToken *theToken=NS_STATIC_CAST(CStartToken*,mTokenAllocator->CreateTokenOfType(eToken_start,eHTMLTag_body,NS_ConvertToString("body")));
mTokenizer->PushTokenFront(theToken); //this token should get pushed on the context stack, don't recycle it
result=BuildModel(aParser,mTokenizer,0,aSink);
}
@@ -524,7 +514,7 @@ nsresult CNavDTD::DidBuildModel(nsresult anErrorCode,PRBool aNotifySink,nsIParse
if((NS_OK==anErrorCode) && (mBodyContext->GetCount()>0)) {
if(mSkipTarget) {
CHTMLToken* theEndToken=nsnull;
- theEndToken=(CHTMLToken*)mTokenAllocator->CreateTokenOfType(eToken_end,mSkipTarget);
+ theEndToken=NS_STATIC_CAST(CHTMLToken*,mTokenAllocator->CreateTokenOfType(eToken_end,mSkipTarget));
if(theEndToken) {
result=HandleToken(theEndToken,mParser);
}
@@ -629,7 +619,7 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
nsresult result=NS_OK;
if(aToken) {
- CHTMLToken* theToken= (CHTMLToken*)(aToken);
+ CHTMLToken* theToken= NS_STATIC_CAST(CHTMLToken*, aToken);
eHTMLTokenTypes theType=eHTMLTokenTypes(theToken->GetTokenType());
eHTMLTags theTag=(eHTMLTags)theToken->GetTypeID();
PRBool execSkipContent=PR_FALSE;
@@ -723,7 +713,7 @@ nsresult CNavDTD::HandleToken(CToken* aToken,nsIParser* aParser){
//However, in quirks mode, a few tags request, ambiguosly, for a BODY. - Bugs 18928, 24204.-
mMisplacedContent.Push(aToken);
if(mDTDMode==eDTDMode_quirks && (gHTMLElements[theTag].HasSpecialProperty(kRequiresBody))) {
- CToken* theBodyToken=(CToken*)mTokenAllocator->CreateTokenOfType(eToken_start,eHTMLTag_body,NS_ConvertToString("body"));
+ CToken* theBodyToken=NS_STATIC_CAST(CToken*,mTokenAllocator->CreateTokenOfType(eToken_start,eHTMLTag_body,NS_ConvertToString("body")));
result=HandleToken(theBodyToken,aParser);
}
return result;
@@ -856,9 +846,10 @@ nsresult CNavDTD::DidHandleStartTag(nsCParserNode& aNode,eHTMLTags aChildTag){
MOZ_TIMER_DEBUGLOG(("Stop: Parse Time: CNavDTD::DidHandleStartTag(), this=%p\n", this));
const nsString& theString=aNode.GetSkippedContent();
if(0CreateTokenOfType(eToken_text,eHTMLTag_text,theString);
+ CTextToken *theToken=NS_STATIC_CAST(CTextToken*,mTokenAllocator->CreateTokenOfType(eToken_text,eHTMLTag_text,theString));
nsCParserNode theNode(theToken,0);
- result=mSink->AddLeaf(theNode); //when the node get's destructed, so does the new token
+ result=mSink->AddLeaf(theNode);
+ IF_FREE(theToken);
}
MOZ_TIMER_DEBUGLOG(("Start: Parse Time: CNavDTD::DidHandleStartTag(), this=%p\n", this));
START_TIMER()
@@ -892,7 +883,7 @@ nsresult CNavDTD::DidHandleStartTag(nsCParserNode& aNode,eHTMLTags aChildTag){
if(theCount) {
PRInt32 theIndex=0;
for(theIndex=0;theIndexCreateTokenOfType(eToken_attribute,aTag);
+ CAttributeToken* theToken= NS_STATIC_CAST(CAttributeToken*,mTokenAllocator->CreateTokenOfType(eToken_attribute,aTag));
if(theToken) {
- theToken->mTextKey.AssignWithConversion("_moz-userdefined");
+ theToken->SetKey(NS_LITERAL_STRING("_moz-userdefined"));
aNode.AddAttribute(theToken);
}
}
@@ -1266,7 +1257,7 @@ nsresult CNavDTD::WillHandleStartTag(CToken* aToken,eHTMLTags aTag,nsCParserNode
CObserverService* theService=mParser->GetObserverService();
if(theService) {
const nsISupportsParserBundle* bundle=mParser->GetParserBundle();
- result=theService->Notify(aTag,aNode,(void*)bundle, NS_ConvertToString(kHTMLTextContentType), mParser);
+ result=theService->Notify(aTag,aNode,(void*)bundle, mMimeType, mParser);
}
}
@@ -1283,11 +1274,11 @@ nsresult CNavDTD::WillHandleStartTag(CToken* aToken,eHTMLTags aTag,nsCParserNode
PRInt32 theCount=aNode.GetAttributeCount();
if(1CreateTokenOfType(eToken_attribute,eHTMLTag_unknown,theAttribute);
- nsString& theKey=((CAttributeToken*)theToken)->GetKey();
- theKey.AssignWithConversion("_moz-type");
+ ((CAttributeToken*)theToken)->SetKey(NS_LITERAL_STRING("_moz-type"));
mTokenizer->PushTokenFront(theToken);
// Pop out NAME and CHALLENGE attributes ( from the keygen NODE )
@@ -1837,7 +1827,7 @@ nsresult CNavDTD::HandleEndToken(CToken* aToken) {
//to use , even though that isn't a legitimate tag.
if(eDTDMode_quirks==mDTDMode) {
// Use recycler and pass the token thro' HandleToken() to fix bugs like 32782.
- CHTMLToken* theToken = (CHTMLToken*)mTokenAllocator->CreateTokenOfType(eToken_start,theChildTag);
+ CHTMLToken* theToken = NS_STATIC_CAST(CHTMLToken*,mTokenAllocator->CreateTokenOfType(eToken_start,theChildTag));
result=HandleToken(theToken,mParser);
}
}
@@ -1888,7 +1878,7 @@ nsresult CNavDTD::HandleEndToken(CToken* aToken) {
if(!CanOmit(theParentTag,theChildTag,theParentContains)) {
IF_HOLD(aToken);
mTokenizer->PushTokenFront(aToken); //put this end token back...
- CHTMLToken* theToken = (CHTMLToken*)mTokenAllocator->CreateTokenOfType(eToken_start,theChildTag);
+ CHTMLToken* theToken = NS_STATIC_CAST(CHTMLToken*,mTokenAllocator->CreateTokenOfType(eToken_start,theChildTag));
mTokenizer->PushTokenFront(theToken); //put this new token onto stack...
}
}
@@ -2025,7 +2015,7 @@ nsresult CNavDTD::HandleEntityToken(CToken* aToken) {
nsresult result=NS_OK;
- nsString& theStr=aToken->GetStringValueXXX();
+ nsAutoString theStr(aToken->GetStringValue());
PRUnichar theChar=theStr.CharAt(0);
if((kHashsign!=theChar) && (-1==nsHTMLEntities::EntityToUnicode(theStr))){
@@ -2033,16 +2023,15 @@ nsresult CNavDTD::HandleEntityToken(CToken* aToken) {
CNamedEntity *theEntity=mBodyContext->GetEntity(theStr);
CToken *theToken=0;
if(theEntity) {
- theToken=(CTextToken*)mTokenAllocator->CreateTokenOfType(eToken_text,eHTMLTag_text,theEntity->mValue);
+ theToken=NS_STATIC_CAST(CTextToken*,mTokenAllocator->CreateTokenOfType(eToken_text,eHTMLTag_text,theEntity->mValue));
}
else {
//if you're here we have a bogus entity.
//convert it into a text token.
- theToken=(CTextToken*)mTokenAllocator->CreateTokenOfType(eToken_text,eHTMLTag_text,NS_ConvertToString("&"));
- if(theToken) {
- nsString &theTokenStr=theToken->GetStringValueXXX();
- theTokenStr.Append(theStr); //should append the entity name; fix bug 51161.
- }
+ nsAutoString entityName;
+ entityName.AssignWithConversion("&");
+ entityName.Append(theStr); //should append the entity name; fix bug 51161.
+ theToken = mTokenAllocator->CreateTokenOfType(eToken_text,eHTMLTag_text,entityName);
}
return HandleToken(theToken,mParser); //theToken should get recycled automagically...
}
@@ -2084,8 +2073,9 @@ nsresult CNavDTD::HandleCommentToken(CToken* aToken) {
nsresult result=NS_OK;
- nsString& theComment=aToken->GetStringValueXXX();
- mLineNumber += (theComment).CountChar(kNewLine);
+ CCommentToken* theToken = NS_STATIC_CAST(CCommentToken*,aToken);
+ const nsAReadableString& theComment = theToken->GetStringValue();
+ mLineNumber += CountCharInReadable(theComment, PRUnichar(kNewLine));
nsCParserNode* theNode=mNodeRecycler->CreateNode();
if(theNode) {
@@ -2203,8 +2193,9 @@ nsresult CNavDTD::HandleDocTypeDeclToken(CToken* aToken){
WriteTokenToLog(aToken);
#endif
- nsString& docTypeStr=aToken->GetStringValueXXX();
- mLineNumber += (docTypeStr).CountChar(kNewLine);
+ CDoctypeDeclToken* theToken = NS_STATIC_CAST(CDoctypeDeclToken*,aToken);
+ nsAutoString docTypeStr(theToken->GetStringValue());
+ mLineNumber += docTypeStr.CountChar(kNewLine);
PRInt32 len=docTypeStr.Length();
PRInt32 pos=docTypeStr.RFindChar(kGreaterThan);
@@ -2212,6 +2203,7 @@ nsresult CNavDTD::HandleDocTypeDeclToken(CToken* aToken){
docTypeStr.Cut(pos,len-pos);// First remove '>' from the end.
}
docTypeStr.Cut(0,2); // Now remove "SetStringValue(docTypeStr);
nsCParserNode* theNode=mNodeRecycler->CreateNode();
if(theNode) {
@@ -2265,7 +2257,7 @@ nsresult CNavDTD::CollectAttributes(nsCParserNode& aNode,eHTMLTags aTag,PRInt32
eHTMLTags theSkipTarget=gHTMLElements[aTag].mSkipTarget;
for(attr=0;attrPopToken();
if(theToken) {
eHTMLTokenTypes theType=eHTMLTokenTypes(theToken->GetTokenType());
diff --git a/mozilla/htmlparser/src/CNavDTD.h b/mozilla/htmlparser/src/CNavDTD.h
index 0e8a8d069ca..e9cfd65f7c6 100644
--- a/mozilla/htmlparser/src/CNavDTD.h
+++ b/mozilla/htmlparser/src/CNavDTD.h
@@ -481,7 +481,6 @@ CLASS_EXPORT_HTMLPARS CNavDTD : public nsIDTD {
nsresult DoFragment(PRBool aFlag);
- static void ReleaseTable(void);
protected:
diff --git a/mozilla/htmlparser/src/COtherDTD.cpp b/mozilla/htmlparser/src/COtherDTD.cpp
index 8a5bd5cf7ef..9b2f7bcd696 100644
--- a/mozilla/htmlparser/src/COtherDTD.cpp
+++ b/mozilla/htmlparser/src/COtherDTD.cpp
@@ -174,13 +174,6 @@ COtherDTD::COtherDTD() : nsIDTD(), mSharedNodes(0) {
#endif
}
-void COtherDTD::ReleaseTable(void) {
- if(gElementTable) {
- delete gElementTable;
- gElementTable=0;
- }
-}
-
/**
* This method creates a new parser node. It tries to get one from
* the recycle list before allocating a new one.
@@ -647,7 +640,7 @@ nsresult COtherDTD::DidHandleStartTag(nsCParserNode& aNode,eHTMLTags aChildTag){
if(theCount) {
PRInt32 theIndex=0;
for(theIndex=0;theIndexGetStringValueXXX();
+ nsAutoString theStr;
+ aToken->GetSource(theStr);
PRUnichar theChar=theStr.CharAt(0);
CToken *theToken=0;
@@ -916,8 +910,10 @@ nsresult COtherDTD::HandleEntityToken(CToken* aToken) {
else {
//if you're here we have a bogus entity.
//convert it into a text token.
- theToken=(CTextToken*)mTokenAllocator->CreateTokenOfType(eToken_text,eHTMLTag_text,NS_ConvertToString("&"));
-
+ nsAutoString entityName;
+ entityName.AssignWithConversion("&");
+ entityName.Append(theStr); //should append the entity name; fix bug 51161.
+ theToken=(CTextToken*)mTokenAllocator->CreateTokenOfType(eToken_text,eHTMLTag_text,entityName);
}
result=HandleStartToken(theToken);
}
diff --git a/mozilla/htmlparser/src/COtherDTD.h b/mozilla/htmlparser/src/COtherDTD.h
index 6297bdd6380..d2fd78f245e 100644
--- a/mozilla/htmlparser/src/COtherDTD.h
+++ b/mozilla/htmlparser/src/COtherDTD.h
@@ -311,8 +311,6 @@ CLASS_EXPORT_HTMLPARS COtherDTD : public nsIDTD {
//by the parser to manage its context-stack.
//*************************************************
- static void ReleaseTable(void);
-
protected:
nsresult CollectAttributes(nsCParserNode& aNode,eHTMLTags aTag,PRInt32 aCount);
@@ -356,6 +354,7 @@ protected:
extern NS_HTMLPARS nsresult NS_NewOtherHTMLDTD(nsIDTD** aInstancePtrResult);
+
CLASS_EXPORT_HTMLPARS CTransitionalDTD : public COtherDTD
{
public:
diff --git a/mozilla/htmlparser/src/COtherElements.h b/mozilla/htmlparser/src/COtherElements.h
index 8f542b343a7..6f261ba8817 100644
--- a/mozilla/htmlparser/src/COtherElements.h
+++ b/mozilla/htmlparser/src/COtherElements.h
@@ -1715,7 +1715,7 @@ public:
nsCParserNode *theNode=(nsCParserNode*)aNode;
nsresult result=NS_OK;
if(theNode) {
- nsString theStr=theNode->mToken->GetStringValueXXX();
+ nsAutoString theStr(theNode->mToken->GetStringValue());
PRInt32 theLen=theStr.Length();
//PRInt32 thePos=theStr.RFindChar(kGreaterThan);
diff --git a/mozilla/htmlparser/src/Makefile.in b/mozilla/htmlparser/src/Makefile.in
index 97c9856e15c..933d6d5766f 100644
--- a/mozilla/htmlparser/src/Makefile.in
+++ b/mozilla/htmlparser/src/Makefile.in
@@ -60,7 +60,6 @@ CPPSRCS = \
nsElementTable.cpp \
CNavDTD.cpp \
COtherDTD.cpp \
- CRtfDTD.cpp \
nsHTMLEntities.cpp \
nsHTMLNullSink.cpp \
nsHTMLTags.cpp \
@@ -78,7 +77,6 @@ CPPSRCS = \
nsValidDTD.cpp \
nsWellFormedDTD.cpp \
nsViewSourceHTML.cpp \
- nsXIFDTD.cpp \
nsExpatDTD.cpp \
$(NULL)
@@ -117,8 +115,6 @@ EXPORTS = \
COtherDTD.h \
nsWellFormedDTD.h \
nsValidDTD.h \
- CRtfDTD.h \
- nsXIFDTD.h \
nsParserCIID.h \
nsExpatDTD.h \
nsParserError.h \
diff --git a/mozilla/htmlparser/src/makefile.win b/mozilla/htmlparser/src/makefile.win
index fdedcd06545..1546be84bfa 100644
--- a/mozilla/htmlparser/src/makefile.win
+++ b/mozilla/htmlparser/src/makefile.win
@@ -37,7 +37,6 @@ CPPSRCS= \
nsElementTable.cpp \
CNavDTD.cpp \
COtherDTD.cpp \
- CRtfDTD.cpp \
nsDTDDebug.cpp \
nsHTMLEntities.cpp \
nsHTMLNullSink.cpp \
@@ -55,11 +54,9 @@ CPPSRCS= \
nsValidDTD.cpp \
nsWellFormedDTD.cpp \
nsViewSourceHTML.cpp \
- nsXIFDTD.cpp \
nsExpatDTD.cpp \
prstrm.cpp \
nsParserModule.cpp \
- nsXIFDTD.cpp \
$(NULL)
CPP_OBJS= \
@@ -70,7 +67,6 @@ CPP_OBJS= \
.\$(OBJDIR)\nsElementTable.obj \
.\$(OBJDIR)\CNavDTD.obj \
.\$(OBJDIR)\COtherDTD.obj \
- .\$(OBJDIR)\CRtfDTD.obj \
.\$(OBJDIR)\nsDTDDebug.obj \
.\$(OBJDIR)\nsHTMLEntities.obj \
.\$(OBJDIR)\nsHTMLNullSink.obj \
@@ -88,11 +84,9 @@ CPP_OBJS= \
.\$(OBJDIR)\nsValidDTD.obj \
.\$(OBJDIR)\nsWellFormedDTD.obj \
.\$(OBJDIR)\nsViewSourceHTML.obj \
- .\$(OBJDIR)\nsXIFDTD.obj \
.\$(OBJDIR)\nsExpatDTD.obj \
.\$(OBJDIR)\prstrm.obj \
.\$(OBJDIR)\nsParserModule.obj \
- .\$(OBJDIR)\nsXIFDTD.obj \
$(NULL)
EXPORTS= \
@@ -119,10 +113,8 @@ EXPORTS= \
CNavDTD.h \
nsWellFormedDTD.h \
nsValidDTD.h \
- CRTFDTD.h \
COtherDTD.h \
nsIDTD.h \
- nsXIFDTD.h \
nsExpatDTD.h \
nsParserCIID.h \
nsParserError.h \
diff --git a/mozilla/htmlparser/src/nsDTDUtils.cpp b/mozilla/htmlparser/src/nsDTDUtils.cpp
index 65d73a01952..bba36f66711 100644
--- a/mozilla/htmlparser/src/nsDTDUtils.cpp
+++ b/mozilla/htmlparser/src/nsDTDUtils.cpp
@@ -802,7 +802,7 @@ PRInt32 nsDTDContext::IncrementCounter(eHTMLTags aTag,nsCParserNode& aNode,nsStr
CAbacus::eNumFormat theNumFormat=CAbacus::eDecimal;
for(theIndex=0;theIndexAddRef(); }
#define IF_FREE(_ptr) if(_ptr) { _ptr->Release(); _ptr=0; } // recycles _ptr
@@ -226,9 +225,8 @@ public:
nsTokenAllocator();
virtual ~nsTokenAllocator();
- virtual CToken* CreateTokenOfType(eHTMLTokenTypes aType,eHTMLTags aTag, const nsString& aString);
+ virtual CToken* CreateTokenOfType(eHTMLTokenTypes aType,eHTMLTags aTag, const nsAReadableString& aString);
virtual CToken* CreateTokenOfType(eHTMLTokenTypes aType,eHTMLTags aTag);
- virtual CToken* CreateRTFTokenOfType(eRTFTokenTypes aType,eRTFTags aTag);
protected:
nsFixedSizeAllocator mArenaPool;
diff --git a/mozilla/htmlparser/src/nsElementTable.cpp b/mozilla/htmlparser/src/nsElementTable.cpp
index f9d081bf74f..21bd12e240c 100644
--- a/mozilla/htmlparser/src/nsElementTable.cpp
+++ b/mozilla/htmlparser/src/nsElementTable.cpp
@@ -1307,6 +1307,14 @@ void InitializeElementTable(void) {
}//if
};
+void DeleteElementTable(void)
+{
+ if(gHTMLElements) {
+ delete [] gHTMLElements; //fixed bug 49564
+ gHTMLElements=0;
+ }
+}
+
int nsHTMLElement::GetSynonymousGroups(eHTMLTags aTag) {
int result=0;
diff --git a/mozilla/htmlparser/src/nsElementTable.h b/mozilla/htmlparser/src/nsElementTable.h
index 23e16a3675c..6c77d16aa24 100644
--- a/mozilla/htmlparser/src/nsElementTable.h
+++ b/mozilla/htmlparser/src/nsElementTable.h
@@ -78,7 +78,7 @@ static const int kAllTags = 0xffffff;
extern void InitializeElementTable(void);
-
+extern void DeleteElementTable(void);
/**
* We're asking the question: is aTest a member of bitset.
diff --git a/mozilla/htmlparser/src/nsExpatTokenizer.cpp b/mozilla/htmlparser/src/nsExpatTokenizer.cpp
index b5d32e0c713..99e8b53aa88 100644
--- a/mozilla/htmlparser/src/nsExpatTokenizer.cpp
+++ b/mozilla/htmlparser/src/nsExpatTokenizer.cpp
@@ -44,10 +44,16 @@
typedef struct _XMLParserState {
XML_Parser parser;
+ nsScanner* scanner;
+ const PRUnichar* bufferStart;
+ const PRUnichar* bufferEnd;
+ nsReadingIterator currentIterator;
nsDeque* tokenDeque;
nsTokenAllocator* tokenAllocator;
- CToken* doctypeToken;
- CToken* cdataToken; // Used by the begin and end handlers of the cdata section
+ nsString doctypeText;
+ PRBool indoctype;
+ nsString cdataText;
+ PRBool incdata;
} XMLParserState;
/************************************************************************
@@ -176,10 +182,10 @@ nsExpatTokenizer::nsExpatTokenizer(nsString* aURL) : nsHTMLTokenizer() {
mBytesParsed = 0;
mState = new XMLParserState;
mState->tokenAllocator = nsnull;
- mState->cdataToken = nsnull;
mState->parser = nsnull;
mState->tokenDeque = nsnull;
- mState->doctypeToken = nsnull;
+ mState->indoctype = PR_FALSE;
+ mState->incdata = PR_FALSE;
nsAutoString buffer; buffer.AssignWithConversion("UTF-16");
const PRUnichar* encoding = buffer.GetUnicode();
@@ -341,18 +347,15 @@ nsExpatTokenizer::AddErrorMessageTokens(nsParserError* aError)
AddToken(newToken, NS_OK, mState->tokenDeque, mState->tokenAllocator);
CAttributeToken* attrToken = (CAttributeToken*)
- mState->tokenAllocator->CreateTokenOfType(eToken_attribute, eHTMLTag_unknown);
- nsString& key = attrToken->GetKey();
- key.AssignWithConversion("xmlns");
- attrToken->SetCStringValue(kHTMLNameSpaceURI);
+ mState->tokenAllocator->CreateTokenOfType(eToken_attribute, eHTMLTag_unknown, NS_ConvertASCIItoUCS2(kHTMLNameSpaceURI));
+ attrToken->SetKey(NS_LITERAL_STRING("xmlns"));
newToken->SetAttributeCount(1);
newToken = (CToken*) attrToken;
AddToken(newToken, NS_OK, mState->tokenDeque, mState->tokenAllocator);
nsAutoString textStr;
CreateErrorText(aError, textStr);
- newToken = mState->tokenAllocator->CreateTokenOfType(eToken_text, eHTMLTag_unknown);
- newToken->SetStringValue(textStr);
+ newToken = mState->tokenAllocator->CreateTokenOfType(eToken_text, eHTMLTag_unknown, textStr);
AddToken(newToken, NS_OK, mState->tokenDeque, mState->tokenAllocator);
newToken = mState->tokenAllocator->CreateTokenOfType(eToken_start, eHTMLTag_sourcetext);
@@ -360,8 +363,7 @@ nsExpatTokenizer::AddErrorMessageTokens(nsParserError* aError)
textStr.Truncate();
CreateSourceText(aError, textStr);
- newToken = mState->tokenAllocator->CreateTokenOfType(eToken_text, eHTMLTag_unknown);
- newToken->SetStringValue(textStr);
+ newToken = mState->tokenAllocator->CreateTokenOfType(eToken_text, eHTMLTag_unknown,textStr);
AddToken(newToken, NS_OK, mState->tokenDeque, mState->tokenAllocator);
newToken = mState->tokenAllocator->CreateTokenOfType(eToken_end, eHTMLTag_sourcetext);
@@ -470,19 +472,35 @@ nsresult nsExpatTokenizer::ConsumeToken(nsScanner& aScanner,PRBool& aFlushTokens
// Ask the scanner to send us all the data it has
// scanned and pass that data to expat.
nsresult result = NS_OK;
- nsString& theBuffer = aScanner.GetBuffer();
- PRUint32 bufLength = theBuffer.Length() * sizeof(PRUnichar);
- const PRUnichar* expatBuffer = (bufLength) ? theBuffer.GetUnicode() : nsnull;
-
+ nsReadingIterator start, end;
+ aScanner.CurrentPosition(start);
+ aScanner.EndReading(end);
mState->tokenDeque = &mTokenDeque;
mState->parser = mExpatParser;
+ mState->scanner = &aScanner;
- result = ParseXMLBuffer((const char *)expatBuffer, bufLength);
-
- theBuffer.Truncate(0);
+ while (start != end) {
+ PRUint32 fragLength = PRUint32(start.size_forward());
+ PRUint32 bufLength = fragLength * sizeof(PRUnichar);
+ const PRUnichar* expatBuffer = start.get();
+
+ mState->bufferStart = expatBuffer;
+ mState->bufferEnd = expatBuffer + fragLength;
+ mState->currentIterator = start;
+ result = ParseXMLBuffer((const char *)expatBuffer, bufLength);
+ if (NS_FAILED(result)) return result;
+
+ start.advance(fragLength);
+ }
+
+ aScanner.SetPosition(end, PR_TRUE);
if(NS_OK==result)
result=aScanner.Eof();
+
+ mState->scanner = nsnull;
+ mState->bufferStart = mState->bufferEnd = nsnull;
+
return result;
}
@@ -506,7 +524,7 @@ void nsExpatTokenizer::FrontloadMisplacedContent(nsDeque& aDeque){
void nsExpatTokenizer::HandleStartElement(void *userData, const XML_Char *name, const XML_Char **atts) {
XMLParserState* state = (XMLParserState*) userData;
- CToken* theToken = state->tokenAllocator->CreateTokenOfType(eToken_start,eHTMLTag_unknown);
+ CToken* theToken = state->tokenAllocator->CreateTokenOfType(eToken_start,eHTMLTag_unknown, nsLiteralString((PRUnichar*)name));
if(theToken) {
// If an ID attribute exists for this element, set it on the start token
PRInt32 index = XML_GetIdAttributeIndex(state->parser);
@@ -516,9 +534,6 @@ void nsExpatTokenizer::HandleStartElement(void *userData, const XML_Char *name,
startToken->SetIDAttributeAtom(attributeAtom);
}
- // Set the element name on the start token and add the token to the token queue
- nsString& theString=theToken->GetStringValueXXX();
- theString.Assign((PRUnichar *) name);
AddToken(theToken, NS_OK, state->tokenDeque, state->tokenAllocator);
// For each attribute on this element, create and add attribute tokens to the token queue
@@ -526,15 +541,25 @@ void nsExpatTokenizer::HandleStartElement(void *userData, const XML_Char *name,
while(*atts){
theAttrCount++;
CAttributeToken* theAttrToken = (CAttributeToken*)
- state->tokenAllocator->CreateTokenOfType(eToken_attribute, eHTMLTag_unknown);
+ state->tokenAllocator->CreateTokenOfType(eToken_attribute, eHTMLTag_unknown, nsLiteralString((PRUnichar*)atts[1]));
if(theAttrToken){
- nsString& theKey=theAttrToken->GetKey();
- theKey.Assign((PRUnichar *) (*atts++));
- nsString& theValue=theAttrToken->GetStringValueXXX();
- theValue.Assign((PRUnichar *) (*atts++));
+ PRUnichar* ptr = (PRUnichar*)atts[0];
+ if ((ptr >= state->bufferStart) && (ptr < state->bufferEnd)) {
+ PRUint32 len = nsCRT::strlen(ptr);
+ nsReadingIterator start, end;
+ start = state->currentIterator;
+ start.advance(ptr - state->bufferStart);
+ end = start;
+ end.advance(len);
+ theAttrToken->BindKey(state->scanner, start, end);
+ }
+ else {
+ theAttrToken->SetKey(nsLiteralString(ptr));
+ }
}
CToken* theTok=(CToken*)theAttrToken;
AddToken(theTok, NS_OK, state->tokenDeque, state->tokenAllocator);
+ atts += 2;
}
theToken->SetAttributeCount(theAttrCount);
}
@@ -545,10 +570,8 @@ void nsExpatTokenizer::HandleStartElement(void *userData, const XML_Char *name,
void nsExpatTokenizer::HandleEndElement(void *userData, const XML_Char *name) {
XMLParserState* state = (XMLParserState*) userData;
- CToken* theToken = state->tokenAllocator->CreateTokenOfType(eToken_end,eHTMLTag_unknown);
+ CToken* theToken = state->tokenAllocator->CreateTokenOfType(eToken_end,eHTMLTag_unknown, nsLiteralString((PRUnichar *) name));
if(theToken) {
- nsString& theString=theToken->GetStringValueXXX();
- theString.Assign((PRUnichar *) name);
AddToken(theToken, NS_OK, state->tokenDeque, state->tokenAllocator);
}
else{
@@ -558,13 +581,11 @@ void nsExpatTokenizer::HandleEndElement(void *userData, const XML_Char *name) {
void nsExpatTokenizer::HandleCharacterData(void *userData, const XML_Char *s, int len) {
XMLParserState* state = (XMLParserState*) userData;
- CCDATASectionToken* currentCDataToken = (CCDATASectionToken*) state->cdataToken;
- if (currentCDataToken) {
- // While there exists a current CDATA token, keep appending all strings
+ if (state->incdata) {
+ // While we're in a CDATASection, keep appending all strings
// from expat into it.
- nsString& theString = currentCDataToken->GetStringValueXXX();
- theString.Append((PRUnichar *) s,len);
+ state->cdataText.Append((PRUnichar *) s,len);
} else {
CToken* newToken = 0;
@@ -575,17 +596,28 @@ void nsExpatTokenizer::HandleCharacterData(void *userData, const XML_Char *s, in
break;
case kSpace:
case kTab:
- newToken = state->tokenAllocator->CreateTokenOfType(eToken_whitespace,eHTMLTag_unknown);
+ newToken = state->tokenAllocator->CreateTokenOfType(eToken_whitespace,eHTMLTag_unknown, nsLiteralString((PRUnichar*)s, len));
break;
default:
- newToken = state->tokenAllocator->CreateTokenOfType(eToken_text,eHTMLTag_unknown);
+ {
+ CTextToken* textToken = (CTextToken*)state->tokenAllocator->CreateTokenOfType(eToken_text, eHTMLTag_unknown);
+ PRUnichar* ptr = (PRUnichar*)s;
+ if ((ptr >= state->bufferStart) && (ptr < state->bufferEnd)) {
+ nsReadingIterator start, end;
+ start = state->currentIterator;
+ start.advance(ptr - state->bufferStart);
+ end = start;
+ end.advance(len);
+ textToken->Bind(state->scanner, start, end);
+ }
+ else {
+ textToken->Bind(nsLiteralString(ptr, len));
+ }
+ newToken = textToken;
+ }
}
if(newToken) {
- if ((((PRUnichar*)s)[0] != (XML_Char)kNewLine) && (((PRUnichar*)s)[0] != (XML_Char)kCR)) {
- nsString& theString=newToken->GetStringValueXXX();
- theString.Append((PRUnichar *) s,len);
- }
AddToken(newToken, NS_OK, state->tokenDeque, state->tokenAllocator);
}
else {
@@ -596,10 +628,8 @@ void nsExpatTokenizer::HandleCharacterData(void *userData, const XML_Char *s, in
void nsExpatTokenizer::HandleComment(void *userData, const XML_Char *name) {
XMLParserState* state = (XMLParserState*) userData;
- CToken* theToken = state->tokenAllocator->CreateTokenOfType(eToken_comment, eHTMLTag_unknown);
+ CToken* theToken = state->tokenAllocator->CreateTokenOfType(eToken_comment, eHTMLTag_unknown, nsLiteralString((PRUnichar*)name));
if(theToken) {
- nsString& theString=theToken->GetStringValueXXX();
- theString.Assign((PRUnichar *) name);
AddToken(theToken, NS_OK, state->tokenDeque, state->tokenAllocator);
}
else{
@@ -609,21 +639,22 @@ void nsExpatTokenizer::HandleComment(void *userData, const XML_Char *name) {
void nsExpatTokenizer::HandleStartCdataSection(void *userData) {
XMLParserState* state = (XMLParserState*) userData;
- CToken* cdataToken = state->tokenAllocator->CreateTokenOfType(eToken_cdatasection,
- eHTMLTag_unknown);
- state->cdataToken = cdataToken;
+ state->incdata = PR_TRUE;
}
void nsExpatTokenizer::HandleEndCdataSection(void *userData) {
XMLParserState* state = (XMLParserState*) userData;
- CToken* currentCDataToken = (CToken*) state->cdataToken;
+ CToken* cdataToken = state->tokenAllocator->CreateTokenOfType(eToken_cdatasection,
+ eHTMLTag_unknown,
+ state->cdataText);
// We've reached the end of the current CDATA section. Push the current
// CDATA token onto the token queue
- AddToken(currentCDataToken, NS_OK, state->tokenDeque, state->tokenAllocator);
+ AddToken(cdataToken, NS_OK, state->tokenDeque, state->tokenAllocator);
- state->cdataToken = nsnull;
+ state->incdata = PR_FALSE;
+ state->cdataText.Truncate();
}
void nsExpatTokenizer::HandleProcessingInstruction(void *userData,
@@ -631,16 +662,17 @@ void nsExpatTokenizer::HandleProcessingInstruction(void *userData,
const XML_Char *data)
{
XMLParserState* state = (XMLParserState*) userData;
- CToken* theToken = state->tokenAllocator->CreateTokenOfType(eToken_instruction,eHTMLTag_unknown);
+ nsAutoString theString;
+ theString. AppendWithConversion("");
+ theString.Append((PRUnichar *) target);
+ if(data) {
+ theString.AppendWithConversion(" ");
+ theString.Append((PRUnichar *) data);
+ }
+ theString.AppendWithConversion("?>");
+
+ CToken* theToken = state->tokenAllocator->CreateTokenOfType(eToken_instruction,eHTMLTag_unknown, theString);
if(theToken) {
- nsString& theString=theToken->GetStringValueXXX();
- theString. AppendWithConversion("");
- theString.Append((PRUnichar *) target);
- if(data) {
- theString.AppendWithConversion(" ");
- theString.Append((PRUnichar *) data);
- }
- theString.AppendWithConversion("?>");
AddToken(theToken, NS_OK, state->tokenDeque, state->tokenAllocator);
}
else{
@@ -650,9 +682,8 @@ void nsExpatTokenizer::HandleProcessingInstruction(void *userData,
void nsExpatTokenizer::HandleDefault(void *userData, const XML_Char *s, int len) {
XMLParserState* state = (XMLParserState*) userData;
- if (state->doctypeToken) {
- nsString& doctypestr = state->doctypeToken->GetStringValueXXX();
- doctypestr.Append((PRUnichar*)s, len);
+ if (state->indoctype) {
+ state->doctypeText.Append((PRUnichar*)s, len);
}
else {
nsAutoString str((PRUnichar *)s, len);
@@ -872,23 +903,20 @@ void nsExpatTokenizer::HandleStartDoctypeDecl(void *userData,
const XML_Char *doctypeName)
{
XMLParserState* state = (XMLParserState*) userData;
- CToken* token = state->tokenAllocator->CreateTokenOfType(eToken_doctypeDecl, eHTMLTag_unknown);
- if (token) {
- nsString& str = token->GetStringValueXXX();
- str.AppendWithConversion(kDocTypeDeclPrefix);
- state->doctypeToken = token;
- }
+ state->indoctype = PR_TRUE;
+ state->doctypeText.Assign((PRUnichar*)kDocTypeDeclPrefix);
}
void nsExpatTokenizer::HandleEndDoctypeDecl(void *userData)
{
XMLParserState* state = (XMLParserState*) userData;
- CToken* token = state->doctypeToken;
+
+ state->doctypeText.AppendWithConversion(">");
+ CToken* token = state->tokenAllocator->CreateTokenOfType(eToken_doctypeDecl, eHTMLTag_unknown, state->doctypeText);
if (token) {
- nsString& str = token->GetStringValueXXX();
- str.AppendWithConversion(">");
AddToken(token, NS_OK, state->tokenDeque, state->tokenAllocator);
- state->doctypeToken = nsnull;
}
+ state->indoctype = PR_FALSE;
+ state->doctypeText.Truncate();
// Do nothing
}
diff --git a/mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp b/mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp
index 04fcede6a29..47cc43332db 100644
--- a/mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp
+++ b/mozilla/htmlparser/src/nsHTMLContentSinkStream.cpp
@@ -272,7 +272,7 @@ void nsHTMLContentSinkStream::EnsureBufferSize(PRInt32 aNewSize)
* @param aString - the string to write.
* @return The number of characters written.
*/
-PRInt32 nsHTMLContentSinkStream::Write(const nsString& aString)
+PRInt32 nsHTMLContentSinkStream::Write(const nsAReadableString& aString)
{
if (mBodyOnly && !mInBody)
return 0;
@@ -289,7 +289,7 @@ PRInt32 nsHTMLContentSinkStream::Write(const nsString& aString)
{
nsresult res;
PRUnichar *encodedBuffer = nsnull;
- res = mEntityConverter->ConvertToEntities(aString.GetUnicode(),
+ res = mEntityConverter->ConvertToEntities(nsPromiseFlatString(aString),
nsIEntityConverter::html40Latin1,
&encodedBuffer);
if (NS_SUCCEEDED(res) && encodedBuffer)
@@ -328,7 +328,7 @@ PRInt32 nsHTMLContentSinkStream::Write(const nsString& aString)
{
// Call the converter to convert to the target charset.
// Convert() takes a char* output param even though it's writing unicode.
- res = mCharsetEncoder->Convert(aString.GetUnicode(), &encodedBuffer);
+ res = mCharsetEncoder->Convert(nsPromiseFlatString(aString), &encodedBuffer);
if (NS_SUCCEEDED(res) && encodedBuffer)
{
charsWritten = nsCRT::strlen(encodedBuffer);
@@ -339,7 +339,7 @@ PRInt32 nsHTMLContentSinkStream::Write(const nsString& aString)
// If it didn't work, just write the unicode
else
{
- const PRUnichar* unicode = aString.GetUnicode();
+ const PRUnichar* unicode = nsPromiseFlatString(aString);
charsWritten = aString.Length();
out.write(unicode, charsWritten);
}
@@ -348,7 +348,7 @@ PRInt32 nsHTMLContentSinkStream::Write(const nsString& aString)
// If we couldn't get an encoder, just write the unicode
else
{
- const PRUnichar* unicode = aString.GetUnicode();
+ const PRUnichar* unicode = nsPromiseFlatString(aString);
charsWritten = aString.Length();
out.write(unicode, charsWritten);
}
@@ -399,7 +399,7 @@ void nsHTMLContentSinkStream::WriteAttributes(const nsIParserNode& aNode)
if(theCount) {
int i=0;
for(i=0;i 0)
{
Write(text);
@@ -884,7 +884,7 @@ nsHTMLContentSinkStream::AddLeaf(const nsIParserNode& aNode)
{
if (!mDoFormat || mPreLevel > 0)
{
- const nsString& text = aNode.GetText();
+ const nsAReadableString& text = aNode.GetText();
Write(text);
mColPos += text.Length();
}
@@ -904,15 +904,14 @@ nsHTMLContentSinkStream::AddLeaf(const nsIParserNode& aNode)
// See if the string has any lines longer than longLineLen:
// if so, we presume formatting is wonky (e.g. the node has been edited)
// and we'd better rewrap the whole text node.
-PRBool nsHTMLContentSinkStream::HasLongLines(const nsString& text)
+PRBool nsHTMLContentSinkStream::HasLongLines(const nsAReadableString& text)
{
const PRUint32 longLineLen = 128;
- nsString str = text;
PRUint32 start=0;
PRUint32 theLen=text.Length();
for (start = 0; start < theLen; )
{
- PRInt32 eol = text.FindChar('\n', PR_FALSE, start);
+ PRInt32 eol = text.FindChar('\n', start);
if (eol < 0) eol = text.Length();
if ((PRUint32)(eol - start) > longLineLen)
return PR_TRUE;
@@ -921,7 +920,7 @@ PRBool nsHTMLContentSinkStream::HasLongLines(const nsString& text)
return PR_FALSE;
}
-void nsHTMLContentSinkStream::WriteWrapped(const nsString& text)
+void nsHTMLContentSinkStream::WriteWrapped(const nsAReadableString& text)
{
// 1. Determine the length of the input string
PRInt32 length = text.Length();
@@ -935,7 +934,7 @@ void nsHTMLContentSinkStream::WriteWrapped(const nsString& text)
}
else
{
- nsString str = text;
+ nsAutoString str(text);
PRBool done = PR_FALSE;
PRInt32 indx = 0;
PRInt32 offset = mColPos;
@@ -1051,16 +1050,16 @@ nsHTMLContentSinkStream::OpenContainer(const nsIParserNode& aNode)
PRInt32 count=aNode.GetAttributeCount();
for(PRInt32 i=0;i" << endl;
- delete[] cp;
}
#endif
diff --git a/mozilla/htmlparser/src/nsHTMLToTXTSinkStream.cpp b/mozilla/htmlparser/src/nsHTMLToTXTSinkStream.cpp
index 41768f72ded..2b99e82364a 100644
--- a/mozilla/htmlparser/src/nsHTMLToTXTSinkStream.cpp
+++ b/mozilla/htmlparser/src/nsHTMLToTXTSinkStream.cpp
@@ -449,8 +449,8 @@ nsHTMLToTXTSinkStream::GetValueOfAttribute(const nsIParserNode& aNode,
PRInt32 count=aNode.GetAttributeCount();
for (PRInt32 i=0;i 1 && mTagStack[mTagStackIndex-2] == eHTMLTag_select)
{
diff --git a/mozilla/htmlparser/src/nsHTMLTokenizer.cpp b/mozilla/htmlparser/src/nsHTMLTokenizer.cpp
index 8bfca2430d5..4e82e5744ec 100644
--- a/mozilla/htmlparser/src/nsHTMLTokenizer.cpp
+++ b/mozilla/htmlparser/src/nsHTMLTokenizer.cpp
@@ -33,6 +33,7 @@
#include "nsElementTable.h"
#include "nsHTMLEntities.h"
#include "CParserContext.h"
+#include "nsReadableUtils.h"
/************************************************************************
And now for the main class -- nsHTMLTokenizer...
@@ -441,7 +442,7 @@ nsresult nsHTMLTokenizer::ConsumeToken(nsScanner& aScanner,PRBool& aFlushTokens)
PRUnichar theChar;
CToken* theToken=0;
- nsresult result=aScanner.GetChar(theChar);
+ nsresult result=aScanner.Peek(theChar);
switch(result) {
case kEOF:
@@ -468,8 +469,7 @@ nsresult nsHTMLTokenizer::ConsumeToken(nsScanner& aScanner,PRBool& aFlushTokens)
}
else {
if(!nsCRT::IsAsciiSpace(theChar)) {
- nsAutoString temp(theChar);
- result=ConsumeText(temp,theToken,aScanner);
+ result=ConsumeText(theToken,aScanner);
break;
}
result=ConsumeWhitespace(theChar,theToken,aScanner);
@@ -494,16 +494,19 @@ nsresult nsHTMLTokenizer::ConsumeToken(nsScanner& aScanner,PRBool& aFlushTokens)
*/
nsresult nsHTMLTokenizer::ConsumeTag(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner,PRBool& aFlushTokens) {
- nsresult result=aScanner.GetChar(aChar);
+ PRUnichar theNextChar, oldChar;
+ nsresult result=aScanner.Peek(aChar,1);
if(NS_OK==result) {
switch(aChar) {
case kForwardSlash:
- PRUnichar ch;
- result=aScanner.Peek(ch);
+ // Get the original "<" (we've already seen it with a Peek)
+ aScanner.GetChar(oldChar);
+
+ result=aScanner.Peek(theNextChar, 1);
if(NS_OK==result) {
- if(nsCRT::IsAsciiAlpha(ch)||(kGreaterThan==ch)) {
+ if(nsCRT::IsAsciiAlpha(theNextChar)||(kGreaterThan==theNextChar)) {
result=ConsumeEndTag(aChar,aToken,aScanner);
}
else result=ConsumeComment(aChar,aToken,aScanner);
@@ -511,8 +514,10 @@ nsresult nsHTMLTokenizer::ConsumeTag(PRUnichar aChar,CToken*& aToken,nsScanner&
break;
case kExclamation:
- PRUnichar theNextChar;
- result=aScanner.Peek(theNextChar);
+ // Get the original "<" (we've already seen it with a Peek)
+ aScanner.GetChar(oldChar);
+
+ result=aScanner.Peek(theNextChar, 1);
if(NS_OK==result) {
if((kMinus==theNextChar) || (kGreaterThan==theNextChar)) {
result=ConsumeComment(aChar,aToken,aScanner);
@@ -523,18 +528,21 @@ nsresult nsHTMLTokenizer::ConsumeTag(PRUnichar aChar,CToken*& aToken,nsScanner&
break;
case kQuestionMark: //it must be an XML processing instruction...
+ // Get the original "<" (we've already seen it with a Peek)
+ aScanner.GetChar(oldChar);
result=ConsumeProcessingInstruction(aChar,aToken,aScanner);
break;
default:
- if(nsCRT::IsAsciiAlpha(aChar))
+ if(nsCRT::IsAsciiAlpha(aChar)) {
+ // Get the original "<" (we've already seen it with a Peek)
+ aScanner.GetChar(oldChar);
result=ConsumeStartTag(aChar,aToken,aScanner,aFlushTokens);
+ }
else if(kEOF!=aChar) {
- // We are not dealing with a tag. So, put back the char
- // and leave the decision to ConsumeText().
- aScanner.PutBack(aChar);
- nsAutoString temp; temp.AssignWithConversion("<");
- result=ConsumeText(temp,aToken,aScanner);
+ // We are not dealing with a tag. So, don't consume the original
+ // char and leave the decision to ConsumeText().
+ result=ConsumeText(aToken,aScanner);
}
} //switch
@@ -552,7 +560,7 @@ nsresult nsHTMLTokenizer::ConsumeTag(PRUnichar aChar,CToken*& aToken,nsScanner&
* @param aLeadingWS: contains ws chars that preceeded the first attribute
* @return
*/
-nsresult nsHTMLTokenizer::ConsumeAttributes(PRUnichar aChar,CStartToken* aToken,nsScanner& aScanner,nsString& aLeadingWS) {
+nsresult nsHTMLTokenizer::ConsumeAttributes(PRUnichar aChar,CStartToken* aToken,nsScanner& aScanner) {
PRBool done=PR_FALSE;
nsresult result=NS_OK;
PRInt16 theAttrCount=0;
@@ -560,13 +568,8 @@ nsresult nsHTMLTokenizer::ConsumeAttributes(PRUnichar aChar,CStartToken* aToken,
nsTokenAllocator* theAllocator=this->GetTokenAllocator();
while((!done) && (result==NS_OK)) {
- CToken* theToken= (CAttributeToken*)theAllocator->CreateTokenOfType(eToken_attribute,eHTMLTag_unknown);
+ CAttributeToken* theToken= NS_STATIC_CAST(CAttributeToken*, theAllocator->CreateTokenOfType(eToken_attribute,eHTMLTag_unknown));
if(theToken){
- if(aLeadingWS.Length()) {
- nsString& theKey=((CAttributeToken*)theToken)->GetKey();
- theKey=aLeadingWS;
- aLeadingWS.Truncate(0);
- }
result=theToken->Consume(aChar,aScanner,PRBool(eViewSource==mParserCommand)); //tell new token to finish consuming text...
//Much as I hate to do this, here's some special case code.
@@ -575,8 +578,8 @@ nsresult nsHTMLTokenizer::ConsumeAttributes(PRUnichar aChar,CStartToken* aToken,
//and a textkey of "/". We should destroy it, and tell the
//start token it was empty.
if(NS_SUCCEEDED(result)) {
- nsString& key=((CAttributeToken*)theToken)->GetKey();
- nsString& text=theToken->GetStringValueXXX();
+ const nsAReadableString& key=theToken->GetKey();
+ const nsAReadableString& text=theToken->GetValue();
if((mDoXMLEmptyTags) && (kForwardSlash==key.CharAt(0)) && (0==text.Length())){
//tada! our special case! Treat it like an empty start tag...
aToken->SetEmpty(PR_TRUE);
@@ -584,7 +587,7 @@ nsresult nsHTMLTokenizer::ConsumeAttributes(PRUnichar aChar,CStartToken* aToken,
}
else {
theAttrCount++;
- AddToken(theToken,result,&mTokenDeque,theAllocator);
+ AddToken((CToken*&)theToken,result,&mTokenDeque,theAllocator);
}
}
else { //if(NS_ERROR_HTMLPARSER_BADATTRIBUTE==result){
@@ -654,7 +657,10 @@ nsresult nsHTMLTokenizer::ConsumeStartTag(PRUnichar aChar,CToken*& aToken,nsScan
aToken=theAllocator->CreateTokenOfType(eToken_start,eHTMLTag_unknown);
if(aToken) {
- ((CStartToken*)aToken)->mOrigin=aScanner.GetOffset()-1; // Save the position after '<' for use in recording traling contents. Ref: Bug. 15204.
+ // Save the position after '<' for use in recording traling contents. Ref: Bug. 15204.
+ nsReadingIterator origin;
+ aScanner.CurrentPosition(origin);
+
PRBool isHTML=((eHTML3Text==mDocType) || (eHTML4Text==mDocType));
result= aToken->Consume(aChar,aScanner,isHTML); //tell new token to finish consuming text...
@@ -665,25 +671,33 @@ nsresult nsHTMLTokenizer::ConsumeStartTag(PRUnichar aChar,CToken*& aToken,nsScan
//Good. Now, let's see if the next char is ">".
//If so, we have a complete tag, otherwise, we have attributes.
- nsString &theScratchStr=GetScratchString();
PRBool theTagHasAttributes=PR_FALSE;
+ nsReadingIterator start, end;
if(NS_OK==result) {
- result=(eViewSource==mParserCommand) ? aScanner.ReadWhitespace(theScratchStr) : aScanner.SkipWhitespace();
+ result=(eViewSource==mParserCommand) ? aScanner.ReadWhitespace(start, end) : aScanner.SkipWhitespace();
aToken->mNewlineCount += aScanner.GetNewlinesSkipped();
if(NS_OK==result) {
- result=aScanner.GetChar(aChar);
+ result=aScanner.Peek(aChar);
if(NS_OK==result) {
if(kGreaterThan!=aChar) { //look for '>'
//push that char back, since we apparently have attributes...
- result=aScanner.PutBack(aChar);
theTagHasAttributes=PR_TRUE;
} //if
+ else {
+ aScanner.GetChar(aChar);
+ }
} //if
}//if
}
if(theTagHasAttributes) {
- result=ConsumeAttributes(aChar,(CStartToken*)aToken,aScanner,theScratchStr);
+ if (eViewSource==mParserCommand) {
+ // Since we conserve whitespace in view-source mode,
+ // go back to the beginning of the whitespace section
+ // and let the first attribute grab it.
+ aScanner.SetPosition(start, PR_FALSE, PR_TRUE);
+ }
+ result=ConsumeAttributes(aChar,(CStartToken*)aToken,aScanner);
}
/* Now that that's over with, we have one more problem to solve.
@@ -699,7 +713,7 @@ nsresult nsHTMLTokenizer::ConsumeStartTag(PRUnichar aChar,CToken*& aToken,nsScan
}
if(mRecordTrailingContent)
- RecordTrailingContent((CStartToken*)aToken,aScanner);
+ RecordTrailingContent((CStartToken*)aToken,aScanner,origin);
//if((eHTMLTag_style==theTag) || (eHTMLTag_script==theTag)) {
if(gHTMLElements[theTag].CanContainType(kCDATA)) {
@@ -739,6 +753,9 @@ nsresult nsHTMLTokenizer::ConsumeStartTag(PRUnichar aChar,CToken*& aToken,nsScan
* @return
*/
nsresult nsHTMLTokenizer::ConsumeEndTag(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner) {
+
+ // Get the "/" (we've already seen it with a Peek)
+ aScanner.GetChar(aChar);
nsTokenAllocator* theAllocator=this->GetTokenAllocator();
aToken=theAllocator->CreateTokenOfType(eToken_end,eHTMLTag_unknown);
@@ -749,7 +766,8 @@ nsresult nsHTMLTokenizer::ConsumeEndTag(PRUnichar aChar,CToken*& aToken,nsScanne
if((theTag==eHTMLTag_textarea || theTag==eHTMLTag_xmp) && mRecordTrailingContent) {
mRecordTrailingContent=PR_FALSE;
}
- result= aToken->Consume(aChar,aScanner,mParseMode); //tell new token to finish consuming text...
+ PRBool isHTML=((eHTML3Text==mDocType) || (eHTML4Text==mDocType));
+ result= aToken->Consume(aChar,aScanner,isHTML); //tell new token to finish consuming text...
AddToken(aToken,result,&mTokenDeque,theAllocator);
} //if
return result;
@@ -767,39 +785,33 @@ nsresult nsHTMLTokenizer::ConsumeEndTag(PRUnichar aChar,CToken*& aToken,nsScanne
*/
nsresult nsHTMLTokenizer::ConsumeEntity(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner) {
PRUnichar theChar;
- nsresult result=aScanner.GetChar(theChar);
+ nsresult result=aScanner.Peek(theChar, 1);
nsTokenAllocator* theAllocator=this->GetTokenAllocator();
if(NS_OK==result) {
if(nsCRT::IsAsciiAlpha(theChar)) { //handle common enity references &xxx; or .
+ // Get the "&"
+ aScanner.GetChar(theChar);
aToken = theAllocator->CreateTokenOfType(eToken_entity,eHTMLTag_entity);
+
+ // Get the first entity character
+ aScanner.GetChar(theChar);
result = aToken->Consume(theChar,aScanner,mParseMode); //tell new token to finish consuming text...
}
else if(kHashsign==theChar) {
+ // Get the "&"
+ aScanner.GetChar(theChar);
aToken = theAllocator->CreateTokenOfType(eToken_entity,eHTMLTag_entity);
+
+ // Get the first numerical entity character
+ aScanner.GetChar(theChar);
result=aToken->Consume(theChar,aScanner,mParseMode);
}
else {
//oops, we're actually looking at plain text...
- nsAutoString temp; temp.AssignWithConversion("&");
- aScanner.PutBack(theChar);
- return ConsumeText(temp,aToken,aScanner);
+ return ConsumeText(aToken,aScanner);
}//if
if(aToken){
-#if 0
- nsString& theStr=aToken->GetStringValueXXX();
-
- if((kHashsign!=theChar) && (-1==nsHTMLEntities::EntityToUnicode(theStr))){
- //if you're here we have a bogus entity.
- //convert it into a text token.
- nsAutoString temp; temp.AssignWithConversion("&");
- temp.Append(theStr);
- CToken* theToken=theAllocator->CreateTokenOfType(eToken_text,eHTMLTag_text,temp);
- IF_FREE(aToken);
- aToken=theToken;
- }
-#endif
-
if(mIsFinalChunk && (kEOF==result)) {
result=NS_OK; //use as much of the entity as you can get.
}
@@ -821,6 +833,9 @@ nsresult nsHTMLTokenizer::ConsumeEntity(PRUnichar aChar,CToken*& aToken,nsScanne
* @return new token or null
*/
nsresult nsHTMLTokenizer::ConsumeWhitespace(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner) {
+ // Get the whitespace character
+ aScanner.GetChar(aChar);
+
nsTokenAllocator* theAllocator=this->GetTokenAllocator();
aToken = theAllocator->CreateTokenOfType(eToken_whitespace,eHTMLTag_whitespace);
nsresult result=NS_OK;
@@ -842,6 +857,9 @@ nsresult nsHTMLTokenizer::ConsumeWhitespace(PRUnichar aChar,CToken*& aToken,nsSc
* @return new token or null
*/
nsresult nsHTMLTokenizer::ConsumeComment(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner){
+ // Get the "!"
+ aScanner.GetChar(aChar);
+
nsTokenAllocator* theAllocator=this->GetTokenAllocator();
aToken = theAllocator->CreateTokenOfType(eToken_comment,eHTMLTag_comment);
nsresult result=NS_OK;
@@ -862,21 +880,21 @@ nsresult nsHTMLTokenizer::ConsumeComment(PRUnichar aChar,CToken*& aToken,nsScann
* @param anErrorCode: arg that will hold error condition
* @return new token or null
*/
-nsresult nsHTMLTokenizer::ConsumeText(const nsString& aString,CToken*& aToken,nsScanner& aScanner){
+nsresult nsHTMLTokenizer::ConsumeText(CToken*& aToken,nsScanner& aScanner){
nsresult result=NS_OK;
nsTokenAllocator* theAllocator=this->GetTokenAllocator();
- aToken=theAllocator->CreateTokenOfType(eToken_text,eHTMLTag_text,aString);
- if(aToken) {
+ CTextToken* theToken = (CTextToken*)theAllocator->CreateTokenOfType(eToken_text,eHTMLTag_text);
+ if(theToken) {
PRUnichar ch=0;
- result=aToken->Consume(ch,aScanner,mParseMode);
+ result=theToken->Consume(ch,aScanner,mParseMode);
if(!NS_SUCCEEDED(result)) {
- nsString& temp=aToken->GetStringValueXXX();
- if(0==temp.Length()){
+ if(0==theToken->GetTextLength()){
IF_FREE(aToken);
aToken = nsnull;
}
else result=NS_OK;
}
+ aToken = theToken;
AddToken(aToken,result,&mTokenDeque,theAllocator);
}
return result;
@@ -894,10 +912,13 @@ nsresult nsHTMLTokenizer::ConsumeText(const nsString& aString,CToken*& aToken,ns
* @return new token or null
*/
nsresult nsHTMLTokenizer::ConsumeSpecialMarkup(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner){
+
+ // Get the "!"
+ aScanner.GetChar(aChar);
+
nsresult result=NS_OK;
nsAutoString theBufCopy;
- nsString& theBuffer=aScanner.GetBuffer();
- theBuffer.Mid(theBufCopy,aScanner.GetOffset(),20);
+ aScanner.Peek(theBufCopy, 20);
theBufCopy.ToUpperCase();
PRInt32 theIndex=theBufCopy.Find("DOCTYPE");
nsTokenAllocator* theAllocator=this->GetTokenAllocator();
@@ -927,6 +948,9 @@ nsresult nsHTMLTokenizer::ConsumeSpecialMarkup(PRUnichar aChar,CToken*& aToken,n
* @return error code
*/
nsresult nsHTMLTokenizer::ConsumeNewline(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner){
+ // Get the newline character
+ aScanner.GetChar(aChar);
+
nsTokenAllocator* theAllocator=this->GetTokenAllocator();
aToken=theAllocator->CreateTokenOfType(eToken_newline,eHTMLTag_newline);
nsresult result=NS_OK;
@@ -948,6 +972,10 @@ nsresult nsHTMLTokenizer::ConsumeNewline(PRUnichar aChar,CToken*& aToken,nsScann
* @return error code
*/
nsresult nsHTMLTokenizer::ConsumeProcessingInstruction(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner){
+
+ // Get the "?"
+ aScanner.GetChar(aChar);
+
nsTokenAllocator* theAllocator=this->GetTokenAllocator();
aToken=theAllocator->CreateTokenOfType(eToken_instruction,eHTMLTag_unknown);
nsresult result=NS_OK;
@@ -969,16 +997,20 @@ nsresult nsHTMLTokenizer::ConsumeProcessingInstruction(PRUnichar aChar,CToken*&
*
*/
-void nsHTMLTokenizer::RecordTrailingContent(CStartToken* aStartToken, nsScanner& aScanner) {
+void nsHTMLTokenizer::RecordTrailingContent(CStartToken* aStartToken, nsScanner& aScanner, nsReadingIterator aOrigin) {
if(aStartToken) {
- PRInt32 theOrigin =aStartToken->mOrigin;
- PRInt32 theCurrOffset =aScanner.GetOffset();
- PRInt32 theLength =(theCurrOffset>theOrigin)? theCurrOffset-theOrigin:-1;
- if(theLength>0) {
- nsString& theRawXXX =aStartToken->mTrailingContent;
- const PRUnichar* theBuff =(aScanner.GetBuffer()).GetUnicode();
- theRawXXX.Append(&theBuff[theOrigin],theLength);
- }
+ nsReadingIterator theCurrentPosition;
+ aScanner.CurrentPosition(theCurrentPosition);
+
+ nsString& trailingContent =aStartToken->mTrailingContent;
+ PRUint32 oldLength = trailingContent.Length();
+ trailingContent.SetLength(oldLength + Distance(aOrigin, theCurrentPosition));
+
+ nsWritingIterator beginWriting;
+ trailingContent.BeginWriting(beginWriting);
+ beginWriting.advance(oldLength);
+
+ copy_string( aOrigin, theCurrentPosition, beginWriting );
}
}
diff --git a/mozilla/htmlparser/src/nsHTMLTokenizer.h b/mozilla/htmlparser/src/nsHTMLTokenizer.h
index 4af4ce9c1d8..a22553eeaa7 100644
--- a/mozilla/htmlparser/src/nsHTMLTokenizer.h
+++ b/mozilla/htmlparser/src/nsHTMLTokenizer.h
@@ -81,18 +81,18 @@ protected:
virtual nsresult ConsumeTag(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner,PRBool& aFlushTokens);
virtual nsresult ConsumeStartTag(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner,PRBool& aFlushTokens);
virtual nsresult ConsumeEndTag(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner);
- virtual nsresult ConsumeAttributes(PRUnichar aChar,CStartToken* aToken,nsScanner& aScanner,nsString& aLeadingWS);
+ virtual nsresult ConsumeAttributes(PRUnichar aChar,CStartToken* aToken,nsScanner& aScanner);
virtual nsresult ConsumeEntity(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner);
virtual nsresult ConsumeWhitespace(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner);
virtual nsresult ConsumeComment(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner);
virtual nsresult ConsumeNewline(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner);
- virtual nsresult ConsumeText(const nsString& aString,CToken*& aToken,nsScanner& aScanner);
+ virtual nsresult ConsumeText(CToken*& aToken,nsScanner& aScanner);
virtual nsresult ConsumeSpecialMarkup(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner);
virtual nsresult ConsumeProcessingInstruction(PRUnichar aChar,CToken*& aToken,nsScanner& aScanner);
nsresult ScanDocStructure(PRBool aIsFinalChunk);
- virtual void RecordTrailingContent(CStartToken* aStartToken,nsScanner& aScanner);
+ virtual void RecordTrailingContent(CStartToken* aStartToken, nsScanner& aScanner, nsReadingIterator aOrigin);
static void AddToken(CToken*& aToken,nsresult aResult,nsDeque* aDeque,nsTokenAllocator* aTokenAllocator);
diff --git a/mozilla/htmlparser/src/nsHTMLTokens.cpp b/mozilla/htmlparser/src/nsHTMLTokens.cpp
index 63cbe84738f..61f94a0bdc8 100644
--- a/mozilla/htmlparser/src/nsHTMLTokens.cpp
+++ b/mozilla/htmlparser/src/nsHTMLTokens.cpp
@@ -32,7 +32,8 @@
#include "nsHTMLTags.h"
#include "nsHTMLEntities.h"
#include "nsCRT.h"
-
+#include "nsReadableUtils.h"
+#include "nsScanner.h"
static const char* gUserdefined = "userdefined";
@@ -42,17 +43,6 @@ static const char* gUserdefined = "userdefined";
And now for the token classes...
**************************************************************/
-/*
- * default constructor
- *
- * @update gess 3/25/98
- * @param
- * @return
- */
-CHTMLToken::CHTMLToken(const nsString& aName,eHTMLTags aTag) : CToken(aName) {
- mTypeID=aTag;
-}
-
/*
* constructor from tag id
*
@@ -68,35 +58,6 @@ CHTMLToken::~CHTMLToken() {
}
-/**
- * Setter method that changes the string value of this token
- * @update gess5/11/98
- * @param name is a char* value containing new string value
- */
-void CHTMLToken::SetCStringValue(const char* name){
- if(name) {
- mTextValue.AssignWithConversion(name);
- mTypeID = nsHTMLTags::LookupTag(mTextValue);
- }
-}
-
-
-/**
- * This method retrieves the value of this internal string.
- *
- * @update gess 3/25/98
- * @return nsString reference to internal string value
- */
-nsString& CHTMLToken::GetStringValueXXX(void) {
-
- if((eHTMLTag_unknown"
nsresult result=NS_OK;
- if(0==aMode) {
- nsSubsumeStr theSubstr;
- result=aScanner.GetIdentifier(theSubstr,!aMode);
+ if(1==aMode) {
+ nsAutoString theSubstr;
+ result=aScanner.GetIdentifier(theSubstr,PR_TRUE);
mTypeID = (PRInt32)nsHTMLTags::LookupTag(theSubstr);
if(eHTMLTag_userdefined==mTypeID) {
mTextValue=theSubstr;
}
}
else {
- mTextValue.Assign(aChar);
-
//added PR_TRUE to readId() call below to fix bug 46083. The problem was that the tag given
//was written but since we didn't respect the '_', we only saw . Then
//we searched for end title, which never comes (they give ).
@@ -303,6 +241,16 @@ void CStartToken::DebugDumpSource(nsOutputStream& out) {
out << ">";
}
+const nsAReadableString& CStartToken::GetStringValue()
+{
+ if((eHTMLTag_unknown'.
//NOTE: We don't Consume the tag attributes here, nor do we eat the ">"
- mTextValue.SetLength(0);
- nsresult result=aScanner.ReadUntil(mTextValue,kGreaterThan,PR_FALSE);
+ nsresult result=NS_OK;
+ nsAutoString buffer;
+ PRInt32 offset;
+ if(1==aMode) {
+ nsAutoString theSubstr;
+ result=aScanner.ReadUntil(theSubstr,kGreaterThan,PR_FALSE);
+ if (NS_FAILED(result)) {
+ return result;
+ }
+
+ offset = theSubstr.FindCharInSet(" \r\n\t\b",0);
+ if (offset != kNotFound) {
+ theSubstr.Left(buffer, offset);
+ mTypeID = nsHTMLTags::LookupTag(buffer);
+ }
+ else {
+ mTypeID = nsHTMLTags::LookupTag(theSubstr);
+ }
+
+ if(eHTMLTag_userdefined==mTypeID) {
+ mTextValue=theSubstr;
+ }
- if(NS_OK==result){
- nsAutoString buffer;
- mTextValue.Left(buffer, mTextValue.FindCharInSet(" \r\n\t\b",0));
- mTypeID= nsHTMLTags::LookupTag(buffer);
- result=aScanner.GetChar(aChar); //eat the closing '>;
}
+ else {
+ mTextValue.SetLength(0);
+ result=aScanner.ReadUntil(mTextValue,kGreaterThan,PR_FALSE);
+ if (NS_FAILED(result)) {
+ return result;
+ }
+ mTypeID = eHTMLTag_userdefined;
+ }
+
+ result=aScanner.GetChar(aChar); //eat the closing '>;
+
return result;
}
@@ -457,6 +425,16 @@ void CEndToken::DebugDumpSource(nsOutputStream& out) {
out << "" << buffer << ">";
}
+const nsAReadableString& CEndToken::GetStringValue()
+{
+ if((eHTMLTag_unknown0)
+ anOutputString.Append(mTextValue);
+ else
+ anOutputString.AppendWithConversion(GetTagName(mTypeID));
anOutputString.AppendWithConversion(">");
}
@@ -479,7 +460,10 @@ void CEndToken::GetSource(nsString& anOutputString){
*/
void CEndToken::AppendSource(nsString& anOutputString){
anOutputString.AppendWithConversion("");
- anOutputString+=mTextValue;
+ if(mTextValue.Length()>0)
+ anOutputString.Append(mTextValue);
+ else
+ anOutputString.AppendWithConversion(GetTagName(mTypeID));
anOutputString.AppendWithConversion(">");
}
@@ -501,8 +485,8 @@ CTextToken::CTextToken() : CHTMLToken(eHTMLTag_text) {
* @param aName -- string to init token name with
* @return
*/
-CTextToken::CTextToken(const nsString& aName) : CHTMLToken(aName) {
- mTypeID=eHTMLTag_text;
+CTextToken::CTextToken(const nsAReadableString& aName) : CHTMLToken(eHTMLTag_text) {
+ mTextValue.Rebind(aName);
}
/*
@@ -527,6 +511,10 @@ PRInt32 CTextToken::GetTokenType(void) {
return eToken_text;
}
+PRInt32 CTextToken::GetTextLength(void) {
+ return mTextValue.Length();
+}
+
/*
* Consume as much clear text from scanner as possible.
*
@@ -539,9 +527,17 @@ nsresult CTextToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aMode)
static nsString theTerminals = NS_ConvertToString("\n\r&<",4);
nsresult result=NS_OK;
PRBool done=PR_FALSE;
+ nsReadingIterator origin, start, end;
+
+ // Start scanning after the first character, because we know it to
+ // be part of this text token (we wouldn't have come here if it weren't)
+ aScanner.CurrentPosition(origin);
+ start = origin;
+ start++;
+ aScanner.SetPosition(start);
while((NS_OK==result) && (!done)) {
- result=aScanner.ReadUntil(mTextValue,theTerminals,PR_FALSE);
+ result=aScanner.ReadUntil(start, end, theTerminals,PR_FALSE);
if(NS_OK==result) {
result=aScanner.Peek(aChar);
@@ -553,31 +549,21 @@ nsresult CTextToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aMode)
case kCR:
// result=aScanner.GetChar(aChar);
if(kLF==theNextChar) {
+ // If the "\r" is followed by a "\n", don't replace it and
+ // let it be ignored by the layout system
+ end += 2;
result=aScanner.GetChar(theNextChar);
}
- else if(kCR==theNextChar) {
- result=aScanner.GetChar(theNextChar);
- result=aScanner.Peek(theNextChar); //then see what's next.
- if(kLF==theNextChar) {
- result=aScanner.GetChar(theNextChar);
- }
- mTextValue.AppendWithConversion("\n");
- mNewlineCount++;
+ else {
+ // If it standalone, replace the "\r" with a "\n" so that
+ // it will be considered by the layout system
+ aScanner.ReplaceCharacter(end, kLF);
+ end++;
}
- mTextValue.AppendWithConversion("\n");
mNewlineCount++;
break;
case kLF:
- if((kLF==theNextChar) || (kCR==theNextChar)) {
- result=aScanner.GetChar(theNextChar);
- mTextValue.AppendWithConversion("\n");
- mNewlineCount++;
- }
- mTextValue.AppendWithConversion("\n");
- mNewlineCount++;
- break;
- default:
- mTextValue.AppendWithConversion("\n");
+ end++;
mNewlineCount++;
break;
} //switch
@@ -585,6 +571,9 @@ nsresult CTextToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aMode)
else done=PR_TRUE;
}
}
+
+ aScanner.BindSubstring(mTextValue, origin, end);
+
return result;
}
@@ -599,16 +588,16 @@ nsresult CTextToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aMode)
nsresult CTextToken::ConsumeUntil(PRUnichar aChar,PRBool aIgnoreComments,nsScanner& aScanner,
nsString& aTerminalString,PRInt32 aMode,PRBool& aFlushTokens){
nsresult result=NS_OK;
- PRInt32 theTermStrPos=0;;
- nsString& theBuffer=aScanner.GetBuffer();
- PRInt32 theStartOffset=aScanner.GetOffset();
- PRInt32 theCurrOffset=theStartOffset;
- PRInt32 theStartCommentPos=kNotFound;
- PRInt32 theAltTermStrPos=kNotFound;
+ nsReadingIterator theStartOffset, theCurrOffset, theTermStrPos, theStartCommentPos, theAltTermStrPos, endPos;
PRBool done=PR_FALSE;
PRBool theLastIteration=PR_FALSE;
PRInt32 termStrLen=aTerminalString.Length();
+ aScanner.CurrentPosition(theStartOffset);
+ theCurrOffset = theStartOffset;
+ aScanner.EndReading(endPos);
+ theTermStrPos = theStartCommentPos = theAltTermStrPos = endPos;
+
// ALGORITHM: *** The performance is based on correctness of the document ***
// 1. Look for a '<' character. This could be
// a) Start of a comment ( between ",PR_TRUE,theTermStrPos,theTermStrPos-theStartCommentPos);
- if(theCurrOffset==kNotFound) {
- // If you're here it means that we have a bogus terminal string.
- theAltTermStrPos=(theAltTermStrPos>-1)? theAltTermStrPos:theTermStrPos; // This could be helpful in case we hit the rock bottom.
- theCurrOffset=theTermStrPos+termStrLen; // We did not find '-->' so keep searching for terminal string.
- continue;
- }
- }
+
+ if (theTermStrPos != endPos) {
+ if((aMode != eDTDMode_strict) && (aMode != eDTDMode_transitional) &&
+ !theLastIteration && !aIgnoreComments) {
+ nsReadingIterator endComment(theCurrOffset);
+ endComment += 5;
+ if ((theStartCommentPos == endPos) &&
+ FindInReadable(NS_LITERAL_STRING(" between "),
+ theCurrOffset, terminal)) {
+ // If you're here it means that we have a bogus terminal string.
+
+ // Even though it is bogus, the position of the terminal string
+ // could be helpful in case we hit the rock bottom.
+ if (theAltTermStrPos != endPos) {
+ theAltTermStrPos = theTermStrPos;
+ }
+
+ // We did not find '-->' so keep searching for terminal string.
+ theCurrOffset = theTermStrPos;
+ theCurrOffset.advance(termStrLen);
+ continue;
+ }
}
}
-
+
disaster=PR_FALSE;
- theCurrOffset=theTermStrPos;
- theBuffer.Mid(aTerminalString,theTermStrPos+2,termStrLen-2);
- PRUnichar ch=theBuffer.CharAt(theTermStrPos+termStrLen);
- theTermStrPos=(ch==kGreaterThan)? theTermStrPos+termStrLen:kNotFound;
- if(theTermStrPos>kNotFound) {
- theBuffer.Mid(mTextValue,theStartOffset,theCurrOffset-theStartOffset);
- aScanner.Mark(theTermStrPos+1);
- aFlushTokens=PR_TRUE; // We found ...permit flushing -> Ref: Bug 22485
- }
- done=PR_TRUE;
+
+ aScanner.BindSubstring(mTextValue, theStartOffset, theTermStrPos);
+
+ theTermStrPos.advance(termStrLen+1);
+ aScanner.SetPosition(theTermStrPos);
+
+ // We found ...permit flushing -> Ref: Bug 22485
+ aFlushTokens=PR_TRUE;
+ done = PR_TRUE;
+ }
+ else {
+ disaster = PR_TRUE;
}
- else disaster=PR_TRUE;
}
- else disaster=PR_TRUE;
+ else {
+ disaster = PR_TRUE;
+ }
+
if(disaster) {
if(!aScanner.IsIncremental()) {
- if(theAltTermStrPos>kNotFound) {
+ if(theAltTermStrPos != endPos) {
// If you're here it means..we hit the rock bottom and therefore switch to plan B.
- theCurrOffset=theAltTermStrPos;
- theLastIteration=PR_TRUE;
+ theCurrOffset = theAltTermStrPos;
+ theLastIteration = PR_TRUE;
}
else {
- aTerminalString.Cut(0,2); // Do this to fix Bug. 35456
- done=PR_TRUE;
+ aTerminalString.Cut(0,2);
+ done = PR_TRUE; // Do this to fix Bug. 35456
}
}
else
@@ -707,6 +718,26 @@ nsresult CTextToken::ConsumeUntil(PRUnichar aChar,PRBool aIgnoreComments,nsScann
return result;
}
+void CTextToken::CopyTo(nsAWritableString& aStr)
+{
+ aStr.Assign(mTextValue);
+}
+
+const nsAReadableString& CTextToken::GetStringValue(void)
+{
+ return mTextValue;
+}
+
+void CTextToken::Bind(nsScanner* aScanner, nsReadingIterator& aStart, nsReadingIterator& aEnd)
+{
+ aScanner->BindSubstring(mTextValue, aStart, aEnd);
+}
+
+void CTextToken::Bind(const nsAReadableString& aStr)
+{
+ mTextValue.Rebind(aStr);
+}
+
/*
* default constructor
*
@@ -725,8 +756,8 @@ CCDATASectionToken::CCDATASectionToken() : CHTMLToken(eHTMLTag_unknown) {
* @param aName -- string to init token name with
* @return
*/
-CCDATASectionToken::CCDATASectionToken(const nsString& aName) : CHTMLToken(aName) {
- mTypeID=eHTMLTag_unknown;
+CCDATASectionToken::CCDATASectionToken(const nsAReadableString& aName) : CHTMLToken(eHTMLTag_unknown) {
+ mTextValue.Assign(aName);
}
/*
@@ -806,6 +837,11 @@ nsresult CCDATASectionToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt3
return result;
}
+const nsAReadableString& CCDATASectionToken::GetStringValue(void)
+{
+ return mTextValue;
+}
+
/*
* Default constructor
@@ -825,8 +861,8 @@ CCommentToken::CCommentToken() : CHTMLToken(eHTMLTag_comment) {
* @param
* @return
*/
-CCommentToken::CCommentToken(const nsString& aName) : CHTMLToken(aName) {
- mTypeID=eHTMLTag_comment;
+CCommentToken::CCommentToken(const nsAReadableString& aName) : CHTMLToken(eHTMLTag_comment) {
+ mTextValue.Assign(aName);
}
/*
@@ -918,11 +954,11 @@ nsresult ConsumeComment(PRUnichar aChar, nsScanner& aScanner,nsString& aString)
per spec (But then, neither does IE or Nav).
*********************************************************/
- PRInt32 theBestAltPos=kNotFound;
- nsString& theBuffer=aScanner.GetBuffer();
- PRInt32 theStartOffset=aScanner.GetOffset();
- PRInt32 theCurrOffset=theStartOffset;
+ nsReadingIterator theStartOffset, theCurrOffset, theBestAltPos, endPos;
+ aScanner.EndReading(endPos);
+ theBestAltPos = endPos;
+ aScanner.CurrentPosition(theStartOffset);
result=aScanner.GetChar(aChar);
if(NS_OK==result) {
if(kMinus==aChar) {
@@ -930,22 +966,26 @@ nsresult ConsumeComment(PRUnichar aChar, nsScanner& aScanner,nsString& aString)
if(NS_OK==result) {
if(kMinus==aChar) {
//in this case, we're reading a long-form comment <-- xxx -->
-
+
+ theCurrOffset = theStartOffset;
+
while((NS_OK==result)) {
- theCurrOffset=theBuffer.FindChar(kGreaterThan,PR_TRUE,theCurrOffset);
- if(kNotFound!=theCurrOffset) {
+ if (FindCharInReadable(PRUnichar(kGreaterThan), theCurrOffset, endPos)) {
theCurrOffset++;
- aChar=theBuffer[theCurrOffset-3];
+ nsReadingIterator temp = theCurrOffset;
+ temp.advance(-3);
+ aChar=*temp;
if(kMinus==aChar) {
- aChar=theBuffer[theCurrOffset-2];
+ temp++;
+ aChar=*temp;
if(kMinus==aChar) {
- theStartOffset=theStartOffset-2; // Include "")
}
}
- if(kNotFound==theBestAltPos) {
+ if(theBestAltPos == endPos) {
// If we did not find the dflt then assume that '>' is the end comment
// until we find '-->'. Nav. Compatibility -- Ref: Bug# 24006
theBestAltPos=theCurrOffset;
@@ -955,16 +995,16 @@ nsresult ConsumeComment(PRUnichar aChar, nsScanner& aScanner,nsString& aString)
result=kEOF;
}
} //while
- if((kNotFound==theCurrOffset) && (!aScanner.IsIncremental())) {
+ if((endPos==theCurrOffset) && (!aScanner.IsIncremental())) {
//if you're here, then we're in a special state.
//The problem at hand is that we've hit the end of the document without finding the normal endcomment delimiter "-->".
//In this case, the first thing we try is to see if we found one of the alternate endcomment delimiter ">".
//If so, rewind just pass than, and use everything up to that point as your comment.
//If not, the document has no end comment and should be treated as one big comment.
- if(kNotFoundAssignWithConversion("\n");
- }
- return *theStr;
+const nsAReadableString& CNewlineToken::GetStringValue(void) {
+ return *gNewlineStr;
}
/*
@@ -1105,12 +1148,6 @@ nsString& CNewlineToken::GetStringValueXXX(void) {
*/
nsresult CNewlineToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aMode) {
-#if 1
- mTextValue.Assign(kNewLine); //This is what I THINK we should be doing.
-#else
- mTextValue=aChar;
-#endif
-
/*******************************************************************
Here's what the HTML spec says about newlines:
@@ -1129,7 +1166,6 @@ nsresult CNewlineToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aMo
case kNewLine:
if(kCR==theChar) {
result=aScanner.GetChar(theChar);
- mTextValue+=theChar;
}
break;
case kCR:
@@ -1164,8 +1200,8 @@ CAttributeToken::CAttributeToken() : CHTMLToken(eHTMLTag_unknown) {
* @param aName -- string value to init token name with
* @return
*/
-CAttributeToken::CAttributeToken(const nsString& aName) : CHTMLToken(aName),
- mTextKey() {
+CAttributeToken::CAttributeToken(const nsAReadableString& aName) : CHTMLToken(eHTMLTag_unknown) {
+ mTextValue.Assign(aName);
mLastAttribute=PR_FALSE;
mHasEqualWithoutValue=PR_FALSE;
}
@@ -1178,21 +1214,9 @@ CAttributeToken::CAttributeToken(const nsString& aName) : CHTMLToken(aName),
* @param aName -- string value to init token name with
* @return
*/
-CAttributeToken::CAttributeToken(const nsString& aKey, const nsString& aName) : CHTMLToken(aName) {
- mTextKey = aKey;
- mLastAttribute=PR_FALSE;
- mHasEqualWithoutValue=PR_FALSE;
-}
-
-/**
- *
- * @update gess8/4/98
- * @param
- * @return
- */
-void CAttributeToken::Reinitialize(PRInt32 aTag, const nsString& aString){
- CHTMLToken::Reinitialize(aTag,aString);
- mTextKey.Truncate();
+CAttributeToken::CAttributeToken(const nsAReadableString& aKey, const nsAReadableString& aName) : CHTMLToken(eHTMLTag_unknown) {
+ mTextValue.Assign(aName);
+ mTextKey.Rebind(aKey);
mLastAttribute=PR_FALSE;
mHasEqualWithoutValue=PR_FALSE;
}
@@ -1229,14 +1253,28 @@ PRInt32 CAttributeToken::GetTokenType(void) {
void CAttributeToken::SanitizeKey() {
PRInt32 length=mTextKey.Length();
if(length > 0) {
- PRUnichar theChar=mTextKey.Last();
- while(!nsCRT::IsAsciiAlpha(theChar) && !nsCRT::IsAsciiDigit(theChar)) {
- mTextKey.Truncate(length-1);
- length = mTextKey.Length();
- if(length <= 0) break;
- theChar = mTextKey.Last();
+ nsReadingIterator iter, begin, end;
+ mTextKey.BeginReading(begin);
+ mTextKey.EndReading(end);
+ iter = end;
+
+ // Look for the first legal character starting from
+ // the end of the string
+ do {
+ --iter;
+ } while (!nsCRT::IsAsciiAlpha(*iter) &&
+ !nsCRT::IsAsciiDigit(*iter) &&
+ (iter != begin));
+
+ // If there were any illegal characters, just copy out the
+ // legal part
+ if (iter != --end) {
+ nsAutoString str;
+ CopyUnicodeTo(begin, iter, str);
+ mTextKey.Rebind(str);
}
}
+
return;
}
@@ -1249,11 +1287,17 @@ void CAttributeToken::SanitizeKey() {
*/
void CAttributeToken::DebugDumpToken(nsOutputStream& out) {
char buffer[200];
- mTextKey.ToCString(buffer,sizeof(buffer));
- out << "[" << GetClassName() << "] " << buffer << "=";
+ nsCAutoString str;
+ CopyUCS2toASCII(mTextKey, str);
+ out << "[" << GetClassName() << "] " << str.GetBuffer() << "=";
mTextValue.ToCString(buffer,sizeof(buffer));
out << buffer << ": " << mTypeID << nsEndl;
}
+
+const nsAReadableString& CAttributeToken::GetStringValue(void)
+{
+ return mTextValue;
+}
/*
*
@@ -1275,10 +1319,10 @@ void CAttributeToken::GetSource(nsString& anOutputString){
* @return nada
*/
void CAttributeToken::AppendSource(nsString& anOutputString){
- anOutputString+=mTextKey;
+ anOutputString.Append(mTextKey);
if(mTextValue.Length() || mHasEqualWithoutValue)
anOutputString.AppendWithConversion("=");
- anOutputString+=mTextValue;
+ anOutputString.Append(mTextValue);
// anOutputString.AppendWithConversion(";");
}
@@ -1293,7 +1337,8 @@ void CAttributeToken::AppendSource(nsString& anOutputString){
*/
nsresult ConsumeQuotedString(PRUnichar aChar,nsString& aString,nsScanner& aScanner){
nsresult result=NS_OK;
- PRInt32 theOffset=aScanner.GetOffset();
+ nsReadingIterator theOffset;
+ aScanner.CurrentPosition(theOffset);
switch(aChar) {
case kQuote:
@@ -1316,7 +1361,7 @@ nsresult ConsumeQuotedString(PRUnichar aChar,nsString& aString,nsScanner& aScann
PRUnichar ch=aString.Last();
if(ch!=aChar) {
if(!aScanner.IsIncremental() && result==kEOF) {
- aScanner.Mark(theOffset);
+ aScanner.SetPosition(theOffset, PR_FALSE, PR_TRUE);
aString.Assign(aChar);
result=kBadStringLiteral;
}
@@ -1374,41 +1419,36 @@ nsresult CAttributeToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 a
//I changed a bit of this method to use aRetainWhitespace so that we do the right
//thing in viewsource. The ws/cr/lf sequences are now maintained, and viewsource looks good.
- result=(aRetainWhitespace) ? aScanner.ReadWhitespace(mTextKey) : aScanner.SkipWhitespace();
+ nsReadingIterator wsstart, wsend;
+ result=(aRetainWhitespace) ? aScanner.ReadWhitespace(wsstart, wsend) : aScanner.SkipWhitespace();
if(NS_OK==result) {
result=aScanner.Peek(aChar);
if(NS_OK==result) {
- if(kQuote==aChar) { //if you're here, handle quoted key...
- result=aScanner.GetChar(aChar); //skip the quote character...
- if(NS_OK==result) {
- mTextKey.Append(aChar);
- result=ConsumeQuotedString(aChar,mTextKey,aScanner);
- if(result==kBadStringLiteral) {
- // Ref. Bug: 58455
- // If you're here it means that we have searched all the way thro'
- // the document for a matching quote and haven't found it. Tell the
- // caller that we are done searching and proceed with whatever we have.
- result=NS_OK;
- }
- if(!aRetainWhitespace)
- mTextKey.StripChars("\r\n"); //per the HTML spec, ignore linefeeds...
- }//if
- }
- else if((kHashsign==aChar) || (nsCRT::IsAsciiDigit(aChar))){
- result=aScanner.ReadNumber(mTextKey);
+ nsReadingIterator start, end;
+ if((kHashsign==aChar) || (nsCRT::IsAsciiDigit(aChar))){
+ result=aScanner.ReadNumber(start, end);
}
else {
//If you're here, handle an unquoted key.
- static nsString theTerminals = NS_ConvertToString("\b\t\n\r \"=>",8);
- result=aScanner.ReadUntil(mTextKey,theTerminals,PR_FALSE);
+ static nsAutoString theTerminals = NS_ConvertToString("\b\t\n\r \"=>",8);
+ result=aScanner.ReadUntil(start,end,theTerminals,PR_FALSE);
+ }
+ if (!aRetainWhitespace) {
+ aScanner.BindSubstring(mTextKey, start, end);
}
//now it's time to Consume the (optional) value...
if(NS_OK==result) {
- result=(aRetainWhitespace) ? aScanner.ReadWhitespace(mTextKey) : aScanner.SkipWhitespace();
+ if (aRetainWhitespace) {
+ aScanner.ReadWhitespace(start, wsend);
+ aScanner.BindSubstring(mTextKey, wsstart, wsend);
+ }
+ else {
+ aScanner.SkipWhitespace();
+ }
if(NS_OK==result) {
result=aScanner.Peek(aChar); //Skip ahead until you find an equal sign or a '>'...
@@ -1420,9 +1460,10 @@ nsresult CAttributeToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 a
result=(aRetainWhitespace) ? aScanner.ReadWhitespace(mTextValue) : aScanner.SkipWhitespace();
if(NS_OK==result) {
- result=aScanner.GetChar(aChar); //and grab the next char.
+ result=aScanner.Peek(aChar); //and grab the next char.
if(NS_OK==result) {
if((kQuote==aChar) || (kApostrophe==aChar)) {
+ aScanner.GetChar(aChar);
mTextValue.Append(aChar);
result=ConsumeQuotedString(aChar,mTextValue,aScanner);
if(result==kBadStringLiteral) {
@@ -1439,11 +1480,11 @@ nsresult CAttributeToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 a
}
else if(kGreaterThan==aChar){
mHasEqualWithoutValue=PR_TRUE;
- result=aScanner.PutBack(aChar);
}
else if(kAmpersand==aChar) {
// XXX - Discard script entity for now....except in
// view-source
+ aScanner.GetChar(aChar);
PRBool discard=!aRetainWhitespace;
mTextValue.Append(aChar);
result=aScanner.GetChar(aChar);
@@ -1454,6 +1495,7 @@ nsresult CAttributeToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 a
if(discard) mTextValue.Truncate();
}
else {
+ aScanner.GetChar(aChar);
mTextValue.Append(aChar); //it's an alphanum attribute...
result=ConsumeAttributeValueText(aChar,mTextValue,aScanner);
}
@@ -1500,8 +1542,9 @@ nsresult CAttributeToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 a
*/
void CAttributeToken::DebugDumpSource(nsOutputStream& out) {
static char buffer[1000];
- mTextKey.ToCString(buffer,sizeof(buffer));
- out << " " << buffer;
+ nsCAutoString str;
+ CopyUCS2toASCII(mTextKey, str);
+ out << " " << str.GetBuffer();
if(mTextValue.Length()){
mTextValue.ToCString(buffer,sizeof(buffer));
out << "=" << buffer;
@@ -1510,6 +1553,18 @@ void CAttributeToken::DebugDumpSource(nsOutputStream& out) {
out<<">";
}
+void CAttributeToken::SetKey(const nsAReadableString& aKey)
+{
+ mTextKey.Rebind(aKey);
+}
+
+void CAttributeToken::BindKey(nsScanner* aScanner,
+ nsReadingIterator& aStart,
+ nsReadingIterator& aEnd)
+{
+ aScanner->BindSubstring(mTextKey, aStart, aEnd);
+}
+
/*
* default constructor
*
@@ -1528,8 +1583,8 @@ CWhitespaceToken::CWhitespaceToken() : CHTMLToken(eHTMLTag_whitespace) {
* @param aName -- string value to init token name with
* @return
*/
-CWhitespaceToken::CWhitespaceToken(const nsString& aName) : CHTMLToken(aName) {
- mTypeID=eHTMLTag_whitespace;
+CWhitespaceToken::CWhitespaceToken(const nsAReadableString& aName) : CHTMLToken(eHTMLTag_whitespace) {
+ mTextValue.Assign(aName);
}
/*
@@ -1572,6 +1627,11 @@ nsresult CWhitespaceToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32
return result;
}
+const nsAReadableString& CWhitespaceToken::GetStringValue(void)
+{
+ return mTextValue;
+}
+
/*
* default constructor
*
@@ -1589,8 +1649,8 @@ CEntityToken::CEntityToken() : CHTMLToken(eHTMLTag_entity) {
* @param aName -- string value to init token name with
* @return
*/
-CEntityToken::CEntityToken(const nsString& aName) : CHTMLToken(aName) {
- mTypeID=eHTMLTag_entity;
+CEntityToken::CEntityToken(const nsAReadableString& aName) : CHTMLToken(eHTMLTag_entity) {
+ mTextValue.Assign(aName);
#ifdef VERBOSE_DEBUG
if(!VerifyEntityTable()) {
cout<<"Entity table is invalid!" << endl;
@@ -1796,6 +1856,11 @@ void CEntityToken::DebugDumpSource(nsOutputStream& out) {
delete[] cp;
}
+const nsAReadableString& CEntityToken::GetStringValue(void)
+{
+ return mTextValue;
+}
+
/*
*
*
@@ -1839,7 +1904,8 @@ CScriptToken::CScriptToken() : CHTMLToken(eHTMLTag_script) {
* @param aName -- string to init token name with
* @return
*/
-CScriptToken::CScriptToken(const nsString& aString) : CHTMLToken(aString,eHTMLTag_script) {
+CScriptToken::CScriptToken(const nsAReadableString& aString) : CHTMLToken(eHTMLTag_script) {
+ mTextValue.Assign(aString);
}
@@ -1865,6 +1931,11 @@ PRInt32 CScriptToken::GetTokenType(void) {
return eToken_script;
}
+const nsAReadableString& CScriptToken::GetStringValue(void)
+{
+ return mTextValue;
+}
+
/*
* default constructor
*
@@ -1875,6 +1946,10 @@ PRInt32 CScriptToken::GetTokenType(void) {
CStyleToken::CStyleToken() : CHTMLToken(eHTMLTag_style) {
}
+CStyleToken::CStyleToken(const nsAReadableString& aString) : CHTMLToken(eHTMLTag_style) {
+ mTextValue.Assign(aString);
+}
+
/*
*
*
@@ -1897,138 +1972,11 @@ PRInt32 CStyleToken::GetTokenType(void) {
return eToken_style;
}
-
-/*
- * string based constructor
- *
- * @update gess 3/25/98
- * @param aName -- string value to init token name with
- * @return
- */
-CSkippedContentToken::CSkippedContentToken(const nsString& aName) : CAttributeToken(aName) {
- mTextKey.AssignWithConversion("$skipped-content");/* XXX need a better answer! */
+const nsAReadableString& CStyleToken::GetStringValue(void)
+{
+ return mTextValue;
}
-/*
- *
- *
- * @update gess 3/25/98
- * @param
- * @return
- */
-const char* CSkippedContentToken::GetClassName(void) {
- return "skipped";
-}
-
-/*
- * Retrieve the token type as an int.
- * @update gess 3/25/98
- * @return
- */
-PRInt32 CSkippedContentToken::GetTokenType(void) {
- return eToken_skippedcontent;
-}
-
-/*
- * Consume content until you find an end sequence that matches
- * this objects current mTextValue. Note that this is complicated
- * by the fact that you can be parsing content that itself
- * contains quoted content of the same type (like ...permit flushing -> Ref: Bug 22485
- }
- done=PR_TRUE;
+
+ aScanner.BindSubstring(mTextValue, theStartOffset, theTermStrPos);
+
+ theTermStrPos.advance(termStrLen+1);
+ aScanner.SetPosition(theTermStrPos);
+
+ // We found ...permit flushing -> Ref: Bug 22485
+ aFlushTokens=PR_TRUE;
+ done = PR_TRUE;
+ }
+ else {
+ disaster = PR_TRUE;
}
- else disaster=PR_TRUE;
}
- else disaster=PR_TRUE;
+ else {
+ disaster = PR_TRUE;
+ }
+
if(disaster) {
if(!aScanner.IsIncremental()) {
- if(theAltTermStrPos>kNotFound) {
+ if(theAltTermStrPos != endPos) {
// If you're here it means..we hit the rock bottom and therefore switch to plan B.
- theCurrOffset=theAltTermStrPos;
- theLastIteration=PR_TRUE;
+ theCurrOffset = theAltTermStrPos;
+ theLastIteration = PR_TRUE;
}
else {
- aTerminalString.Cut(0,2); // Do this to fix Bug. 35456
- done=PR_TRUE;
+ aTerminalString.Cut(0,2);
+ done = PR_TRUE; // Do this to fix Bug. 35456
}
}
else
@@ -707,6 +718,26 @@ nsresult CTextToken::ConsumeUntil(PRUnichar aChar,PRBool aIgnoreComments,nsScann
return result;
}
+void CTextToken::CopyTo(nsAWritableString& aStr)
+{
+ aStr.Assign(mTextValue);
+}
+
+const nsAReadableString& CTextToken::GetStringValue(void)
+{
+ return mTextValue;
+}
+
+void CTextToken::Bind(nsScanner* aScanner, nsReadingIterator& aStart, nsReadingIterator& aEnd)
+{
+ aScanner->BindSubstring(mTextValue, aStart, aEnd);
+}
+
+void CTextToken::Bind(const nsAReadableString& aStr)
+{
+ mTextValue.Rebind(aStr);
+}
+
/*
* default constructor
*
@@ -725,8 +756,8 @@ CCDATASectionToken::CCDATASectionToken() : CHTMLToken(eHTMLTag_unknown) {
* @param aName -- string to init token name with
* @return
*/
-CCDATASectionToken::CCDATASectionToken(const nsString& aName) : CHTMLToken(aName) {
- mTypeID=eHTMLTag_unknown;
+CCDATASectionToken::CCDATASectionToken(const nsAReadableString& aName) : CHTMLToken(eHTMLTag_unknown) {
+ mTextValue.Assign(aName);
}
/*
@@ -806,6 +837,11 @@ nsresult CCDATASectionToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt3
return result;
}
+const nsAReadableString& CCDATASectionToken::GetStringValue(void)
+{
+ return mTextValue;
+}
+
/*
* Default constructor
@@ -825,8 +861,8 @@ CCommentToken::CCommentToken() : CHTMLToken(eHTMLTag_comment) {
* @param
* @return
*/
-CCommentToken::CCommentToken(const nsString& aName) : CHTMLToken(aName) {
- mTypeID=eHTMLTag_comment;
+CCommentToken::CCommentToken(const nsAReadableString& aName) : CHTMLToken(eHTMLTag_comment) {
+ mTextValue.Assign(aName);
}
/*
@@ -918,11 +954,11 @@ nsresult ConsumeComment(PRUnichar aChar, nsScanner& aScanner,nsString& aString)
per spec (But then, neither does IE or Nav).
*********************************************************/
- PRInt32 theBestAltPos=kNotFound;
- nsString& theBuffer=aScanner.GetBuffer();
- PRInt32 theStartOffset=aScanner.GetOffset();
- PRInt32 theCurrOffset=theStartOffset;
+ nsReadingIterator theStartOffset, theCurrOffset, theBestAltPos, endPos;
+ aScanner.EndReading(endPos);
+ theBestAltPos = endPos;
+ aScanner.CurrentPosition(theStartOffset);
result=aScanner.GetChar(aChar);
if(NS_OK==result) {
if(kMinus==aChar) {
@@ -930,22 +966,26 @@ nsresult ConsumeComment(PRUnichar aChar, nsScanner& aScanner,nsString& aString)
if(NS_OK==result) {
if(kMinus==aChar) {
//in this case, we're reading a long-form comment <-- xxx -->
-
+
+ theCurrOffset = theStartOffset;
+
while((NS_OK==result)) {
- theCurrOffset=theBuffer.FindChar(kGreaterThan,PR_TRUE,theCurrOffset);
- if(kNotFound!=theCurrOffset) {
+ if (FindCharInReadable(PRUnichar(kGreaterThan), theCurrOffset, endPos)) {
theCurrOffset++;
- aChar=theBuffer[theCurrOffset-3];
+ nsReadingIterator temp = theCurrOffset;
+ temp.advance(-3);
+ aChar=*temp;
if(kMinus==aChar) {
- aChar=theBuffer[theCurrOffset-2];
+ temp++;
+ aChar=*temp;
if(kMinus==aChar) {
- theStartOffset=theStartOffset-2; // Include "")
}
}
- if(kNotFound==theBestAltPos) {
+ if(theBestAltPos == endPos) {
// If we did not find the dflt then assume that '>' is the end comment
// until we find '-->'. Nav. Compatibility -- Ref: Bug# 24006
theBestAltPos=theCurrOffset;
@@ -955,16 +995,16 @@ nsresult ConsumeComment(PRUnichar aChar, nsScanner& aScanner,nsString& aString)
result=kEOF;
}
} //while
- if((kNotFound==theCurrOffset) && (!aScanner.IsIncremental())) {
+ if((endPos==theCurrOffset) && (!aScanner.IsIncremental())) {
//if you're here, then we're in a special state.
//The problem at hand is that we've hit the end of the document without finding the normal endcomment delimiter "-->".
//In this case, the first thing we try is to see if we found one of the alternate endcomment delimiter ">".
//If so, rewind just pass than, and use everything up to that point as your comment.
//If not, the document has no end comment and should be treated as one big comment.
- if(kNotFoundAssignWithConversion("\n");
- }
- return *theStr;
+const nsAReadableString& CNewlineToken::GetStringValue(void) {
+ return *gNewlineStr;
}
/*
@@ -1105,12 +1148,6 @@ nsString& CNewlineToken::GetStringValueXXX(void) {
*/
nsresult CNewlineToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aMode) {
-#if 1
- mTextValue.Assign(kNewLine); //This is what I THINK we should be doing.
-#else
- mTextValue=aChar;
-#endif
-
/*******************************************************************
Here's what the HTML spec says about newlines:
@@ -1129,7 +1166,6 @@ nsresult CNewlineToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 aMo
case kNewLine:
if(kCR==theChar) {
result=aScanner.GetChar(theChar);
- mTextValue+=theChar;
}
break;
case kCR:
@@ -1164,8 +1200,8 @@ CAttributeToken::CAttributeToken() : CHTMLToken(eHTMLTag_unknown) {
* @param aName -- string value to init token name with
* @return
*/
-CAttributeToken::CAttributeToken(const nsString& aName) : CHTMLToken(aName),
- mTextKey() {
+CAttributeToken::CAttributeToken(const nsAReadableString& aName) : CHTMLToken(eHTMLTag_unknown) {
+ mTextValue.Assign(aName);
mLastAttribute=PR_FALSE;
mHasEqualWithoutValue=PR_FALSE;
}
@@ -1178,21 +1214,9 @@ CAttributeToken::CAttributeToken(const nsString& aName) : CHTMLToken(aName),
* @param aName -- string value to init token name with
* @return
*/
-CAttributeToken::CAttributeToken(const nsString& aKey, const nsString& aName) : CHTMLToken(aName) {
- mTextKey = aKey;
- mLastAttribute=PR_FALSE;
- mHasEqualWithoutValue=PR_FALSE;
-}
-
-/**
- *
- * @update gess8/4/98
- * @param
- * @return
- */
-void CAttributeToken::Reinitialize(PRInt32 aTag, const nsString& aString){
- CHTMLToken::Reinitialize(aTag,aString);
- mTextKey.Truncate();
+CAttributeToken::CAttributeToken(const nsAReadableString& aKey, const nsAReadableString& aName) : CHTMLToken(eHTMLTag_unknown) {
+ mTextValue.Assign(aName);
+ mTextKey.Rebind(aKey);
mLastAttribute=PR_FALSE;
mHasEqualWithoutValue=PR_FALSE;
}
@@ -1229,14 +1253,28 @@ PRInt32 CAttributeToken::GetTokenType(void) {
void CAttributeToken::SanitizeKey() {
PRInt32 length=mTextKey.Length();
if(length > 0) {
- PRUnichar theChar=mTextKey.Last();
- while(!nsCRT::IsAsciiAlpha(theChar) && !nsCRT::IsAsciiDigit(theChar)) {
- mTextKey.Truncate(length-1);
- length = mTextKey.Length();
- if(length <= 0) break;
- theChar = mTextKey.Last();
+ nsReadingIterator iter, begin, end;
+ mTextKey.BeginReading(begin);
+ mTextKey.EndReading(end);
+ iter = end;
+
+ // Look for the first legal character starting from
+ // the end of the string
+ do {
+ --iter;
+ } while (!nsCRT::IsAsciiAlpha(*iter) &&
+ !nsCRT::IsAsciiDigit(*iter) &&
+ (iter != begin));
+
+ // If there were any illegal characters, just copy out the
+ // legal part
+ if (iter != --end) {
+ nsAutoString str;
+ CopyUnicodeTo(begin, iter, str);
+ mTextKey.Rebind(str);
}
}
+
return;
}
@@ -1249,11 +1287,17 @@ void CAttributeToken::SanitizeKey() {
*/
void CAttributeToken::DebugDumpToken(nsOutputStream& out) {
char buffer[200];
- mTextKey.ToCString(buffer,sizeof(buffer));
- out << "[" << GetClassName() << "] " << buffer << "=";
+ nsCAutoString str;
+ CopyUCS2toASCII(mTextKey, str);
+ out << "[" << GetClassName() << "] " << str.GetBuffer() << "=";
mTextValue.ToCString(buffer,sizeof(buffer));
out << buffer << ": " << mTypeID << nsEndl;
}
+
+const nsAReadableString& CAttributeToken::GetStringValue(void)
+{
+ return mTextValue;
+}
/*
*
@@ -1275,10 +1319,10 @@ void CAttributeToken::GetSource(nsString& anOutputString){
* @return nada
*/
void CAttributeToken::AppendSource(nsString& anOutputString){
- anOutputString+=mTextKey;
+ anOutputString.Append(mTextKey);
if(mTextValue.Length() || mHasEqualWithoutValue)
anOutputString.AppendWithConversion("=");
- anOutputString+=mTextValue;
+ anOutputString.Append(mTextValue);
// anOutputString.AppendWithConversion(";");
}
@@ -1293,7 +1337,8 @@ void CAttributeToken::AppendSource(nsString& anOutputString){
*/
nsresult ConsumeQuotedString(PRUnichar aChar,nsString& aString,nsScanner& aScanner){
nsresult result=NS_OK;
- PRInt32 theOffset=aScanner.GetOffset();
+ nsReadingIterator theOffset;
+ aScanner.CurrentPosition(theOffset);
switch(aChar) {
case kQuote:
@@ -1316,7 +1361,7 @@ nsresult ConsumeQuotedString(PRUnichar aChar,nsString& aString,nsScanner& aScann
PRUnichar ch=aString.Last();
if(ch!=aChar) {
if(!aScanner.IsIncremental() && result==kEOF) {
- aScanner.Mark(theOffset);
+ aScanner.SetPosition(theOffset, PR_FALSE, PR_TRUE);
aString.Assign(aChar);
result=kBadStringLiteral;
}
@@ -1374,41 +1419,36 @@ nsresult CAttributeToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 a
//I changed a bit of this method to use aRetainWhitespace so that we do the right
//thing in viewsource. The ws/cr/lf sequences are now maintained, and viewsource looks good.
- result=(aRetainWhitespace) ? aScanner.ReadWhitespace(mTextKey) : aScanner.SkipWhitespace();
+ nsReadingIterator wsstart, wsend;
+ result=(aRetainWhitespace) ? aScanner.ReadWhitespace(wsstart, wsend) : aScanner.SkipWhitespace();
if(NS_OK==result) {
result=aScanner.Peek(aChar);
if(NS_OK==result) {
- if(kQuote==aChar) { //if you're here, handle quoted key...
- result=aScanner.GetChar(aChar); //skip the quote character...
- if(NS_OK==result) {
- mTextKey.Append(aChar);
- result=ConsumeQuotedString(aChar,mTextKey,aScanner);
- if(result==kBadStringLiteral) {
- // Ref. Bug: 58455
- // If you're here it means that we have searched all the way thro'
- // the document for a matching quote and haven't found it. Tell the
- // caller that we are done searching and proceed with whatever we have.
- result=NS_OK;
- }
- if(!aRetainWhitespace)
- mTextKey.StripChars("\r\n"); //per the HTML spec, ignore linefeeds...
- }//if
- }
- else if((kHashsign==aChar) || (nsCRT::IsAsciiDigit(aChar))){
- result=aScanner.ReadNumber(mTextKey);
+ nsReadingIterator start, end;
+ if((kHashsign==aChar) || (nsCRT::IsAsciiDigit(aChar))){
+ result=aScanner.ReadNumber(start, end);
}
else {
//If you're here, handle an unquoted key.
- static nsString theTerminals = NS_ConvertToString("\b\t\n\r \"=>",8);
- result=aScanner.ReadUntil(mTextKey,theTerminals,PR_FALSE);
+ static nsAutoString theTerminals = NS_ConvertToString("\b\t\n\r \"=>",8);
+ result=aScanner.ReadUntil(start,end,theTerminals,PR_FALSE);
+ }
+ if (!aRetainWhitespace) {
+ aScanner.BindSubstring(mTextKey, start, end);
}
//now it's time to Consume the (optional) value...
if(NS_OK==result) {
- result=(aRetainWhitespace) ? aScanner.ReadWhitespace(mTextKey) : aScanner.SkipWhitespace();
+ if (aRetainWhitespace) {
+ aScanner.ReadWhitespace(start, wsend);
+ aScanner.BindSubstring(mTextKey, wsstart, wsend);
+ }
+ else {
+ aScanner.SkipWhitespace();
+ }
if(NS_OK==result) {
result=aScanner.Peek(aChar); //Skip ahead until you find an equal sign or a '>'...
@@ -1420,9 +1460,10 @@ nsresult CAttributeToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 a
result=(aRetainWhitespace) ? aScanner.ReadWhitespace(mTextValue) : aScanner.SkipWhitespace();
if(NS_OK==result) {
- result=aScanner.GetChar(aChar); //and grab the next char.
+ result=aScanner.Peek(aChar); //and grab the next char.
if(NS_OK==result) {
if((kQuote==aChar) || (kApostrophe==aChar)) {
+ aScanner.GetChar(aChar);
mTextValue.Append(aChar);
result=ConsumeQuotedString(aChar,mTextValue,aScanner);
if(result==kBadStringLiteral) {
@@ -1439,11 +1480,11 @@ nsresult CAttributeToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 a
}
else if(kGreaterThan==aChar){
mHasEqualWithoutValue=PR_TRUE;
- result=aScanner.PutBack(aChar);
}
else if(kAmpersand==aChar) {
// XXX - Discard script entity for now....except in
// view-source
+ aScanner.GetChar(aChar);
PRBool discard=!aRetainWhitespace;
mTextValue.Append(aChar);
result=aScanner.GetChar(aChar);
@@ -1454,6 +1495,7 @@ nsresult CAttributeToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 a
if(discard) mTextValue.Truncate();
}
else {
+ aScanner.GetChar(aChar);
mTextValue.Append(aChar); //it's an alphanum attribute...
result=ConsumeAttributeValueText(aChar,mTextValue,aScanner);
}
@@ -1500,8 +1542,9 @@ nsresult CAttributeToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32 a
*/
void CAttributeToken::DebugDumpSource(nsOutputStream& out) {
static char buffer[1000];
- mTextKey.ToCString(buffer,sizeof(buffer));
- out << " " << buffer;
+ nsCAutoString str;
+ CopyUCS2toASCII(mTextKey, str);
+ out << " " << str.GetBuffer();
if(mTextValue.Length()){
mTextValue.ToCString(buffer,sizeof(buffer));
out << "=" << buffer;
@@ -1510,6 +1553,18 @@ void CAttributeToken::DebugDumpSource(nsOutputStream& out) {
out<<">";
}
+void CAttributeToken::SetKey(const nsAReadableString& aKey)
+{
+ mTextKey.Rebind(aKey);
+}
+
+void CAttributeToken::BindKey(nsScanner* aScanner,
+ nsReadingIterator& aStart,
+ nsReadingIterator& aEnd)
+{
+ aScanner->BindSubstring(mTextKey, aStart, aEnd);
+}
+
/*
* default constructor
*
@@ -1528,8 +1583,8 @@ CWhitespaceToken::CWhitespaceToken() : CHTMLToken(eHTMLTag_whitespace) {
* @param aName -- string value to init token name with
* @return
*/
-CWhitespaceToken::CWhitespaceToken(const nsString& aName) : CHTMLToken(aName) {
- mTypeID=eHTMLTag_whitespace;
+CWhitespaceToken::CWhitespaceToken(const nsAReadableString& aName) : CHTMLToken(eHTMLTag_whitespace) {
+ mTextValue.Assign(aName);
}
/*
@@ -1572,6 +1627,11 @@ nsresult CWhitespaceToken::Consume(PRUnichar aChar, nsScanner& aScanner,PRInt32
return result;
}
+const nsAReadableString& CWhitespaceToken::GetStringValue(void)
+{
+ return mTextValue;
+}
+
/*
* default constructor
*
@@ -1589,8 +1649,8 @@ CEntityToken::CEntityToken() : CHTMLToken(eHTMLTag_entity) {
* @param aName -- string value to init token name with
* @return
*/
-CEntityToken::CEntityToken(const nsString& aName) : CHTMLToken(aName) {
- mTypeID=eHTMLTag_entity;
+CEntityToken::CEntityToken(const nsAReadableString& aName) : CHTMLToken(eHTMLTag_entity) {
+ mTextValue.Assign(aName);
#ifdef VERBOSE_DEBUG
if(!VerifyEntityTable()) {
cout<<"Entity table is invalid!" << endl;
@@ -1796,6 +1856,11 @@ void CEntityToken::DebugDumpSource(nsOutputStream& out) {
delete[] cp;
}
+const nsAReadableString& CEntityToken::GetStringValue(void)
+{
+ return mTextValue;
+}
+
/*
*
*
@@ -1839,7 +1904,8 @@ CScriptToken::CScriptToken() : CHTMLToken(eHTMLTag_script) {
* @param aName -- string to init token name with
* @return
*/
-CScriptToken::CScriptToken(const nsString& aString) : CHTMLToken(aString,eHTMLTag_script) {
+CScriptToken::CScriptToken(const nsAReadableString& aString) : CHTMLToken(eHTMLTag_script) {
+ mTextValue.Assign(aString);
}
@@ -1865,6 +1931,11 @@ PRInt32 CScriptToken::GetTokenType(void) {
return eToken_script;
}
+const nsAReadableString& CScriptToken::GetStringValue(void)
+{
+ return mTextValue;
+}
+
/*
* default constructor
*
@@ -1875,6 +1946,10 @@ PRInt32 CScriptToken::GetTokenType(void) {
CStyleToken::CStyleToken() : CHTMLToken(eHTMLTag_style) {
}
+CStyleToken::CStyleToken(const nsAReadableString& aString) : CHTMLToken(eHTMLTag_style) {
+ mTextValue.Assign(aString);
+}
+
/*
*
*
@@ -1897,138 +1972,11 @@ PRInt32 CStyleToken::GetTokenType(void) {
return eToken_style;
}
-
-/*
- * string based constructor
- *
- * @update gess 3/25/98
- * @param aName -- string value to init token name with
- * @return
- */
-CSkippedContentToken::CSkippedContentToken(const nsString& aName) : CAttributeToken(aName) {
- mTextKey.AssignWithConversion("$skipped-content");/* XXX need a better answer! */
+const nsAReadableString& CStyleToken::GetStringValue(void)
+{
+ return mTextValue;
}
-/*
- *
- *
- * @update gess 3/25/98
- * @param
- * @return
- */
-const char* CSkippedContentToken::GetClassName(void) {
- return "skipped";
-}
-
-/*
- * Retrieve the token type as an int.
- * @update gess 3/25/98
- * @return
- */
-PRInt32 CSkippedContentToken::GetTokenType(void) {
- return eToken_skippedcontent;
-}
-
-/*
- * Consume content until you find an end sequence that matches
- * this objects current mTextValue. Note that this is complicated
- * by the fact that you can be parsing content that itself
- * contains quoted content of the same type (like