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

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

Issue 2323413002: Support ImageData cloning in the V8-based structured clone path. (Closed)
Patch Set: does win_clang like the other order better? Created 4 years, 3 months 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/serialization/V8ScriptValueDeserializer.cpp
diff --git a/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueDeserializer.cpp b/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueDeserializer.cpp
index c63f2b14bc9c5e383c98fa1fbd630c727e0131a3..5073a2f68e2ecd23966fe3bac01db873d7ed4886 100644
--- a/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueDeserializer.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueDeserializer.cpp
@@ -7,6 +7,7 @@
#include "bindings/core/v8/ToV8.h"
#include "core/dom/DOMArrayBuffer.h"
#include "core/dom/DOMSharedArrayBuffer.h"
+#include "core/html/ImageData.h"
#include "platform/RuntimeEnabledFeatures.h"
namespace blink {
@@ -19,7 +20,8 @@ V8ScriptValueDeserializer::V8ScriptValueDeserializer(RefPtr<ScriptState> scriptS
reinterpret_cast<const uint8_t*>(
m_serializedScriptValue->data().ensure16Bit(),
m_serializedScriptValue->data().characters16()),
- m_serializedScriptValue->data().length() * 2)
+ m_serializedScriptValue->data().length() * 2,
+ this)
{
DCHECK(RuntimeEnabledFeatures::v8BasedStructuredCloneEnabled());
m_deserializer.SetSupportsLegacyWireFormat(true);
@@ -78,4 +80,46 @@ void V8ScriptValueDeserializer::transfer()
}
}
+ScriptWrappable* V8ScriptValueDeserializer::readDOMObject(SerializationTag tag)
+{
+ switch (tag) {
+ case ImageDataTag: {
+ uint32_t width = 0, height = 0, pixelLength = 0;
+ const void* pixels = nullptr;
+ if (!readUint32(&width)
+ || !readUint32(&height)
+ || !readUint32(&pixelLength)
+ || !readRawBytes(pixelLength, &pixels))
+ return nullptr;
+ ImageData* imageData = ImageData::create(IntSize(width, height));
+ DOMUint8ClampedArray* pixelArray = imageData->data();
+ if (pixelArray->length() < pixelLength)
haraken 2016/09/16 14:17:53 When can this happen?
jbroman 2016/09/16 14:34:33 It should never be produced by V8ScriptValueSerial
+ return nullptr;
+ memcpy(pixelArray->data(), pixels, pixelLength);
+ return imageData;
+ }
+ default:
+ break;
+ }
+ return nullptr;
+}
+
+v8::MaybeLocal<v8::Object> V8ScriptValueDeserializer::ReadHostObject(v8::Isolate* isolate)
+{
+ DCHECK_EQ(isolate, m_scriptState->isolate());
+ ExceptionState exceptionState(isolate, ExceptionState::UnknownContext, nullptr, nullptr);
+ ScriptWrappable* wrappable = nullptr;
+ SerializationTag tag = PaddingTag;
+ if (readTag(&tag))
+ wrappable = readDOMObject(tag);
haraken 2016/09/16 14:17:53 Maybe can we move readTag() into readDOMObject()?
jbroman 2016/09/16 14:34:33 readDOMObject will be a virtual method which is ov
+ if (!wrappable) {
+ exceptionState.throwDOMException(DataCloneError, "Unable to deserialize cloned data.");
+ return v8::MaybeLocal<v8::Object>();
+ }
+ v8::Local<v8::Object> creationContext = m_scriptState->context()->Global();
+ v8::Local<v8::Value> wrapper = toV8(wrappable, creationContext, isolate);
+ DCHECK(wrapper->IsObject());
+ return wrapper.As<v8::Object>();
+}
+
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698