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..d93d0021794f0889144a50da2640d1d2fbd2593e 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)); |
+ 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()); |