| 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;
 | 
| 
 |