bool ArrayBuffer::transfer(ArrayBufferContents& result, Vector<RefPtr<ArrayBufferView> >& neuteredViews) { RefPtr<ArrayBuffer> keepAlive(this); if (!m_contents.m_data) { result.m_data = 0; return false; } bool allViewsAreNeuterable = true; for (ArrayBufferView* i = m_firstView; i; i = i->m_nextView) { if (!i->isNeuterable()) allViewsAreNeuterable = false; } if (allViewsAreNeuterable) m_contents.transfer(result); else { m_contents.copyTo(result); if (!result.m_data) return false; } while (m_firstView) { ArrayBufferView* current = m_firstView; removeView(current); if (allViewsAreNeuterable || current->isNeuterable()) current->neuter(); neuteredViews.append(current); } return true; }
void SourceBuffer::AppendBuffer(const ArrayBufferView& aData, ErrorResult& aRv) { aData.ComputeLengthAndData(); AppendData(aData.Data(), aData.Length(), aRv); }
void PresentationConnection::Send(const ArrayBufferView& aData, ErrorResult& aRv) { if (NS_WARN_IF(mState != PresentationConnectionState::Connected)) { aRv.Throw(NS_ERROR_DOM_INVALID_STATE_ERR); return; } nsCOMPtr<nsIPresentationService> service = do_GetService(PRESENTATION_SERVICE_CONTRACTID); if(NS_WARN_IF(!service)) { AsyncCloseConnectionWithErrorMsg( NS_LITERAL_STRING("Unable to send message due to an internal error.")); return; } aData.ComputeLengthAndData(); static_assert(sizeof(*aData.Data()) == 1, "byte-sized data required"); uint32_t length = aData.Length(); char* data = reinterpret_cast<char*>(aData.Data()); nsDependentCSubstring msgString(data, length); nsresult rv = service->SendSessionBinaryMsg(mId, mRole, msgString); if(NS_WARN_IF(NS_FAILED(rv))) { AsyncCloseConnectionWithErrorMsg( NS_LITERAL_STRING("Unable to send binary message for ArrayBufferView message.")); } }
void WebGLContext::BufferSubData(GLenum target, WebGLsizeiptr byteOffset, const ArrayBufferView& data) { if (IsContextLost()) return; WebGLRefPtr<WebGLBuffer>* bufferSlot = GetBufferSlotByTarget(target, "bufferSubData"); if (!bufferSlot) { return; } if (byteOffset < 0) return ErrorInvalidValue("bufferSubData: negative offset"); WebGLBuffer* boundBuffer = bufferSlot->get(); if (!boundBuffer) return ErrorInvalidOperation("bufferSubData: no buffer bound!"); CheckedInt<WebGLsizeiptr> checked_neededByteLength = CheckedInt<WebGLsizeiptr>(byteOffset) + data.Length(); if (!checked_neededByteLength.isValid()) return ErrorInvalidValue("bufferSubData: integer overflow computing the needed byte length"); if (checked_neededByteLength.value() > boundBuffer->ByteLength()) return ErrorInvalidValue("bufferSubData: not enough data -- operation requires %d bytes, but buffer only has %d bytes", checked_neededByteLength.value(), boundBuffer->ByteLength()); boundBuffer->ElementArrayCacheBufferSubData(byteOffset, data.Data(), data.Length()); MakeContextCurrent(); gl->fBufferSubData(target, byteOffset, data.Length(), data.Data()); }
bool ArrayBuffer::transfer(ArrayBufferContents& result) { ASSERT(!isShared()); RefPtr<ArrayBuffer> keepAlive(this); if (!m_contents.data()) { result.neuter(); return false; } bool allViewsAreNeuterable = true; for (ArrayBufferView* i = m_firstView; i; i = i->m_nextView) { if (!i->isNeuterable()) allViewsAreNeuterable = false; } if (allViewsAreNeuterable) { m_contents.transfer(result); } else { m_contents.copyTo(result); if (!result.data()) return false; } while (m_firstView) { ArrayBufferView* current = m_firstView; removeView(current); if (allViewsAreNeuterable || current->isNeuterable()) current->neuter(); } m_isNeutered = true; return true; }
void SourceBuffer::AppendBuffer(const ArrayBufferView& aData, ErrorResult& aRv) { MOZ_ASSERT(NS_IsMainThread()); MSE_API("AppendBuffer(ArrayBufferView)"); aData.ComputeLengthAndData(); AppendData(aData.Data(), aData.Length(), aRv); }
void nsDOMDataChannel::Send(const ArrayBufferView& aData, ErrorResult& aRv) { NS_ABORT_IF_FALSE(NS_IsMainThread(), "Not running on main thread"); MOZ_ASSERT(sizeof(*aData.Data()) == 1); uint32_t len = aData.Length(); char* data = reinterpret_cast<char*>(aData.Data()); nsDependentCSubstring msgString(data, len); Send(nullptr, msgString, len, true, aRv); }
void nsDOMDataChannel::Send(const ArrayBufferView& aData, ErrorResult& aRv) { MOZ_ASSERT(NS_IsMainThread(), "Not running on main thread"); aData.ComputeLengthAndData(); static_assert(sizeof(*aData.Data()) == 1, "byte-sized data required"); uint32_t len = aData.Length(); char* data = reinterpret_cast<char*>(aData.Data()); nsDependentCSubstring msgString(data, len); Send(nullptr, msgString, len, true, aRv); }
bool ArrayBuffer::transfer(ArrayBufferContents& result, Vector<RefPtr<ArrayBufferView> >& neuteredViews) { RefPtr<ArrayBuffer> keepAlive(this); if (!m_contents.m_data) { result.m_data = 0; return false; } m_contents.transfer(result); while (m_firstView) { ArrayBufferView* current = m_firstView; removeView(current); current->neuter(); neuteredViews.append(current); } return true; }
JSValue JSArrayBufferView::slice(ExecState* exec) { ArrayBufferView* array = reinterpret_cast<ArrayBufferView*>(impl()); int start, end; switch (exec->argumentCount()) { case 0: start = 0; end = array->length(); break; case 1: start = exec->argument(0).toInt32(exec); end = array->length(); break; default: start = exec->argument(0).toInt32(exec); end = exec->argument(1).toInt32(exec); } return toJS(exec, globalObject(), array->slice(start, end)); }
static IDBKey* createIDBKeyFromValue(v8::Isolate* isolate, v8::Handle<v8::Value> value, Vector<v8::Handle<v8::Array> >& stack, bool allowExperimentalTypes = false) { if (value->IsNumber() && !std::isnan(value->NumberValue())) return IDBKey::createNumber(value->NumberValue()); if (value->IsString()) return IDBKey::createString(toCoreString(value.As<v8::String>())); if (value->IsDate() && !std::isnan(value->NumberValue())) return IDBKey::createDate(value->NumberValue()); if (value->IsUint8Array() && (allowExperimentalTypes || RuntimeEnabledFeatures::indexedDBExperimentalEnabled())) { // Per discussion in https://www.w3.org/Bugs/Public/show_bug.cgi?id=23332 the // input type is constrained to Uint8Array to match the output type. ArrayBufferView* view = blink::V8ArrayBufferView::toImpl(value->ToObject()); const char* start = static_cast<const char*>(view->baseAddress()); size_t length = view->byteLength(); return IDBKey::createBinary(SharedBuffer::create(start, length)); } if (value->IsArray()) { v8::Handle<v8::Array> array = v8::Handle<v8::Array>::Cast(value); if (stack.contains(array)) return 0; if (stack.size() >= maximumDepth) return 0; stack.append(array); IDBKey::KeyArray subkeys; uint32_t length = array->Length(); for (uint32_t i = 0; i < length; ++i) { v8::Local<v8::Value> item = array->Get(v8::Int32::New(isolate, i)); IDBKey* subkey = createIDBKeyFromValue(isolate, item, stack, allowExperimentalTypes); if (!subkey) subkeys.append(IDBKey::createInvalid()); else subkeys.append(subkey); } stack.removeLast(); return IDBKey::createArray(subkeys); } return 0; }
v8::Handle<v8::Value> V8ArrayBufferView::sliceCallback(const v8::Arguments& args) { INC_STATS("DOM.ArrayBufferView.slice"); // Forms: // * slice(long start, long end); ArrayBufferView* imp = V8ArrayBufferView::toNative(args.Holder()); int start, end; switch (args.Length()) { case 0: start = 0; end = imp->length(); break; case 1: start = toInt32(args[0]); end = imp->length(); break; default: start = toInt32(args[0]); end = toInt32(args[1]); } return toV8(imp->slice(start, end)); }
void WebGLContext::BufferData(GLenum target, const ArrayBufferView& data, GLenum usage) { if (IsContextLost()) return; WebGLRefPtr<WebGLBuffer>* bufferSlot = GetBufferSlotByTarget(target, "bufferSubData"); if (!bufferSlot) { return; } if (!ValidateBufferUsageEnum(usage, "bufferData: usage")) return; WebGLBuffer* boundBuffer = bufferSlot->get(); if (!boundBuffer) return ErrorInvalidOperation("bufferData: no buffer bound!"); data.ComputeLengthAndData(); // Careful: data.Length() could conceivably be any uint32_t, but GLsizeiptr // is like intptr_t. if (!CheckedInt<GLsizeiptr>(data.Length()).isValid()) return ErrorOutOfMemory("bufferData: bad size"); InvalidateBufferFetching(); MakeContextCurrent(); GLenum error = CheckedBufferData(target, data.Length(), data.Data(), usage); if (error) { GenerateWarning("bufferData generated error %s", ErrorName(error)); return; } boundBuffer->SetByteLength(data.Length()); if (!boundBuffer->ElementArrayCacheBufferData(data.Data(), data.Length())) { return ErrorOutOfMemory("bufferData: out of memory"); } }
ExceptionOr<void> XMLHttpRequest::send(ArrayBufferView& body) { return sendBytesData(body.baseAddress(), body.byteLength()); }