<rdar://problem/13740375> Non-ASCII downloaded file names are garbled when using NetworkProcess
        https://bugs.webkit.org/show_bug.cgi?id=115520

        Reviewed by Darin Adler.

        * Shared/mac/WebCoreArgumentCodersMac.mm:
        (CoreIPC::::encodePlatformData):
        (CoreIPC::::decodePlatformData):
        Send the encoding fallback array over IPC, so that it's present when NetworkProcess does its loading.



git-svn-id: http://svn.webkit.org/repository/webkit/trunk@149491 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/ChangeLog b/Source/WebCore/ChangeLog
index 634cddd..1bf5f37 100644
--- a/Source/WebCore/ChangeLog
+++ b/Source/WebCore/ChangeLog
@@ -1,3 +1,23 @@
+2013-05-02  Alexey Proskuryakov  <ap@apple.com>
+
+        <rdar://problem/13740375> Non-ASCII downloaded file names are garbled when using NetworkProcess
+        https://bugs.webkit.org/show_bug.cgi?id=115520
+
+        Reviewed by Darin Adler.
+
+        Covered by existing tests when using NetworkProcess.
+
+        * WebCore.exp.in:
+        * platform/network/ResourceRequestBase.h:
+        (WebCore::ResourceRequestBase::responseContentDispositionEncodingFallbackArray):
+        Added a getter for encoding fallback array.
+
+        * platform/network/mac/ResourceRequestMac.mm:
+        (WebCore::ResourceRequest::doUpdateResourceRequest):
+        (WebCore::ResourceRequest::doUpdatePlatformRequest):
+        Removed obsolete checks for presence of fallback array methods, they were available
+        since 10.6.8.
+
 2013-05-01  Enrica Casucci  <enrica@apple.com>
 
         text-combine: horizontal does not work properly for some fonts.
diff --git a/Source/WebCore/WebCore.exp.in b/Source/WebCore/WebCore.exp.in
index b075f69..1dd07c2 100644
--- a/Source/WebCore/WebCore.exp.in
+++ b/Source/WebCore/WebCore.exp.in
@@ -643,6 +643,7 @@
 __ZN7WebCore19ResourceRequestBase22defaultTimeoutIntervalEv
 __ZN7WebCore19ResourceRequestBase24s_defaultTimeoutIntervalE
 __ZN7WebCore19ResourceRequestBase25setDefaultTimeoutIntervalEd
+__ZN7WebCore19ResourceRequestBase50setResponseContentDispositionEncodingFallbackArrayERKN3WTF6StringES4_S4_
 __ZN7WebCore19ResourceRequestBase6setURLERKNS_4KURLE
 __ZN7WebCore19TextResourceDecoder5flushEv
 __ZN7WebCore19TextResourceDecoder6decodeEPKcm
diff --git a/Source/WebCore/platform/network/ResourceRequestBase.h b/Source/WebCore/platform/network/ResourceRequestBase.h
index a9fbdb9..ceff9b9 100644
--- a/Source/WebCore/platform/network/ResourceRequestBase.h
+++ b/Source/WebCore/platform/network/ResourceRequestBase.h
@@ -111,6 +111,7 @@
         void setHTTPAccept(const String& httpAccept) { setHTTPHeaderField("Accept", httpAccept); }
         void clearHTTPAccept();
 
+        const Vector<String>& responseContentDispositionEncodingFallbackArray() const { return m_responseContentDispositionEncodingFallbackArray; }
         void setResponseContentDispositionEncodingFallbackArray(const String& encoding1, const String& encoding2 = String(), const String& encoding3 = String());
 
         FormData* httpBody() const;
diff --git a/Source/WebCore/platform/network/mac/ResourceRequestMac.mm b/Source/WebCore/platform/network/mac/ResourceRequestMac.mm
index 6670652..f8239c3 100644
--- a/Source/WebCore/platform/network/mac/ResourceRequestMac.mm
+++ b/Source/WebCore/platform/network/mac/ResourceRequestMac.mm
@@ -100,17 +100,13 @@
     while ((name = [e nextObject]))
         m_httpHeaderFields.set(name, [headers objectForKey:name]);
 
