Encode form data using the KeyedEncoder
authorandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 10 Nov 2013 01:27:48 +0000 (01:27 +0000)
committerandersca@apple.com <andersca@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Sun, 10 Nov 2013 01:27:48 +0000 (01:27 +0000)
https://bugs.webkit.org/show_bug.cgi?id=124107

Reviewed by Sam Weinig.

Source/WebCore:

* platform/KeyedCoding.h:
(WebCore::KeyedEncoder::encodeEnum):
* platform/network/FormData.cpp:
(WebCore::encodeElement):
(WebCore::FormData::encode):
* platform/network/FormData.h:

Source/WebKit2:

* Shared/cf/KeyedEncoder.cpp:
(WebKit::KeyedEncoder::encodeBool):
(WebKit::KeyedEncoder::encodeDouble):
* Shared/cf/KeyedEncoder.h:

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

Source/WebCore/ChangeLog
Source/WebCore/platform/KeyedCoding.h
Source/WebCore/platform/network/FormData.cpp
Source/WebCore/platform/network/FormData.h
Source/WebKit2/ChangeLog
Source/WebKit2/Shared/cf/KeyedEncoder.cpp
Source/WebKit2/Shared/cf/KeyedEncoder.h

index a3544ba6ff0374e5cc9889465b7d0c13b3fdb72d..c44e98f94c4b3db676689209fec58895d11e1bc7 100644 (file)
@@ -1,3 +1,17 @@
+2013-11-09  Anders Carlsson  <andersca@apple.com>
+
+        Encode form data using the KeyedEncoder
+        https://bugs.webkit.org/show_bug.cgi?id=124107
+
+        Reviewed by Sam Weinig.
+
+        * platform/KeyedCoding.h:
+        (WebCore::KeyedEncoder::encodeEnum):
+        * platform/network/FormData.cpp:
+        (WebCore::encodeElement):
+        (WebCore::FormData::encode):
+        * platform/network/FormData.h:
+
 2013-11-09  Sam Weinig  <sam@webkit.org>
 
         Modernize CanvasObserverProxy
index c8addcfd32ea2af43c10b8581a1005296127fbbd..2d6f4d9c4c5fbe2463bc7b9a5a45c170a0cffd1c 100644 (file)
@@ -36,12 +36,22 @@ protected:
 
 public:
     virtual void encodeBytes(const String& key, const uint8_t*, size_t) = 0;
+    virtual void encodeBool(const String& key, bool) = 0;
     virtual void encodeUInt32(const String& key, uint32_t) = 0;
     virtual void encodeInt32(const String& key, int32_t) = 0;
     virtual void encodeInt64(const String& key, int64_t) = 0;
     virtual void encodeFloat(const String& key, float) = 0;
+    virtual void encodeDouble(const String& key, double) = 0;
     virtual void encodeString(const String& key, const String&) = 0;
 
+    template<typename T>
+    void encodeEnum(const String& key, T value)
+    {
+        static_assert(std::is_enum<T>::value, "T must be an enum type");
+
+        encodeInt64(key, static_cast<int64_t>(value));
+    }
+
     template<typename T, typename F>
     void encodeObject(const String& key, const T& object, F&& function)
     {
index 02a86eb0b16491464d9ebb8718a9af333b7ee184..f056b58ca63b34407930271987c24fda22c9da98 100644 (file)
@@ -33,6 +33,7 @@
 #include "FileSystem.h"
 #include "FormDataBuilder.h"
 #include "FormDataList.h"
+#include "KeyedCoding.h"
 #include "MIMETypeRegistry.h"
 #include "Page.h"
 #include "TextEncoding.h"
@@ -443,6 +444,35 @@ static void encodeElement(Encoder& encoder, const FormDataElement& element)
     ASSERT_NOT_REACHED();
 }
 
+static void encodeElement(KeyedEncoder& encoder, const FormDataElement& element)
+{
+    encoder.encodeEnum("type", element.m_type);
+
+    switch (element.m_type) {
+    case FormDataElement::data:
+        encoder.encodeBytes("data", reinterpret_cast<const uint8_t*>(element.m_data.data()), element.m_data.size());
+        return;
+    case FormDataElement::encodedFile:
+        encoder.encodeString("filename", element.m_filename);
+        encoder.encodeString("generatedFilename", element.m_generatedFilename);
+        encoder.encodeBool("shouldGenerateFile", element.m_shouldGenerateFile);
+#if ENABLE(BLOB)
+        encoder.encodeInt64("fileStart", element.m_fileStart);
+        encoder.encodeInt64("fileLength", element.m_fileLength);
+        encoder.encodeDouble("expectedFileModificationTime", element.m_expectedFileModificationTime);
+#endif
+        return;
+
+#if ENABLE(BLOB)
+    case FormDataElement::encodedBlob:
+        encoder.encodeString("url", element.m_url.string());
+        return;
+#endif
+    }
+
+    ASSERT_NOT_REACHED();
+}
+
 static bool decodeElement(Decoder& decoder, FormDataElement& element)
 {
     uint32_t type;
@@ -527,6 +557,19 @@ void FormData::encode(Encoder& encoder) const
     encoder.encodeInt64(m_identifier);
 }
 
