Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(146)

Unified Diff: third_party/WebKit/Source/bindings/core/v8/ScriptValueSerializer.cpp

Issue 1423513005: Reland of: Make Imagebitmap Transferable (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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());

Powered by Google App Engine
This is Rietveld 408576698