Title: [168199] trunk/Source/WebCore
Revision
168199
Author
ander...@apple.com
Date
2014-05-02 15:38:47 -0700 (Fri, 02 May 2014)

Log Message

Implement FormData decoding using KeyedDecoder
https://bugs.webkit.org/show_bug.cgi?id=132494

Reviewed by Tim Horton.

* platform/KeyedCoding.h:
(WebCore::KeyedDecoder::decodeEnum):
* platform/network/FormData.cpp:
(WebCore::decodeElement):
(WebCore::FormData::decode):
* platform/network/FormData.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (168198 => 168199)


--- trunk/Source/WebCore/ChangeLog	2014-05-02 22:37:07 UTC (rev 168198)
+++ trunk/Source/WebCore/ChangeLog	2014-05-02 22:38:47 UTC (rev 168199)
@@ -1,3 +1,17 @@
+2014-05-02  Anders Carlsson  <ander...@apple.com>
+
+        Implement FormData decoding using KeyedDecoder
+        https://bugs.webkit.org/show_bug.cgi?id=132494
+
+        Reviewed by Tim Horton.
+
+        * platform/KeyedCoding.h:
+        (WebCore::KeyedDecoder::decodeEnum):
+        * platform/network/FormData.cpp:
+        (WebCore::decodeElement):
+        (WebCore::FormData::decode):
+        * platform/network/FormData.h:
+
 2014-05-02  Brent Fulgham  <bfulg...@apple.com>
 
         [iOS] deviceScaleFactor is being double-applied when rendering captions in full screen mode

Modified: trunk/Source/WebCore/platform/KeyedCoding.h (168198 => 168199)


--- trunk/Source/WebCore/platform/KeyedCoding.h	2014-05-02 22:37:07 UTC (rev 168198)
+++ trunk/Source/WebCore/platform/KeyedCoding.h	2014-05-02 22:38:47 UTC (rev 168199)
@@ -72,7 +72,7 @@
         if (!decodeInt64(key, intValue))
             return false;
 
-        if (!isValidEnumFunction(intValue))
+        if (!isValidEnumFunction(static_cast<T>(intValue)))
             return false;
 
         value = static_cast<T>(intValue);

Modified: trunk/Source/WebCore/platform/network/FormData.cpp (168198 => 168199)


--- trunk/Source/WebCore/platform/network/FormData.cpp	2014-05-02 22:37:07 UTC (rev 168198)
+++ trunk/Source/WebCore/platform/network/FormData.cpp	2014-05-02 22:38:47 UTC (rev 168199)
@@ -543,6 +543,75 @@
     return false;
 }
 
+static bool decodeElement(KeyedDecoder& decoder, FormDataElement& element)
+{
+    if (!decoder.decodeEnum("type", element.m_type, [](FormDataElement::Type type) {
+        switch (type) {
+        case FormDataElement::Type::Data:
+        case FormDataElement::Type::EncodedFile:
+#if ENABLE(BLOB)
+        case FormDataElement::Type::EncodedBlob:
+#endif
+            return true;
+        }
+
+        return false;
+    }))
+        return false;
+
+    switch (element.m_type) {
+    case FormDataElement::Type::Data:
+        if (!decoder.decodeBytes("data", element.m_data))
+            return false;
+        break;
+
+    case FormDataElement::Type::EncodedFile: {
+        if (!decoder.decodeString("filename", element.m_filename))
+            return false;
+        if (!decoder.decodeString("generatedFilename", element.m_generatedFilename))
+            return false;
+        if (!decoder.decodeBool("shouldGenerateFile", element.m_shouldGenerateFile))
+            return false;
+
+#if ENABLE(BLOB)
+        int64_t fileStart;
+        if (!decoder.decodeInt64("fileStart", fileStart))
+            return false;
+        if (fileStart < 0)
+            return false;
+
+        int64_t fileLength;
+        if (!decoder.decodeInt64("fileLength", fileLength))
+            return false;
+        if (fileLength != BlobDataItem::toEndOfFile && fileLength < fileStart)
+            return false;
+
+        double expectedFileModificationTime;
+        if (!decoder.decodeDouble("expectedFileModificationTime", expectedFileModificationTime))
+            return false;
+
+        element.m_fileStart = fileStart;
+        element.m_fileLength = fileLength;
+        element.m_expectedFileModificationTime = expectedFileModificationTime;
+#endif
+        break;
+    }
+
+#if ENABLE(BLOB)
+    case FormDataElement::Type::EncodedBlob: {
+        String blobURLString;
+        if (!decoder.decodeString("url", blobURLString))
+            return false;
+
+        element.m_url = URL(URL(), blobURLString);
+        break;
+    }
+#endif
+    }
+
+    return true;
+}
+
 void FormData::encode(Encoder& encoder) const
 {
     encoder.encodeBool(m_alwaysStream);
@@ -605,4 +674,25 @@
     return data.release();
 }
 
+PassRefPtr<FormData> FormData::decode(KeyedDecoder& decoder)
+{
+    RefPtr<FormData> data = ""
+
+    if (!decoder.decodeBool("alwaysStream", data->m_alwaysStream))
+        return nullptr;
+
+    if (!decoder.decodeBytes("boundary", data->m_boundary))
+        return nullptr;
+
+    if (!decoder.decodeObjects("elements", data->m_elements, [](KeyedDecoder& decoder, FormDataElement& element) {
+        return decodeElement(decoder, element);
+    }))
+        return nullptr;
+
+    if (!decoder.decodeInt64("identifier", data->m_identifier))
+        return nullptr;
+
+    return data.release();
+}
+
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/network/FormData.h (168198 => 168199)


--- trunk/Source/WebCore/platform/network/FormData.h	2014-05-02 22:37:07 UTC (rev 168198)
+++ trunk/Source/WebCore/platform/network/FormData.h	2014-05-02 22:38:47 UTC (rev 168199)
@@ -30,6 +30,7 @@
 
 class Document;
 class FormDataList;
+class KeyedDecoder;
 class KeyedEncoder;
 class TextEncoding;
 
@@ -145,6 +146,7 @@
     void encode(Encoder&) const;
     void encode(KeyedEncoder&) const;
     static PassRefPtr<FormData> decode(Decoder&);
+    static PassRefPtr<FormData> decode(KeyedDecoder&);
 
     void appendData(const void* data, size_t);
     void appendFile(const String& filePath, bool shouldGenerateFile = false);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to