| 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 1137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1148 | 1148 |
| 1149 ScriptValueSerializer::StateBase* ScriptValueSerializer::writeAndGreyArrayBuffer
View(v8::Local<v8::Object> object, StateBase* next) | 1149 ScriptValueSerializer::StateBase* ScriptValueSerializer::writeAndGreyArrayBuffer
View(v8::Local<v8::Object> object, StateBase* next) |
| 1150 { | 1150 { |
| 1151 ASSERT(!object.IsEmpty()); | 1151 ASSERT(!object.IsEmpty()); |
| 1152 DOMArrayBufferView* arrayBufferView = V8ArrayBufferView::toImpl(object); | 1152 DOMArrayBufferView* arrayBufferView = V8ArrayBufferView::toImpl(object); |
| 1153 if (!arrayBufferView) | 1153 if (!arrayBufferView) |
| 1154 return nullptr; | 1154 return nullptr; |
| 1155 if (!arrayBufferView->bufferBase()) | 1155 if (!arrayBufferView->bufferBase()) |
| 1156 return handleError(Status::DataCloneError, "An ArrayBuffer could not be
cloned.", next); | 1156 return handleError(Status::DataCloneError, "An ArrayBuffer could not be
cloned.", next); |
| 1157 v8::Local<v8::Value> underlyingBuffer = toV8(arrayBufferView->bufferBase(),
m_scriptState->context()->Global(), isolate()); | 1157 v8::Local<v8::Value> underlyingBuffer = toV8(arrayBufferView->bufferBase(),
m_scriptState->context()->Global(), isolate()); |
| 1158 if (underlyingBuffer.IsEmpty()) | |
| 1159 return handleError(Status::DataCloneError, "An ArrayBuffer could not be
cloned.", next); | |
| 1160 StateBase* stateOut = doSerializeArrayBuffer(underlyingBuffer, next); | 1158 StateBase* stateOut = doSerializeArrayBuffer(underlyingBuffer, next); |
| 1161 if (stateOut) | 1159 if (stateOut) |
| 1162 return stateOut; | 1160 return stateOut; |
| 1163 m_writer.writeArrayBufferView(*arrayBufferView); | 1161 m_writer.writeArrayBufferView(*arrayBufferView); |
| 1164 // This should be safe: we serialize something that we know to be a wrapper
(see | 1162 // This should be safe: we serialize something that we know to be a wrapper
(see |
| 1165 // the toV8 call above), so the call to doSerializeArrayBuffer should neithe
r | 1163 // the toV8 call above), so the call to doSerializeArrayBuffer should neithe
r |
| 1166 // cause the system stack to overflow nor should it have potential to reach | 1164 // cause the system stack to overflow nor should it have potential to reach |
| 1167 // this ArrayBufferView again. | 1165 // this ArrayBufferView again. |
| 1168 // | 1166 // |
| 1169 // We do need to grey the underlying buffer before we grey its view, however
; | 1167 // We do need to grey the underlying buffer before we grey its view, however
; |
| (...skipping 598 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1768 return false; | 1766 return false; |
| 1769 ImageData* imageData = ImageData::create(IntSize(width, height)); | 1767 ImageData* imageData = ImageData::create(IntSize(width, height)); |
| 1770 DOMUint8ClampedArray* pixelArray = imageData->data(); | 1768 DOMUint8ClampedArray* pixelArray = imageData->data(); |
| 1771 ASSERT(pixelArray); | 1769 ASSERT(pixelArray); |
| 1772 ASSERT(pixelArray->length() >= pixelDataLength); | 1770 ASSERT(pixelArray->length() >= pixelDataLength); |
| 1773 memcpy(pixelArray->data(), m_buffer + m_position, pixelDataLength); | 1771 memcpy(pixelArray->data(), m_buffer + m_position, pixelDataLength); |
| 1774 m_position += pixelDataLength; | 1772 m_position += pixelDataLength; |
| 1775 if (!imageData) | 1773 if (!imageData) |
| 1776 return false; | 1774 return false; |
| 1777 *value = toV8(imageData, m_scriptState->context()->Global(), isolate()); | 1775 *value = toV8(imageData, m_scriptState->context()->Global(), isolate()); |
| 1778 return !value->IsEmpty(); | 1776 return true; |
| 1779 } | 1777 } |
| 1780 | 1778 |
| 1781 bool SerializedScriptValueReader::readImageBitmap(v8::Local<v8::Value>* value) | 1779 bool SerializedScriptValueReader::readImageBitmap(v8::Local<v8::Value>* value) |
| 1782 { | 1780 { |
| 1783 uint32_t isOriginClean; | 1781 uint32_t isOriginClean; |
| 1784 if (!doReadUint32(&isOriginClean)) | 1782 if (!doReadUint32(&isOriginClean)) |
| 1785 return false; | 1783 return false; |
| 1786 uint32_t isPremultiplied; | 1784 uint32_t isPremultiplied; |
| 1787 if (!doReadUint32(&isPremultiplied)) | 1785 if (!doReadUint32(&isPremultiplied)) |
| 1788 return false; | 1786 return false; |
| 1789 uint32_t width; | 1787 uint32_t width; |
| 1790 uint32_t height; | 1788 uint32_t height; |
| 1791 uint32_t pixelDataLength; | 1789 uint32_t pixelDataLength; |
| 1792 if (!doReadImageDataProperties(&width, &height, &pixelDataLength)) | 1790 if (!doReadImageDataProperties(&width, &height, &pixelDataLength)) |
| 1793 return false; | 1791 return false; |
| 1794 std::unique_ptr<uint8_t[]> pixelData = wrapArrayUnique(new uint8_t[pixelData
Length]); | 1792 std::unique_ptr<uint8_t[]> pixelData = wrapArrayUnique(new uint8_t[pixelData
Length]); |
| 1795 memcpy(pixelData.get(), m_buffer + m_position, pixelDataLength); | 1793 memcpy(pixelData.get(), m_buffer + m_position, pixelDataLength); |
| 1796 m_position += pixelDataLength; | 1794 m_position += pixelDataLength; |
| 1797 ImageBitmap* imageBitmap = ImageBitmap::create(std::move(pixelData), width,
height, isPremultiplied, isOriginClean); | 1795 ImageBitmap* imageBitmap = ImageBitmap::create(std::move(pixelData), width,
height, isPremultiplied, isOriginClean); |
| 1798 if (!imageBitmap) | 1796 if (!imageBitmap) |
| 1799 return false; | 1797 return false; |
| 1800 *value = toV8(imageBitmap, m_scriptState->context()->Global(), isolate()); | 1798 *value = toV8(imageBitmap, m_scriptState->context()->Global(), isolate()); |
| 1801 return !value->IsEmpty(); | 1799 return true; |
| 1802 } | 1800 } |
| 1803 | 1801 |
| 1804 bool SerializedScriptValueReader::readCompositorProxy(v8::Local<v8::Value>* valu
e) | 1802 bool SerializedScriptValueReader::readCompositorProxy(v8::Local<v8::Value>* valu
e) |
| 1805 { | 1803 { |
| 1806 uint32_t attributes; | 1804 uint32_t attributes; |
| 1807 uint64_t element; | 1805 uint64_t element; |
| 1808 if (!doReadUint64(&element)) | 1806 if (!doReadUint64(&element)) |
| 1809 return false; | 1807 return false; |
| 1810 if (!doReadUint32(&attributes)) | 1808 if (!doReadUint32(&attributes)) |
| 1811 return false; | 1809 return false; |
| 1812 | 1810 |
| 1813 CompositorProxy* compositorProxy = CompositorProxy::create(m_scriptState->ge
tExecutionContext(), element, attributes); | 1811 CompositorProxy* compositorProxy = CompositorProxy::create(m_scriptState->ge
tExecutionContext(), element, attributes); |
| 1814 *value = toV8(compositorProxy, m_scriptState->context()->Global(), isolate()
); | 1812 *value = toV8(compositorProxy, m_scriptState->context()->Global(), isolate()
); |
| 1815 return !value->IsEmpty(); | 1813 return true; |
| 1816 } | 1814 } |
| 1817 | 1815 |
| 1818 DOMArrayBuffer* SerializedScriptValueReader::doReadArrayBuffer() | 1816 DOMArrayBuffer* SerializedScriptValueReader::doReadArrayBuffer() |
| 1819 { | 1817 { |
| 1820 uint32_t byteLength; | 1818 uint32_t byteLength; |
| 1821 if (!doReadUint32(&byteLength)) | 1819 if (!doReadUint32(&byteLength)) |
| 1822 return nullptr; | 1820 return nullptr; |
| 1823 if (m_position + byteLength > m_length) | 1821 if (m_position + byteLength > m_length) |
| 1824 return nullptr; | 1822 return nullptr; |
| 1825 const void* bufferStart = m_buffer + m_position; | 1823 const void* bufferStart = m_buffer + m_position; |
| 1826 m_position += byteLength; | 1824 m_position += byteLength; |
| 1827 return DOMArrayBuffer::create(bufferStart, byteLength); | 1825 return DOMArrayBuffer::create(bufferStart, byteLength); |
| 1828 } | 1826 } |
| 1829 | 1827 |
| 1830 bool SerializedScriptValueReader::readArrayBuffer(v8::Local<v8::Value>* value) | 1828 bool SerializedScriptValueReader::readArrayBuffer(v8::Local<v8::Value>* value) |
| 1831 { | 1829 { |
| 1832 DOMArrayBuffer* arrayBuffer = doReadArrayBuffer(); | 1830 DOMArrayBuffer* arrayBuffer = doReadArrayBuffer(); |
| 1833 if (!arrayBuffer) | 1831 if (!arrayBuffer) |
| 1834 return false; | 1832 return false; |
| 1835 *value = toV8(arrayBuffer, m_scriptState->context()->Global(), isolate()); | 1833 *value = toV8(arrayBuffer, m_scriptState->context()->Global(), isolate()); |
| 1836 return !value->IsEmpty(); | 1834 return true; |
| 1837 } | 1835 } |
| 1838 | 1836 |
| 1839 bool SerializedScriptValueReader::readArrayBufferView(v8::Local<v8::Value>* valu
e, ScriptValueDeserializer& deserializer) | 1837 bool SerializedScriptValueReader::readArrayBufferView(v8::Local<v8::Value>* valu
e, ScriptValueDeserializer& deserializer) |
| 1840 { | 1838 { |
| 1841 ArrayBufferViewSubTag subTag; | 1839 ArrayBufferViewSubTag subTag; |
| 1842 uint32_t byteOffset; | 1840 uint32_t byteOffset; |
| 1843 uint32_t byteLength; | 1841 uint32_t byteLength; |
| 1844 DOMArrayBufferBase* arrayBuffer = nullptr; | 1842 DOMArrayBufferBase* arrayBuffer = nullptr; |
| 1845 v8::Local<v8::Value> arrayBufferV8Value; | 1843 v8::Local<v8::Value> arrayBufferV8Value; |
| 1846 if (!readArrayBufferViewSubTag(&subTag)) | 1844 if (!readArrayBufferViewSubTag(&subTag)) |
| (...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1934 case FloatArrayTag: | 1932 case FloatArrayTag: |
| 1935 *value = toV8(DOMFloat32Array::create(arrayBuffer, byteOffset, numElemen
ts), creationContext, isolate()); | 1933 *value = toV8(DOMFloat32Array::create(arrayBuffer, byteOffset, numElemen
ts), creationContext, isolate()); |
| 1936 break; | 1934 break; |
| 1937 case DoubleArrayTag: | 1935 case DoubleArrayTag: |
| 1938 *value = toV8(DOMFloat64Array::create(arrayBuffer, byteOffset, numElemen
ts), creationContext, isolate()); | 1936 *value = toV8(DOMFloat64Array::create(arrayBuffer, byteOffset, numElemen
ts), creationContext, isolate()); |
| 1939 break; | 1937 break; |
| 1940 case DataViewTag: | 1938 case DataViewTag: |
| 1941 *value = toV8(DOMDataView::create(arrayBuffer, byteOffset, byteLength),
creationContext, isolate()); | 1939 *value = toV8(DOMDataView::create(arrayBuffer, byteOffset, byteLength),
creationContext, isolate()); |
| 1942 break; | 1940 break; |
| 1943 } | 1941 } |
| 1944 return !value->IsEmpty(); | 1942 return true; |
| 1945 } | 1943 } |
| 1946 | 1944 |
| 1947 bool SerializedScriptValueReader::readRegExp(v8::Local<v8::Value>* value) | 1945 bool SerializedScriptValueReader::readRegExp(v8::Local<v8::Value>* value) |
| 1948 { | 1946 { |
| 1949 v8::Local<v8::Value> pattern; | 1947 v8::Local<v8::Value> pattern; |
| 1950 if (!readString(&pattern)) | 1948 if (!readString(&pattern)) |
| 1951 return false; | 1949 return false; |
| 1952 uint32_t flags; | 1950 uint32_t flags; |
| 1953 if (!doReadUint32(&flags)) | 1951 if (!doReadUint32(&flags)) |
| 1954 return false; | 1952 return false; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1979 ASSERT(!m_blobInfo); | 1977 ASSERT(!m_blobInfo); |
| 1980 if (!readWebCoreString(&uuid)) | 1978 if (!readWebCoreString(&uuid)) |
| 1981 return false; | 1979 return false; |
| 1982 if (!readWebCoreString(&type)) | 1980 if (!readWebCoreString(&type)) |
| 1983 return false; | 1981 return false; |
| 1984 if (!doReadUint64(&size)) | 1982 if (!doReadUint64(&size)) |
| 1985 return false; | 1983 return false; |
| 1986 blob = Blob::create(getOrCreateBlobDataHandle(uuid, type, size)); | 1984 blob = Blob::create(getOrCreateBlobDataHandle(uuid, type, size)); |
| 1987 } | 1985 } |
| 1988 *value = toV8(blob, m_scriptState->context()->Global(), isolate()); | 1986 *value = toV8(blob, m_scriptState->context()->Global(), isolate()); |
| 1989 return !value->IsEmpty(); | 1987 return true; |
| 1990 } | 1988 } |
| 1991 | 1989 |
| 1992 bool SerializedScriptValueReader::readFile(v8::Local<v8::Value>* value, bool isI
ndexed) | 1990 bool SerializedScriptValueReader::readFile(v8::Local<v8::Value>* value, bool isI
ndexed) |
| 1993 { | 1991 { |
| 1994 File* file = nullptr; | 1992 File* file = nullptr; |
| 1995 if (isIndexed) { | 1993 if (isIndexed) { |
| 1996 if (m_version < 6) | 1994 if (m_version < 6) |
| 1997 return false; | 1995 return false; |
| 1998 file = readFileIndexHelper(); | 1996 file = readFileIndexHelper(); |
| 1999 } else { | 1997 } else { |
| 2000 file = readFileHelper(); | 1998 file = readFileHelper(); |
| 2001 } | 1999 } |
| 2002 if (!file) | 2000 if (!file) |
| 2003 return false; | 2001 return false; |
| 2004 *value = toV8(file, m_scriptState->context()->Global(), isolate()); | 2002 *value = toV8(file, m_scriptState->context()->Global(), isolate()); |
| 2005 return !value->IsEmpty(); | 2003 return true; |
| 2006 } | 2004 } |
| 2007 | 2005 |
| 2008 bool SerializedScriptValueReader::readFileList(v8::Local<v8::Value>* value, bool
isIndexed) | 2006 bool SerializedScriptValueReader::readFileList(v8::Local<v8::Value>* value, bool
isIndexed) |
| 2009 { | 2007 { |
| 2010 if (m_version < 3) | 2008 if (m_version < 3) |
| 2011 return false; | 2009 return false; |
| 2012 uint32_t length; | 2010 uint32_t length; |
| 2013 if (!doReadUint32(&length)) | 2011 if (!doReadUint32(&length)) |
| 2014 return false; | 2012 return false; |
| 2015 FileList* fileList = FileList::create(); | 2013 FileList* fileList = FileList::create(); |
| 2016 for (unsigned i = 0; i < length; ++i) { | 2014 for (unsigned i = 0; i < length; ++i) { |
| 2017 File* file = nullptr; | 2015 File* file = nullptr; |
| 2018 if (isIndexed) { | 2016 if (isIndexed) { |
| 2019 if (m_version < 6) | 2017 if (m_version < 6) |
| 2020 return false; | 2018 return false; |
| 2021 file = readFileIndexHelper(); | 2019 file = readFileIndexHelper(); |
| 2022 } else { | 2020 } else { |
| 2023 file = readFileHelper(); | 2021 file = readFileHelper(); |
| 2024 } | 2022 } |
| 2025 if (!file) | 2023 if (!file) |
| 2026 return false; | 2024 return false; |
| 2027 fileList->append(file); | 2025 fileList->append(file); |
| 2028 } | 2026 } |
| 2029 *value = toV8(fileList, m_scriptState->context()->Global(), isolate()); | 2027 *value = toV8(fileList, m_scriptState->context()->Global(), isolate()); |
| 2030 return !value->IsEmpty(); | 2028 return true; |
| 2031 } | 2029 } |
| 2032 | 2030 |
| 2033 File* SerializedScriptValueReader::readFileHelper() | 2031 File* SerializedScriptValueReader::readFileHelper() |
| 2034 { | 2032 { |
| 2035 if (m_version < 3) | 2033 if (m_version < 3) |
| 2036 return nullptr; | 2034 return nullptr; |
| 2037 ASSERT(!m_blobInfo); | 2035 ASSERT(!m_blobInfo); |
| 2038 String path; | 2036 String path; |
| 2039 String name; | 2037 String name; |
| 2040 String relativePath; | 2038 String relativePath; |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2294 } | 2292 } |
| 2295 | 2293 |
| 2296 bool ScriptValueDeserializer::tryGetTransferredMessagePort(uint32_t index, v8::L
ocal<v8::Value>* object) | 2294 bool ScriptValueDeserializer::tryGetTransferredMessagePort(uint32_t index, v8::L
ocal<v8::Value>* object) |
| 2297 { | 2295 { |
| 2298 if (!m_transferredMessagePorts) | 2296 if (!m_transferredMessagePorts) |
| 2299 return false; | 2297 return false; |
| 2300 if (index >= m_transferredMessagePorts->size()) | 2298 if (index >= m_transferredMessagePorts->size()) |
| 2301 return false; | 2299 return false; |
| 2302 v8::Local<v8::Object> creationContext = m_reader.getScriptState()->context()
->Global(); | 2300 v8::Local<v8::Object> creationContext = m_reader.getScriptState()->context()
->Global(); |
| 2303 *object = toV8(m_transferredMessagePorts->at(index).get(), creationContext,
m_reader.getScriptState()->isolate()); | 2301 *object = toV8(m_transferredMessagePorts->at(index).get(), creationContext,
m_reader.getScriptState()->isolate()); |
| 2304 return !object->IsEmpty(); | 2302 return true; |
| 2305 } | 2303 } |
| 2306 | 2304 |
| 2307 bool ScriptValueDeserializer::tryGetTransferredArrayBuffer(uint32_t index, v8::L
ocal<v8::Value>* object) | 2305 bool ScriptValueDeserializer::tryGetTransferredArrayBuffer(uint32_t index, v8::L
ocal<v8::Value>* object) |
| 2308 { | 2306 { |
| 2309 if (!m_arrayBufferContents) | 2307 if (!m_arrayBufferContents) |
| 2310 return false; | 2308 return false; |
| 2311 if (index >= m_arrayBuffers.size()) | 2309 if (index >= m_arrayBuffers.size()) |
| 2312 return false; | 2310 return false; |
| 2313 v8::Local<v8::Value> result = m_arrayBuffers.at(index); | 2311 v8::Local<v8::Value> result = m_arrayBuffers.at(index); |
| 2314 if (result.IsEmpty()) { | 2312 if (result.IsEmpty()) { |
| 2315 DOMArrayBuffer* buffer = DOMArrayBuffer::create(m_arrayBufferContents->a
t(index)); | 2313 DOMArrayBuffer* buffer = DOMArrayBuffer::create(m_arrayBufferContents->a
t(index)); |
| 2316 v8::Isolate* isolate = m_reader.getScriptState()->isolate(); | 2314 v8::Isolate* isolate = m_reader.getScriptState()->isolate(); |
| 2317 v8::Local<v8::Object> creationContext = m_reader.getScriptState()->conte
xt()->Global(); | 2315 v8::Local<v8::Object> creationContext = m_reader.getScriptState()->conte
xt()->Global(); |
| 2318 result = toV8(buffer, creationContext, isolate); | 2316 result = toV8(buffer, creationContext, isolate); |
| 2319 if (result.IsEmpty()) | |
| 2320 return false; | |
| 2321 m_arrayBuffers[index] = result; | 2317 m_arrayBuffers[index] = result; |
| 2322 } | 2318 } |
| 2323 *object = result; | 2319 *object = result; |
| 2324 return true; | 2320 return true; |
| 2325 } | 2321 } |
| 2326 | 2322 |
| 2327 bool ScriptValueDeserializer::tryGetTransferredImageBitmap(uint32_t index, v8::L
ocal<v8::Value>* object) | 2323 bool ScriptValueDeserializer::tryGetTransferredImageBitmap(uint32_t index, v8::L
ocal<v8::Value>* object) |
| 2328 { | 2324 { |
| 2329 if (!m_imageBitmapContents) | 2325 if (!m_imageBitmapContents) |
| 2330 return false; | 2326 return false; |
| 2331 if (index >= m_imageBitmaps.size()) | 2327 if (index >= m_imageBitmaps.size()) |
| 2332 return false; | 2328 return false; |
| 2333 v8::Local<v8::Value> result = m_imageBitmaps.at(index); | 2329 v8::Local<v8::Value> result = m_imageBitmaps.at(index); |
| 2334 if (result.IsEmpty()) { | 2330 if (result.IsEmpty()) { |
| 2335 ImageBitmap* bitmap = ImageBitmap::create(m_imageBitmapContents->at(inde
x)); | 2331 ImageBitmap* bitmap = ImageBitmap::create(m_imageBitmapContents->at(inde
x)); |
| 2336 v8::Isolate* isolate = m_reader.getScriptState()->isolate(); | 2332 v8::Isolate* isolate = m_reader.getScriptState()->isolate(); |
| 2337 v8::Local<v8::Object> creationContext = m_reader.getScriptState()->conte
xt()->Global(); | 2333 v8::Local<v8::Object> creationContext = m_reader.getScriptState()->conte
xt()->Global(); |
| 2338 result = toV8(bitmap, creationContext, isolate); | 2334 result = toV8(bitmap, creationContext, isolate); |
| 2339 if (result.IsEmpty()) | |
| 2340 return false; | |
| 2341 m_imageBitmaps[index] = result; | 2335 m_imageBitmaps[index] = result; |
| 2342 } | 2336 } |
| 2343 *object = result; | 2337 *object = result; |
| 2344 return true; | 2338 return true; |
| 2345 } | 2339 } |
| 2346 | 2340 |
| 2347 bool ScriptValueDeserializer::tryGetTransferredSharedArrayBuffer(uint32_t index,
v8::Local<v8::Value>* object) | 2341 bool ScriptValueDeserializer::tryGetTransferredSharedArrayBuffer(uint32_t index,
v8::Local<v8::Value>* object) |
| 2348 { | 2342 { |
| 2349 ASSERT(RuntimeEnabledFeatures::sharedArrayBufferEnabled()); | 2343 ASSERT(RuntimeEnabledFeatures::sharedArrayBufferEnabled()); |
| 2350 if (!m_arrayBufferContents) | 2344 if (!m_arrayBufferContents) |
| 2351 return false; | 2345 return false; |
| 2352 if (index >= m_arrayBuffers.size()) | 2346 if (index >= m_arrayBuffers.size()) |
| 2353 return false; | 2347 return false; |
| 2354 v8::Local<v8::Value> result = m_arrayBuffers.at(index); | 2348 v8::Local<v8::Value> result = m_arrayBuffers.at(index); |
| 2355 if (result.IsEmpty()) { | 2349 if (result.IsEmpty()) { |
| 2356 DOMSharedArrayBuffer* buffer = DOMSharedArrayBuffer::create(m_arrayBuffe
rContents->at(index)); | 2350 DOMSharedArrayBuffer* buffer = DOMSharedArrayBuffer::create(m_arrayBuffe
rContents->at(index)); |
| 2357 v8::Isolate* isolate = m_reader.getScriptState()->isolate(); | 2351 v8::Isolate* isolate = m_reader.getScriptState()->isolate(); |
| 2358 v8::Local<v8::Object> creationContext = m_reader.getScriptState()->conte
xt()->Global(); | 2352 v8::Local<v8::Object> creationContext = m_reader.getScriptState()->conte
xt()->Global(); |
| 2359 result = toV8(buffer, creationContext, isolate); | 2353 result = toV8(buffer, creationContext, isolate); |
| 2360 if (result.IsEmpty()) | |
| 2361 return false; | |
| 2362 m_arrayBuffers[index] = result; | 2354 m_arrayBuffers[index] = result; |
| 2363 } | 2355 } |
| 2364 *object = result; | 2356 *object = result; |
| 2365 return true; | 2357 return true; |
| 2366 } | 2358 } |
| 2367 | 2359 |
| 2368 bool ScriptValueDeserializer::tryGetTransferredOffscreenCanvas(uint32_t index, u
int32_t width, uint32_t height, uint32_t canvasId, uint32_t clientId, uint32_t l
ocalId, uint64_t nonce, v8::Local<v8::Value>* object) | 2360 bool ScriptValueDeserializer::tryGetTransferredOffscreenCanvas(uint32_t index, u
int32_t width, uint32_t height, uint32_t canvasId, uint32_t clientId, uint32_t l
ocalId, uint64_t nonce, v8::Local<v8::Value>* object) |
| 2369 { | 2361 { |
| 2370 OffscreenCanvas* offscreenCanvas = OffscreenCanvas::create(width, height); | 2362 OffscreenCanvas* offscreenCanvas = OffscreenCanvas::create(width, height); |
| 2371 offscreenCanvas->setAssociatedCanvasId(canvasId); | 2363 offscreenCanvas->setAssociatedCanvasId(canvasId); |
| 2372 offscreenCanvas->setSurfaceId(clientId, localId, nonce); | 2364 offscreenCanvas->setSurfaceId(clientId, localId, nonce); |
| 2373 *object = toV8(offscreenCanvas, m_reader.getScriptState()); | 2365 *object = toV8(offscreenCanvas, m_reader.getScriptState()); |
| 2374 if ((*object).IsEmpty()) | |
| 2375 return false; | |
| 2376 return true; | 2366 return true; |
| 2377 } | 2367 } |
| 2378 | 2368 |
| 2379 bool ScriptValueDeserializer::tryGetObjectFromObjectReference(uint32_t reference
, v8::Local<v8::Value>* object) | 2369 bool ScriptValueDeserializer::tryGetObjectFromObjectReference(uint32_t reference
, v8::Local<v8::Value>* object) |
| 2380 { | 2370 { |
| 2381 if (reference >= m_objectPool.size()) | 2371 if (reference >= m_objectPool.size()) |
| 2382 return false; | 2372 return false; |
| 2383 *object = m_objectPool[reference]; | 2373 *object = m_objectPool[reference]; |
| 2384 return object; | 2374 return object; |
| 2385 } | 2375 } |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2447 return false; | 2437 return false; |
| 2448 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe
renceStack.size() - 1]; | 2438 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe
renceStack.size() - 1]; |
| 2449 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() -
1); | 2439 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() -
1); |
| 2450 if (objectReference >= m_objectPool.size()) | 2440 if (objectReference >= m_objectPool.size()) |
| 2451 return false; | 2441 return false; |
| 2452 *object = m_objectPool[objectReference]; | 2442 *object = m_objectPool[objectReference]; |
| 2453 return true; | 2443 return true; |
| 2454 } | 2444 } |
| 2455 | 2445 |
| 2456 } // namespace blink | 2446 } // namespace blink |
| OLD | NEW |