Chromium Code Reviews| Index: third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp |
| diff --git a/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp b/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp |
| index ed8c7ae5521982cc79eee3da2d2a1244d3bf390b..fa584a8dcfe9f767f93c95455fa78349e1edd9a0 100644 |
| --- a/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp |
| +++ b/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp |
| @@ -270,19 +270,6 @@ void SerializedScriptValue::ToWireBytes(Vector<char>& result) const { |
| } |
| } |
| -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)); |
| - } |
| -} |
| - |
| std::unique_ptr<SerializedScriptValue::ImageBitmapContentsArray> |
| SerializedScriptValue::TransferImageBitmapContents( |
| v8::Isolate* isolate, |
| @@ -487,14 +474,16 @@ SerializedScriptValue::TransferArrayBufferContents( |
| HeapHashSet<Member<DOMArrayBufferBase>> visited; |
| for (auto it = array_buffers.begin(); it != array_buffers.end(); ++it) { |
| - DOMArrayBufferBase* array_buffer = *it; |
| - if (visited.Contains(array_buffer)) |
| + DOMArrayBufferBase* array_buffer_base = *it; |
| + if (visited.Contains(array_buffer_base)) |
| continue; |
| - visited.insert(array_buffer); |
| + visited.insert(array_buffer_base); |
| size_t index = std::distance(array_buffers.begin(), it); |
| - if (array_buffer->IsShared()) { |
| - if (!array_buffer->ShareContentsWith(contents->at(index))) { |
| + if (array_buffer_base->IsShared()) { |
| + DOMSharedArrayBuffer* shared_array_buffer = |
| + static_cast<DOMSharedArrayBuffer*>(array_buffer_base); |
| + if (!shared_array_buffer->ShareContentsWith(contents->at(index))) { |
| exception_state.ThrowDOMException(kDataCloneError, |
| "SharedArrayBuffer at index " + |
| String::Number(index) + |
| @@ -502,31 +491,22 @@ SerializedScriptValue::TransferArrayBufferContents( |
| return nullptr; |
| } |
| } else { |
| - Vector<v8::Local<v8::ArrayBuffer>, 4> buffer_handles; |
| - v8::HandleScope handle_scope(isolate); |
| - AccumulateArrayBuffersForAllWorlds( |
| - isolate, static_cast<DOMArrayBuffer*>(it->Get()), buffer_handles); |
| - bool is_neuterable = true; |
| - for (const auto& buffer_handle : buffer_handles) |
| - is_neuterable &= buffer_handle->IsNeuterable(); |
| - |
| - DOMArrayBufferBase* to_transfer = array_buffer; |
| - if (!is_neuterable) { |
| + DOMArrayBuffer* array_buffer = |
| + static_cast<DOMArrayBuffer*>(array_buffer_base); |
| + |
| + DOMArrayBuffer* to_transfer = array_buffer; |
| + if (!array_buffer->IsNeuterable(isolate)) { |
| to_transfer = |
| DOMArrayBuffer::Create(array_buffer->Buffer()->Data(), |
| array_buffer->Buffer()->ByteLength()); |
| } |
| - if (!to_transfer->Transfer(contents->at(index))) { |
| + |
| + if (!to_transfer->Transfer(isolate, contents->at(index))) { |
| exception_state.ThrowDOMException( |
|
haraken
2017/04/20 20:07:01
We're checking IsNeuterable twice. (Transfer calls
binji
2017/04/21 00:00:23
I made a separate method DOMArrayBuffer::TransferO
|
| kDataCloneError, "ArrayBuffer at index " + String::Number(index) + |
| " could not be transferred."); |
| return nullptr; |
| } |
| - |
| - if (is_neuterable) { |
| - for (const auto& buffer_handle : buffer_handles) |
| - buffer_handle->Neuter(); |
| - } |
| } |
| } |
| return contents; |