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) { |