Title: [103487] trunk/Source/WebCore
Revision
103487
Author
leo.y...@torchmobile.com.cn
Date
2011-12-21 18:50:12 -0800 (Wed, 21 Dec 2011)

Log Message

Upstream the Multipart feature in Blackberry port
https://bugs.webkit.org/show_bug.cgi?id=73533

Patch by Chris Guan <chris.g...@torchmobile.com.cn> on 2011-12-21
Reviewed by Rob Buis.

I refactored Multipart code of Blackberry port. Moved Multipart into
Blackerry network layer and removed the dependence of std::string.

Initial upstream, no new test cases.

* platform/network/blackberry/DeferredData.cpp:
(WebCore::DeferredData::deferMultipartHeaderReceived):
(WebCore::DeferredData::processHeaders):
(WebCore::DeferredData::processDeferredData):
* platform/network/blackberry/DeferredData.h:
(WebCore::DeferredData::hasDeferredData):
* platform/network/blackberry/NetworkJob.cpp:
(WebCore::NetworkJob::notifyMultipartHeaderReceived):
(WebCore::NetworkJob::handleNotifyMultipartHeaderReceived):
(WebCore::NetworkJob::handleNotifyDataReceived):
(WebCore::NetworkJob::handleNotifyClose):
(WebCore::NetworkJob::startNewJobWithRequest):
(WebCore::NetworkJob::sendResponseIfNeeded):
(WebCore::NetworkJob::sendMultipartResponseIfNeeded):
* platform/network/blackberry/NetworkJob.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (103486 => 103487)


--- trunk/Source/WebCore/ChangeLog	2011-12-22 02:45:23 UTC (rev 103486)
+++ trunk/Source/WebCore/ChangeLog	2011-12-22 02:50:12 UTC (rev 103487)
@@ -1,3 +1,31 @@
+2011-12-21  Chris Guan  <chris.g...@torchmobile.com.cn>
+
+        Upstream the Multipart feature in Blackberry port
+        https://bugs.webkit.org/show_bug.cgi?id=73533
+
+        Reviewed by Rob Buis.
+
+        I refactored Multipart code of Blackberry port. Moved Multipart into
+        Blackerry network layer and removed the dependence of std::string.
+
+        Initial upstream, no new test cases.
+
+        * platform/network/blackberry/DeferredData.cpp:
+        (WebCore::DeferredData::deferMultipartHeaderReceived):
+        (WebCore::DeferredData::processHeaders):
+        (WebCore::DeferredData::processDeferredData):
+        * platform/network/blackberry/DeferredData.h:
+        (WebCore::DeferredData::hasDeferredData):
+        * platform/network/blackberry/NetworkJob.cpp:
+        (WebCore::NetworkJob::notifyMultipartHeaderReceived):
+        (WebCore::NetworkJob::handleNotifyMultipartHeaderReceived):
+        (WebCore::NetworkJob::handleNotifyDataReceived):
+        (WebCore::NetworkJob::handleNotifyClose):
+        (WebCore::NetworkJob::startNewJobWithRequest):
+        (WebCore::NetworkJob::sendResponseIfNeeded):
+        (WebCore::NetworkJob::sendMultipartResponseIfNeeded):
+        * platform/network/blackberry/NetworkJob.h:
+
 2011-12-21  Eric Carlson  <eric.carl...@apple.com>
 
         Fix text track cue font size and colors

Modified: trunk/Source/WebCore/platform/network/blackberry/DeferredData.cpp (103486 => 103487)


--- trunk/Source/WebCore/platform/network/blackberry/DeferredData.cpp	2011-12-22 02:45:23 UTC (rev 103486)
+++ trunk/Source/WebCore/platform/network/blackberry/DeferredData.cpp	2011-12-22 02:50:12 UTC (rev 103487)
@@ -55,6 +55,12 @@
     m_headerValues.append(value);
 }
 
+void DeferredData::deferMultipartHeaderReceived(const String& key, const String& value)
+{
+    m_multipartHeaderKeys.append(key);
+    m_multipartheaderValues.append(value);
+}
+
 void DeferredData::deferDataSent(unsigned long long bytesSent, unsigned long long totalBytesToBeSent)
 {
     m_bytesSent = bytesSent;
@@ -73,6 +79,30 @@
     m_deferredClose = true;
 }
 
