Reviewed by Darin.
authormjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 23 Aug 2004 17:52:11 +0000 (17:52 +0000)
committermjs <mjs@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 23 Aug 2004 17:52:11 +0000 (17:52 +0000)
<rdar://problem/3770306> XMLHttpRequest does not honor character set encoding

        * khtml/ecma/xmlhttprequest.cpp:
        (KJS::XMLHttpRequest::slotData): Get encoding from the transfer job.
        * kwq/KWQKJobClasses.h:
        * kwq/KWQKJobClasses.mm:
        (KIO::TransferJobPrivate::TransferJobPrivate): Added retrievedCharset
flag.
        (KIO::TransferJob::retrieveCharset): New method, gets the charset
from the response.
        (KIO::TransferJob::queryMetaData): Handle charset.
        (KIO::TransferJob::emitReceivedResponse): Clear retreivedCharset flag.
        * kwq/KWQLoader.h:
        * kwq/KWQLoader.mm:
        (KWQResponseTextEncodingName): New function, gets the encoding from the response.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@7323 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog-2005-08-23
WebCore/khtml/ecma/xmlhttprequest.cpp
WebCore/kwq/KWQKJobClasses.h
WebCore/kwq/KWQKJobClasses.mm
WebCore/kwq/KWQLoader.h
WebCore/kwq/KWQLoader.mm

index 7684b30..7790aba 100644 (file)
@@ -1,3 +1,23 @@
+2004-08-23  Maciej Stachowiak  <mjs@apple.com>
+
+        Reviewed by Darin.
+
+       <rdar://problem/3770306> XMLHttpRequest does not honor character set encoding
+
+        * khtml/ecma/xmlhttprequest.cpp:
+        (KJS::XMLHttpRequest::slotData): Get encoding from the transfer job.
+        * kwq/KWQKJobClasses.h:
+        * kwq/KWQKJobClasses.mm:
+        (KIO::TransferJobPrivate::TransferJobPrivate): Added retrievedCharset
+       flag.
+        (KIO::TransferJob::retrieveCharset): New method, gets the charset
+       from the response.
+        (KIO::TransferJob::queryMetaData): Handle charset.
+        (KIO::TransferJob::emitReceivedResponse): Clear retreivedCharset flag.
+        * kwq/KWQLoader.h:
+        * kwq/KWQLoader.mm:
+        (KWQResponseTextEncodingName): New function, gets the encoding from the response.
+
 2004-08-23  David Hyatt  <hyatt@apple.com>
 
        Apply leo's fix to marquees.
index 32d4695..b7b4048 100644 (file)
@@ -528,6 +528,7 @@ void XMLHttpRequest::slotData(KIO::Job*, const QByteArray &_data)
 {
   if (state < Loaded) {
     responseHeaders = job->queryMetaData("HTTP-Headers");
+    encoding = job->queryMetaData("charset");
     changeState(Loaded);
   }
   
index f8b1dee..f86f45a 100644 (file)
@@ -77,6 +77,7 @@ public:
     QString method() const;
 private:
     void assembleResponseHeaders() const;
+    void retrieveCharset() const;
 
     TransferJobPrivate *d;
 
index 9349c80..8146d41 100644 (file)
@@ -49,7 +49,8 @@ public:
        , loader(nil)
        , method("GET")
        , response(0)
-       , assembledResponseHeaders(true)
+        , assembledResponseHeaders(true)
+        , retrievedCharset(true)
     {
     }
 
@@ -62,6 +63,7 @@ public:
        , postData(_postData)
        , response(0)
        , assembledResponseHeaders(true)
+        , retrievedCharset(true)
     {
     }
 
@@ -81,6 +83,7 @@ public:
 
     void *response;
     bool assembledResponseHeaders;
+    bool retrievedCharset;
     QString responseHeaders;
 };
 
@@ -138,7 +141,17 @@ void TransferJob::assembleResponseHeaders() const
        d->responseHeaders = QString::fromNSString((NSString *)KWQResponseHeaderString(d->response));
        d->assembledResponseHeaders = true;
     }
+}
 
+void TransferJob::retrieveCharset() const
+{
+    if (!d->retrievedCharset) {
+        NSString *charset = (NSString *)KWQResponseTextEncodingName(d->response);
+        if (charset) {
+            [d->metaData setObject:charset forKey:@"charset"];
+        }
+        d->retrievedCharset = true;
+    }
 }
 
 QString TransferJob::queryMetaData(const QString &key) const
@@ -146,6 +159,11 @@ QString TransferJob::queryMetaData(const QString &key) const
     if (key == "HTTP-Headers") {
        assembleResponseHeaders();
        return d->responseHeaders;
+    } 
+
+    if (key == "charset") {
+        // this will put it in the regular metadata dictionary
+        retrieveCharset();
     }
 
     NSString *value = [d->metaData objectForKey:key.getNSString()]; 
@@ -212,6 +230,7 @@ void TransferJob::emitResult()
 void TransferJob::emitReceivedResponse(void *response)
 {
     d->assembledResponseHeaders = false;
+    d->retrievedCharset = false;
     d->response = response;
     KWQRetainResponse(d->response);
 
index cc68105..df3f3ae 100644 (file)
@@ -47,6 +47,7 @@ bool KWQCheckIfReloading(khtml::DocLoader *loader);
 void KWQRetainResponse(void *response);
 void KWQReleaseResponse(void *response);
 void *KWQResponseMIMEType(void *response);
+void *KWQResponseTextEncodingName(void *response);
 void *KWQResponseHeaderString(void *response);
 int KWQNumberOfPendingOrLoadingRequests(khtml::DocLoader *dl);
 time_t KWQCacheObjectExpiresTime(khtml::DocLoader *docLoader, void *response);
index 8986981..82020ee 100644 (file)
@@ -281,6 +281,15 @@ void *KWQResponseMIMEType(void *response)
     return NULL;
 }
 
+void *KWQResponseTextEncodingName(void *response)
+{
+    KWQ_BLOCK_EXCEPTIONS;
+    return [(NSURLResponse *)response textEncodingName];
+    KWQ_UNBLOCK_EXCEPTIONS;
+
+    return NULL;
+}
+
 void *KWQResponseHeaderString(void *response)
 {
     KWQ_BLOCK_EXCEPTIONS;