示例#1
0
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());
}
示例#5
0
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;
}
示例#6
0
void
SourceBuffer::AppendBuffer(const ArrayBufferView& aData, ErrorResult& aRv)
{
  MOZ_ASSERT(NS_IsMainThread());
  MSE_API("AppendBuffer(ArrayBufferView)");
  aData.ComputeLengthAndData();
  AppendData(aData.Data(), aData.Length(), aRv);
}
示例#7
0
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);
}
示例#8
0
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);
}
示例#9
0
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;
}
示例#10
0
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));
}
示例#13
0
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");
    }
}
示例#14
0
ExceptionOr<void> XMLHttpRequest::send(ArrayBufferView& body)
{
    return sendBytesData(body.baseAddress(), body.byteLength());
}