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

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

Issue 1097773004: Sharing of SharedArrayBuffer via PostMessage transfer (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: additional flag in virtual test suite Created 5 years, 5 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
« no previous file with comments | « Source/bindings/core/v8/ScriptValueSerializer.h ('k') | Source/bindings/core/v8/SerializationTag.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/bindings/core/v8/ScriptValueSerializer.cpp
diff --git a/Source/bindings/core/v8/ScriptValueSerializer.cpp b/Source/bindings/core/v8/ScriptValueSerializer.cpp
index 219bba8549a0dd2c6cd4f45710cf41890a4324f0..f3f745a957887b9da4ef0316266f0eb3b5a0a29c 100644
--- a/Source/bindings/core/v8/ScriptValueSerializer.cpp
+++ b/Source/bindings/core/v8/ScriptValueSerializer.cpp
@@ -13,11 +13,15 @@
#include "bindings/core/v8/V8FileList.h"
#include "bindings/core/v8/V8ImageData.h"
#include "bindings/core/v8/V8MessagePort.h"
+#include "bindings/core/v8/V8SharedArrayBuffer.h"
#include "core/dom/CompositorProxy.h"
#include "core/dom/DOMDataView.h"
+#include "core/dom/DOMSharedArrayBuffer.h"
+#include "core/dom/DOMTypedArray.h"
#include "core/fileapi/Blob.h"
#include "core/fileapi/File.h"
#include "core/fileapi/FileList.h"
+#include "platform/RuntimeEnabledFeatures.h"
#include "public/platform/Platform.h"
#include "public/platform/WebBlobInfo.h"
#include "wtf/DateMath.h"
@@ -247,8 +251,7 @@ void SerializedScriptValueWriter::writeArrayBufferView(const DOMArrayBufferView&
{
append(ArrayBufferViewTag);
#if ENABLE(ASSERT)
- const DOMArrayBuffer& arrayBuffer = *arrayBufferView.buffer();
- ASSERT(static_cast<const uint8_t*>(arrayBuffer.data()) + arrayBufferView.byteOffset() ==
+ ASSERT(static_cast<const uint8_t*>(arrayBufferView.bufferBase()->data()) + arrayBufferView.byteOffset() ==
static_cast<const uint8_t*>(arrayBufferView.baseAddress()));
#endif
DOMArrayBufferView::ViewType type = arrayBufferView.type();
@@ -320,6 +323,13 @@ void SerializedScriptValueWriter::writeTransferredArrayBuffer(uint32_t index)
doWriteUint32(index);
}
+void SerializedScriptValueWriter::writeTransferredSharedArrayBuffer(uint32_t index)
+{
+ ASSERT(RuntimeEnabledFeatures::sharedArrayBufferEnabled());
+ append(SharedArrayBufferTransferTag);
+ doWriteUint32(index);
+}
+
void SerializedScriptValueWriter::writeObjectReference(uint32_t reference)
{
append(ObjectReferenceTag);
@@ -627,15 +637,14 @@ static v8::Local<v8::Object> toV8Object(MessagePort* impl, v8::Local<v8::Object>
return wrapper.As<v8::Object>();
}
-static v8::Local<v8::ArrayBuffer> toV8Object(DOMArrayBuffer* impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
+static v8::Local<v8::Object> toV8Object(DOMArrayBufferBase* impl, v8::Local<v8::Object> creationContext, v8::Isolate* isolate)
{
if (!impl)
- return v8::Local<v8::ArrayBuffer>();
+ return v8::Local<v8::Object>();
v8::Local<v8::Value> wrapper = toV8(impl, creationContext, isolate);
if (wrapper.IsEmpty())
- return v8::Local<v8::ArrayBuffer>();
- ASSERT(wrapper->IsArrayBuffer());
- return wrapper.As<v8::ArrayBuffer>();
+ return v8::Local<v8::Object>();
+ return wrapper.As<v8::Object>();
}
// Returns true if the provided object is to be considered a 'host object', as used in the
@@ -733,6 +742,8 @@ ScriptValueSerializer::StateBase* ScriptValueSerializer::doSerializeValue(v8::Lo
}
} else if (V8ArrayBuffer::hasInstance(value, isolate()) && m_transferredArrayBuffers.tryGet(value.As<v8::Object>(), &arrayBufferIndex)) {
return writeTransferredArrayBuffer(value, arrayBufferIndex, next);
+ } else if (V8SharedArrayBuffer::hasInstance(value, isolate()) && m_transferredArrayBuffers.tryGet(value.As<v8::Object>(), &arrayBufferIndex)) {
+ return writeTransferredSharedArrayBuffer(value, arrayBufferIndex, next);
} else {
v8::Local<v8::Object> jsObject = value.As<v8::Object>();
if (jsObject.IsEmpty())
@@ -967,9 +978,9 @@ ScriptValueSerializer::StateBase* ScriptValueSerializer::writeAndGreyArrayBuffer
DOMArrayBufferView* arrayBufferView = V8ArrayBufferView::toImpl(object);
if (!arrayBufferView)
return 0;
- if (!arrayBufferView->buffer())
+ if (!arrayBufferView->bufferBase())
return handleError(DataCloneError, "An ArrayBuffer could not be cloned.", next);
- v8::Local<v8::Value> underlyingBuffer = toV8(arrayBufferView->buffer(), m_scriptState->context()->Global(), isolate());
+ v8::Local<v8::Value> underlyingBuffer = toV8(arrayBufferView->bufferBase(), m_scriptState->context()->Global(), isolate());
if (underlyingBuffer.IsEmpty())
return handleError(DataCloneError, "An ArrayBuffer could not be cloned.", next);
StateBase* stateOut = doSerializeArrayBuffer(underlyingBuffer, next);
@@ -1013,6 +1024,16 @@ ScriptValueSerializer::StateBase* ScriptValueSerializer::writeTransferredArrayBu
return 0;
}
+ScriptValueSerializer::StateBase* ScriptValueSerializer::writeTransferredSharedArrayBuffer(v8::Local<v8::Value> value, uint32_t index, ScriptValueSerializer::StateBase* next)
+{
+ ASSERT(RuntimeEnabledFeatures::sharedArrayBufferEnabled());
+ DOMSharedArrayBuffer* sharedArrayBuffer = V8SharedArrayBuffer::toImpl(value.As<v8::Object>());
+ if (!sharedArrayBuffer)
+ return 0;
+ m_writer.writeTransferredSharedArrayBuffer(index);
+ return 0;
+}
+
bool ScriptValueSerializer::shouldSerializeDensely(uint32_t length, uint32_t propertyCount)
{
// Let K be the cost of serializing all property values that are there
@@ -1331,6 +1352,16 @@ bool SerializedScriptValueReader::readWithTag(SerializationTag tag, v8::Local<v8
return false;
break;
}
+ case SharedArrayBufferTransferTag: {
+ if (!m_version)
+ return false;
+ uint32_t index;
+ if (!doReadUint32(&index))
+ return false;
+ if (!creator.tryGetTransferredSharedArrayBuffer(index, value))
+ return false;
+ break;
+ }
case ObjectReferenceTag: {
if (!m_version)
return false;
@@ -1552,7 +1583,7 @@ bool SerializedScriptValueReader::readArrayBufferView(v8::Local<v8::Value>* valu
ArrayBufferViewSubTag subTag;
uint32_t byteOffset;
uint32_t byteLength;
- RefPtr<DOMArrayBuffer> arrayBuffer;
+ RefPtr<DOMArrayBufferBase> arrayBuffer;
v8::Local<v8::Value> arrayBufferV8Value;
if (!readArrayBufferViewSubTag(&subTag))
return false;
@@ -1564,9 +1595,17 @@ bool SerializedScriptValueReader::readArrayBufferView(v8::Local<v8::Value>* valu
return false;
if (arrayBufferV8Value.IsEmpty())
return false;
- arrayBuffer = V8ArrayBuffer::toImpl(arrayBufferV8Value.As<v8::Object>());
- if (!arrayBuffer)
- return false;
+ if (arrayBufferV8Value->IsArrayBuffer()) {
+ arrayBuffer = V8ArrayBuffer::toImpl(arrayBufferV8Value.As<v8::Object>());
+ if (!arrayBuffer)
+ return false;
+ } else if (arrayBufferV8Value->IsSharedArrayBuffer()) {
+ arrayBuffer = V8SharedArrayBuffer::toImpl(arrayBufferV8Value.As<v8::Object>());
+ if (!arrayBuffer)
+ return false;
+ } else {
+ ASSERT_NOT_REACHED();
+ }
// Check the offset, length and alignment.
int elementByteSize;
@@ -2027,6 +2066,27 @@ bool ScriptValueDeserializer::tryGetTransferredArrayBuffer(uint32_t index, v8::L
return true;
}
+bool ScriptValueDeserializer::tryGetTransferredSharedArrayBuffer(uint32_t index, v8::Local<v8::Value>* object)
+{
+ ASSERT(RuntimeEnabledFeatures::sharedArrayBufferEnabled());
+ if (!m_arrayBufferContents)
+ return false;
+ if (index >= m_arrayBuffers.size())
+ return false;
+ v8::Local<v8::Value> result = m_arrayBuffers.at(index);
+ if (result.IsEmpty()) {
+ RefPtr<DOMSharedArrayBuffer> buffer = DOMSharedArrayBuffer::create(m_arrayBufferContents->at(index));
+ v8::Isolate* isolate = m_reader.scriptState()->isolate();
+ v8::Local<v8::Object> creationContext = m_reader.scriptState()->context()->Global();
+ result = toV8(buffer.get(), creationContext, isolate);
+ if (result.IsEmpty())
+ return false;
+ m_arrayBuffers[index] = result;
+ }
+ *object = result;
+ return true;
+}
+
bool ScriptValueDeserializer::tryGetObjectFromObjectReference(uint32_t reference, v8::Local<v8::Value>* object)
{
if (reference >= m_objectPool.size())
« no previous file with comments | « Source/bindings/core/v8/ScriptValueSerializer.h ('k') | Source/bindings/core/v8/SerializationTag.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698