Title: [134262] trunk/Source/WebCore
Revision
134262
Author
[email protected]
Date
2012-11-12 11:13:08 -0800 (Mon, 12 Nov 2012)

Log Message

Move resolving blob references to FormData.
https://bugs.webkit.org/show_bug.cgi?id=101754

Reviewed by Simon Hausmann.

Resolving Blob-references to a set of just File and Data is done similar by several platforms.
This patch adds a generic implementation in FormData and uses that from CFNetwork, Qt and
BlackBerry network implementation.

* platform/network/FormData.cpp:
(WebCore::appendBlobResolved):
(WebCore::FormData::resolveBlobReferences):
* platform/network/FormData.h:
* platform/network/blackberry/ResourceRequestBlackBerry.cpp:
(WebCore::ResourceRequest::initializePlatformRequest):
* platform/network/cf/FormDataStreamCFNet.cpp:
(WebCore::setHTTPBody):
* platform/network/qt/QNetworkReplyHandler.cpp:
(WebCore::FormDataIODevice::prepareFormElements):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (134261 => 134262)


--- trunk/Source/WebCore/ChangeLog	2012-11-12 19:12:12 UTC (rev 134261)
+++ trunk/Source/WebCore/ChangeLog	2012-11-12 19:13:08 UTC (rev 134262)
@@ -1,3 +1,25 @@
+2012-11-12  Allan Sandfeld Jensen  <[email protected]>
+
+        Move resolving blob references to FormData.
+        https://bugs.webkit.org/show_bug.cgi?id=101754
+
+        Reviewed by Simon Hausmann.
+
+        Resolving Blob-references to a set of just File and Data is done similar by several platforms.
+        This patch adds a generic implementation in FormData and uses that from CFNetwork, Qt and
+        BlackBerry network implementation.
+
+        * platform/network/FormData.cpp:
+        (WebCore::appendBlobResolved):
+        (WebCore::FormData::resolveBlobReferences):
+        * platform/network/FormData.h:
+        * platform/network/blackberry/ResourceRequestBlackBerry.cpp:
+        (WebCore::ResourceRequest::initializePlatformRequest):
+        * platform/network/cf/FormDataStreamCFNet.cpp:
+        (WebCore::setHTTPBody):
+        * platform/network/qt/QNetworkReplyHandler.cpp:
+        (WebCore::FormDataIODevice::prepareFormElements):
+
 2012-11-12  Zeno Albisser  <[email protected]>
 
         GraphicsSurfaceGLX does not handle transparency correctly.

Modified: trunk/Source/WebCore/platform/network/FormData.cpp (134261 => 134262)


--- trunk/Source/WebCore/platform/network/FormData.cpp	2012-11-12 19:12:12 UTC (rev 134261)
+++ trunk/Source/WebCore/platform/network/FormData.cpp	2012-11-12 19:13:08 UTC (rev 134262)
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2004, 2006, 2008, 2011 Apple Inc. All rights reserved.
  * Copyright (C) 2009 Google Inc. All rights reserved.
+ * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies)
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -23,6 +24,7 @@
 #include "FormData.h"
 
 #include "BlobData.h"
+#include "BlobRegistryImpl.h"
 #include "BlobURL.h"
 #include "Chrome.h"
 #include "ChromeClient.h"
@@ -317,6 +319,64 @@
     return Latin1Encoding().decode(reinterpret_cast<const char*>(bytes.data()), bytes.size());
 }
 
