diff --git a/mozilla/htmlparser/src/nsExpatTokenizer.cpp b/mozilla/htmlparser/src/nsExpatTokenizer.cpp index e42fecc45c6..95bd02675e2 100644 --- a/mozilla/htmlparser/src/nsExpatTokenizer.cpp +++ b/mozilla/htmlparser/src/nsExpatTokenizer.cpp @@ -142,7 +142,7 @@ void nsExpatTokenizer::SetupExpatCallbacks(void) { * @param * @return */ -nsExpatTokenizer::nsExpatTokenizer() : nsHTMLTokenizer() { +nsExpatTokenizer::nsExpatTokenizer(nsString* aURL) : nsHTMLTokenizer() { NS_INIT_REFCNT(); mBytesParsed = 0; nsAutoString buffer("UTF-16"); @@ -152,6 +152,8 @@ nsExpatTokenizer::nsExpatTokenizer() : nsHTMLTokenizer() { #ifdef XML_DTD XML_SetParamEntityParsing(mExpatParser, XML_PARAM_ENTITY_PARSING_ALWAYS); #endif + if (aURL) + XML_SetBase(mExpatParser, (const XML_Char*) aURL->GetUnicode()); gTokenRecycler=(CTokenRecycler*)GetTokenRecycler(); if (mExpatParser) { SetupExpatCallbacks(); @@ -484,52 +486,52 @@ void nsExpatTokenizer::HandleUnparsedEntityDecl(void *userData, } nsresult -nsExpatTokenizer::OpenInputStream(nsString2& aURLStr, nsIInputStream*& in) +nsExpatTokenizer::OpenInputStream(const nsString& aURLStr, + const nsString& aBaseURL, + nsIInputStream** in, + nsString* aAbsURL) { - nsresult ret; + nsresult rv; #ifndef NECKO nsINetService* pNetService = nsnull; - ret = nsServiceManager::GetService(kNetServiceCID, + aAbsURL->Truncate(0); + rv = nsServiceManager::GetService(kNetServiceCID, kINetServiceIID, (nsISupports**) &pNetService); - /* get the url - */ - nsIURI *url = nsnull; - - ret = pNetService->CreateURL(&url, aURLStr); - if (NS_FAILED(ret)) { -#ifdef NS_DEBUG - char *s = aURLStr.ToNewCString(); - printf("\n** cannot create URL for %s\n", s?s:"null"); - delete s; -#endif - return ret; + + if (NS_SUCCEEDED(rv)) { + nsIURI* contextURL = nsnull; + rv = pNetService->CreateURL(&contextURL, aBaseURL); + if (NS_SUCCEEDED(rv)) { + nsIURI* url = nsnull; + rv = pNetService->CreateURL(&url, aURLStr, contextURL); + if (NS_SUCCEEDED(rv)) { + rv = pNetService->OpenBlockingStream(url, nsnull, in); + const char* absURL = nsnull; + url->GetSpec(&absURL); + aAbsURL->Append(absURL); + NS_RELEASE(url); + } + NS_RELEASE(contextURL); + } + NS_RELEASE(pNetService); } - // - ret = pNetService->OpenBlockingStream(url, nsnull, &in); - NS_RELEASE(url); -#ifdef NS_DEBUG - if (NS_FAILED(ret) || !in) { - char *s = aURLStr.ToNewCString(); - printf("\n** cannot open stream: %s\n", s?s:"null"); - delete s; - } -#endif - #else // NECKO nsIURI* uri; - ret = NS_NewURI(&uri, aURLStr); - if (NS_FAILED(ret)) return ret; + rv = NS_NewURI(&uri, aURLStr); + if (NS_FAILED(rv)) return rv; + + ret = NS_OpenURI(in, uri); - ret = NS_OpenURI(&in, uri); NS_RELEASE(uri); #endif // NECKO - return ret; + return rv; } nsresult nsExpatTokenizer::LoadStream(nsIInputStream* in, - PRUnichar* &uniBuf, PRUint32 &retLen) + PRUnichar*& uniBuf, + PRUint32& retLen) { // read it PRUint32 aCount = 1024, @@ -543,7 +545,6 @@ nsresult nsExpatTokenizer::LoadStream(nsIInputStream* in, aCount, utf8); - // PRUint32 aReadCount = 0; uniBuf = (PRUnichar *) PR_Malloc(bufsize); @@ -556,8 +557,11 @@ nsresult nsExpatTokenizer::LoadStream(nsIInputStream* in, uniBuf = (PRUnichar *) PR_Realloc(uniBuf, bufsize*sizeof(PRUnichar)); } }/* while */ + if (NS_BASE_STREAM_EOF == res) + res = NS_OK; return res; } + void nsExpatTokenizer::HandleNotationDecl(void *userData, const XML_Char *notationName, const XML_Char *base, @@ -570,38 +574,44 @@ int nsExpatTokenizer::HandleExternalEntityRef(XML_Parser parser, const XML_Char *openEntityNames, const XML_Char *base, const XML_Char *systemId, - const XML_Char *publicId){ + const XML_Char *publicId) +{ + int result = 0; + #ifdef XML_DTD - /* create an extent parser - */ - nsAutoString buffer("UTF-16"); - const PRUnichar* encoding = buffer.GetUnicode(); - XML_Parser entParser = - XML_ExternalEntityParserCreate(parser, + // Create a parser for parsing the external entity + nsAutoString encoding("UTF-16"); + XML_Parser entParser = nsnull; + + entParser = XML_ExternalEntityParserCreate(parser, 0, - encoding?(const XML_Char*) encoding:0); - - int result = 1; + (const XML_Char*) encoding.GetUnicode()); + // Load the external entity into a buffer nsIInputStream *in = nsnull; - nsString2 s((PRUnichar *)systemId); - nsresult res = OpenInputStream(s, in); - PRUint32 retLen = 0; - PRUnichar *uniBuf = nsnull; + nsString urlSpec = (const PRUnichar*) systemId; + nsString baseURL = (const PRUnichar*) base; + nsString absURL; - res = LoadStream(in, uniBuf, retLen); - NS_RELEASE(in); + nsresult rv = OpenInputStream(urlSpec, baseURL, &in, &absURL); - result = XML_Parse(entParser, (char *)uniBuf, retLen*sizeof(PRUnichar), 1); - XML_ParserFree(entParser); - - // free uniBuf too?? - PR_FREEIF(uniBuf); + if (entParser && NS_SUCCEEDED(rv)) { + PRUint32 retLen = 0; + PRUnichar *uniBuf = nsnull; + rv = LoadStream(in, uniBuf, retLen); + NS_RELEASE(in); + // Pass the buffer to expat for parsing + if (NS_SUCCEEDED(rv)) { + XML_SetBase(entParser, (const XML_Char*) absURL.GetUnicode()); + result = XML_Parse(entParser, (char *)uniBuf, retLen * sizeof(PRUnichar), 1); + XML_ParserFree(entParser); + PR_FREEIF(uniBuf); + } + } #else /* ! XML_DTD */ - NS_NOTYETIMPLEMENTED("Error: nsExpatTokenizer::HandleExternalEntityRef() not yet implemented."); - int result=0; + NS_NOTYETIMPLEMENTED("Error: nsExpatTokenizer::HandleExternalEntityRef() not yet implemented."); #endif /* XML_DTD */ diff --git a/mozilla/htmlparser/src/nsExpatTokenizer.h b/mozilla/htmlparser/src/nsExpatTokenizer.h index 0a1969a6813..4dbc59a6f30 100644 --- a/mozilla/htmlparser/src/nsExpatTokenizer.h +++ b/mozilla/htmlparser/src/nsExpatTokenizer.h @@ -48,7 +48,7 @@ CLASS_EXPORT_HTMLPARS nsExpatTokenizer : public nsHTMLTokenizer { public: - nsExpatTokenizer(); + nsExpatTokenizer(nsString* aURL = nsnull); virtual ~nsExpatTokenizer(); NS_DECL_ISUPPORTS @@ -83,10 +83,14 @@ protected: PRUint32 aByteIndex, nsString& aLine); // Load up an external stream to get external entity information - static nsresult OpenInputStream(nsString2& aURLStr, - nsIInputStream*& in); + static nsresult OpenInputStream(const nsString& aURLStr, + const nsString& aBaseURL, + nsIInputStream** in, + nsString* aAbsURL); + static nsresult LoadStream(nsIInputStream* in, - PRUnichar* &uniBuf, PRUint32 &retLen); + PRUnichar* &uniBuf, + PRUint32 &retLen); /* The callback handlers that get called from the expat parser */ static void HandleStartElement(void *userData, const XML_Char *name, const XML_Char **atts); diff --git a/mozilla/htmlparser/src/nsWellFormedDTD.cpp b/mozilla/htmlparser/src/nsWellFormedDTD.cpp index 94528f6d2ed..5cf7fe62d98 100644 --- a/mozilla/htmlparser/src/nsWellFormedDTD.cpp +++ b/mozilla/htmlparser/src/nsWellFormedDTD.cpp @@ -328,7 +328,7 @@ nsITokenRecycler* CWellFormedDTD::GetTokenRecycler(void){ */ nsITokenizer* CWellFormedDTD::GetTokenizer(void) { if(!mTokenizer) - mTokenizer=(nsHTMLTokenizer*)new nsExpatTokenizer(); + mTokenizer=(nsHTMLTokenizer*)new nsExpatTokenizer(&mFilename); return mTokenizer; } diff --git a/mozilla/parser/htmlparser/src/nsExpatTokenizer.cpp b/mozilla/parser/htmlparser/src/nsExpatTokenizer.cpp index e42fecc45c6..95bd02675e2 100644 --- a/mozilla/parser/htmlparser/src/nsExpatTokenizer.cpp +++ b/mozilla/parser/htmlparser/src/nsExpatTokenizer.cpp @@ -142,7 +142,7 @@ void nsExpatTokenizer::SetupExpatCallbacks(void) { * @param * @return */ -nsExpatTokenizer::nsExpatTokenizer() : nsHTMLTokenizer() { +nsExpatTokenizer::nsExpatTokenizer(nsString* aURL) : nsHTMLTokenizer() { NS_INIT_REFCNT(); mBytesParsed = 0; nsAutoString buffer("UTF-16"); @@ -152,6 +152,8 @@ nsExpatTokenizer::nsExpatTokenizer() : nsHTMLTokenizer() { #ifdef XML_DTD XML_SetParamEntityParsing(mExpatParser, XML_PARAM_ENTITY_PARSING_ALWAYS); #endif + if (aURL) + XML_SetBase(mExpatParser, (const XML_Char*) aURL->GetUnicode()); gTokenRecycler=(CTokenRecycler*)GetTokenRecycler(); if (mExpatParser) { SetupExpatCallbacks(); @@ -484,52 +486,52 @@ void nsExpatTokenizer::HandleUnparsedEntityDecl(void *userData, } nsresult -nsExpatTokenizer::OpenInputStream(nsString2& aURLStr, nsIInputStream*& in) +nsExpatTokenizer::OpenInputStream(const nsString& aURLStr, + const nsString& aBaseURL, + nsIInputStream** in, + nsString* aAbsURL) { - nsresult ret; + nsresult rv; #ifndef NECKO nsINetService* pNetService = nsnull; - ret = nsServiceManager::GetService(kNetServiceCID, + aAbsURL->Truncate(0); + rv = nsServiceManager::GetService(kNetServiceCID, kINetServiceIID, (nsISupports**) &pNetService); - /* get the url - */ - nsIURI *url = nsnull; - - ret = pNetService->CreateURL(&url, aURLStr); - if (NS_FAILED(ret)) { -#ifdef NS_DEBUG - char *s = aURLStr.ToNewCString(); - printf("\n** cannot create URL for %s\n", s?s:"null"); - delete s; -#endif - return ret; + + if (NS_SUCCEEDED(rv)) { + nsIURI* contextURL = nsnull; + rv = pNetService->CreateURL(&contextURL, aBaseURL); + if (NS_SUCCEEDED(rv)) { + nsIURI* url = nsnull; + rv = pNetService->CreateURL(&url, aURLStr, contextURL); + if (NS_SUCCEEDED(rv)) { + rv = pNetService->OpenBlockingStream(url, nsnull, in); + const char* absURL = nsnull; + url->GetSpec(&absURL); + aAbsURL->Append(absURL); + NS_RELEASE(url); + } + NS_RELEASE(contextURL); + } + NS_RELEASE(pNetService); } - // - ret = pNetService->OpenBlockingStream(url, nsnull, &in); - NS_RELEASE(url); -#ifdef NS_DEBUG - if (NS_FAILED(ret) || !in) { - char *s = aURLStr.ToNewCString(); - printf("\n** cannot open stream: %s\n", s?s:"null"); - delete s; - } -#endif - #else // NECKO nsIURI* uri; - ret = NS_NewURI(&uri, aURLStr); - if (NS_FAILED(ret)) return ret; + rv = NS_NewURI(&uri, aURLStr); + if (NS_FAILED(rv)) return rv; + + ret = NS_OpenURI(in, uri); - ret = NS_OpenURI(&in, uri); NS_RELEASE(uri); #endif // NECKO - return ret; + return rv; } nsresult nsExpatTokenizer::LoadStream(nsIInputStream* in, - PRUnichar* &uniBuf, PRUint32 &retLen) + PRUnichar*& uniBuf, + PRUint32& retLen) { // read it PRUint32 aCount = 1024, @@ -543,7 +545,6 @@ nsresult nsExpatTokenizer::LoadStream(nsIInputStream* in, aCount, utf8); - // PRUint32 aReadCount = 0; uniBuf = (PRUnichar *) PR_Malloc(bufsize); @@ -556,8 +557,11 @@ nsresult nsExpatTokenizer::LoadStream(nsIInputStream* in, uniBuf = (PRUnichar *) PR_Realloc(uniBuf, bufsize*sizeof(PRUnichar)); } }/* while */ + if (NS_BASE_STREAM_EOF == res) + res = NS_OK; return res; } + void nsExpatTokenizer::HandleNotationDecl(void *userData, const XML_Char *notationName, const XML_Char *base, @@ -570,38 +574,44 @@ int nsExpatTokenizer::HandleExternalEntityRef(XML_Parser parser, const XML_Char *openEntityNames, const XML_Char *base, const XML_Char *systemId, - const XML_Char *publicId){ + const XML_Char *publicId) +{ + int result = 0; + #ifdef XML_DTD - /* create an extent parser - */ - nsAutoString buffer("UTF-16"); - const PRUnichar* encoding = buffer.GetUnicode(); - XML_Parser entParser = - XML_ExternalEntityParserCreate(parser, + // Create a parser for parsing the external entity + nsAutoString encoding("UTF-16"); + XML_Parser entParser = nsnull; + + entParser = XML_ExternalEntityParserCreate(parser, 0, - encoding?(const XML_Char*) encoding:0); - - int result = 1; + (const XML_Char*) encoding.GetUnicode()); + // Load the external entity into a buffer nsIInputStream *in = nsnull; - nsString2 s((PRUnichar *)systemId); - nsresult res = OpenInputStream(s, in); - PRUint32 retLen = 0; - PRUnichar *uniBuf = nsnull; + nsString urlSpec = (const PRUnichar*) systemId; + nsString baseURL = (const PRUnichar*) base; + nsString absURL; - res = LoadStream(in, uniBuf, retLen); - NS_RELEASE(in); + nsresult rv = OpenInputStream(urlSpec, baseURL, &in, &absURL); - result = XML_Parse(entParser, (char *)uniBuf, retLen*sizeof(PRUnichar), 1); - XML_ParserFree(entParser); - - // free uniBuf too?? - PR_FREEIF(uniBuf); + if (entParser && NS_SUCCEEDED(rv)) { + PRUint32 retLen = 0; + PRUnichar *uniBuf = nsnull; + rv = LoadStream(in, uniBuf, retLen); + NS_RELEASE(in); + // Pass the buffer to expat for parsing + if (NS_SUCCEEDED(rv)) { + XML_SetBase(entParser, (const XML_Char*) absURL.GetUnicode()); + result = XML_Parse(entParser, (char *)uniBuf, retLen * sizeof(PRUnichar), 1); + XML_ParserFree(entParser); + PR_FREEIF(uniBuf); + } + } #else /* ! XML_DTD */ - NS_NOTYETIMPLEMENTED("Error: nsExpatTokenizer::HandleExternalEntityRef() not yet implemented."); - int result=0; + NS_NOTYETIMPLEMENTED("Error: nsExpatTokenizer::HandleExternalEntityRef() not yet implemented."); #endif /* XML_DTD */ diff --git a/mozilla/parser/htmlparser/src/nsExpatTokenizer.h b/mozilla/parser/htmlparser/src/nsExpatTokenizer.h index 0a1969a6813..4dbc59a6f30 100644 --- a/mozilla/parser/htmlparser/src/nsExpatTokenizer.h +++ b/mozilla/parser/htmlparser/src/nsExpatTokenizer.h @@ -48,7 +48,7 @@ CLASS_EXPORT_HTMLPARS nsExpatTokenizer : public nsHTMLTokenizer { public: - nsExpatTokenizer(); + nsExpatTokenizer(nsString* aURL = nsnull); virtual ~nsExpatTokenizer(); NS_DECL_ISUPPORTS @@ -83,10 +83,14 @@ protected: PRUint32 aByteIndex, nsString& aLine); // Load up an external stream to get external entity information - static nsresult OpenInputStream(nsString2& aURLStr, - nsIInputStream*& in); + static nsresult OpenInputStream(const nsString& aURLStr, + const nsString& aBaseURL, + nsIInputStream** in, + nsString* aAbsURL); + static nsresult LoadStream(nsIInputStream* in, - PRUnichar* &uniBuf, PRUint32 &retLen); + PRUnichar* &uniBuf, + PRUint32 &retLen); /* The callback handlers that get called from the expat parser */ static void HandleStartElement(void *userData, const XML_Char *name, const XML_Char **atts); diff --git a/mozilla/parser/htmlparser/src/nsWellFormedDTD.cpp b/mozilla/parser/htmlparser/src/nsWellFormedDTD.cpp index 94528f6d2ed..5cf7fe62d98 100644 --- a/mozilla/parser/htmlparser/src/nsWellFormedDTD.cpp +++ b/mozilla/parser/htmlparser/src/nsWellFormedDTD.cpp @@ -328,7 +328,7 @@ nsITokenRecycler* CWellFormedDTD::GetTokenRecycler(void){ */ nsITokenizer* CWellFormedDTD::GetTokenizer(void) { if(!mTokenizer) - mTokenizer=(nsHTMLTokenizer*)new nsExpatTokenizer(); + mTokenizer=(nsHTMLTokenizer*)new nsExpatTokenizer(&mFilename); return mTokenizer; }