+void FormData::encode(KeyedEncoder& encoder) const
+{
+    encoder.encodeBool("alwaysStream", m_alwaysStream);
+    encoder.encodeBytes("boundary", reinterpret_cast<const uint8_t*>(m_boundary.data()), m_boundary.size());
+
+    encoder.encodeObjects("elements", m_elements.begin(), m_elements.end(), [](KeyedEncoder& encoder, const FormDataElement& element) {
+        encodeElement(encoder, element);
+    });
+
+    encoder.encodeBool("hasGeneratedFiles", m_hasGeneratedFiles);
+    encoder.encodeInt64("identifier", m_identifier);
+}
+
 PassRefPtr<FormData> FormData::decode(Decoder& decoder)
 {
     RefPtr<FormData> data = FormData::create();
index 1bf5a98389efadea3f8fdcd36dca4dc203597b9e..e3761f8badccd6fa47c0d1d95434ea378ed2486c 100644 (file)
@@ -30,6 +30,7 @@ namespace WebCore {
 
 class Document;
 class FormDataList;
+class KeyedEncoder;
 class TextEncoding;
 
 class FormDataElement {
@@ -108,6 +109,7 @@ public:
     ~FormData();
 
     void encode(Encoder&) const;
+    void encode(KeyedEncoder&) const;
     static PassRefPtr<FormData> decode(Decoder&);
 
     void appendData(const void* data, size_t);
index 7d371db4a6945458ff739f725d6d56947e82ec88..6fdfd576649fa73183df30f6228c277dec8becf9 100644 (file)
@@ -1,3 +1,15 @@
+2013-11-09  Anders Carlsson  <andersca@apple.com>
+
+        Encode form data using the KeyedEncoder
+        https://bugs.webkit.org/show_bug.cgi?id=124107
+
+        Reviewed by Sam Weinig.
+
+        * Shared/cf/KeyedEncoder.cpp:
+        (WebKit::KeyedEncoder::encodeBool):
+        (WebKit::KeyedEncoder::encodeDouble):
+        * Shared/cf/KeyedEncoder.h:
+
 2013-11-09  Anders Carlsson  <andersca@apple.com>
 
         Remove an unused file.
index 58936a10844caea866327af6012ddb41baa64557..3c327eafffdeca84f51406f79e28627de193be11 100644 (file)
@@ -55,6 +55,11 @@ void KeyedEncoder::encodeBytes(const String& key, const uint8_t* bytes, size_t s
     CFDictionarySetValue(m_dictionaryStack.last(), key.createCFString().get(), data.get());
 }
 
+void KeyedEncoder::encodeBool(const String& key, bool value)
+{
+    CFDictionarySetValue(m_dictionaryStack.last(), key.createCFString().get(), value ? kCFBooleanTrue : kCFBooleanFalse);
+}
+
 void KeyedEncoder::encodeUInt32(const String& key, uint32_t value)
 {
     auto number = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &value));
@@ -79,6 +84,12 @@ void KeyedEncoder::encodeFloat(const String& key, float value)
     CFDictionarySetValue(m_dictionaryStack.last(), key.createCFString().get(), number.get());
 }
 
+void KeyedEncoder::encodeDouble(const String& key, double value)
+{
+    auto number = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberDoubleType, &value));
+    CFDictionarySetValue(m_dictionaryStack.last(), key.createCFString().get(), number.get());
+}
+
 void KeyedEncoder::encodeString(const String& key, const String& value)
 {
     CFDictionarySetValue(m_dictionaryStack.last(), key.createCFString().get(), value.createCFString().get());
index 2161d842144b3eed311150601d656d6799cb7fee..bc644ed14fb689440be710407f76f5e65c1d0448 100644 (file)
 
 namespace WebKit {
 
-class KeyedEncoder : public WebCore::KeyedEncoder {
+class KeyedEncoder FINAL : public WebCore::KeyedEncoder {
 public:
     KeyedEncoder();
     ~KeyedEncoder();
 
 private:
     virtual void encodeBytes(const String& key, const uint8_t*, size_t) OVERRIDE;
-
+    virtual void encodeBool(const String& key, bool) OVERRIDE;
     virtual void encodeUInt32(const String& key, uint32_t) OVERRIDE;
     virtual void encodeInt32(const String& key, int32_t) OVERRIDE;
     virtual void encodeInt64(const String& key, int64_t) OVERRIDE;
     virtual void encodeFloat(const String& key, float) OVERRIDE;
+    virtual void encodeDouble(const String& key, double) OVERRIDE;
     virtual void encodeString(const String& key, const String&) OVERRIDE;
 
     virtual void beginObject(const String& key) OVERRIDE;