+#if ENABLE(BLOB)
+static void appendBlobResolved(FormData* formData, const KURL& url)
+{
+    RefPtr<BlobStorageData> blobData = static_cast<BlobRegistryImpl&>(blobRegistry()).getBlobDataFromURL(KURL(ParsedURLString, url));
+    if (!blobData)
+        return;
+
+    BlobDataItemList::const_iterator it = blobData->items().begin();
+    const BlobDataItemList::const_iterator itend = blobData->items().end();
+    for (; it != itend; ++it) {
+        const BlobDataItem& blobItem = *it;
+        if (blobItem.type == BlobDataItem::Data)
+            formData->appendData(blobItem.data->data() + static_cast<int>(blobItem.offset), static_cast<int>(blobItem.length));
+        else if (blobItem.type == BlobDataItem::File)
+            formData->appendFileRange(blobItem.path, blobItem.offset, blobItem.length, blobItem.expectedModificationTime);
+        else if (blobItem.type == BlobDataItem::Blob)
+            appendBlobResolved(formData, blobItem.url);
+        else
+            ASSERT_NOT_REACHED();
+    }
+}
+
+PassRefPtr<FormData> FormData::resolveBlobReferences()
+{
+    // First check if any blobs needs to be resolved, or we can take the fast path.
+    bool hasBlob = false;
+    Vector<FormDataElement>::const_iterator it = elements().begin();
+    const Vector<FormDataElement>::const_iterator itend = elements().end();
+    for (; it != itend; ++it) {
+        if (it->m_type == FormDataElement::encodedBlob) {
+            hasBlob = true;
+            break;
+        }
+    }
+
+    if (!hasBlob)
+        return this;
+
+    // Create a copy to append the result into.
+    RefPtr<FormData> newFormData = FormData::create();
+    newFormData->setAlwaysStream(alwaysStream());
+    newFormData->setIdentifier(identifier());
+    it = elements().begin();
+    for (; it != itend; ++it) {
+        const FormDataElement& element = *it;
+        if (element.m_type == FormDataElement::data)
+            newFormData->appendData(element.m_data.data(), element.m_data.size());
+        else if (element.m_type == FormDataElement::encodedFile)
+            newFormData->appendFileRange(element.m_filename, element.m_fileStart, element.m_fileLength, element.m_expectedFileModificationTime, element.m_shouldGenerateFile);
+        else if (element.m_type == FormDataElement::encodedBlob)
+            appendBlobResolved(newFormData.get(), element.m_url);
+        else
+            ASSERT_NOT_REACHED();
+    }
+    return newFormData.release();
+}
+#endif
+
 void FormData::generateFiles(Document* document)
 {
     ASSERT(!m_hasGeneratedFiles);

Modified: trunk/Source/WebCore/platform/network/FormData.h (134261 => 134262)


--- trunk/Source/WebCore/platform/network/FormData.h	2012-11-12 19:12:12 UTC (rev 134261)
+++ trunk/Source/WebCore/platform/network/FormData.h	2012-11-12 19:13:08 UTC (rev 134262)
@@ -134,6 +134,12 @@
     void flatten(Vector<char>&) const; // omits files
     String flattenToString() const; // omits files
 
+#if ENABLE(BLOB)
+    // Resolve all blob references so we only have file and data.
+    // If the FormData has no blob references to resolve, this is returned.
+    PassRefPtr<FormData> resolveBlobReferences();
+#endif
+
     bool isEmpty() const { return m_elements.isEmpty(); }
     const Vector<FormDataElement>& elements() const { return m_elements; }
     const Vector<char>& boundary() const { return m_boundary; }

Modified: trunk/Source/WebCore/platform/network/blackberry/ResourceRequestBlackBerry.cpp (134261 => 134262)


--- trunk/Source/WebCore/platform/network/blackberry/ResourceRequestBlackBerry.cpp	2012-11-12 19:12:12 UTC (rev 134261)
+++ trunk/Source/WebCore/platform/network/blackberry/ResourceRequestBlackBerry.cpp	2012-11-12 19:13:08 UTC (rev 134262)
@@ -157,7 +157,11 @@
         platformRequest.setSuggestedSaveName(suggestedSaveName());
 
         if (httpBody() && !httpBody()->isEmpty()) {
-            const Vector<FormDataElement>& elements = httpBody()->elements();
+            RefPtr<FormData> formData = httpBody();
+#if ENABLE(BLOB)
+            formData = formData->resolveBlobReferences();
+#endif
+            const Vector<FormDataElement>& elements = formData->elements();
             // Use setData for simple forms because it is slightly more efficient.
             if (elements.size() == 1 && elements[0].m_type == FormDataElement::data)
                 platformRequest.setData(elements[0].m_data.data(), elements[0].m_data.size());
@@ -168,24 +172,8 @@
                         platformRequest.addMultipartData(element.m_data.data(), element.m_data.size());
                     else if (element.m_type == FormDataElement::encodedFile)
                         platformRequest.addMultipartFilename(element.m_filename.characters(), element.m_filename.length());
-#if ENABLE(BLOB)
-                    else if (element.m_type == FormDataElement::encodedBlob) {
-                        RefPtr<BlobStorageData> blobData = static_cast<BlobRegistryImpl&>(blobRegistry()).getBlobDataFromURL(KURL(ParsedURLString, element.m_url));
-                        if (blobData) {
-                            for (size_t j = 0; j < blobData->items().size(); ++j) {
-                                const BlobDataItem& blobItem = blobData->items()[j];
-                                if (blobItem.type == BlobDataItem::Data)
-                                    platformRequest.addMultipartData(blobItem.data->data() + static_cast<int>(blobItem.offset), static_cast<int>(blobItem.length));
-                                else {
-                                    ASSERT(blobItem.type == BlobDataItem::File);
-                                    platformRequest.addMultipartFilename(blobItem.path.characters(), blobItem.path.length(), blobItem.offset, blobItem.length, blobItem.expectedModificationTime);
-                                }
-                            }
-                        }
-                    }
-#endif
                     else
-                        ASSERT_NOT_REACHED(); // unknown type
+                        ASSERT_NOT_REACHED(); // Blobs should be resolved at this point.
                 }
             }
         }

