OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "bindings/core/v8/ScriptValueSerializer.h" | 5 #include "bindings/core/v8/ScriptValueSerializer.h" |
6 | 6 |
7 #include "bindings/core/v8/Transferables.h" | 7 #include "bindings/core/v8/Transferables.h" |
8 #include "bindings/core/v8/V8ArrayBuffer.h" | 8 #include "bindings/core/v8/V8ArrayBuffer.h" |
9 #include "bindings/core/v8/V8ArrayBufferView.h" | 9 #include "bindings/core/v8/V8ArrayBufferView.h" |
10 #include "bindings/core/v8/V8Blob.h" | 10 #include "bindings/core/v8/V8Blob.h" |
(...skipping 873 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
884 return writeAndGreyArrayBuffer(object, next); | 884 return writeAndGreyArrayBuffer(object, next); |
885 } | 885 } |
886 if (object->IsSharedArrayBuffer()) { | 886 if (object->IsSharedArrayBuffer()) { |
887 uint32_t index; | 887 uint32_t index; |
888 if (!m_transferredArrayBuffers.tryGet(object, &index)) { | 888 if (!m_transferredArrayBuffers.tryGet(object, &index)) { |
889 return handleError(Status::DataCloneError, "A SharedArrayBuffer coul
d not be cloned.", next); | 889 return handleError(Status::DataCloneError, "A SharedArrayBuffer coul
d not be cloned.", next); |
890 } | 890 } |
891 return writeTransferredSharedArrayBuffer(object, index, next); | 891 return writeTransferredSharedArrayBuffer(object, index, next); |
892 } | 892 } |
893 | 893 |
| 894 if (object->IsWebAssemblyCompiledModule()) |
| 895 return writeWasmCompiledModule(object, next); |
| 896 |
894 // Transferable only objects | 897 // Transferable only objects |
895 if (V8MessagePort::hasInstance(object, isolate())) { | 898 if (V8MessagePort::hasInstance(object, isolate())) { |
896 uint32_t index; | 899 uint32_t index; |
897 if (!m_transferredMessagePorts.tryGet(object, &index)) { | 900 if (!m_transferredMessagePorts.tryGet(object, &index)) { |
898 return handleError(Status::DataCloneError, "A MessagePort could not
be cloned.", next); | 901 return handleError(Status::DataCloneError, "A MessagePort could not
be cloned.", next); |
899 } | 902 } |
900 m_writer.writeTransferredMessagePort(index); | 903 m_writer.writeTransferredMessagePort(index); |
901 return nullptr; | 904 return nullptr; |
902 } | 905 } |
903 if (V8OffscreenCanvas::hasInstance(object, isolate())) { | 906 if (V8OffscreenCanvas::hasInstance(object, isolate())) { |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1191 // | 1194 // |
1192 // We do need to grey the underlying buffer before we grey its view, however
; | 1195 // We do need to grey the underlying buffer before we grey its view, however
; |
1193 // ArrayBuffers may be shared, so they need to be given reference IDs, and a
n | 1196 // ArrayBuffers may be shared, so they need to be given reference IDs, and a
n |
1194 // ArrayBufferView cannot be constructed without a corresponding ArrayBuffer | 1197 // ArrayBufferView cannot be constructed without a corresponding ArrayBuffer |
1195 // (or without an additional tag that would allow us to do two-stage constru
ction | 1198 // (or without an additional tag that would allow us to do two-stage constru
ction |
1196 // like we do for Objects and Arrays). | 1199 // like we do for Objects and Arrays). |
1197 greyObject(object); | 1200 greyObject(object); |
1198 return nullptr; | 1201 return nullptr; |
1199 } | 1202 } |
1200 | 1203 |
| 1204 ScriptValueSerializer::StateBase* ScriptValueSerializer::writeWasmCompiledModule
(v8::Local<v8::Object> object, StateBase* next) |
| 1205 { |
| 1206 CHECK(RuntimeEnabledFeatures::webAssemblySerializationEnabled()); |
| 1207 // TODO (mtrofin): explore mechanism avoiding data copying / buffer resizing
. |
| 1208 v8::Local<v8::WasmCompiledModule> wasmModule = object.As<v8::WasmCompiledMod
ule>(); |
| 1209 v8::WasmCompiledModule::SerializedModule data = wasmModule->Serialize(); |
| 1210 m_writer.append(WasmModuleTag); |
| 1211 m_writer.doWriteUint32(static_cast<uint32_t>(data.second)); |
| 1212 m_writer.append(data.first.get(), static_cast<int>(data.second)); |
| 1213 return nullptr; |
| 1214 } |
| 1215 |
1201 ScriptValueSerializer::StateBase* ScriptValueSerializer::writeAndGreyArrayBuffer
(v8::Local<v8::Object> object, StateBase* next) | 1216 ScriptValueSerializer::StateBase* ScriptValueSerializer::writeAndGreyArrayBuffer
(v8::Local<v8::Object> object, StateBase* next) |
1202 { | 1217 { |
1203 DOMArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl(object); | 1218 DOMArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl(object); |
1204 if (!arrayBuffer) | 1219 if (!arrayBuffer) |
1205 return nullptr; | 1220 return nullptr; |
1206 if (arrayBuffer->isNeutered()) | 1221 if (arrayBuffer->isNeutered()) |
1207 return handleError(Status::DataCloneError, "An ArrayBuffer is neutered a
nd could not be cloned.", next); | 1222 return handleError(Status::DataCloneError, "An ArrayBuffer is neutered a
nd could not be cloned.", next); |
1208 | 1223 |
1209 uint32_t index; | 1224 uint32_t index; |
1210 if (m_transferredArrayBuffers.tryGet(object, &index)) { | 1225 if (m_transferredArrayBuffers.tryGet(object, &index)) { |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1491 break; | 1506 break; |
1492 } | 1507 } |
1493 case ArrayBufferViewTag: { | 1508 case ArrayBufferViewTag: { |
1494 if (!m_version) | 1509 if (!m_version) |
1495 return false; | 1510 return false; |
1496 if (!readArrayBufferView(value, deserializer)) | 1511 if (!readArrayBufferView(value, deserializer)) |
1497 return false; | 1512 return false; |
1498 deserializer.pushObjectReference(*value); | 1513 deserializer.pushObjectReference(*value); |
1499 break; | 1514 break; |
1500 } | 1515 } |
| 1516 case WasmModuleTag: { |
| 1517 if (!readWasmCompiledModule(value)) |
| 1518 return false; |
| 1519 deserializer.pushObjectReference(*value); |
| 1520 break; |
| 1521 } |
1501 case ArrayBufferTag: { | 1522 case ArrayBufferTag: { |
1502 if (!m_version) | 1523 if (!m_version) |
1503 return false; | 1524 return false; |
1504 if (!readArrayBuffer(value)) | 1525 if (!readArrayBuffer(value)) |
1505 return false; | 1526 return false; |
1506 deserializer.pushObjectReference(*value); | 1527 deserializer.pushObjectReference(*value); |
1507 break; | 1528 break; |
1508 } | 1529 } |
1509 case GenerateFreshObjectTag: { | 1530 case GenerateFreshObjectTag: { |
1510 if (!m_version) | 1531 if (!m_version) |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1843 uint32_t byteLength; | 1864 uint32_t byteLength; |
1844 if (!doReadUint32(&byteLength)) | 1865 if (!doReadUint32(&byteLength)) |
1845 return nullptr; | 1866 return nullptr; |
1846 if (m_position + byteLength > m_length) | 1867 if (m_position + byteLength > m_length) |
1847 return nullptr; | 1868 return nullptr; |
1848 const void* bufferStart = m_buffer + m_position; | 1869 const void* bufferStart = m_buffer + m_position; |
1849 m_position += byteLength; | 1870 m_position += byteLength; |
1850 return DOMArrayBuffer::create(bufferStart, byteLength); | 1871 return DOMArrayBuffer::create(bufferStart, byteLength); |
1851 } | 1872 } |
1852 | 1873 |
| 1874 bool SerializedScriptValueReader::readWasmCompiledModule(v8::Local<v8::Value>* v
alue) |
| 1875 { |
| 1876 CHECK(RuntimeEnabledFeatures::webAssemblySerializationEnabled()); |
| 1877 uint32_t size = 0; |
| 1878 if (!doReadUint32(&size)) |
| 1879 return false; |
| 1880 if (m_position + size > m_length) |
| 1881 return false; |
| 1882 const uint8_t* buf = m_buffer + m_position; |
| 1883 // TODO(mtrofin): simplify deserializer API. const uint8_t* + size_t should |
| 1884 // be sufficient. |
| 1885 v8::WasmCompiledModule::SerializedModule data = { |
| 1886 std::unique_ptr<const uint8_t[]>(buf), |
| 1887 static_cast<size_t>(size) |
| 1888 }; |
| 1889 v8::MaybeLocal<v8::WasmCompiledModule> retval = v8::WasmCompiledModule::Dese
rialize(isolate(), data); |
| 1890 data.first.release(); |
| 1891 m_position += size; |
| 1892 |
| 1893 // TODO(mtrofin): right now, we'll return undefined if the deserialization |
| 1894 // fails, which is what may happen when v8's version changes. Update when |
| 1895 // spec settles. crbug.com/639090 |
| 1896 return retval.ToLocal(value); |
| 1897 } |
| 1898 |
1853 bool SerializedScriptValueReader::readArrayBuffer(v8::Local<v8::Value>* value) | 1899 bool SerializedScriptValueReader::readArrayBuffer(v8::Local<v8::Value>* value) |
1854 { | 1900 { |
1855 DOMArrayBuffer* arrayBuffer = doReadArrayBuffer(); | 1901 DOMArrayBuffer* arrayBuffer = doReadArrayBuffer(); |
1856 if (!arrayBuffer) | 1902 if (!arrayBuffer) |
1857 return false; | 1903 return false; |
1858 *value = toV8(arrayBuffer, m_scriptState->context()->Global(), isolate()); | 1904 *value = toV8(arrayBuffer, m_scriptState->context()->Global(), isolate()); |
1859 return !value->IsEmpty(); | 1905 return !value->IsEmpty(); |
1860 } | 1906 } |
1861 | 1907 |
1862 bool SerializedScriptValueReader::readArrayBufferView(v8::Local<v8::Value>* valu
e, ScriptValueDeserializer& deserializer) | 1908 bool SerializedScriptValueReader::readArrayBufferView(v8::Local<v8::Value>* valu
e, ScriptValueDeserializer& deserializer) |
(...skipping 624 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2487 return false; | 2533 return false; |
2488 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe
renceStack.size() - 1]; | 2534 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe
renceStack.size() - 1]; |
2489 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() -
1); | 2535 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() -
1); |
2490 if (objectReference >= m_objectPool.size()) | 2536 if (objectReference >= m_objectPool.size()) |
2491 return false; | 2537 return false; |
2492 *object = m_objectPool[objectReference]; | 2538 *object = m_objectPool[objectReference]; |
2493 return true; | 2539 return true; |
2494 } | 2540 } |
2495 | 2541 |
2496 } // namespace blink | 2542 } // namespace blink |
OLD | NEW |