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 55c8776877b810a98581050cde04171b953437c2..947ba493b73fa2c7a5c1862588318793398314fd 100644 |
| --- a/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp |
| +++ b/third_party/WebKit/Source/bindings/core/v8/SerializedScriptValue.cpp |
| @@ -149,7 +149,7 @@ void SerializedScriptValue::toWireBytes(Vector<char>& result) const { |
| } |
| } |
| -static void acculumateArrayBuffersForAllWorlds( |
| +static void accumulateArrayBuffersForAllWorlds( |
| v8::Isolate* isolate, |
| DOMArrayBuffer* object, |
| Vector<v8::Local<v8::ArrayBuffer>, 4>& buffers) { |
| @@ -230,64 +230,8 @@ void SerializedScriptValue::transferArrayBuffers( |
| v8::Isolate* isolate, |
| const ArrayBufferArray& arrayBuffers, |
| ExceptionState& exceptionState) { |
| - if (!arrayBuffers.size()) |
| - return; |
| - |
| - for (size_t i = 0; i < arrayBuffers.size(); ++i) { |
| - if (arrayBuffers[i]->isNeutered()) { |
| - exceptionState.throwDOMException( |
| - DataCloneError, "ArrayBuffer at index " + String::number(i) + |
| - " is already neutered."); |
| - return; |
| - } |
| - } |
| - |
| - std::unique_ptr<ArrayBufferContentsArray> contents = |
| - wrapUnique(new ArrayBufferContentsArray(arrayBuffers.size())); |
| - |
| - HeapHashSet<Member<DOMArrayBufferBase>> visited; |
| - for (size_t i = 0; i < arrayBuffers.size(); ++i) { |
| - if (visited.contains(arrayBuffers[i])) |
| - continue; |
| - visited.add(arrayBuffers[i]); |
| - |
| - if (arrayBuffers[i]->isShared()) { |
| - bool result = arrayBuffers[i]->shareContentsWith(contents->at(i)); |
| - if (!result) { |
| - exceptionState.throwDOMException( |
| - DataCloneError, "SharedArrayBuffer at index " + String::number(i) + |
| - " could not be transferred."); |
| - return; |
| - } |
| - } else { |
| - Vector<v8::Local<v8::ArrayBuffer>, 4> bufferHandles; |
| - v8::HandleScope handleScope(isolate); |
| - acculumateArrayBuffersForAllWorlds( |
| - isolate, static_cast<DOMArrayBuffer*>(arrayBuffers[i].get()), |
| - bufferHandles); |
| - bool isNeuterable = true; |
| - for (size_t j = 0; j < bufferHandles.size(); ++j) |
| - isNeuterable &= bufferHandles[j]->IsNeuterable(); |
| - |
| - DOMArrayBufferBase* toTransfer = arrayBuffers[i]; |
| - if (!isNeuterable) |
| - toTransfer = |
| - DOMArrayBuffer::create(arrayBuffers[i]->buffer()->data(), |
| - arrayBuffers[i]->buffer()->byteLength()); |
| - bool result = toTransfer->transfer(contents->at(i)); |
| - if (!result) { |
| - exceptionState.throwDOMException( |
| - DataCloneError, "ArrayBuffer at index " + String::number(i) + |
| - " could not be transferred."); |
| - return; |
| - } |
| - |
| - if (isNeuterable) |
| - for (size_t j = 0; j < bufferHandles.size(); ++j) |
| - bufferHandles[j]->Neuter(); |
| - } |
| - } |
| - m_arrayBufferContentsArray = std::move(contents); |
| + m_arrayBufferContentsArray = |
| + transferArrayBufferContents(isolate, arrayBuffers, exceptionState); |
| } |
| v8::Local<v8::Value> SerializedScriptValue::deserialize( |
| @@ -402,6 +346,72 @@ bool SerializedScriptValue::extractTransferables( |
| return true; |
| } |
| +std::unique_ptr<ArrayBufferContentsArray> |
| +SerializedScriptValue::transferArrayBufferContents( |
| + v8::Isolate* isolate, |
| + const ArrayBufferArray& arrayBuffers, |
| + ExceptionState& exceptionState) { |
| + if (!arrayBuffers.size()) |
| + return nullptr; |
| + |
| + for (size_t i = 0; i < arrayBuffers.size(); ++i) { |
|
haraken
2016/10/19 09:49:28
Can we use an iterator? An index-based access is s
nhiroki
2016/10/20 07:44:02
Done.
(Just to confirm: The out-of-range check in
|
| + if (arrayBuffers[i]->isNeutered()) { |
| + exceptionState.throwDOMException( |
| + DataCloneError, "ArrayBuffer at index " + String::number(i) + |
| + " is already neutered."); |
| + return nullptr; |
| + } |
| + } |
| + |
| + std::unique_ptr<ArrayBufferContentsArray> contents = |
| + wrapUnique(new ArrayBufferContentsArray(arrayBuffers.size())); |
| + |
| + HeapHashSet<Member<DOMArrayBufferBase>> visited; |
| + for (size_t i = 0; i < arrayBuffers.size(); ++i) { |
|
haraken
2016/10/19 09:49:28
Ditto.
nhiroki
2016/10/20 07:44:02
Done.
|
| + if (visited.contains(arrayBuffers[i])) |
| + continue; |
| + visited.add(arrayBuffers[i]); |
| + |
| + if (arrayBuffers[i]->isShared()) { |
| + bool result = arrayBuffers[i]->shareContentsWith(contents->at(i)); |
| + if (!result) { |
| + exceptionState.throwDOMException( |
| + DataCloneError, "SharedArrayBuffer at index " + String::number(i) + |
| + " could not be transferred."); |
| + return nullptr; |
| + } |
| + } else { |
| + Vector<v8::Local<v8::ArrayBuffer>, 4> bufferHandles; |
| + v8::HandleScope handleScope(isolate); |
| + accumulateArrayBuffersForAllWorlds( |
| + isolate, static_cast<DOMArrayBuffer*>(arrayBuffers[i].get()), |
| + bufferHandles); |
| + bool isNeuterable = true; |
| + for (size_t j = 0; j < bufferHandles.size(); ++j) |
|
haraken
2016/10/19 09:49:28
Ditto.
nhiroki
2016/10/20 07:44:02
Done.
|
| + isNeuterable &= bufferHandles[j]->IsNeuterable(); |
| + |
| + DOMArrayBufferBase* toTransfer = arrayBuffers[i]; |
| + if (!isNeuterable) { |
| + toTransfer = |
| + DOMArrayBuffer::create(arrayBuffers[i]->buffer()->data(), |
| + arrayBuffers[i]->buffer()->byteLength()); |
| + } |
| + bool result = toTransfer->transfer(contents->at(i)); |
| + if (!result) { |
| + exceptionState.throwDOMException( |
| + DataCloneError, "ArrayBuffer at index " + String::number(i) + |
| + " could not be transferred."); |
| + return nullptr; |
| + } |
| + |
| + if (isNeuterable) |
| + for (size_t j = 0; j < bufferHandles.size(); ++j) |
|
haraken
2016/10/19 09:49:28
Ditto.
nhiroki
2016/10/20 07:44:02
Done.
|
| + bufferHandles[j]->Neuter(); |
| + } |
| + } |
| + return contents; |
| +} |
| + |
| void SerializedScriptValue::registerMemoryAllocatedWithCurrentScriptContext() { |
| if (m_externallyAllocatedMemory) |
| return; |
| @@ -410,8 +420,4 @@ void SerializedScriptValue::registerMemoryAllocatedWithCurrentScriptContext() { |
| m_externallyAllocatedMemory); |
| } |
| -bool SerializedScriptValue::containsTransferableArrayBuffer() const { |
| - return m_arrayBufferContentsArray && !m_arrayBufferContentsArray->isEmpty(); |
| -} |
| - |
| } // namespace blink |