| Index: third_party/WebKit/Source/core/dom/DOMArrayBuffer.cpp
|
| diff --git a/third_party/WebKit/Source/core/dom/DOMArrayBuffer.cpp b/third_party/WebKit/Source/core/dom/DOMArrayBuffer.cpp
|
| index 3b7c5bc8891aecf24714cf09105eb483e4777da5..007672f0eb73389c7ea78d88ac6e513fa40a9fad 100644
|
| --- a/third_party/WebKit/Source/core/dom/DOMArrayBuffer.cpp
|
| +++ b/third_party/WebKit/Source/core/dom/DOMArrayBuffer.cpp
|
| @@ -5,10 +5,58 @@
|
| #include "core/dom/DOMArrayBuffer.h"
|
|
|
| #include "bindings/core/v8/DOMDataStore.h"
|
| +#include "bindings/core/v8/DOMWrapperWorld.h"
|
| #include "platform/wtf/RefPtr.h"
|
| +#include "platform/wtf/Vector.h"
|
|
|
| namespace blink {
|
|
|
| +static void AccumulateArrayBuffersForAllWorlds(
|
| + v8::Isolate* isolate,
|
| + DOMArrayBuffer* object,
|
| + Vector<v8::Local<v8::ArrayBuffer>, 4>& buffers) {
|
| + Vector<RefPtr<DOMWrapperWorld>> worlds;
|
| + DOMWrapperWorld::AllWorldsInCurrentThread(worlds);
|
| + for (const auto& world : worlds) {
|
| + v8::Local<v8::Object> wrapper = world->DomDataStore().Get(object, isolate);
|
| + if (!wrapper.IsEmpty())
|
| + buffers.push_back(v8::Local<v8::ArrayBuffer>::Cast(wrapper));
|
| + }
|
| +}
|
| +
|
| +bool DOMArrayBuffer::IsNeuterable(v8::Isolate* isolate) {
|
| + Vector<v8::Local<v8::ArrayBuffer>, 4> buffer_handles;
|
| + v8::HandleScope handle_scope(isolate);
|
| + AccumulateArrayBuffersForAllWorlds(isolate, this, buffer_handles);
|
| +
|
| + bool is_neuterable = true;
|
| + for (const auto& buffer_handle : buffer_handles)
|
| + is_neuterable &= buffer_handle->IsNeuterable();
|
| +
|
| + return is_neuterable;
|
| +}
|
| +
|
| +bool DOMArrayBuffer::Transfer(v8::Isolate* isolate,
|
| + WTF::ArrayBufferContents& result) {
|
| + DOMArrayBuffer* to_transfer = this;
|
| + if (!IsNeuterable(isolate)) {
|
| + to_transfer =
|
| + DOMArrayBuffer::Create(Buffer()->Data(), Buffer()->ByteLength());
|
| + }
|
| +
|
| + if (!Buffer()->Transfer(result))
|
| + return false;
|
| +
|
| + Vector<v8::Local<v8::ArrayBuffer>, 4> buffer_handles;
|
| + v8::HandleScope handle_scope(isolate);
|
| + AccumulateArrayBuffersForAllWorlds(isolate, this, buffer_handles);
|
| +
|
| + for (const auto& buffer_handle : buffer_handles)
|
| + buffer_handle->Neuter();
|
| +
|
| + return true;
|
| +}
|
| +
|
| DOMArrayBuffer* DOMArrayBuffer::CreateUninitializedOrNull(
|
| unsigned num_elements,
|
| unsigned element_byte_size) {
|
|
|