-    // The below check can be removed once we require a version of Foundation with -[NSURLRequest contentDispositionEncodingFallbackArray] method.
-    static bool supportsContentDispositionEncodingFallbackArray = [NSURLRequest instancesRespondToSelector:@selector(contentDispositionEncodingFallbackArray)];
-    if (supportsContentDispositionEncodingFallbackArray) {
-        m_responseContentDispositionEncodingFallbackArray.clear();
-        NSArray *encodingFallbacks = [m_nsRequest.get() contentDispositionEncodingFallbackArray];
-        NSUInteger count = [encodingFallbacks count];
-        for (NSUInteger i = 0; i < count; ++i) {
-            CFStringEncoding encoding = CFStringConvertNSStringEncodingToEncoding([(NSNumber *)[encodingFallbacks objectAtIndex:i] unsignedLongValue]);
-            if (encoding != kCFStringEncodingInvalidId)
-                m_responseContentDispositionEncodingFallbackArray.append(CFStringConvertEncodingToIANACharSetName(encoding));
-        }
+    m_responseContentDispositionEncodingFallbackArray.clear();
+    NSArray *encodingFallbacks = [m_nsRequest.get() contentDispositionEncodingFallbackArray];
+    NSUInteger count = [encodingFallbacks count];
+    for (NSUInteger i = 0; i < count; ++i) {
+        CFStringEncoding encoding = CFStringConvertNSStringEncodingToEncoding([(NSNumber *)[encodingFallbacks objectAtIndex:i] unsignedLongValue]);
+        if (encoding != kCFStringEncodingInvalidId)
+            m_responseContentDispositionEncodingFallbackArray.append(CFStringConvertEncodingToIANACharSetName(encoding));
     }
 
 #if ENABLE(CACHE_PARTITIONING)
@@ -177,20 +173,16 @@
     for (HTTPHeaderMap::const_iterator it = httpHeaderFields().begin(); it != end; ++it)
         [nsRequest setValue:it->value forHTTPHeaderField:it->key];
 
-    // The below check can be removed once we require a version of Foundation with -[NSMutableURLRequest setContentDispositionEncodingFallbackArray:] method.
-    static bool supportsContentDispositionEncodingFallbackArray = [NSMutableURLRequest instancesRespondToSelector:@selector(setContentDispositionEncodingFallbackArray:)];
-    if (supportsContentDispositionEncodingFallbackArray) {
-        NSMutableArray *encodingFallbacks = [NSMutableArray array];
-        unsigned count = m_responseContentDispositionEncodingFallbackArray.size();
-        for (unsigned i = 0; i != count; ++i) {
-            RetainPtr<CFStringRef> encodingName = m_responseContentDispositionEncodingFallbackArray[i].createCFString();
-            unsigned long nsEncoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingName.get()));
+    NSMutableArray *encodingFallbacks = [NSMutableArray array];
+    unsigned count = m_responseContentDispositionEncodingFallbackArray.size();
+    for (unsigned i = 0; i != count; ++i) {
+        RetainPtr<CFStringRef> encodingName = m_responseContentDispositionEncodingFallbackArray[i].createCFString();
+        unsigned long nsEncoding = CFStringConvertEncodingToNSStringEncoding(CFStringConvertIANACharSetNameToEncoding(encodingName.get()));
 
-            if (nsEncoding != kCFStringEncodingInvalidId)
-                [encodingFallbacks addObject:[NSNumber numberWithUnsignedLong:nsEncoding]];
-        }
-        [nsRequest setContentDispositionEncodingFallbackArray:encodingFallbacks];
+        if (nsEncoding != kCFStringEncodingInvalidId)
+            [encodingFallbacks addObject:[NSNumber numberWithUnsignedLong:nsEncoding]];
     }
+    [nsRequest setContentDispositionEncodingFallbackArray:encodingFallbacks];
 
 #if ENABLE(CACHE_PARTITIONING)
     String partition = cachePartition();
diff --git a/Source/WebKit2/ChangeLog b/Source/WebKit2/ChangeLog
index 65f0d3b..707a7c2 100644
--- a/Source/WebKit2/ChangeLog
+++ b/Source/WebKit2/ChangeLog
@@ -1,3 +1,15 @@
+2013-05-02  Alexey Proskuryakov  <ap@apple.com>
+
+        <rdar://problem/13740375> Non-ASCII downloaded file names are garbled when using NetworkProcess
+        https://bugs.webkit.org/show_bug.cgi?id=115520
+
+        Reviewed by Darin Adler.
+
+        * Shared/mac/WebCoreArgumentCodersMac.mm:
+        (CoreIPC::::encodePlatformData):
+        (CoreIPC::::decodePlatformData):
+        Send the encoding fallback array over IPC, so that it's present when NetworkProcess does its loading.
+
 2013-05-01  Alexey Proskuryakov  <ap@apple.com>
 
         REGRESSION (r149422): -[WKBrowsingContextController loadFileURL:restrictToFilesWithin:]
diff --git a/Source/WebKit2/Shared/mac/WebCoreArgumentCodersMac.mm b/Source/WebKit2/Shared/mac/WebCoreArgumentCodersMac.mm
index 6e82670..c126000 100644
--- a/Source/WebKit2/Shared/mac/WebCoreArgumentCodersMac.mm
+++ b/Source/WebKit2/Shared/mac/WebCoreArgumentCodersMac.mm
@@ -58,6 +58,9 @@
 
     RetainPtr<CFDictionaryRef> dictionary = adoptCF(WKNSURLRequestCreateSerializableRepresentation(requestToSerialize.get(), CoreIPC::tokenNullTypeRef()));
     CoreIPC::encode(encoder, dictionary.get());
+
+    // The fallback array is part of NSURLRequest, but it is not encoded by WKNSURLRequestCreateSerializableRepresentation.
+    encoder << resourceRequest.responseContentDispositionEncodingFallbackArray();
 }
 
 bool ArgumentCoder<ResourceRequest>::decodePlatformData(ArgumentDecoder& decoder, ResourceRequest& resourceRequest)
@@ -80,6 +83,17 @@
         return false;
 
     resourceRequest = ResourceRequest(nsURLRequest);
+    
+    Vector<String> responseContentDispositionEncodingFallbackArray;
+    if (!decoder.decode(responseContentDispositionEncodingFallbackArray))
+        return false;
+
+    resourceRequest.setResponseContentDispositionEncodingFallbackArray(
+        responseContentDispositionEncodingFallbackArray.size() > 0 ? responseContentDispositionEncodingFallbackArray[0] : String(),
+        responseContentDispositionEncodingFallbackArray.size() > 1 ? responseContentDispositionEncodingFallbackArray[1] : String(),
+        responseContentDispositionEncodingFallbackArray.size() > 2 ? responseContentDispositionEncodingFallbackArray[2] : String()
+    );
+
     return true;
 }