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 850 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
861 return writeAndGreyArrayBuffer(object, next); | 861 return writeAndGreyArrayBuffer(object, next); |
862 } | 862 } |
863 if (object->IsSharedArrayBuffer()) { | 863 if (object->IsSharedArrayBuffer()) { |
864 uint32_t index; | 864 uint32_t index; |
865 if (!m_transferredArrayBuffers.tryGet(object, &index)) { | 865 if (!m_transferredArrayBuffers.tryGet(object, &index)) { |
866 return handleError(Status::DataCloneError, "A SharedArrayBuffer coul
d not be cloned.", next); | 866 return handleError(Status::DataCloneError, "A SharedArrayBuffer coul
d not be cloned.", next); |
867 } | 867 } |
868 return writeTransferredSharedArrayBuffer(object, index, next); | 868 return writeTransferredSharedArrayBuffer(object, index, next); |
869 } | 869 } |
870 | 870 |
| 871 if (object->IsWebAssemblyCompiledModule()) |
| 872 return writeWasmCompiledModule(object, next); |
| 873 |
871 // Transferable only objects | 874 // Transferable only objects |
872 if (V8MessagePort::hasInstance(object, isolate())) { | 875 if (V8MessagePort::hasInstance(object, isolate())) { |
873 uint32_t index; | 876 uint32_t index; |
874 if (!m_transferredMessagePorts.tryGet(object, &index)) { | 877 if (!m_transferredMessagePorts.tryGet(object, &index)) { |
875 return handleError(Status::DataCloneError, "A MessagePort could not
be cloned.", next); | 878 return handleError(Status::DataCloneError, "A MessagePort could not
be cloned.", next); |
876 } | 879 } |
877 m_writer.writeTransferredMessagePort(index); | 880 m_writer.writeTransferredMessagePort(index); |
878 return nullptr; | 881 return nullptr; |
879 } | 882 } |
880 if (V8OffscreenCanvas::hasInstance(object, isolate())) { | 883 if (V8OffscreenCanvas::hasInstance(object, isolate())) { |
(...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1168 // | 1171 // |
1169 // We do need to grey the underlying buffer before we grey its view, however
; | 1172 // We do need to grey the underlying buffer before we grey its view, however
; |
1170 // ArrayBuffers may be shared, so they need to be given reference IDs, and a
n | 1173 // ArrayBuffers may be shared, so they need to be given reference IDs, and a
n |
1171 // ArrayBufferView cannot be constructed without a corresponding ArrayBuffer | 1174 // ArrayBufferView cannot be constructed without a corresponding ArrayBuffer |
1172 // (or without an additional tag that would allow us to do two-stage constru
ction | 1175 // (or without an additional tag that would allow us to do two-stage constru
ction |
1173 // like we do for Objects and Arrays). | 1176 // like we do for Objects and Arrays). |
1174 greyObject(object); | 1177 greyObject(object); |
1175 return nullptr; | 1178 return nullptr; |
1176 } | 1179 } |
1177 | 1180 |
| 1181 ScriptValueSerializer::StateBase* ScriptValueSerializer::writeWasmCompiledModule
(v8::Local<v8::Object> object, StateBase* next) |
| 1182 { |
| 1183 // TODO (mtrofin): explore mechanism avoiding data copying / buffer resizing
. |
| 1184 v8::Local<v8::WasmCompiledModule> wasmModule = object.As<v8::WasmCompiledMod
ule>(); |
| 1185 v8::WasmCompiledModule::SerializedModule data = wasmModule->Serialize(); |
| 1186 m_writer.append(WasmModuleTag); |
| 1187 m_writer.doWriteUint32(static_cast<uint32_t>(data.second)); |
| 1188 m_writer.append(data.first.get(), static_cast<int>(data.second)); |
| 1189 return nullptr; |
| 1190 } |
| 1191 |
1178 ScriptValueSerializer::StateBase* ScriptValueSerializer::writeAndGreyArrayBuffer
(v8::Local<v8::Object> object, StateBase* next) | 1192 ScriptValueSerializer::StateBase* ScriptValueSerializer::writeAndGreyArrayBuffer
(v8::Local<v8::Object> object, StateBase* next) |
1179 { | 1193 { |
1180 DOMArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl(object); | 1194 DOMArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl(object); |
1181 if (!arrayBuffer) | 1195 if (!arrayBuffer) |
1182 return nullptr; | 1196 return nullptr; |
1183 if (arrayBuffer->isNeutered()) | 1197 if (arrayBuffer->isNeutered()) |
1184 return handleError(Status::DataCloneError, "An ArrayBuffer is neutered a
nd could not be cloned.", next); | 1198 return handleError(Status::DataCloneError, "An ArrayBuffer is neutered a
nd could not be cloned.", next); |
1185 | 1199 |
1186 uint32_t index; | 1200 uint32_t index; |
1187 if (m_transferredArrayBuffers.tryGet(object, &index)) { | 1201 if (m_transferredArrayBuffers.tryGet(object, &index)) { |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1468 break; | 1482 break; |
1469 } | 1483 } |
1470 case ArrayBufferViewTag: { | 1484 case ArrayBufferViewTag: { |
1471 if (!m_version) | 1485 if (!m_version) |
1472 return false; | 1486 return false; |
1473 if (!readArrayBufferView(value, deserializer)) | 1487 if (!readArrayBufferView(value, deserializer)) |
1474 return false; | 1488 return false; |
1475 deserializer.pushObjectReference(*value); | 1489 deserializer.pushObjectReference(*value); |
1476 break; | 1490 break; |
1477 } | 1491 } |
| 1492 case WasmModuleTag: { |
| 1493 if (!readWasmCompiledModule(value)) |
| 1494 return false; |
| 1495 deserializer.pushObjectReference(*value); |
| 1496 break; |
| 1497 } |
1478 case ArrayBufferTag: { | 1498 case ArrayBufferTag: { |
1479 if (!m_version) | 1499 if (!m_version) |
1480 return false; | 1500 return false; |
1481 if (!readArrayBuffer(value)) | 1501 if (!readArrayBuffer(value)) |
1482 return false; | 1502 return false; |
1483 deserializer.pushObjectReference(*value); | 1503 deserializer.pushObjectReference(*value); |
1484 break; | 1504 break; |
1485 } | 1505 } |
1486 case GenerateFreshObjectTag: { | 1506 case GenerateFreshObjectTag: { |
1487 if (!m_version) | 1507 if (!m_version) |
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1820 uint32_t byteLength; | 1840 uint32_t byteLength; |
1821 if (!doReadUint32(&byteLength)) | 1841 if (!doReadUint32(&byteLength)) |
1822 return nullptr; | 1842 return nullptr; |
1823 if (m_position + byteLength > m_length) | 1843 if (m_position + byteLength > m_length) |
1824 return nullptr; | 1844 return nullptr; |
1825 const void* bufferStart = m_buffer + m_position; | 1845 const void* bufferStart = m_buffer + m_position; |
1826 m_position += byteLength; | 1846 m_position += byteLength; |
1827 return DOMArrayBuffer::create(bufferStart, byteLength); | 1847 return DOMArrayBuffer::create(bufferStart, byteLength); |
1828 } | 1848 } |
1829 | 1849 |
| 1850 bool SerializedScriptValueReader::readWasmCompiledModule(v8::Local<v8::Value>* v
alue) |
| 1851 { |
| 1852 uint32_t size = 0; |
| 1853 if (!doReadUint32(&size)) |
| 1854 return false; |
| 1855 if (m_position + size > m_length) |
| 1856 return false; |
| 1857 const uint8_t* buf = m_buffer + m_position; |
| 1858 // TODO(mtrofin): simplify deserializer API. const uint8_t* + size_t should |
| 1859 // be sufficient. |
| 1860 v8::WasmCompiledModule::SerializedModule data = { |
| 1861 std::unique_ptr<const uint8_t[]>(buf), |
| 1862 static_cast<size_t>(size) |
| 1863 }; |
| 1864 v8::MaybeLocal<v8::WasmCompiledModule> retval = v8::WasmCompiledModule::Dese
rialize(isolate(), data); |
| 1865 data.first.release(); |
| 1866 m_position += size; |
| 1867 |
| 1868 // TODO(mtrofin): right now, we'll return undefined if the deserialization |
| 1869 // fails, which is what may happen when v8's version changes. Update when |
| 1870 // spec settles. crbug.com/639090 |
| 1871 return retval.ToLocal(value); |
| 1872 } |
| 1873 |
1830 bool SerializedScriptValueReader::readArrayBuffer(v8::Local<v8::Value>* value) | 1874 bool SerializedScriptValueReader::readArrayBuffer(v8::Local<v8::Value>* value) |
1831 { | 1875 { |
1832 DOMArrayBuffer* arrayBuffer = doReadArrayBuffer(); | 1876 DOMArrayBuffer* arrayBuffer = doReadArrayBuffer(); |
1833 if (!arrayBuffer) | 1877 if (!arrayBuffer) |
1834 return false; | 1878 return false; |
1835 *value = toV8(arrayBuffer, m_scriptState->context()->Global(), isolate()); | 1879 *value = toV8(arrayBuffer, m_scriptState->context()->Global(), isolate()); |
1836 return !value->IsEmpty(); | 1880 return !value->IsEmpty(); |
1837 } | 1881 } |
1838 | 1882 |
1839 bool SerializedScriptValueReader::readArrayBufferView(v8::Local<v8::Value>* valu
e, ScriptValueDeserializer& deserializer) | 1883 bool SerializedScriptValueReader::readArrayBufferView(v8::Local<v8::Value>* valu
e, ScriptValueDeserializer& deserializer) |
(...skipping 607 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2447 return false; | 2491 return false; |
2448 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe
renceStack.size() - 1]; | 2492 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe
renceStack.size() - 1]; |
2449 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() -
1); | 2493 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() -
1); |
2450 if (objectReference >= m_objectPool.size()) | 2494 if (objectReference >= m_objectPool.size()) |
2451 return false; | 2495 return false; |
2452 *object = m_objectPool[objectReference]; | 2496 *object = m_objectPool[objectReference]; |
2453 return true; | 2497 return true; |
2454 } | 2498 } |
2455 | 2499 |
2456 } // namespace blink | 2500 } // namespace blink |
OLD | NEW |