| Index: third_party/WebKit/Source/bindings/core/v8/ScriptValueSerializer.cpp
|
| diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptValueSerializer.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptValueSerializer.cpp
|
| index 3bd0390146d9043f971387b6fb751005509455e8..86d79aa7e5d80feade66de2d1be98fdf9b883527 100644
|
| --- a/third_party/WebKit/Source/bindings/core/v8/ScriptValueSerializer.cpp
|
| +++ b/third_party/WebKit/Source/bindings/core/v8/ScriptValueSerializer.cpp
|
| @@ -11,6 +11,7 @@
|
| #include "bindings/core/v8/V8CompositorProxy.h"
|
| #include "bindings/core/v8/V8File.h"
|
| #include "bindings/core/v8/V8FileList.h"
|
| +#include "bindings/core/v8/V8ImageBitmap.h"
|
| #include "bindings/core/v8/V8ImageData.h"
|
| #include "bindings/core/v8/V8MessagePort.h"
|
| #include "bindings/core/v8/V8SharedArrayBuffer.h"
|
| @@ -323,6 +324,12 @@ void SerializedScriptValueWriter::writeTransferredArrayBuffer(uint32_t index)
|
| doWriteUint32(index);
|
| }
|
|
|
| +void SerializedScriptValueWriter::writeTransferredImageBitmap(uint32_t index)
|
| +{
|
| + append(ImageBitmapTransferTag);
|
| + doWriteUint32(index);
|
| +}
|
| +
|
| void SerializedScriptValueWriter::writeTransferredSharedArrayBuffer(uint32_t index)
|
| {
|
| ASSERT(RuntimeEnabledFeatures::sharedArrayBufferEnabled());
|
| @@ -636,6 +643,16 @@ static v8::Local<v8::Object> toV8Object(MessagePort* impl, v8::Local<v8::Object>
|
| return wrapper.As<v8::Object>();
|
| }
|
|
|
| +static v8::Local<v8::Object> toV8Object(ImageBitmap* impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
|
| +{
|
| + if (!impl)
|
| + return v8::Local<v8::Object>();
|
| + v8::Local<v8::Value> wrapper = toV8(impl, creationContext, isolate);
|
| + if (wrapper.IsEmpty())
|
| + return v8::Local<v8::Object>();
|
| + return wrapper.As<v8::Object>();
|
| +}
|
| +
|
| static v8::Local<v8::Object> toV8Object(DOMArrayBufferBase* impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
|
| {
|
| if (!impl)
|
| @@ -657,7 +674,7 @@ static bool isHostObject(v8::Local<v8::Object> object)
|
| return object->InternalFieldCount();
|
| }
|
|
|
| -ScriptValueSerializer::ScriptValueSerializer(SerializedScriptValueWriter& writer, MessagePortArray* messagePorts, ArrayBufferArray* arrayBuffers, WebBlobInfoArray* blobInfo, BlobDataHandleMap& blobDataHandles, v8::TryCatch& tryCatch, ScriptState* scriptState)
|
| +ScriptValueSerializer::ScriptValueSerializer(SerializedScriptValueWriter& writer, MessagePortArray* messagePorts, ArrayBufferArray* arrayBuffers, ImageBitmapArray* imageBitmaps, WebBlobInfoArray* blobInfo, BlobDataHandleMap& blobDataHandles, v8::TryCatch& tryCatch, ScriptState* scriptState)
|
| : m_scriptState(scriptState)
|
| , m_writer(writer)
|
| , m_tryCatch(tryCatch)
|
| @@ -681,6 +698,13 @@ ScriptValueSerializer::ScriptValueSerializer(SerializedScriptValueWriter& writer
|
| m_transferredArrayBuffers.set(v8ArrayBuffer, i);
|
| }
|
| }
|
| + if (imageBitmaps) {
|
| + for (size_t i = 0; i < imageBitmaps->size(); i++) {
|
| + v8::Local<v8::Object> v8ImageBitmap = toV8Object(imageBitmaps->at(i).get(), creationContext, isolate());
|
| + if (!m_transferredImageBitmaps.contains(v8ImageBitmap))
|
| + m_transferredImageBitmaps.set(v8ImageBitmap, i);
|
| + }
|
| + }
|
| }
|
|
|
| ScriptValueSerializer::Status ScriptValueSerializer::serialize(v8::Local<v8::Value> value)
|
| @@ -733,6 +757,7 @@ ScriptValueSerializer::StateBase* ScriptValueSerializer::doSerializeValue(v8::Lo
|
| v8::Local<v8::Object> jsObject = value.As<v8::Object>();
|
|
|
| uint32_t arrayBufferIndex;
|
| + uint32_t imageBitmapIndex;
|
| if (V8ArrayBufferView::hasInstance(value, isolate())) {
|
| return writeAndGreyArrayBufferView(jsObject, next);
|
| } else if (V8MessagePort::hasInstance(value, isolate())) {
|
| @@ -743,6 +768,8 @@ ScriptValueSerializer::StateBase* ScriptValueSerializer::doSerializeValue(v8::Lo
|
| return nullptr;
|
| } else if (V8ArrayBuffer::hasInstance(value, isolate()) && m_transferredArrayBuffers.tryGet(jsObject, &arrayBufferIndex)) {
|
| return writeTransferredArrayBuffer(value, arrayBufferIndex, next);
|
| + } else if (V8ImageBitmap::hasInstance(value, isolate()) && m_transferredImageBitmaps.tryGet(jsObject, &imageBitmapIndex)) {
|
| + return writeTransferredImageBitmap(value, imageBitmapIndex, next);
|
| } else if (V8SharedArrayBuffer::hasInstance(value, isolate()) && m_transferredArrayBuffers.tryGet(jsObject, &arrayBufferIndex)) {
|
| return writeTransferredSharedArrayBuffer(value, arrayBufferIndex, next);
|
| }
|
| @@ -1023,6 +1050,17 @@ ScriptValueSerializer::StateBase* ScriptValueSerializer::writeTransferredArrayBu
|
| return 0;
|
| }
|
|
|
| +ScriptValueSerializer::StateBase* ScriptValueSerializer::writeTransferredImageBitmap(v8::Local<v8::Value> value, uint32_t index, ScriptValueSerializer::StateBase* next)
|
| +{
|
| + ImageBitmap* imageBitmap = V8ImageBitmap::toImpl(value.As<v8::Object>());
|
| + if (!imageBitmap)
|
| + return 0;
|
| + if (imageBitmap->isNeutered())
|
| + return handleError(DataCloneError, "An ImageBitmap is neutered and could not be cloned.", next);
|
| + m_writer.writeTransferredImageBitmap(index);
|
| + return 0;
|
| +}
|
| +
|
| ScriptValueSerializer::StateBase* ScriptValueSerializer::writeTransferredSharedArrayBuffer(v8::Local<v8::Value> value, uint32_t index, ScriptValueSerializer::StateBase* next)
|
| {
|
| ASSERT(RuntimeEnabledFeatures::sharedArrayBufferEnabled());
|
| @@ -1351,6 +1389,16 @@ bool SerializedScriptValueReader::readWithTag(SerializationTag tag, v8::Local<v8
|
| return false;
|
| break;
|
| }
|
| + case ImageBitmapTransferTag: {
|
| + if (!m_version)
|
| + return false;
|
| + uint32_t index;
|
| + if (!doReadUint32(&index))
|
| + return false;
|
| + if (!creator.tryGetTransferredImageBitmap(index, value))
|
| + return false;
|
| + break;
|
| + }
|
| case SharedArrayBufferTransferTag: {
|
| if (!m_version)
|
| return false;
|
| @@ -2065,6 +2113,26 @@ bool ScriptValueDeserializer::tryGetTransferredArrayBuffer(uint32_t index, v8::L
|
| return true;
|
| }
|
|
|
| +bool ScriptValueDeserializer::tryGetTransferredImageBitmap(uint32_t index, v8::Local<v8::Value>* object)
|
| +{
|
| + if (!m_imageBitmapContents)
|
| + return false;
|
| + if (index >= m_imageBitmaps.size())
|
| + return false;
|
| + v8::Local<v8::Value> result = m_imageBitmaps.at(index);
|
| + if (result.IsEmpty()) {
|
| + RefPtrWillBeRawPtr<ImageBitmap> bitmap = ImageBitmap::create(m_imageBitmapContents->at(index).get());
|
| + v8::Isolate* isolate = m_reader.scriptState()->isolate();
|
| + v8::Local<v8::Object> creationContext = m_reader.scriptState()->context()->Global();
|
| + result = toV8(bitmap.get(), creationContext, isolate);
|
| + if (result.IsEmpty())
|
| + return false;
|
| + m_imageBitmaps[index] = result;
|
| + }
|
| + *object = result;
|
| + return true;
|
| +}
|
| +
|
| bool ScriptValueDeserializer::tryGetTransferredSharedArrayBuffer(uint32_t index, v8::Local<v8::Value>* object)
|
| {
|
| ASSERT(RuntimeEnabledFeatures::sharedArrayBufferEnabled());
|
|
|