| Index: Source/core/dom/DOMDataView.cpp
|
| diff --git a/Source/core/dom/DOMDataView.cpp b/Source/core/dom/DOMDataView.cpp
|
| index 617554f25de71809d97fe09a86ec9ee6f49d05a4..4398e8ce97c6a7c40db9de7c0ef8f36e84354e80 100644
|
| --- a/Source/core/dom/DOMDataView.cpp
|
| +++ b/Source/core/dom/DOMDataView.cpp
|
| @@ -8,9 +8,46 @@
|
| #include "bindings/core/v8/DOMDataStore.h"
|
| #include "bindings/core/v8/V8ArrayBuffer.h"
|
| #include "bindings/core/v8/V8DOMWrapper.h"
|
| +#include "platform/CheckedInt.h"
|
| +#include "wtf/ArrayBufferView.h"
|
|
|
| namespace blink {
|
|
|
| +namespace {
|
| +
|
| +class DataView final : public ArrayBufferView {
|
| +public:
|
| + static PassRefPtr<DataView> create(PassRefPtr<ArrayBuffer> buffer, unsigned byteOffset, unsigned byteLength)
|
| + {
|
| + RELEASE_ASSERT(byteOffset <= buffer->byteLength());
|
| + CheckedInt<uint32_t> checkedOffset(byteOffset);
|
| + CheckedInt<uint32_t> checkedLength(byteLength);
|
| + CheckedInt<uint32_t> checkedMax = checkedOffset + checkedLength;
|
| + RELEASE_ASSERT(checkedMax.isValid());
|
| + RELEASE_ASSERT(checkedMax.value() <= buffer->byteLength());
|
| + return adoptRef(new DataView(buffer, byteOffset, byteLength));
|
| + }
|
| +
|
| + virtual unsigned byteLength() const override { return m_byteLength; }
|
| + virtual ViewType type() const override { return TypeDataView; }
|
| +
|
| +protected:
|
| + virtual void neuter() override
|
| + {
|
| + ArrayBufferView::neuter();
|
| + m_byteLength = 0;
|
| + }
|
| +
|
| +private:
|
| + DataView(PassRefPtr<ArrayBuffer> buffer, unsigned byteOffset, unsigned byteLength)
|
| + : ArrayBufferView(buffer, byteOffset)
|
| + , m_byteLength(byteLength) { }
|
| +
|
| + unsigned m_byteLength;
|
| +};
|
| +
|
| +} // anonymous namespace
|
| +
|
| PassRefPtr<DOMDataView> DOMDataView::create(PassRefPtr<DOMArrayBuffer> prpBuffer, unsigned byteOffset, unsigned byteLength)
|
| {
|
| RefPtr<DOMArrayBuffer> buffer = prpBuffer;
|
|
|