OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/dom/DOMArrayBuffer.h" | 5 #include "core/dom/DOMArrayBuffer.h" |
6 | 6 |
7 #include "bindings/core/v8/DOMDataStore.h" | 7 #include "bindings/core/v8/DOMDataStore.h" |
| 8 #include "bindings/core/v8/DOMWrapperWorld.h" |
8 #include "platform/wtf/RefPtr.h" | 9 #include "platform/wtf/RefPtr.h" |
| 10 #include "platform/wtf/Vector.h" |
9 | 11 |
10 namespace blink { | 12 namespace blink { |
11 | 13 |
| 14 static void AccumulateArrayBuffersForAllWorlds( |
| 15 v8::Isolate* isolate, |
| 16 DOMArrayBuffer* object, |
| 17 Vector<v8::Local<v8::ArrayBuffer>, 4>& buffers) { |
| 18 Vector<RefPtr<DOMWrapperWorld>> worlds; |
| 19 DOMWrapperWorld::AllWorldsInCurrentThread(worlds); |
| 20 for (const auto& world : worlds) { |
| 21 v8::Local<v8::Object> wrapper = world->DomDataStore().Get(object, isolate); |
| 22 if (!wrapper.IsEmpty()) |
| 23 buffers.push_back(v8::Local<v8::ArrayBuffer>::Cast(wrapper)); |
| 24 } |
| 25 } |
| 26 |
| 27 bool DOMArrayBuffer::IsNeuterable(v8::Isolate* isolate) { |
| 28 Vector<v8::Local<v8::ArrayBuffer>, 4> buffer_handles; |
| 29 v8::HandleScope handle_scope(isolate); |
| 30 AccumulateArrayBuffersForAllWorlds(isolate, this, buffer_handles); |
| 31 |
| 32 bool is_neuterable = true; |
| 33 for (const auto& buffer_handle : buffer_handles) |
| 34 is_neuterable &= buffer_handle->IsNeuterable(); |
| 35 |
| 36 return is_neuterable; |
| 37 } |
| 38 |
| 39 bool DOMArrayBuffer::Transfer(v8::Isolate* isolate, |
| 40 WTF::ArrayBufferContents& result) { |
| 41 DOMArrayBuffer* to_transfer = this; |
| 42 if (!IsNeuterable(isolate)) { |
| 43 to_transfer = |
| 44 DOMArrayBuffer::Create(Buffer()->Data(), Buffer()->ByteLength()); |
| 45 } |
| 46 |
| 47 if (!to_transfer->Buffer()->Transfer(result)) |
| 48 return false; |
| 49 |
| 50 Vector<v8::Local<v8::ArrayBuffer>, 4> buffer_handles; |
| 51 v8::HandleScope handle_scope(isolate); |
| 52 AccumulateArrayBuffersForAllWorlds(isolate, to_transfer, buffer_handles); |
| 53 |
| 54 for (const auto& buffer_handle : buffer_handles) |
| 55 buffer_handle->Neuter(); |
| 56 |
| 57 return true; |
| 58 } |
| 59 |
12 DOMArrayBuffer* DOMArrayBuffer::CreateUninitializedOrNull( | 60 DOMArrayBuffer* DOMArrayBuffer::CreateUninitializedOrNull( |
13 unsigned num_elements, | 61 unsigned num_elements, |
14 unsigned element_byte_size) { | 62 unsigned element_byte_size) { |
15 RefPtr<ArrayBuffer> buffer = WTF::ArrayBuffer::CreateUninitializedOrNull( | 63 RefPtr<ArrayBuffer> buffer = WTF::ArrayBuffer::CreateUninitializedOrNull( |
16 num_elements, element_byte_size); | 64 num_elements, element_byte_size); |
17 if (!buffer) | 65 if (!buffer) |
18 return nullptr; | 66 return nullptr; |
19 return Create(std::move(buffer)); | 67 return Create(std::move(buffer)); |
20 } | 68 } |
21 | 69 |
22 v8::Local<v8::Object> DOMArrayBuffer::Wrap( | 70 v8::Local<v8::Object> DOMArrayBuffer::Wrap( |
23 v8::Isolate* isolate, | 71 v8::Isolate* isolate, |
24 v8::Local<v8::Object> creation_context) { | 72 v8::Local<v8::Object> creation_context) { |
25 DCHECK(!DOMDataStore::ContainsWrapper(this, isolate)); | 73 DCHECK(!DOMDataStore::ContainsWrapper(this, isolate)); |
26 | 74 |
27 const WrapperTypeInfo* wrapper_type_info = this->GetWrapperTypeInfo(); | 75 const WrapperTypeInfo* wrapper_type_info = this->GetWrapperTypeInfo(); |
28 v8::Local<v8::Object> wrapper = | 76 v8::Local<v8::Object> wrapper = |
29 v8::ArrayBuffer::New(isolate, Data(), ByteLength()); | 77 v8::ArrayBuffer::New(isolate, Data(), ByteLength()); |
30 | 78 |
31 return AssociateWithWrapper(isolate, wrapper_type_info, wrapper); | 79 return AssociateWithWrapper(isolate, wrapper_type_info, wrapper); |
32 } | 80 } |
33 | 81 |
34 } // namespace blink | 82 } // namespace blink |
OLD | NEW |