diff options
Diffstat (limited to 'src/websockets/qwebsocket_wasm_p.cpp')
-rw-r--r-- | src/websockets/qwebsocket_wasm_p.cpp | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/src/websockets/qwebsocket_wasm_p.cpp b/src/websockets/qwebsocket_wasm_p.cpp index 199fe44..85fcab2 100644 --- a/src/websockets/qwebsocket_wasm_p.cpp +++ b/src/websockets/qwebsocket_wasm_p.cpp @@ -137,11 +137,19 @@ qint64 QWebSocketPrivate::sendTextMessage(const QString &message) qint64 QWebSocketPrivate::sendBinaryMessage(const QByteArray &data) { - socketContext.call<void>("send", - val(typed_memory_view(data.size(), - reinterpret_cast<const unsigned char *> - (data.constData())))); + // Make a copy of the payload data; we don't know how long WebSocket.send() will + // retain the memory view, while the QByteArray passed to this function may be + // destroyed as soon as this function returns. In addition, the WebSocket.send() + // API does not accept data from a view backet by a SharedArrayBuffer, which will + // be the case for the view produced by typed_memory_view() when threads are enabled. + val Uint8Array = val::global("Uint8Array"); + val dataCopy = Uint8Array.new_(data.size()); + val dataView = val(typed_memory_view(data.size(), + reinterpret_cast<const unsigned char *> + (data.constData()))); + dataCopy.call<void>("set", dataView); + socketContext.call<void>("send", dataCopy); return data.length(); } |