Changeset 230828 in webkit


Ignore:
Timestamp:
Apr 19, 2018 4:59:50 PM (6 years ago)
Author:
commit-queue@webkit.org
Message:

REGRESSION(r227340): ArrayBuffers were not being serialized when sent via MessagePorts
https://bugs.webkit.org/show_bug.cgi?id=184254
<rdar://problem/39140200>

Patch by Tadeu Zagallo <Tadeu Zagallo> on 2018-04-19
Reviewed by Daniel Bates.

Source/JavaScriptCore:

Expose an extra constructor of ArrayBufferContents in order to be able to decode SerializedScriptValues.

  • runtime/ArrayBuffer.h:

(JSC::ArrayBufferContents::ArrayBufferContents):

Source/WebCore:

Add a new encoding method to SerializedScriptValue that includes ArrayBuffers.

Test: workers/message-port.html

  • bindings/js/SerializedScriptValue.h:

(WebCore::SerializedScriptValue::encode const):
(WebCore::SerializedScriptValue::decode):

  • dom/messageports/MessageWithMessagePorts.h:

(WebCore::MessageWithMessagePorts::encode const):
(WebCore::MessageWithMessagePorts::decode):

LayoutTests:

The regression test provided with the bug report verifies that the ArrayBuffer is properly
serialized - before, the whole data object would be null.
Test case provided by Yann Cabon <ycabon@esri.com> as part of the bug report.

  • workers/message-port-expected.txt: Added.
  • workers/message-port.html: Added.
