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 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(); }
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(); }
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(); }
void WorkerThreadableWebSocketChannel::Peer::send(const ArrayBuffer& binaryData) { ASSERT(isMainThread()); if (!m_mainWebSocketChannel || !m_workerClientWrapper) return; ThreadableWebSocketChannel::SendResult sendRequestResult = m_mainWebSocketChannel->send(binaryData, 0, binaryData.byteLength()); RefPtr<ThreadableWebSocketChannelClientWrapper> workerClientWrapper = m_workerClientWrapper; m_loaderProxy.postTaskForModeToWorkerGlobalScope([workerClientWrapper, sendRequestResult] (ScriptExecutionContext&) { workerClientWrapper->setSendRequestResult(sendRequestResult); }, m_taskMode); }
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; }
void WorkerThreadableWebSocketChannel::Peer::send(const ArrayBuffer& binaryData) { ASSERT(isMainThread()); if (!m_mainWebSocketChannel || !m_workerClientWrapper) return; WebSocketChannel::SendResult sendRequestResult = m_mainWebSocketChannel->send(binaryData, 0, binaryData.byteLength()); m_loaderProxy.postTaskForModeToWorkerGlobalScope(createCallbackTask(&workerGlobalScopeDidSend, m_workerClientWrapper, sendRequestResult), m_taskMode); }
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()))); }
static v8::Handle<v8::Value> byteLengthAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) { ArrayBuffer* imp = V8ArrayBuffer::toNative(info.Holder()); return v8UnsignedInteger(imp->byteLength(), info.GetIsolate()); }
static v8::Handle<v8::Value> byteLengthAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) { INC_STATS("DOM.ArrayBuffer.byteLength._get"); ArrayBuffer* imp = V8ArrayBuffer::toNative(info.Holder()); return v8::Integer::New(imp->byteLength()); }