Changeset 158984 in webkit


Ignore:
Timestamp:
Nov 8, 2013 5:51:11 PM (11 years ago)
Author:
andersca@apple.com
Message:

Implement encoding of arrays of objects
https://bugs.webkit.org/show_bug.cgi?id=124091

Reviewed by Beth Dakin.

Source/WebCore:

  • history/HistoryItem.cpp:

(WebCore::HistoryItem::encodeBackForwardTreeNode):
Encode the rest of the members.

  • platform/KeyedCoding.h:

(WebCore::KeyedEncoder::encodeObjects):
Call beginArray, then beginArrayElement/endArrayElement for every element and lastly endArray.

Source/WebKit2:

Add a new array stack and push and pop from it accordingly.

  • Shared/cf/KeyedEncoder.cpp:

(WebKit::KeyedEncoder::~KeyedEncoder):
(WebKit::KeyedEncoder::encodeBytes):
(WebKit::KeyedEncoder::encodeUInt32):
(WebKit::KeyedEncoder::encodeInt32):
(WebKit::KeyedEncoder::encodeInt64):
(WebKit::KeyedEncoder::encodeFloat):
(WebKit::KeyedEncoder::beginArray):
(WebKit::KeyedEncoder::beginArrayElement):
(WebKit::KeyedEncoder::endArrayElement):
(WebKit::KeyedEncoder::endArray):

  • Shared/cf/KeyedEncoder.h:
Location:
trunk/Source
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r158982 r158984  
     12013-11-08  Anders Carlsson  <andersca@apple.com>
     2
     3        Implement encoding of arrays of objects
     4        https://bugs.webkit.org/show_bug.cgi?id=124091
     5
     6        Reviewed by Beth Dakin.
     7
     8        * history/HistoryItem.cpp:
     9        (WebCore::HistoryItem::encodeBackForwardTreeNode):
     10        Encode the rest of the members.
     11
     12        * platform/KeyedCoding.h:
     13        (WebCore::KeyedEncoder::encodeObjects):
     14        Call beginArray, then beginArrayElement/endArrayElement for every element and lastly endArray.
     15
    1162013-11-08  Tim Horton  <timothy_horton@apple.com>
    217
  • trunk/Source/WebCore/history/HistoryItem.cpp

    r158980 r158984  
    738738void HistoryItem::encodeBackForwardTreeNode(KeyedEncoder& encoder) const
    739739{
    740     // FIXME: Implement.
     740    encoder.encodeObjects("children", m_children.begin(), m_children.end(), [](KeyedEncoder& encoder, const RefPtr<HistoryItem>& child) {
     741        encoder.encodeString("originalURLString", child->m_originalURLString);
     742        encoder.encodeString("urlString", child->m_urlString);
     743
     744        child->encodeBackForwardTreeNode(encoder);
     745    });
     746
     747    encoder.encodeInt64("documentSequenceNumber", m_documentSequenceNumber);
     748
     749    encoder.encodeObjects("documentState", m_documentState.begin(), m_documentState.end(), [](KeyedEncoder& encoder, const String& string) {
     750        encoder.encodeString("string", string);
     751    });
    741752
    742753    encoder.encodeString("formContentType", m_formContentType);
     
    745756        // FIXME: Implement.
    746757    });
     758
     759    encoder.encodeInt64("itemSequenceNumber", m_itemSequenceNumber);
    747760
    748761    encoder.encodeString("referrer", m_referrer);
  • trunk/Source/WebCore/platform/KeyedCoding.h

    r158980 r158984  
    3939    virtual void encodeUInt32(const String& key, uint32_t) = 0;
    4040    virtual void encodeInt32(const String& key, int32_t) = 0;
     41    virtual void encodeInt64(const String& key, int64_t) = 0;
    4142    virtual void encodeFloat(const String& key, float) = 0;
    4243    virtual void encodeString(const String& key, const String&) = 0;
    4344
    4445    template<typename T, typename F>
    45     void encodeObject(const String& key, const T& object, F function)
     46    void encodeObject(const String& key, const T& object, F&& function)
    4647    {
    47         this->beginObject(key);
     48        beginObject(key);
    4849        function(*this, object);
    49         this->endObject();
     50        endObject();
    5051    }
    5152
     
    5960    }
    6061
     62    template<typename T, typename F>
     63    void encodeObjects(const String& key, T begin, T end, F&& function)
     64    {
     65        if (begin == end)
     66            return;
     67
     68        beginArray(key);
     69        for (T it = begin; it != end; ++it) {
     70            beginArrayElement();
     71            function(*this, *it);
     72            endArrayElement();
     73        }
     74        endArray();
     75    }
     76
    6177private:
    6278    virtual void beginObject(const String& key) = 0;
    6379    virtual void endObject() = 0;
     80
     81    virtual void beginArray(const String& key) = 0;
     82    virtual void beginArrayElement() = 0;
     83    virtual void endArrayElement() = 0;
     84    virtual void endArray() = 0;
    6485};
    6586
  • trunk/Source/WebKit2/ChangeLog

    r158982 r158984  
     12013-11-08  Anders Carlsson  <andersca@apple.com>
     2
     3        Implement encoding of arrays of objects
     4        https://bugs.webkit.org/show_bug.cgi?id=124091
     5
     6        Reviewed by Beth Dakin.
     7
     8        Add a new array stack and push and pop from it accordingly.
     9
     10        * Shared/cf/KeyedEncoder.cpp:
     11        (WebKit::KeyedEncoder::~KeyedEncoder):
     12        (WebKit::KeyedEncoder::encodeBytes):
     13        (WebKit::KeyedEncoder::encodeUInt32):
     14        (WebKit::KeyedEncoder::encodeInt32):
     15        (WebKit::KeyedEncoder::encodeInt64):
     16        (WebKit::KeyedEncoder::encodeFloat):
     17        (WebKit::KeyedEncoder::beginArray):
     18        (WebKit::KeyedEncoder::beginArrayElement):
     19        (WebKit::KeyedEncoder::endArrayElement):
     20        (WebKit::KeyedEncoder::endArray):
     21        * Shared/cf/KeyedEncoder.h:
     22
    1232013-11-08  Tim Horton  <timothy_horton@apple.com>
    224
  • trunk/Source/WebKit2/Shared/cf/KeyedEncoder.cpp

    r158980 r158984  
    4747    ASSERT(m_dictionaryStack.size() == 1);
    4848    ASSERT(m_dictionaryStack.last() == m_rootDictionary);
     49    ASSERT(m_arrayStack.isEmpty());
    4950}
    5051
    5152void KeyedEncoder::encodeBytes(const String& key, const uint8_t* bytes, size_t size)
    5253{
    53     RetainPtr<CFDataRef> data = adoptCF(CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, bytes, size, kCFAllocatorNull));
     54    auto data = adoptCF(CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, bytes, size, kCFAllocatorNull));
    5455    CFDictionarySetValue(m_dictionaryStack.last(), key.createCFString().get(), data.get());
    5556}
     
    5758void KeyedEncoder::encodeUInt32(const String& key, uint32_t value)
    5859{
    59     RetainPtr<CFNumberRef> number = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &value));
     60    auto number = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &value));
    6061    CFDictionarySetValue(m_dictionaryStack.last(), key.createCFString().get(), number.get());
    6162}
     
    6364void KeyedEncoder::encodeInt32(const String& key, int32_t value)
    6465{
    65     RetainPtr<CFNumberRef> number = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &value));
     66    auto number = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &value));
     67    CFDictionarySetValue(m_dictionaryStack.last(), key.createCFString().get(), number.get());
     68}
     69
     70void KeyedEncoder::encodeInt64(const String& key, int64_t value)
     71{
     72    auto number = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt64Type, &value));
    6673    CFDictionarySetValue(m_dictionaryStack.last(), key.createCFString().get(), number.get());
    6774}
     
    6976void KeyedEncoder::encodeFloat(const String& key, float value)
    7077{
    71     RetainPtr<CFNumberRef> number = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberFloatType, &value));
     78    auto number = adoptCF(CFNumberCreate(kCFAllocatorDefault, kCFNumberFloatType, &value));
    7279    CFDictionarySetValue(m_dictionaryStack.last(), key.createCFString().get(), number.get());
    7380}
     
    9198}
    9299
     100void KeyedEncoder::beginArray(const String& key)
     101{
     102    auto array = adoptCF(CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks));
     103    CFDictionarySetValue(m_dictionaryStack.last(), key.createCFString().get(), array.get());
     104
     105    m_arrayStack.append(array.get());
     106}
     107
     108void KeyedEncoder::beginArrayElement()
     109{
     110    auto dictionary = createDictionary();
     111    CFArrayAppendValue(m_arrayStack.last(), dictionary.get());
     112
     113    m_dictionaryStack.append(dictionary.get());
     114}
     115
     116void KeyedEncoder::endArrayElement()
     117{
     118    m_dictionaryStack.removeLast();
     119}
     120
     121void KeyedEncoder::endArray()
     122{
     123    m_arrayStack.removeLast();
     124}
     125
    93126} // namespace WebKit
  • trunk/Source/WebKit2/Shared/cf/KeyedEncoder.h

    r158980 r158984  
    4343    virtual void encodeUInt32(const String& key, uint32_t) OVERRIDE;
    4444    virtual void encodeInt32(const String& key, int32_t) OVERRIDE;
     45    virtual void encodeInt64(const String& key, int64_t) OVERRIDE;
    4546    virtual void encodeFloat(const String& key, float) OVERRIDE;
    4647    virtual void encodeString(const String& key, const String&) OVERRIDE;
     
    4950    virtual void endObject() OVERRIDE;
    5051
     52    virtual void beginArray(const String& key) OVERRIDE;
     53    virtual void beginArrayElement() OVERRIDE;
     54    virtual void endArrayElement() OVERRIDE;
     55    virtual void endArray() OVERRIDE;
     56
    5157    RetainPtr<CFMutableDictionaryRef> m_rootDictionary;
     58
    5259    Vector<CFMutableDictionaryRef, 16> m_dictionaryStack;
     60    Vector<CFMutableArrayRef, 16> m_arrayStack;
    5361};
    5462
  • trunk/Source/WebKit2/WebProcess/WebPage/WebBackForwardListProxy.cpp

    r158971 r158984  
    8585static void updateBackForwardItem(uint64_t itemID, HistoryItem* item)
    8686{
    87     KeyedEncoder keyedEncoder;
    88     item->encodeBackForwardTree(keyedEncoder);
    89 
    9087    EncoderAdapter encoder;
    9188    item->encodeBackForwardTree(encoder);
Note: See TracChangeset for help on using the changeset viewer.