From dc62af156c9e62fddf99e04dd7020d064e84d7ad Mon Sep 17 00:00:00 2001 From: "harishd%netscape.com" Date: Wed, 11 Jul 2001 20:36:04 +0000 Subject: [PATCH] Nisheeth checking in on behalf of Heikki from Harish's machine! Fix for PDT+ bug 88327. XMLHttpRequest correctly processes international char set XML text returned from the server. git-svn-id: svn://10.0.0.236/branches/MOZILLA_0_9_2_BRANCH@99078 18797224-902f-48f8-a5cc-f745e15eee43 --- .../xmlextras/base/src/nsXMLHttpRequest.cpp | 18 +++++++++++++++++- .../xmlextras/base/src/nsXMLHttpRequest.h | 17 ++++++++--------- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/mozilla/extensions/xmlextras/base/src/nsXMLHttpRequest.cpp b/mozilla/extensions/xmlextras/base/src/nsXMLHttpRequest.cpp index eace6201d13..d8a722fbd78 100644 --- a/mozilla/extensions/xmlextras/base/src/nsXMLHttpRequest.cpp +++ b/mozilla/extensions/xmlextras/base/src/nsXMLHttpRequest.cpp @@ -54,6 +54,7 @@ #include "nsIInterfaceRequestor.h" #endif #include "nsIDOMClassInfo.h" +#include "nsIDOMElement.h" static const char* kLoadAsData = "loadAsData"; #define LOADSTR NS_LITERAL_STRING("load") @@ -405,7 +406,7 @@ nsXMLHttpRequest::DetectCharset(nsAWritableString& aCharset) nsAutoString contentType; contentType.AssignWithConversion( contenttypeheader.get() ); PRInt32 start = contentType.RFind("charset=", PR_TRUE ) ; - if(start<0) { + if(start>=0) { start += 8; // 8 = "charset=".length PRInt32 end = 0; if(PRUnichar('"') == contentType.CharAt(start)) { @@ -1147,6 +1148,19 @@ nsresult nsXMLHttpRequest::Load(nsIDOMEvent* aEvent) { mStatus = XML_HTTP_REQUEST_COMPLETED; + + // We might have been sent non-XML data. If that was the case, + // we should null out the document member. The idea in this + // check here is that if there is no document element it is not + // an XML document. We might need a fancier check... + if (mDocument) { + nsCOMPtr root; + mDocument->GetDocumentElement(getter_AddRefs(root)); + if (!root) { + mDocument = nsnull; + } + } + #ifdef IMPLEMENT_SYNC_LOAD if (mChromeWindow) { mChromeWindow->ExitModalEventLoop(NS_OK); @@ -1207,6 +1221,7 @@ nsresult nsXMLHttpRequest::Abort(nsIDOMEvent* aEvent) { mStatus = XML_HTTP_REQUEST_ABORTED; + mDocument = nsnull; #ifdef IMPLEMENT_SYNC_LOAD if (mChromeWindow) { mChromeWindow->ExitModalEventLoop(NS_OK); @@ -1221,6 +1236,7 @@ nsresult nsXMLHttpRequest::Error(nsIDOMEvent* aEvent) { mStatus = XML_HTTP_REQUEST_ABORTED; + mDocument = nsnull; #ifdef IMPLEMENT_SYNC_LOAD if (mChromeWindow) { mChromeWindow->ExitModalEventLoop(NS_OK); diff --git a/mozilla/extensions/xmlextras/base/src/nsXMLHttpRequest.h b/mozilla/extensions/xmlextras/base/src/nsXMLHttpRequest.h index 9badbc0923a..087728b4c5f 100644 --- a/mozilla/extensions/xmlextras/base/src/nsXMLHttpRequest.h +++ b/mozilla/extensions/xmlextras/base/src/nsXMLHttpRequest.h @@ -94,6 +94,14 @@ protected: nsresult GetStreamForWString(const PRUnichar* aStr, PRInt32 aLength, nsIInputStream** aStream); + nsresult DetectCharset(nsAWritableString& aCharset); + nsresult ConvertBodyToText(PRUnichar **aOutBuffer); + static NS_METHOD StreamReaderFunc(nsIInputStream* in, + void* closure, + const char* fromRawSegment, + PRUint32 toOffset, + PRUint32 count, + PRUint32 *writeCount); nsCOMPtr mContext; nsCOMPtr mChannel; @@ -111,15 +119,6 @@ protected: nsCOMPtr mOnLoadListener; nsCOMPtr mOnErrorListener; - nsresult DetectCharset(nsAWritableString& aCharset); - nsresult ConvertBodyToText(PRUnichar **aOutBuffer); - static NS_METHOD StreamReaderFunc(nsIInputStream* in, - void* closure, - const char* fromRawSegment, - PRUint32 toOffset, - PRUint32 count, - PRUint32 *writeCount); - // used to implement getAllResponseHeaders() class nsHeaderVisitor : public nsIHttpHeaderVisitor { public: