Index: third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializer.cpp |
diff --git a/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializer.cpp b/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializer.cpp |
index fb08af290b9e6f3a860d6b503817ef513b0f14a7..69c43d317d23032577e30afc5c4b68578450c20c 100644 |
--- a/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializer.cpp |
+++ b/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializer.cpp |
@@ -8,6 +8,7 @@ |
#include "bindings/core/v8/V8ImageBitmap.h" |
#include "bindings/core/v8/V8ImageData.h" |
#include "bindings/core/v8/V8MessagePort.h" |
+#include "bindings/core/v8/V8OffscreenCanvas.h" |
#include "core/dom/DOMArrayBufferBase.h" |
#include "core/html/ImageData.h" |
#include "platform/RuntimeEnabledFeatures.h" |
@@ -103,6 +104,10 @@ void V8ScriptValueSerializer::finalizeTransfer(ExceptionState& exceptionState) |
m_serializedScriptValue->transferImageBitmaps(isolate, m_transferables->imageBitmaps, exceptionState); |
if (exceptionState.hadException()) |
return; |
+ |
+ m_serializedScriptValue->transferOffscreenCanvas(isolate, m_transferables->offscreenCanvases, exceptionState); |
+ if (exceptionState.hadException()) |
+ return; |
} |
void V8ScriptValueSerializer::writeUTF8String(const String& string) |
@@ -176,6 +181,32 @@ bool V8ScriptValueSerializer::writeDOMObject(ScriptWrappable* wrappable, Excepti |
writeUint32(static_cast<uint32_t>(index)); |
return true; |
} |
+ if (wrapperTypeInfo == &V8OffscreenCanvas::wrapperTypeInfo) { |
+ OffscreenCanvas* canvas = wrappable->toImpl<OffscreenCanvas>(); |
+ size_t index = kNotFound; |
+ if (m_transferables) |
+ index = m_transferables->offscreenCanvases.find(canvas); |
+ if (index == kNotFound) { |
+ exceptionState.throwDOMException(DataCloneError, "An OffscreenCanvas could not be cloned because it was not transferred."); |
+ return false; |
+ } |
+ if (canvas->isNeutered()) { |
+ exceptionState.throwDOMException(DataCloneError, "An OffscreenCanvas could not be cloned because it was detached."); |
+ return false; |
+ } |
+ if (canvas->renderingContext()) { |
+ exceptionState.throwDOMException(DataCloneError, "An OffscreenCanvas could not be cloned because it had a rendering context."); |
+ return false; |
+ } |
+ writeTag(OffscreenCanvasTransferTag); |
+ writeUint32(canvas->width()); |
+ writeUint32(canvas->height()); |
+ writeUint32(canvas->getAssociatedCanvasId()); |
+ writeUint32(canvas->clientId()); |
+ writeUint32(canvas->localId()); |
+ writeUint64(canvas->nonce()); |
+ return true; |
+ } |
return false; |
} |