Modified: trunk/Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp (134261 => 134262)


--- trunk/Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp	2012-11-12 19:12:12 UTC (rev 134261)
+++ trunk/Source/WebCore/platform/network/cf/FormDataStreamCFNet.cpp	2012-11-12 19:13:08 UTC (rev 134262)
@@ -395,46 +395,8 @@
     }
 
 #if ENABLE(BLOB)
-    // Check if there is a blob in the form data.
-    bool hasBlob = false;
-    for (size_t i = 0; i < count; ++i) {
-        const FormDataElement& element = formData->elements()[i];
-        if (element.m_type == FormDataElement::encodedBlob) {
-            hasBlob = true;
-            break;
-        }
-    }
-
-    // If yes, we have to resolve all the blob references and regenerate the form data with only data and file types.
-    if (hasBlob) {
-        RefPtr<FormData> newFormData = FormData::create();
-        newFormData->setAlwaysStream(formData->alwaysStream());
-        newFormData->setIdentifier(formData->identifier());
-        for (size_t i = 0; i < count; ++i) {
-            const FormDataElement& element = formData->elements()[i];
-            if (element.m_type == FormDataElement::data)
-                newFormData->appendData(element.m_data.data(), element.m_data.size());
-            else if (element.m_type == FormDataElement::encodedFile)
-                newFormData->appendFile(element.m_filename, element.m_shouldGenerateFile);
-            else {
-                ASSERT(element.m_type == FormDataElement::encodedBlob);
-                RefPtr<BlobStorageData> blobData = static_cast<BlobRegistryImpl&>(blobRegistry()).getBlobDataFromURL(KURL(ParsedURLString, element.m_url));
-                if (blobData) {
-                    for (size_t j = 0; j < blobData->items().size(); ++j) {
-                        const BlobDataItem& blobItem = blobData->items()[j];
-                        if (blobItem.type == BlobDataItem::Data)
-                            newFormData->appendData(blobItem.data->data() + static_cast<int>(blobItem.offset), static_cast<int>(blobItem.length));
-                        else {
-                            ASSERT(blobItem.type == BlobDataItem::File);
-                            newFormData->appendFileRange(blobItem.path, blobItem.offset, blobItem.length, blobItem.expectedModificationTime);
-                        }
-                    }
-                }
-            }
-        }
-        formData = newFormData.release();
-        count = formData->elements().size();
-    }
+    formData = formData->resolveBlobReferences();
+    count = formData->elements().size();
 #endif
 
     // Precompute the content length so NSURLConnection doesn't use chunked mode.

