| Index: Source/bindings/core/v8/SerializedScriptValue.cpp
|
| diff --git a/Source/bindings/core/v8/SerializedScriptValue.cpp b/Source/bindings/core/v8/SerializedScriptValue.cpp
|
| index fde1ba7ec4203ccd1718acc4fab11b87ea27381c..d5cc1368b1d0a47a6d94f6b9b0f5076f008a8233 100644
|
| --- a/Source/bindings/core/v8/SerializedScriptValue.cpp
|
| +++ b/Source/bindings/core/v8/SerializedScriptValue.cpp
|
| @@ -39,6 +39,7 @@
|
| #include "bindings/core/v8/SerializedScriptValueFactory.h"
|
| #include "bindings/core/v8/V8ArrayBuffer.h"
|
| #include "bindings/core/v8/V8MessagePort.h"
|
| +#include "bindings/core/v8/V8SharedArrayBuffer.h"
|
| #include "core/dom/ExceptionCode.h"
|
| #include "platform/SharedBuffer.h"
|
| #include "platform/blob/BlobData.h"
|
| @@ -113,32 +114,42 @@ PassOwnPtr<SerializedScriptValue::ArrayBufferContentsArray> SerializedScriptValu
|
|
|
| OwnPtr<ArrayBufferContentsArray> contents = adoptPtr(new ArrayBufferContentsArray(arrayBuffers.size()));
|
|
|
| - HashSet<DOMArrayBuffer*> visited;
|
| + HashSet<DOMArrayBufferBase*> visited;
|
| for (size_t i = 0; i < arrayBuffers.size(); i++) {
|
| if (visited.contains(arrayBuffers[i].get()))
|
| continue;
|
| visited.add(arrayBuffers[i].get());
|
|
|
| - Vector<v8::Local<v8::ArrayBuffer>, 4> bufferHandles;
|
| - v8::HandleScope handleScope(isolate);
|
| - acculumateArrayBuffersForAllWorlds(isolate, arrayBuffers[i].get(), bufferHandles);
|
| - bool isNeuterable = true;
|
| - for (size_t j = 0; j < bufferHandles.size(); j++)
|
| - isNeuterable &= bufferHandles[j]->IsNeuterable();
|
| -
|
| - RefPtr<DOMArrayBuffer> toTransfer = arrayBuffers[i];
|
| - if (!isNeuterable)
|
| - toTransfer = DOMArrayBuffer::create(arrayBuffers[i]->buffer());
|
| - 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 (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);
|
| + acculumateArrayBuffersForAllWorlds(isolate, static_pointer_cast<DOMArrayBuffer>(arrayBuffers[i]).get(), bufferHandles);
|
| + bool isNeuterable = true;
|
| + for (size_t j = 0; j < bufferHandles.size(); j++)
|
| + isNeuterable &= bufferHandles[j]->IsNeuterable();
|
| +
|
| + RefPtr<DOMArrayBufferBase> toTransfer = arrayBuffers[i];
|
| + if (!isNeuterable)
|
| + toTransfer = DOMArrayBuffer::create(arrayBuffers[i]->buffer());
|
| + 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++)
|
| + bufferHandles[j]->Neuter();
|
| }
|
|
|
| - if (isNeuterable)
|
| - for (size_t j = 0; j < bufferHandles.size(); j++)
|
| - bufferHandles[j]->Neuter();
|
| }
|
| +
|
| return contents.release();
|
| }
|
|
|
| @@ -204,6 +215,13 @@ bool SerializedScriptValue::extractTransferables(v8::Isolate* isolate, v8::Local
|
| return false;
|
| }
|
| arrayBuffers.append(arrayBuffer.release());
|
| + } else if (V8SharedArrayBuffer::hasInstance(transferrable, isolate)) {
|
| + RefPtr<DOMSharedArrayBuffer> sharedArrayBuffer = V8SharedArrayBuffer::toImpl(v8::Local<v8::Object>::Cast(transferrable));
|
| + if (arrayBuffers.contains(sharedArrayBuffer)) {
|
| + exceptionState.throwDOMException(DataCloneError, "SharedArrayBuffer at index " + String::number(i) + " is a duplicate of an earlier SharedArrayBuffer.");
|
| + return false;
|
| + }
|
| + arrayBuffers.append(sharedArrayBuffer.release());
|
| } else {
|
| exceptionState.throwTypeError("Value at index " + String::number(i) + " does not have a transferable type.");
|
| return false;
|
|
|