ThreadableWebSocketChannel::SendResult WebSocketChannel::send(const ArrayBuffer& binaryData, unsigned byteOffset, unsigned byteLength) { LOG(Network, "WebSocketChannel %p send() Sending ArrayBuffer %p byteOffset=%u byteLength=%u", this, &binaryData, byteOffset, byteLength); enqueueRawFrame(WebSocketFrame::OpCodeBinary, static_cast<const char*>(binaryData.data()) + byteOffset, byteLength); processOutgoingFrameQueue(); return ThreadableWebSocketChannel::SendSuccess; }
ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(const ArrayBuffer& binaryData, unsigned byteOffset, unsigned byteLength) { if (!m_workerClientWrapper || !m_peer) return ThreadableWebSocketChannel::SendFail; // ArrayBuffer isn't thread-safe, hence the content of ArrayBuffer is copied into Vector<char>. Vector<char>* dataPtr = std::make_unique<Vector<char>>(byteLength).release(); if (binaryData.byteLength()) memcpy(dataPtr->data(), static_cast<const char*>(binaryData.data()) + byteOffset, byteLength); setMethodNotCompleted(); Peer* peer = m_peer; m_loaderProxy.postTaskToLoader([peer, dataPtr] (ScriptExecutionContext& context) { ASSERT(isMainThread()); ASSERT_UNUSED(context, context.isDocument()); ASSERT(peer); std::unique_ptr<Vector<char>> data(dataPtr); RefPtr<ArrayBuffer> arrayBuffer = ArrayBuffer::create(data->data(), data->size()); peer->send(*arrayBuffer); }); Ref<Bridge> protect(*this); waitForMethodCompletion(); ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapper.get(); if (!clientWrapper) return ThreadableWebSocketChannel::SendFail; return clientWrapper->sendRequestResult(); }
bool WebSocketChannel::send(const ArrayBuffer& binaryData) { LOG(Network, "WebSocketChannel %p send arraybuffer %p", this, &binaryData); ASSERT(!m_useHixie76Protocol); enqueueRawFrame(WebSocketFrame::OpCodeBinary, static_cast<const char*>(binaryData.data()), binaryData.byteLength()); return true; }
WebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(const ArrayBuffer& binaryData, unsigned byteOffset, unsigned byteLength) { if (!m_workerClientWrapper || !m_workerGlobalScope) return WebSocketChannel::SendFail; ASSERT(m_syncHelper); // ArrayBuffer isn't thread-safe, hence the content of ArrayBuffer is copied into Vector<char>. OwnPtr<Vector<char> > data = adoptPtr(new Vector<char>(byteLength)); if (binaryData.byteLength()) memcpy(data->data(), static_cast<const char*>(binaryData.data()) + byteOffset, byteLength); m_loaderProxy.postTaskToLoader(CallClosureTask::create(bind(&Peer::sendArrayBuffer, m_peer, data.release()))); RefPtr<Bridge> protect(this); waitForMethodCompletion(); return m_syncHelper->sendRequestResult(); }
bool WorkerThreadableWebSocketChannel::Bridge::send(const ArrayBuffer& binaryData) { if (!m_workerClientWrapper) return false; ASSERT(m_peer); // ArrayBuffer isn't thread-safe, hence the content of ArrayBuffer is copied into Vector<char>. OwnPtr<Vector<char> > data = adoptPtr(new Vector<char>(binaryData.byteLength())); if (binaryData.byteLength()) memcpy(data->data(), binaryData.data(), binaryData.byteLength()); setMethodNotCompleted(); m_loaderProxy.postTaskToLoader(createCallbackTask(&WorkerThreadableWebSocketChannel::mainThreadSendArrayBuffer, AllowCrossThreadAccess(m_peer), data.release())); RefPtr<Bridge> protect(this); waitForMethodCompletion(); ThreadableWebSocketChannelClientWrapper* clientWrapper = m_workerClientWrapper.get(); return clientWrapper && clientWrapper->sendRequestResult(); }
ThreadableWebSocketChannel::SendResult WorkerThreadableWebSocketChannel::Bridge::send(const ArrayBuffer& binaryData, unsigned byteOffset, unsigned byteLength) { if (!m_peer) return ThreadableWebSocketChannel::SendFail; // ArrayBuffer isn't thread-safe, hence the content of ArrayBuffer is copied into Vector<char>. Vector<char> data(byteLength); if (binaryData.byteLength()) memcpy(data.data(), static_cast<const char*>(binaryData.data()) + byteOffset, byteLength); setMethodNotCompleted(); m_loaderProxy.postTaskToLoader([peer = m_peer, data = WTFMove(data)](ScriptExecutionContext& context) { ASSERT(isMainThread()); ASSERT_UNUSED(context, context.isDocument()); ASSERT(peer); auto arrayBuffer = ArrayBuffer::create(data.data(), data.size()); peer->send(arrayBuffer); }); Ref<Bridge> protectedThis(*this); waitForMethodCompletion(); return m_workerClientWrapper->sendRequestResult(); }
RefPtr<ArrayBuffer> ArrayBuffer::tryCreate(ArrayBuffer& other) { return tryCreate(other.data(), other.byteLength()); }
Ref<ArrayBuffer> ArrayBuffer::create(ArrayBuffer& other) { return ArrayBuffer::create(other.data(), other.byteLength()); }
ExceptionOr<void> XMLHttpRequest::send(ArrayBuffer& body) { ASCIILiteral consoleMessage("ArrayBuffer is deprecated in XMLHttpRequest.send(). Use ArrayBufferView instead."); scriptExecutionContext()->addConsoleMessage(MessageSource::JS, MessageLevel::Warning, consoleMessage); return sendBytesData(body.data(), body.byteLength()); }
EncodedJSValue JSC_HOST_CALL structuredCloneArrayBuffer(ExecState* execState) { ASSERT(execState); ASSERT(execState->argumentCount()); ASSERT(execState->lexicalGlobalObject()); ArrayBuffer* buffer = toArrayBuffer(execState->uncheckedArgument(0)); if (!buffer) { setDOMException(execState, DATA_CLONE_ERR); return JSValue::encode(jsUndefined()); } return JSValue::encode(JSArrayBuffer::create(execState->vm(), execState->lexicalGlobalObject()->arrayBufferStructure(), ArrayBuffer::tryCreate(buffer->data(), buffer->byteLength()))); }