+bool DeferredData::processHeaders(Vector<String>& headerKeys, Vector<String>& headerValues, HandleHeadersFunction function)
+{
+    size_t numHeaders = headerKeys.size();
+    ASSERT(headerValues.size() == numHeaders);
+    for (size_t i = 0; i < numHeaders; ++i) {
+        (m_job.*function)(headerKeys[i], headerValues[i]);
+
+        if (m_job.isDeferringLoading()) {
+            // Remove all the headers that have already been processed.
+            headerKeys.remove(0, i + 1);
+            headerValues.remove(0, i + 1);
+            return false;
+        }
+
+        if (m_job.isCancelled()) {
+            // Don't bother removing headers; job will be deleted.
+            return false;
+        }
+    }
+    headerKeys.clear();
+    headerValues.clear();
+    return true;
+}
+
 void DeferredData::processDeferredData()
 {
     if (m_inProcessDeferredData)
@@ -100,26 +130,10 @@
             return;
     }
 
-    size_t numHeaders = m_headerKeys.size();
-    ASSERT(m_headerValues.size() == numHeaders);
-    for (unsigned i = 0; i < numHeaders; ++i) {
-        m_job.handleNotifyHeaderReceived(m_headerKeys[i], m_headerValues[i]);
+    if (!processHeaders(m_headerKeys, m_headerValues, &NetworkJob::handleNotifyHeaderReceived)
+        || !processHeaders(m_multipartHeaderKeys, m_multipartheaderValues, &NetworkJob::handleNotifyMultipartHeaderReceived))
+        return;
 
-        if (m_job.isDeferringLoading()) {
-            // Remove all the headers that have already been processed.
-            m_headerKeys.remove(0, i + 1);
-            m_headerValues.remove(0, i + 1);
-            return;
-        }
-
-        if (m_job.isCancelled()) {
-            // Don't bother removing headers; job will be deleted.
-            return;
-        }
-    }
-    m_headerKeys.clear();
-    m_headerValues.clear();
-
     // Only process 32k of data at a time to avoid blocking the event loop for too long.
     static const unsigned maxData = 32 * 1024;
 

Modified: trunk/Source/WebCore/platform/network/blackberry/DeferredData.h (103486 => 103487)


--- trunk/Source/WebCore/platform/network/blackberry/DeferredData.h	2011-12-22 02:45:23 UTC (rev 103486)
+++ trunk/Source/WebCore/platform/network/blackberry/DeferredData.h	2011-12-22 02:50:12 UTC (rev 103487)
@@ -53,13 +53,14 @@
     void deferOpen(int status, const String& message);
     void deferWMLOverride();
     void deferHeaderReceived(const String& key, const String& value);
+    void deferMultipartHeaderReceived(const String& key, const String& value);
     void deferDataReceived(const char* buf, size_t len);
     void deferDataSent(unsigned long long bytesSent, unsigned long long totalBytesToBeSent);
     void deferClose(int status);
 
     bool hasDeferredData() const
     {
-        return m_deferredStatusReceived || m_deferredWMLOverride || !m_headerKeys.isEmpty() || !m_dataSegments.isEmpty() || m_deferredClose;
+        return m_deferredStatusReceived || m_deferredWMLOverride || !m_headerKeys.isEmpty() || !m_multipartHeaderKeys.isEmpty() || !m_dataSegments.isEmpty() || m_deferredClose;
     }
 
     void processDeferredData();
@@ -71,6 +72,11 @@
     }
 
 private:
+    typedef void (NetworkJob::*HandleHeadersFunction)(const String& key, const String& value);
+
+    // Returns false if the job is deferred or canceled, otherwise returns true.
+    bool processHeaders(Vector<String>& headerKeys, Vector<String>& headerValues, HandleHeadersFunction);
+
     void fireProcessDataTimer(Timer<DeferredData>*);
     NetworkJob& m_job;
     Timer<DeferredData> m_processDataTimer;
@@ -80,6 +86,8 @@
     bool m_deferredWMLOverride;
     Vector<String> m_headerKeys;
     Vector<String> m_headerValues;
