Changeset 230828 in webkit
- Timestamp:
- Apr 19, 2018 4:59:50 PM (6 years ago)
- Location:
- trunk
- Files:
-
- 2 added
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r230822 r230828 1 2018-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 1 16 2018-04-19 Eric Carlson <eric.carlson@apple.com> 2 17 -
trunk/Source/JavaScriptCore/ChangeLog
r230826 r230828 1 2018-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 1 14 2018-04-19 Mark Lam <mark.lam@apple.com> 2 15 -
trunk/Source/JavaScriptCore/runtime/ArrayBuffer.h
r221439 r230828 60 60 public: 61 61 JS_EXPORT_PRIVATE ArrayBufferContents(); 62 JS_EXPORT_PRIVATE ArrayBufferContents(void* data, unsigned sizeInBytes, ArrayBufferDestructorFunction&&); 62 63 63 64 JS_EXPORT_PRIVATE ArrayBufferContents(ArrayBufferContents&&); … … 74 75 75 76 bool isShared() const { return m_shared; } 76 77 77 78 private: 78 ArrayBufferContents(void* data, unsigned sizeInBytes, ArrayBufferDestructorFunction&&);79 80 79 void destroy(); 81 80 void reset(); -
trunk/Source/WebCore/ChangeLog
r230824 r230828 1 2018-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 1 20 2018-04-19 David Kilzer <ddkilzer@apple.com> 2 21 -
trunk/Source/WebCore/bindings/js/SerializedScriptValue.cpp
r230348 r230828 3170 3170 } 3171 3171 3172 SerializedScriptValue::SerializedScriptValue(Vector<uint8_t>&& buffer, std::unique_ptr<ArrayBufferContentsArray> arrayBufferContentsArray) 3173 : m_data(WTFMove(buffer)) 3174 , m_arrayBufferContentsArray(WTFMove(arrayBufferContentsArray)) 3175 { 3176 } 3177 3172 3178 SerializedScriptValue::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 3173 3179 #if ENABLE(WEBASSEMBLY) -
trunk/Source/WebCore/bindings/js/SerializedScriptValue.h
r230348 r230828 34 34 #include <wtf/Forward.h> 35 35 #include <wtf/Function.h> 36 #include <wtf/Gigacage.h> 36 37 #include <wtf/text/WTFString.h> 37 38 … … 102 103 const Vector<uint8_t>& toWireBytes() const { return m_data; } 103 104 105 template<class Encoder> void encode(Encoder&) const; 106 template<class Decoder> static RefPtr<SerializedScriptValue> decode(Decoder&); 107 104 108 WEBCORE_EXPORT ~SerializedScriptValue(); 105 109 106 110 private: 107 111 WEBCORE_EXPORT SerializedScriptValue(Vector<unsigned char>&&); 112 WEBCORE_EXPORT SerializedScriptValue(Vector<unsigned char>&&, std::unique_ptr<ArrayBufferContentsArray>); 108 113 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 109 114 #if ENABLE(WEBASSEMBLY) … … 122 127 }; 123 128 129 template<class Encoder> 130 void 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 } 124 145 } 146 147 template<class Decoder> 148 RefPtr<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 49 49 { 50 50 ASSERT(message); 51 encoder << message->toWireBytes()<< transferredPorts;51 encoder << *message << transferredPorts; 52 52 } 53 53 … … 57 57 MessageWithMessagePorts result; 58 58 59 Vector<uint8_t> wireBytes;60 if (! decoder.decode(wireBytes))59 result.message = SerializedScriptValue::decode(decoder); 60 if (!result.message) 61 61 return std::nullopt; 62 62 … … 64 64 return std::nullopt; 65 65 66 result.message = SerializedScriptValue::createFromWireBytes(WTFMove(wireBytes));67 66 return result; 68 67 }
Note: See TracChangeset
for help on using the changeset viewer.