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 bc0cf537a4dc95ecaf9d688e8606827c6bc92aa8..dee9be55b981dc544ed993e2d6af79250b6d3903 100644 |
--- a/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializer.cpp |
+++ b/third_party/WebKit/Source/bindings/core/v8/serialization/V8ScriptValueSerializer.cpp |
@@ -51,7 +51,8 @@ V8ScriptValueSerializer::V8ScriptValueSerializer( |
serializer_(script_state_->GetIsolate(), this), |
transferables_(options.transferables), |
blob_info_array_(options.blob_info), |
- inline_wasm_(options.write_wasm_to_stream) {} |
+ inline_wasm_(options.write_wasm_to_stream), |
+ for_storage_(options.for_storage) {} |
RefPtr<SerializedScriptValue> V8ScriptValueSerializer::Serialize( |
v8::Local<v8::Value> value, |
@@ -117,32 +118,37 @@ void V8ScriptValueSerializer::PrepareTransfer(ExceptionState& exception_state) { |
void V8ScriptValueSerializer::FinalizeTransfer( |
ExceptionState& exception_state) { |
- if (!transferables_ && shared_array_buffers_.IsEmpty()) |
- return; |
- |
// TODO(jbroman): Strictly speaking, this is not correct; transfer should |
// occur in the order of the transfer list. |
// https://html.spec.whatwg.org/multipage/infrastructure.html#structuredclonewithtransfer |
+ v8::Isolate* isolate = script_state_->GetIsolate(); |
+ |
+ // The order of ArrayBuffers and SharedArrayBuffers matters; we use the index |
+ // into this array for deserialization. |
ArrayBufferArray array_buffers; |
- array_buffers.AppendVector(transferables_->array_buffers); |
+ if (transferables_) |
+ array_buffers.AppendVector(transferables_->array_buffers); |
array_buffers.AppendVector(shared_array_buffers_); |
- v8::Isolate* isolate = script_state_->GetIsolate(); |
- serialized_script_value_->TransferArrayBuffers(isolate, array_buffers, |
- exception_state); |
- if (exception_state.HadException()) |
- return; |
+ if (!array_buffers.IsEmpty()) { |
+ serialized_script_value_->TransferArrayBuffers(isolate, array_buffers, |
+ exception_state); |
+ if (exception_state.HadException()) |
+ return; |
+ } |
- serialized_script_value_->TransferImageBitmaps( |
- isolate, transferables_->image_bitmaps, exception_state); |
- if (exception_state.HadException()) |
- return; |
+ if (transferables_) { |
+ serialized_script_value_->TransferImageBitmaps( |
+ isolate, transferables_->image_bitmaps, exception_state); |
+ if (exception_state.HadException()) |
+ return; |
- serialized_script_value_->TransferOffscreenCanvas( |
- isolate, transferables_->offscreen_canvases, exception_state); |
- if (exception_state.HadException()) |
- return; |
+ serialized_script_value_->TransferOffscreenCanvas( |
+ isolate, transferables_->offscreen_canvases, exception_state); |
+ if (exception_state.HadException()) |
+ return; |
+ } |
} |
void V8ScriptValueSerializer::WriteUTF8String(const String& string) { |
@@ -399,6 +405,18 @@ v8::Maybe<bool> V8ScriptValueSerializer::WriteHostObject( |
v8::Maybe<uint32_t> V8ScriptValueSerializer::GetSharedArrayBufferId( |
v8::Isolate* isolate, |
v8::Local<v8::SharedArrayBuffer> v8_shared_array_buffer) { |
+ if (for_storage_) { |
+ DCHECK(exception_state_); |
+ DCHECK_EQ(isolate, script_state_->GetIsolate()); |
+ ExceptionState exception_state(isolate, exception_state_->Context(), |
+ exception_state_->InterfaceName(), |
+ exception_state_->PropertyName()); |
+ exception_state.ThrowDOMException( |
+ kDataCloneError, |
+ "A SharedArrayBuffer can not be serialized for storage."); |
+ return v8::Nothing<uint32_t>(); |
+ } |
+ |
DOMSharedArrayBuffer* shared_array_buffer = |
V8SharedArrayBuffer::toImpl(v8_shared_array_buffer); |