+    Vector<String> m_multipartHeaderKeys;
+    Vector<String> m_multipartheaderValues;
     Deque<Vector<char> > m_dataSegments;
     unsigned long long m_bytesSent;
     unsigned long long m_totalBytesToBeSent;

Modified: trunk/Source/WebCore/platform/network/blackberry/NetworkJob.cpp (103486 => 103487)


--- trunk/Source/WebCore/platform/network/blackberry/NetworkJob.cpp	2011-12-22 02:45:23 UTC (rev 103486)
+++ trunk/Source/WebCore/platform/network/blackberry/NetworkJob.cpp	2011-12-22 02:50:12 UTC (rev 103487)
@@ -37,6 +37,7 @@
 #include <BlackBerryPlatformLog.h>
 #include <BlackBerryPlatformWebKitCredits.h>
 #include <BuildInformation.h>
+#include <network/MultipartStream.h>
 #include <network/NetworkRequest.h>
 #include <network/NetworkStreamFactory.h>
 #include <wtf/ASCIICType.h>
@@ -279,6 +280,14 @@
     }
 }
 
+void NetworkJob::notifyMultipartHeaderReceived(const char* key, const char* value)
+{
+    if (shouldDeferLoading())
+        m_deferredData.deferMultipartHeaderReceived(key, value);
+    else
+        handleNotifyMultipartHeaderReceived(key, value);
+}
+
 void NetworkJob::notifyStringHeaderReceived(const String& key, const String& value)
 {
     if (shouldDeferLoading())
@@ -315,6 +324,44 @@
     m_response.setHTTPHeaderField(key, value);
 }
 