Location:
trunk
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r230822 r230828  
     12018-04-19  Tadeu Zagallo  <tzagallo@apple.com>
     2
     3        REGRESSION(r227340): ArrayBuffers were not being serialized when sent via MessagePorts
     4        https://bugs.webkit.org/show_bug.cgi?id=184254
     5        <rdar://problem/39140200>
     6
     7        Reviewed by Daniel Bates.
     8
     9        The regression test provided with the bug report verifies that the ArrayBuffer is properly
     10        serialized - before, the whole data object would be null.
     11        Test case provided by Yann Cabon <ycabon@esri.com> as part of the bug report.
     12
     13        * workers/message-port-expected.txt: Added.
     14        * workers/message-port.html: Added.
     15
    1162018-04-19  Eric Carlson  <eric.carlson@apple.com>
    217
  • trunk/Source/JavaScriptCore/ChangeLog

    r230826 r230828  
     12018-04-19  Tadeu Zagallo  <tzagallo@apple.com>
     2
     3        REGRESSION(r227340): ArrayBuffers were not being serialized when sent via MessagePorts
     4        https://bugs.webkit.org/show_bug.cgi?id=184254
     5        <rdar://problem/39140200>
     6
     7        Reviewed by Daniel Bates.
     8
     9        Expose an extra constructor of ArrayBufferContents in order to be able to decode SerializedScriptValues.
     10
     11        * runtime/ArrayBuffer.h:
     12        (JSC::ArrayBufferContents::ArrayBufferContents):
     13
    1142018-04-19  Mark Lam  <mark.lam@apple.com>
    215
  • trunk/Source/JavaScriptCore/runtime/ArrayBuffer.h

    r221439 r230828  
    6060public:
    6161    JS_EXPORT_PRIVATE ArrayBufferContents();
     62    JS_EXPORT_PRIVATE ArrayBufferContents(void* data, unsigned sizeInBytes, ArrayBufferDestructorFunction&&);
    6263   
    6364    JS_EXPORT_PRIVATE ArrayBufferContents(ArrayBufferContents&&);
     
    7475   
    7576    bool isShared() const { return m_shared; }
    76 
     77   
    7778private:
    78     ArrayBufferContents(void* data, unsigned sizeInBytes, ArrayBufferDestructorFunction&&);
    79    
    8079    void destroy();
    8180    void reset();
  • trunk/Source/WebCore/ChangeLog

    r230824 r230828  
     12018-04-19  Tadeu Zagallo  <tzagallo@apple.com>
     2
     3        REGRESSION(r227340): ArrayBuffers were not being serialized when sent via MessagePorts
     4        https://bugs.webkit.org/show_bug.cgi?id=184254
     5        <rdar://problem/39140200>
     6
     7        Reviewed by Daniel Bates.
     8
     9        Add a new encoding method to SerializedScriptValue that includes ArrayBuffers.
     10
     11        Test: workers/message-port.html
     12
     13        * bindings/js/SerializedScriptValue.h:
     14        (WebCore::SerializedScriptValue::encode const):
     15        (WebCore::SerializedScriptValue::decode):
     16        * dom/messageports/MessageWithMessagePorts.h:
     17        (WebCore::MessageWithMessagePorts::encode const):
     18        (WebCore::MessageWithMessagePorts::decode):
     19
    1202018-04-19  David Kilzer  <ddkilzer@apple.com>
    221
  • trunk/Source/WebCore/bindings/js/SerializedScriptValue.cpp

    r230348 r230828  
    31703170}
    31713171
     3172SerializedScriptValue::SerializedScriptValue(Vector<uint8_t>&& buffer, std::unique_ptr<ArrayBufferContentsArray> arrayBufferContentsArray)
     3173    : m_data(WTFMove(buffer))
     3174    , m_arrayBufferContentsArray(WTFMove(arrayBufferContentsArray))
     3175{
     3176}
     3177
    31723178SerializedScriptValue::SerializedScriptValue(Vector<uint8_t>&& buffer, const Vector<String>& blobURLs, std::unique_ptr<ArrayBufferContentsArray> arrayBufferContentsArray, std::unique_ptr<ArrayBufferContentsArray> sharedBufferContentsArray, Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>>&& imageBuffers
    31733179#if ENABLE(WEBASSEMBLY)
  • trunk/Source/WebCore/bindings/js/SerializedScriptValue.h

    r230348 r230828  
    3434#include <wtf/Forward.h>
    3535#include <wtf/Function.h>
     36#include <wtf/Gigacage.h>
    3637#include <wtf/text/WTFString.h>
    3738
     
    102103    const Vector<uint8_t>& toWireBytes() const { return m_data; }
    103104
     105    template<class Encoder> void encode(Encoder&) const;
     106    template<class Decoder> static RefPtr<SerializedScriptValue> decode(Decoder&);
     107
    104108    WEBCORE_EXPORT ~SerializedScriptValue();
    105109
    106110private:
    107111    WEBCORE_EXPORT SerializedScriptValue(Vector<unsigned char>&&);
     112    WEBCORE_EXPORT SerializedScriptValue(Vector<unsigned char>&&, std::unique_ptr<ArrayBufferContentsArray>);
    108113    SerializedScriptValue(Vector<unsigned char>&&, const Vector<String>& blobURLs, std::unique_ptr<ArrayBufferContentsArray>, std::unique_ptr<ArrayBufferContentsArray> sharedBuffers, Vector<std::pair<std::unique_ptr<ImageBuffer>, bool>>&& imageBuffers
    109114#if ENABLE(WEBASSEMBLY)
     
    122127};
    123128
     129template<class Encoder>
     130void SerializedScriptValue::encode(Encoder& encoder) const
     131{
     132    encoder << m_data;
     133
     134    auto hasArray = m_arrayBufferContentsArray && m_arrayBufferContentsArray->size();
     135    encoder << hasArray;
     136
     137    if (!hasArray)
     138        return;
     139
     140    encoder << static_cast<uint64_t>(m_arrayBufferContentsArray->size());
     141    for (const auto &arrayBufferContents : *m_arrayBufferContentsArray) {
     142        encoder << arrayBufferContents.sizeInBytes();
     143        encoder.encodeFixedLengthData(static_cast<const uint8_t*>(arrayBufferContents.data()), arrayBufferContents.sizeInBytes(), 1);
     144    }
    124145}
     146
     147template<class Decoder>
     148RefPtr<SerializedScriptValue> SerializedScriptValue::decode(Decoder& decoder)
     149{
     150    Vector<uint8_t> data;
     151    if (!decoder.decode(data))
     152        return nullptr;
     153
     154    bool hasArray;
     155    if (!decoder.decode(hasArray))
     156        return nullptr;
     157
     158    if (!hasArray)
     159        return adoptRef(*new SerializedScriptValue(WTFMove(data)));
     160
     161    uint64_t arrayLength;
     162    if (!decoder.decode(arrayLength))
     163        return nullptr;
     164    ASSERT(arrayLength);
     165
     166    auto arrayBufferContentsArray = std::make_unique<ArrayBufferContentsArray>();
     167    while (arrayLength--) {
     168        unsigned bufferSize;
     169        if (!decoder.decode(bufferSize))
     170            return nullptr;
     171
     172        auto buffer = Gigacage::tryMalloc(Gigacage::Primitive, bufferSize);
     173        auto destructor = [] (void* ptr) {
     174            Gigacage::free(Gigacage::Primitive, ptr);
     175        };
     176        if (!decoder.decodeFixedLengthData(static_cast<uint8_t*>(buffer), bufferSize, 1)) {
     177            destructor(buffer);
     178            return nullptr;
     179        }
     180        arrayBufferContentsArray->append({ buffer, bufferSize, WTFMove(destructor) });
     181    }
     182
     183    return adoptRef(*new SerializedScriptValue(WTFMove(data), WTFMove(arrayBufferContentsArray)));
     184}
     185
     186
     187}
  • trunk/Source/WebCore/dom/messageports/MessageWithMessagePorts.h

    r227340 r230828  
    4949{
    5050    ASSERT(message);
    51     encoder << message->toWireBytes() << transferredPorts;
     51    encoder << *message << transferredPorts;
    5252}
    5353
     
    5757    MessageWithMessagePorts result;
    5858
    59     Vector<uint8_t> wireBytes;
    60     if (!decoder.decode(wireBytes))
     59    result.message = SerializedScriptValue::decode(decoder);
     60    if (!result.message)
    6161        return std::nullopt;
    6262
     
    6464        return std::nullopt;
    6565
    66     result.message = SerializedScriptValue::createFromWireBytes(WTFMove(wireBytes));
    6766    return result;
    6867}
Note: See TracChangeset for help on using the changeset viewer.