Modified: trunk/Source/WebCore/platform/network/qt/QNetworkReplyHandler.cpp (134261 => 134262)


--- trunk/Source/WebCore/platform/network/qt/QNetworkReplyHandler.cpp	2012-11-12 19:12:12 UTC (rev 134261)
+++ trunk/Source/WebCore/platform/network/qt/QNetworkReplyHandler.cpp	2012-11-12 19:13:08 UTC (rev 134262)
@@ -21,7 +21,7 @@
 #include "config.h"
 #include "QNetworkReplyHandler.h"
 
-#include "BlobRegistryImpl.h"
+#include "BlobData.h"
 #include "HTTPParsers.h"
 #include "MIMETypeRegistry.h"
 #include "ResourceHandle.h"
@@ -61,68 +61,19 @@
     delete m_currentFile;
 }
 
-#if ENABLE(BLOB)
-static void appendBlobResolved(FormData* formData, const KURL& url)
-{
-    RefPtr<BlobStorageData> blobData = static_cast<BlobRegistryImpl&>(blobRegistry()).getBlobDataFromURL(KURL(ParsedURLString, url));
-    if (blobData) {
-        BlobDataItemList::const_iterator it = blobData->items().begin();
-        const BlobDataItemList::const_iterator itend = blobData->items().end();
-        for (; it != itend; ++it) {
-            const BlobDataItem& blobItem = *it;
-            if (blobItem.type == BlobDataItem::Data)
-                formData->appendData(blobItem.data->data() + static_cast<int>(blobItem.offset), static_cast<int>(blobItem.length));
-            else if (blobItem.type == BlobDataItem::File)
-                formData->appendFileRange(blobItem.path, blobItem.offset, blobItem.length, blobItem.expectedModificationTime);
-            else if (blobItem.type == BlobDataItem::Blob)
-                appendBlobResolved(formData, blobItem.url);
-            else
-                ASSERT_NOT_REACHED();
-        }
-    }
-}
-#endif
-
 void FormDataIODevice::prepareFormElements(FormData* formData)
 {
     if (!formData)
         return;
 
-#if ENABLE(BLOB)
-    bool hasBlob = false;
-    Vector<FormDataElement>::const_iterator it = formData->elements().begin();
-    const Vector<FormDataElement>::const_iterator itend = formData->elements().end();
-    for (; it != itend; ++it) {
-        if (it->m_type == FormDataElement::encodedBlob) {
-            hasBlob = true;
-            break;
-        }
-    }
+    RefPtr<FormData> formDataRef(formData);
 
-    // Resolve all blobs so we only have file and data.
-    if (hasBlob) {
-        RefPtr<FormData> newFormData = FormData::create();
-        newFormData->setAlwaysStream(formData->alwaysStream());
-        newFormData->setIdentifier(formData->identifier());
-        it = formData->elements().begin();
-        for (; it != itend; ++it) {
-            const FormDataElement& element = *it;
-            if (element.m_type == FormDataElement::data)
-                newFormData->appendData(element.m_data.data(), element.m_data.size());
-            else if (element.m_type == FormDataElement::encodedFile)
-                newFormData->appendFileRange(element.m_filename, element.m_fileStart, element.m_fileLength, element.m_expectedFileModificationTime, element.m_shouldGenerateFile);
-            else if (element.m_type == FormDataElement::encodedBlob)
-                appendBlobResolved(newFormData.get(), element.m_url);
-            else
-                ASSERT_NOT_REACHED();
-        }
-        m_formElements = newFormData->elements();
-        return;
-    }
+#if ENABLE(BLOB)
+    formDataRef = formDataRef->resolveBlobReferences();
 #endif
 
     // Take a deep copy of the FormDataElements
-    m_formElements = formData->elements();
+    m_formElements = formDataRef->elements();
 }
 
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to