+void NetworkJob::handleNotifyMultipartHeaderReceived(const String& key, const String& value)
+{
+    if (!m_multipartResponse) {
+        // Create a new response based on the original set of headers + the
+        // replacement headers. We only replace the same few headers that gecko
+        // does. See netwerk/streamconv/converters/nsMultiMixedConv.cpp.
+        m_multipartResponse = adoptPtr(new ResourceResponse);
+        m_multipartResponse->setURL(m_response.url());
+
+        // The list of BlackBerry::Platform::replaceHeaders that we do not copy from the original
+        // response when generating a response.
+        const WebCore::HTTPHeaderMap& map = m_response.httpHeaderFields();
+
+        for (WebCore::HTTPHeaderMap::const_iterator it = map.begin(); it != map.end(); ++it) {
+            bool needsCopyfromOriginalResponse = true;
+            int replaceHeadersIndex = 0;
+            while (BlackBerry::Platform::MultipartStream::replaceHeaders[replaceHeadersIndex]) {
+                if (it->first.lower() == BlackBerry::Platform::MultipartStream::replaceHeaders[replaceHeadersIndex]) {
+                    needsCopyfromOriginalResponse = false;
+                    break;
+                }
+                replaceHeadersIndex++;
+            }
+            if (needsCopyfromOriginalResponse)
+                m_multipartResponse->setHTTPHeaderField(it->first, it->second);
+        }
+
+        m_multipartResponse->setIsMultipartPayload(true);
+    } else {
+        if (key.lower() == "content-type") {
+            String contentType = value.lower();
+            m_multipartResponse->setMimeType(extractMIMETypeFromMediaType(contentType));
+            m_multipartResponse->setTextEncodingName(extractCharsetFromMediaType(contentType));
+        }
+        m_multipartResponse->setHTTPHeaderField(key, value);
+    }
+}
+
 void NetworkJob::handleSetCookieHeader(const String& value)
 {
     KURL url = ""
@@ -350,13 +397,10 @@
 
     if (shouldSendClientData()) {
         sendResponseIfNeeded();
+        sendMultipartResponseIfNeeded();
         if (clientIsOk()) {
-            if (m_multipartDelegate)
-                m_multipartDelegate->onReceivedData(buf, len, len);
-            else {
-                RecursionGuard guard(m_callingClient);
-                m_handle->client()->didReceiveData(m_handle.get(), buf, len, len);
-           }
+            RecursionGuard guard(m_callingClient);
+            m_handle->client()->didReceiveData(m_handle.get(), buf, len, len);
         }
     }
 
@@ -419,8 +463,6 @@
 
             sendResponseIfNeeded();
             if (clientIsOk()) {
-                if (m_multipartDelegate)
-                    m_multipartDelegate->onCompletedRequest();
 
                 RecursionGuard guard(m_callingClient);
                 if (isError(m_extendedStatusCode) && !m_dataReceived) {
@@ -439,7 +481,7 @@
 
     // Detach from the ResourceHandle in any case.
     m_handle = 0;
-    m_multipartDelegate = nullptr;
+    m_multipartResponse = nullptr;
 }
 
 bool NetworkJob::shouldNotifyClientFinished()
@@ -487,7 +529,7 @@
     // Pass the ownership of the ResourceHandle to the new NetworkJob.
     RefPtr<ResourceHandle> handle = m_handle;
     m_handle = 0;
-    m_multipartDelegate = nullptr;
+    m_multipartResponse = nullptr;
 
     NetworkManager::instance()->startJob(m_playerId,
         m_pageGroupName,
@@ -582,13 +624,14 @@
     if (clientIsOk()) {
         RecursionGuard guard(m_callingClient);
         m_handle->client()->didReceiveResponse(m_handle.get(), m_response);
+    }
+}
 
-        if (mimeType == "multipart/x-mixed-replace") {
-            std::string boundary;
-            bool isReadBoundary = MultipartResponseDelegate::readMultipartBoundary(m_contentType.lower().utf8().data(), boundary);
-            if (isReadBoundary && !boundary.empty())
-                m_multipartDelegate = adoptPtr(new MultipartResponseDelegate(m_handle, m_response, boundary));
-        }
+void NetworkJob::sendMultipartResponseIfNeeded()
+{
+    if (m_multipartResponse && clientIsOk()) {
+        m_handle->client()->didReceiveResponse(m_handle.get(), *m_multipartResponse);
+        m_multipartResponse = nullptr;
     }
 }
 

Modified: trunk/Source/WebCore/platform/network/blackberry/NetworkJob.h (103486 => 103487)


--- trunk/Source/WebCore/platform/network/blackberry/NetworkJob.h	2011-12-22 02:45:23 UTC (rev 103486)
+++ trunk/Source/WebCore/platform/network/blackberry/NetworkJob.h	2011-12-22 02:50:12 UTC (rev 103487)
@@ -20,7 +20,6 @@
 #define NetworkJob_h
 
 #include "DeferredData.h"
-#include "MultipartResponseDelegate.h"
 #include "PlatformString.h"
 #include "ProtectionSpace.h"
 #include "ResourceHandle.h"
@@ -70,9 +69,11 @@
     virtual void notifyWMLOverride();
     void handleNotifyWMLOverride() { m_response.setIsWML(true); }
     virtual void notifyHeaderReceived(const char* key, const char* value);
+    virtual void notifyMultipartHeaderReceived(const char* key, const char* value);
     // Exists only to resolve ambiguity between char* and String parameters
     void notifyStringHeaderReceived(const String& key, const String& value);
     void handleNotifyHeaderReceived(const String& key, const String& value);
+    void handleNotifyMultipartHeaderReceived(const String& key, const String& value);
     void handleSetCookieHeader(const String& value);
     void notifyDataReceivedPlain(const char* buf, size_t len);
     void handleNotifyDataReceived(const char* buf, size_t len);
@@ -108,6 +109,7 @@
 
     // This can cause m_cancelled to be set to true, if it passes up an error to m_handle->client() which causes the job to be cancelled
     void sendResponseIfNeeded();
+    void sendMultipartResponseIfNeeded();
 
     void fireLoadDataTimer(Timer<NetworkJob>*)
     {
@@ -149,7 +151,7 @@
     ResourceResponse m_response;
     Timer<NetworkJob> m_loadDataTimer;
     Timer<NetworkJob> m_loadAboutTimer;
-    OwnPtr<MultipartResponseDelegate> m_multipartDelegate;
+    OwnPtr<ResourceResponse> m_multipartResponse;
     Timer<NetworkJob> m_deleteJobTimer;
     String m_contentType;
     String m_contentDisposition;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to