blob: f278a65ecf2e2effe86047051a7734ffdd1a75ad [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "core/typed_arrays/DOMDataView.h"
#include "bindings/core/v8/V8ArrayBuffer.h"
#include "platform/bindings/DOMDataStore.h"
#include "platform/wtf/CheckedNumeric.h"
#include "platform/wtf/typed_arrays/ArrayBufferView.h"
namespace blink {
namespace {
class DataView final : public ArrayBufferView {
public:
static scoped_refptr<DataView> Create(ArrayBuffer* buffer,
unsigned byte_offset,
unsigned byte_length) {
CheckedNumeric<uint32_t> checked_max = byte_offset;
checked_max += byte_length;
CHECK_LE(checked_max.ValueOrDie(), buffer->ByteLength());
return base::AdoptRef(new DataView(buffer, byte_offset, byte_length));
}
unsigned ByteLength() const override { return byte_length_; }
ViewType GetType() const override { return kTypeDataView; }
unsigned TypeSize() const override { return 1; }
protected:
void Neuter() override {
ArrayBufferView::Neuter();
byte_length_ = 0;
}
private:
DataView(ArrayBuffer* buffer, unsigned byte_offset, unsigned byte_length)
: ArrayBufferView(buffer, byte_offset), byte_length_(byte_length) {}
unsigned byte_length_;
};
} // anonymous namespace
DOMDataView* DOMDataView::Create(DOMArrayBufferBase* buffer,
unsigned byte_offset,
unsigned byte_length) {
scoped_refptr<DataView> data_view =
DataView::Create(buffer->Buffer(), byte_offset, byte_length);
return new DOMDataView(data_view, buffer);
}
v8::Local<v8::Object> DOMDataView::Wrap(
v8::Isolate* isolate,
v8::Local<v8::Object> creation_context) {
DCHECK(!DOMDataStore::ContainsWrapper(this, isolate));
const WrapperTypeInfo* wrapper_type_info = this->GetWrapperTypeInfo();
v8::Local<v8::Value> v8_buffer = ToV8(buffer(), creation_context, isolate);
if (v8_buffer.IsEmpty())
return v8::Local<v8::Object>();
DCHECK(v8_buffer->IsArrayBuffer());
v8::Local<v8::Object> wrapper = v8::DataView::New(
v8_buffer.As<v8::ArrayBuffer>(), byteOffset(), byteLength());
return AssociateWithWrapper(isolate, wrapper_type_info, wrapper);
}
} // namespace blink