Bug 184001, do not copy external DTDs into internal subset, r=harishd, sr=jst, a=asa.

This commit is contained in:
heikki%netscape.com 2003-01-31 19:21:24 +00:00
parent 1885f3315d
commit b68801109e
4 changed files with 84 additions and 42 deletions

View File

@ -302,6 +302,7 @@ nsExpatDriver::nsExpatDriver()
:mExpatParser(0),
mInCData(PR_FALSE),
mInDoctype(PR_FALSE),
mInExternalDTD(PR_FALSE),
mHandledXMLDeclaration(PR_FALSE),
mBytePosition(0),
mInternalState(NS_OK),
@ -373,8 +374,10 @@ nsExpatDriver::HandleComment(const PRUnichar *aValue)
NS_ASSERTION(mSink, "content sink not found!");
if (mInDoctype) {
if (!mInExternalDTD) {
mDoctypeText.Append(aValue);
}
}
else if (mSink){
mInternalState = mSink->HandleComment(aValue);
}
@ -430,8 +433,10 @@ nsExpatDriver::HandleDefault(const PRUnichar *aValue,
NS_ASSERTION(mSink, "content sink not found!");
if (mInDoctype) {
if (!mInExternalDTD) {
mDoctypeText.Append(aValue, aLength);
}
}
else if (mSink) {
if (!mHandledXMLDeclaration && !mBytesParsed) {
static const PRUnichar xmlDecl[] = {'<', '?', 'x', 'm', 'l', ' ', '\0'};
@ -508,8 +513,8 @@ nsExpatDriver::HandleStartDoctypeDecl()
mInDoctype = PR_TRUE;
// Consuming a huge DOCTYPE translates to numerous
// allocations. In an effort to avoid too many allocations
// setting mDoctypeText's capacity to be 20K ( just a guesstimate! ).
mDoctypeText.SetCapacity(20480);
// setting mDoctypeText's capacity to be 1K ( just a guesstimate! ).
mDoctypeText.SetCapacity(1024);
return NS_OK;
}
@ -570,7 +575,11 @@ nsExpatDriver::HandleExternalEntityRef(const PRUnichar *openEntityNames,
nsCOMPtr<nsIInputStream> in;
nsAutoString absURL;
nsresult rv = OpenInputStream(publicId, systemId, base, getter_AddRefs(in), absURL);
nsresult rv = OpenInputStreamFromExternalDTD(publicId,
systemId,
base,
getter_AddRefs(in),
absURL);
if (NS_FAILED(rv)) {
return result;
@ -578,23 +587,31 @@ nsExpatDriver::HandleExternalEntityRef(const PRUnichar *openEntityNames,
nsCOMPtr<nsIUnicharInputStream> uniIn;
NS_NewUTF8ConverterStream(getter_AddRefs(uniIn), in, 1024);
rv = NS_NewUTF8ConverterStream(getter_AddRefs(uniIn), in, 1024);
if (NS_FAILED(rv)) {
return result;
}
if (uniIn) {
XML_Parser entParser =
XML_ExternalEntityParserCreate(mExpatParser, 0, (const XML_Char*) NS_LITERAL_STRING("UTF-16").get());
XML_ExternalEntityParserCreate(
mExpatParser,
0,
(const XML_Char*) NS_LITERAL_STRING("UTF-16").get());
if (entParser) {
PRUint32 readCount = 0;
PRUnichar tmpBuff[1024] = {0};
PRUnichar *uniBuf = tmpBuff;
PRUnichar uniBuff[1024] = {0};
XML_SetBase(entParser, (const XML_Char*) absURL.get());
while (NS_SUCCEEDED(uniIn->Read(uniBuf, 0, 1024, &readCount)) && result) {
mInExternalDTD = PR_TRUE;
while (NS_SUCCEEDED(uniIn->Read(uniBuff, 0, 1024, &readCount)) && result) {
if (readCount) {
// Pass the buffer to expat for parsing
result = XML_Parse(entParser, (char *)uniBuf, readCount * sizeof(PRUnichar), 0);
result = XML_Parse(entParser, (char *)uniBuff, readCount * sizeof(PRUnichar), 0);
}
else {
// done reading
@ -602,6 +619,9 @@ nsExpatDriver::HandleExternalEntityRef(const PRUnichar *openEntityNames,
break;
}
}
mInExternalDTD = PR_FALSE;
XML_ParserFree(entParser);
}
}
@ -610,7 +630,7 @@ nsExpatDriver::HandleExternalEntityRef(const PRUnichar *openEntityNames,
}
nsresult
nsExpatDriver::OpenInputStream(const PRUnichar* aFPIStr,
nsExpatDriver::OpenInputStreamFromExternalDTD(const PRUnichar* aFPIStr,
const PRUnichar* aURLStr,
const PRUnichar* aBaseURL,
nsIInputStream** in,

View File

@ -78,7 +78,7 @@ public:
protected:
// Load up an external stream to get external entity information
nsresult OpenInputStream(const PRUnichar* aFPIStr,
nsresult OpenInputStreamFromExternalDTD(const PRUnichar* aFPIStr,
const PRUnichar* aURLStr,
const PRUnichar* aBaseURL,
nsIInputStream** in,
@ -94,6 +94,7 @@ protected:
nsString mDoctypeText;
PRPackedBool mInCData;
PRPackedBool mInDoctype;
PRPackedBool mInExternalDTD;
PRPackedBool mHandledXMLDeclaration;
PRInt32 mBytePosition;
nsresult mInternalState;

View File

@ -302,6 +302,7 @@ nsExpatDriver::nsExpatDriver()
:mExpatParser(0),
mInCData(PR_FALSE),
mInDoctype(PR_FALSE),
mInExternalDTD(PR_FALSE),
mHandledXMLDeclaration(PR_FALSE),
mBytePosition(0),
mInternalState(NS_OK),
@ -373,8 +374,10 @@ nsExpatDriver::HandleComment(const PRUnichar *aValue)
NS_ASSERTION(mSink, "content sink not found!");
if (mInDoctype) {
if (!mInExternalDTD) {
mDoctypeText.Append(aValue);
}
}
else if (mSink){
mInternalState = mSink->HandleComment(aValue);
}
@ -430,8 +433,10 @@ nsExpatDriver::HandleDefault(const PRUnichar *aValue,
NS_ASSERTION(mSink, "content sink not found!");
if (mInDoctype) {
if (!mInExternalDTD) {
mDoctypeText.Append(aValue, aLength);
}
}
else if (mSink) {
if (!mHandledXMLDeclaration && !mBytesParsed) {
static const PRUnichar xmlDecl[] = {'<', '?', 'x', 'm', 'l', ' ', '\0'};
@ -508,8 +513,8 @@ nsExpatDriver::HandleStartDoctypeDecl()
mInDoctype = PR_TRUE;
// Consuming a huge DOCTYPE translates to numerous
// allocations. In an effort to avoid too many allocations
// setting mDoctypeText's capacity to be 20K ( just a guesstimate! ).
mDoctypeText.SetCapacity(20480);
// setting mDoctypeText's capacity to be 1K ( just a guesstimate! ).
mDoctypeText.SetCapacity(1024);
return NS_OK;
}
@ -570,7 +575,11 @@ nsExpatDriver::HandleExternalEntityRef(const PRUnichar *openEntityNames,
nsCOMPtr<nsIInputStream> in;
nsAutoString absURL;
nsresult rv = OpenInputStream(publicId, systemId, base, getter_AddRefs(in), absURL);
nsresult rv = OpenInputStreamFromExternalDTD(publicId,
systemId,
base,
getter_AddRefs(in),
absURL);
if (NS_FAILED(rv)) {
return result;
@ -578,23 +587,31 @@ nsExpatDriver::HandleExternalEntityRef(const PRUnichar *openEntityNames,
nsCOMPtr<nsIUnicharInputStream> uniIn;
NS_NewUTF8ConverterStream(getter_AddRefs(uniIn), in, 1024);
rv = NS_NewUTF8ConverterStream(getter_AddRefs(uniIn), in, 1024);
if (NS_FAILED(rv)) {
return result;
}
if (uniIn) {
XML_Parser entParser =
XML_ExternalEntityParserCreate(mExpatParser, 0, (const XML_Char*) NS_LITERAL_STRING("UTF-16").get());
XML_ExternalEntityParserCreate(
mExpatParser,
0,
(const XML_Char*) NS_LITERAL_STRING("UTF-16").get());
if (entParser) {
PRUint32 readCount = 0;
PRUnichar tmpBuff[1024] = {0};
PRUnichar *uniBuf = tmpBuff;
PRUnichar uniBuff[1024] = {0};
XML_SetBase(entParser, (const XML_Char*) absURL.get());
while (NS_SUCCEEDED(uniIn->Read(uniBuf, 0, 1024, &readCount)) && result) {
mInExternalDTD = PR_TRUE;
while (NS_SUCCEEDED(uniIn->Read(uniBuff, 0, 1024, &readCount)) && result) {
if (readCount) {
// Pass the buffer to expat for parsing
result = XML_Parse(entParser, (char *)uniBuf, readCount * sizeof(PRUnichar), 0);
result = XML_Parse(entParser, (char *)uniBuff, readCount * sizeof(PRUnichar), 0);
}
else {
// done reading
@ -602,6 +619,9 @@ nsExpatDriver::HandleExternalEntityRef(const PRUnichar *openEntityNames,
break;
}
}
mInExternalDTD = PR_FALSE;
XML_ParserFree(entParser);
}
}
@ -610,7 +630,7 @@ nsExpatDriver::HandleExternalEntityRef(const PRUnichar *openEntityNames,
}
nsresult
nsExpatDriver::OpenInputStream(const PRUnichar* aFPIStr,
nsExpatDriver::OpenInputStreamFromExternalDTD(const PRUnichar* aFPIStr,
const PRUnichar* aURLStr,
const PRUnichar* aBaseURL,
nsIInputStream** in,

View File

@ -78,7 +78,7 @@ public:
protected:
// Load up an external stream to get external entity information
nsresult OpenInputStream(const PRUnichar* aFPIStr,
nsresult OpenInputStreamFromExternalDTD(const PRUnichar* aFPIStr,
const PRUnichar* aURLStr,
const PRUnichar* aBaseURL,
nsIInputStream** in,
@ -94,6 +94,7 @@ protected:
nsString mDoctypeText;
PRPackedBool mInCData;
PRPackedBool mInDoctype;
PRPackedBool mInExternalDTD;
PRPackedBool mHandledXMLDeclaration;
PRInt32 mBytePosition;
nsresult mInternalState;