| 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 691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 702 void ScriptValueSerializer::copyTransferables( | 702 void ScriptValueSerializer::copyTransferables( |
| 703 const Transferables& transferables) { | 703 const Transferables& transferables) { |
| 704 v8::Local<v8::Object> creationContext = m_scriptState->context()->Global(); | 704 v8::Local<v8::Object> creationContext = m_scriptState->context()->Global(); |
| 705 | 705 |
| 706 // Also kept in separate ObjectPools, iterate and copy the contents | 706 // Also kept in separate ObjectPools, iterate and copy the contents |
| 707 // of each kind of transferable vector. | 707 // of each kind of transferable vector. |
| 708 | 708 |
| 709 const auto& messagePorts = transferables.messagePorts; | 709 const auto& messagePorts = transferables.messagePorts; |
| 710 for (size_t i = 0; i < messagePorts.size(); ++i) { | 710 for (size_t i = 0; i < messagePorts.size(); ++i) { |
| 711 v8::Local<v8::Object> v8MessagePort = | 711 v8::Local<v8::Object> v8MessagePort = |
| 712 toV8(messagePorts[i].get(), creationContext, isolate()) | 712 ToV8(messagePorts[i].get(), creationContext, isolate()) |
| 713 .As<v8::Object>(); | 713 .As<v8::Object>(); |
| 714 m_transferredMessagePorts.set(v8MessagePort, i); | 714 m_transferredMessagePorts.set(v8MessagePort, i); |
| 715 } | 715 } |
| 716 | 716 |
| 717 const auto& arrayBuffers = transferables.arrayBuffers; | 717 const auto& arrayBuffers = transferables.arrayBuffers; |
| 718 for (size_t i = 0; i < arrayBuffers.size(); ++i) { | 718 for (size_t i = 0; i < arrayBuffers.size(); ++i) { |
| 719 v8::Local<v8::Object> v8ArrayBuffer = | 719 v8::Local<v8::Object> v8ArrayBuffer = |
| 720 toV8(arrayBuffers[i].get(), creationContext, isolate()) | 720 ToV8(arrayBuffers[i].get(), creationContext, isolate()) |
| 721 .As<v8::Object>(); | 721 .As<v8::Object>(); |
| 722 // Coalesce multiple occurences of the same buffer to the first index. | 722 // Coalesce multiple occurences of the same buffer to the first index. |
| 723 if (!m_transferredArrayBuffers.contains(v8ArrayBuffer)) | 723 if (!m_transferredArrayBuffers.contains(v8ArrayBuffer)) |
| 724 m_transferredArrayBuffers.set(v8ArrayBuffer, i); | 724 m_transferredArrayBuffers.set(v8ArrayBuffer, i); |
| 725 } | 725 } |
| 726 | 726 |
| 727 const auto& imageBitmaps = transferables.imageBitmaps; | 727 const auto& imageBitmaps = transferables.imageBitmaps; |
| 728 for (size_t i = 0; i < imageBitmaps.size(); ++i) { | 728 for (size_t i = 0; i < imageBitmaps.size(); ++i) { |
| 729 v8::Local<v8::Object> v8ImageBitmap = | 729 v8::Local<v8::Object> v8ImageBitmap = |
| 730 toV8(imageBitmaps[i].get(), creationContext, isolate()) | 730 ToV8(imageBitmaps[i].get(), creationContext, isolate()) |
| 731 .As<v8::Object>(); | 731 .As<v8::Object>(); |
| 732 if (!m_transferredImageBitmaps.contains(v8ImageBitmap)) | 732 if (!m_transferredImageBitmaps.contains(v8ImageBitmap)) |
| 733 m_transferredImageBitmaps.set(v8ImageBitmap, i); | 733 m_transferredImageBitmaps.set(v8ImageBitmap, i); |
| 734 } | 734 } |
| 735 | 735 |
| 736 const auto& offscreenCanvases = transferables.offscreenCanvases; | 736 const auto& offscreenCanvases = transferables.offscreenCanvases; |
| 737 for (size_t i = 0; i < offscreenCanvases.size(); ++i) { | 737 for (size_t i = 0; i < offscreenCanvases.size(); ++i) { |
| 738 v8::Local<v8::Object> v8OffscreenCanvas = | 738 v8::Local<v8::Object> v8OffscreenCanvas = |
| 739 toV8(offscreenCanvases[i].get(), creationContext, isolate()) | 739 ToV8(offscreenCanvases[i].get(), creationContext, isolate()) |
| 740 .As<v8::Object>(); | 740 .As<v8::Object>(); |
| 741 if (!m_transferredOffscreenCanvas.contains(v8OffscreenCanvas)) | 741 if (!m_transferredOffscreenCanvas.contains(v8OffscreenCanvas)) |
| 742 m_transferredOffscreenCanvas.set(v8OffscreenCanvas, i); | 742 m_transferredOffscreenCanvas.set(v8OffscreenCanvas, i); |
| 743 } | 743 } |
| 744 } | 744 } |
| 745 | 745 |
| 746 PassRefPtr<SerializedScriptValue> ScriptValueSerializer::serialize( | 746 PassRefPtr<SerializedScriptValue> ScriptValueSerializer::serialize( |
| 747 v8::Local<v8::Value> value, | 747 v8::Local<v8::Value> value, |
| 748 Transferables* transferables, | 748 Transferables* transferables, |
| 749 ExceptionState& exceptionState) { | 749 ExceptionState& exceptionState) { |
| (...skipping 450 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1200 ScriptValueSerializer::writeAndGreyArrayBufferView(v8::Local<v8::Object> object, | 1200 ScriptValueSerializer::writeAndGreyArrayBufferView(v8::Local<v8::Object> object, |
| 1201 StateBase* next) { | 1201 StateBase* next) { |
| 1202 ASSERT(!object.IsEmpty()); | 1202 ASSERT(!object.IsEmpty()); |
| 1203 DOMArrayBufferView* arrayBufferView = V8ArrayBufferView::toImpl(object); | 1203 DOMArrayBufferView* arrayBufferView = V8ArrayBufferView::toImpl(object); |
| 1204 if (!arrayBufferView) | 1204 if (!arrayBufferView) |
| 1205 return nullptr; | 1205 return nullptr; |
| 1206 if (!arrayBufferView->bufferBase()) | 1206 if (!arrayBufferView->bufferBase()) |
| 1207 return handleError(Status::DataCloneError, | 1207 return handleError(Status::DataCloneError, |
| 1208 "An ArrayBuffer could not be cloned.", next); | 1208 "An ArrayBuffer could not be cloned.", next); |
| 1209 v8::Local<v8::Value> underlyingBuffer = | 1209 v8::Local<v8::Value> underlyingBuffer = |
| 1210 toV8(arrayBufferView->bufferBase(), m_scriptState->context()->Global(), | 1210 ToV8(arrayBufferView->bufferBase(), m_scriptState->context()->Global(), |
| 1211 isolate()); | 1211 isolate()); |
| 1212 if (underlyingBuffer.IsEmpty()) | 1212 if (underlyingBuffer.IsEmpty()) |
| 1213 return handleError(Status::DataCloneError, | 1213 return handleError(Status::DataCloneError, |
| 1214 "An ArrayBuffer could not be cloned.", next); | 1214 "An ArrayBuffer could not be cloned.", next); |
| 1215 StateBase* stateOut = doSerializeArrayBuffer(underlyingBuffer, next); | 1215 StateBase* stateOut = doSerializeArrayBuffer(underlyingBuffer, next); |
| 1216 if (stateOut) | 1216 if (stateOut) |
| 1217 return stateOut; | 1217 return stateOut; |
| 1218 m_writer.writeArrayBufferView(*arrayBufferView); | 1218 m_writer.writeArrayBufferView(*arrayBufferView); |
| 1219 // This should be safe: we serialize something that we know to be a wrapper | 1219 // This should be safe: we serialize something that we know to be a wrapper |
| 1220 // (see the toV8 call above), so the call to doSerializeArrayBuffer should | 1220 // (see the toV8 call above), so the call to doSerializeArrayBuffer should |
| (...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1878 if (!doReadImageDataProperties(&width, &height, &pixelDataLength)) | 1878 if (!doReadImageDataProperties(&width, &height, &pixelDataLength)) |
| 1879 return false; | 1879 return false; |
| 1880 ImageData* imageData = ImageData::create(IntSize(width, height)); | 1880 ImageData* imageData = ImageData::create(IntSize(width, height)); |
| 1881 DOMUint8ClampedArray* pixelArray = imageData->data(); | 1881 DOMUint8ClampedArray* pixelArray = imageData->data(); |
| 1882 ASSERT(pixelArray); | 1882 ASSERT(pixelArray); |
| 1883 ASSERT(pixelArray->length() >= pixelDataLength); | 1883 ASSERT(pixelArray->length() >= pixelDataLength); |
| 1884 memcpy(pixelArray->data(), m_buffer + m_position, pixelDataLength); | 1884 memcpy(pixelArray->data(), m_buffer + m_position, pixelDataLength); |
| 1885 m_position += pixelDataLength; | 1885 m_position += pixelDataLength; |
| 1886 if (!imageData) | 1886 if (!imageData) |
| 1887 return false; | 1887 return false; |
| 1888 *value = toV8(imageData, m_scriptState->context()->Global(), isolate()); | 1888 *value = ToV8(imageData, m_scriptState->context()->Global(), isolate()); |
| 1889 return !value->IsEmpty(); | 1889 return !value->IsEmpty(); |
| 1890 } | 1890 } |
| 1891 | 1891 |
| 1892 bool SerializedScriptValueReader::readImageBitmap(v8::Local<v8::Value>* value) { | 1892 bool SerializedScriptValueReader::readImageBitmap(v8::Local<v8::Value>* value) { |
| 1893 uint32_t isOriginClean; | 1893 uint32_t isOriginClean; |
| 1894 if (!doReadUint32(&isOriginClean)) | 1894 if (!doReadUint32(&isOriginClean)) |
| 1895 return false; | 1895 return false; |
| 1896 uint32_t isPremultiplied; | 1896 uint32_t isPremultiplied; |
| 1897 if (!doReadUint32(&isPremultiplied)) | 1897 if (!doReadUint32(&isPremultiplied)) |
| 1898 return false; | 1898 return false; |
| 1899 uint32_t width; | 1899 uint32_t width; |
| 1900 uint32_t height; | 1900 uint32_t height; |
| 1901 uint32_t pixelDataLength; | 1901 uint32_t pixelDataLength; |
| 1902 if (!doReadImageDataProperties(&width, &height, &pixelDataLength)) | 1902 if (!doReadImageDataProperties(&width, &height, &pixelDataLength)) |
| 1903 return false; | 1903 return false; |
| 1904 const void* pixelData = m_buffer + m_position; | 1904 const void* pixelData = m_buffer + m_position; |
| 1905 m_position += pixelDataLength; | 1905 m_position += pixelDataLength; |
| 1906 ImageBitmap* imageBitmap = ImageBitmap::create( | 1906 ImageBitmap* imageBitmap = ImageBitmap::create( |
| 1907 pixelData, width, height, isPremultiplied, isOriginClean); | 1907 pixelData, width, height, isPremultiplied, isOriginClean); |
| 1908 if (!imageBitmap) | 1908 if (!imageBitmap) |
| 1909 return false; | 1909 return false; |
| 1910 *value = toV8(imageBitmap, m_scriptState->context()->Global(), isolate()); | 1910 *value = ToV8(imageBitmap, m_scriptState->context()->Global(), isolate()); |
| 1911 return !value->IsEmpty(); | 1911 return !value->IsEmpty(); |
| 1912 } | 1912 } |
| 1913 | 1913 |
| 1914 bool SerializedScriptValueReader::readCompositorProxy( | 1914 bool SerializedScriptValueReader::readCompositorProxy( |
| 1915 v8::Local<v8::Value>* value) { | 1915 v8::Local<v8::Value>* value) { |
| 1916 uint32_t attributes; | 1916 uint32_t attributes; |
| 1917 uint64_t element; | 1917 uint64_t element; |
| 1918 if (!doReadUint64(&element)) | 1918 if (!doReadUint64(&element)) |
| 1919 return false; | 1919 return false; |
| 1920 if (!doReadUint32(&attributes)) | 1920 if (!doReadUint32(&attributes)) |
| 1921 return false; | 1921 return false; |
| 1922 | 1922 |
| 1923 CompositorProxy* compositorProxy = CompositorProxy::create( | 1923 CompositorProxy* compositorProxy = CompositorProxy::create( |
| 1924 m_scriptState->getExecutionContext(), element, attributes); | 1924 m_scriptState->getExecutionContext(), element, attributes); |
| 1925 *value = toV8(compositorProxy, m_scriptState->context()->Global(), isolate()); | 1925 *value = ToV8(compositorProxy, m_scriptState->context()->Global(), isolate()); |
| 1926 return !value->IsEmpty(); | 1926 return !value->IsEmpty(); |
| 1927 } | 1927 } |
| 1928 | 1928 |
| 1929 DOMArrayBuffer* SerializedScriptValueReader::doReadArrayBuffer() { | 1929 DOMArrayBuffer* SerializedScriptValueReader::doReadArrayBuffer() { |
| 1930 uint32_t byteLength; | 1930 uint32_t byteLength; |
| 1931 if (!doReadUint32(&byteLength)) | 1931 if (!doReadUint32(&byteLength)) |
| 1932 return nullptr; | 1932 return nullptr; |
| 1933 if (m_position + byteLength > m_length) | 1933 if (m_position + byteLength > m_length) |
| 1934 return nullptr; | 1934 return nullptr; |
| 1935 const void* bufferStart = m_buffer + m_position; | 1935 const void* bufferStart = m_buffer + m_position; |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1974 v8::WasmCompiledModule::DeserializeOrCompile(isolate(), compiledBytes, | 1974 v8::WasmCompiledModule::DeserializeOrCompile(isolate(), compiledBytes, |
| 1975 wireBytes); | 1975 wireBytes); |
| 1976 | 1976 |
| 1977 return retval.ToLocal(value); | 1977 return retval.ToLocal(value); |
| 1978 } | 1978 } |
| 1979 | 1979 |
| 1980 bool SerializedScriptValueReader::readArrayBuffer(v8::Local<v8::Value>* value) { | 1980 bool SerializedScriptValueReader::readArrayBuffer(v8::Local<v8::Value>* value) { |
| 1981 DOMArrayBuffer* arrayBuffer = doReadArrayBuffer(); | 1981 DOMArrayBuffer* arrayBuffer = doReadArrayBuffer(); |
| 1982 if (!arrayBuffer) | 1982 if (!arrayBuffer) |
| 1983 return false; | 1983 return false; |
| 1984 *value = toV8(arrayBuffer, m_scriptState->context()->Global(), isolate()); | 1984 *value = ToV8(arrayBuffer, m_scriptState->context()->Global(), isolate()); |
| 1985 return !value->IsEmpty(); | 1985 return !value->IsEmpty(); |
| 1986 } | 1986 } |
| 1987 | 1987 |
| 1988 bool SerializedScriptValueReader::readArrayBufferView( | 1988 bool SerializedScriptValueReader::readArrayBufferView( |
| 1989 v8::Local<v8::Value>* value, | 1989 v8::Local<v8::Value>* value, |
| 1990 ScriptValueDeserializer& deserializer) { | 1990 ScriptValueDeserializer& deserializer) { |
| 1991 ArrayBufferViewSubTag subTag; | 1991 ArrayBufferViewSubTag subTag; |
| 1992 uint32_t byteOffset; | 1992 uint32_t byteOffset; |
| 1993 uint32_t byteLength; | 1993 uint32_t byteLength; |
| 1994 DOMArrayBufferBase* arrayBuffer = nullptr; | 1994 DOMArrayBufferBase* arrayBuffer = nullptr; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2055 const unsigned numElements = byteLength / elementByteSize; | 2055 const unsigned numElements = byteLength / elementByteSize; |
| 2056 const unsigned remainingElements = | 2056 const unsigned remainingElements = |
| 2057 (arrayBuffer->byteLength() - byteOffset) / elementByteSize; | 2057 (arrayBuffer->byteLength() - byteOffset) / elementByteSize; |
| 2058 if (byteOffset % elementByteSize || byteOffset > arrayBuffer->byteLength() || | 2058 if (byteOffset % elementByteSize || byteOffset > arrayBuffer->byteLength() || |
| 2059 numElements > remainingElements) | 2059 numElements > remainingElements) |
| 2060 return false; | 2060 return false; |
| 2061 | 2061 |
| 2062 v8::Local<v8::Object> creationContext = m_scriptState->context()->Global(); | 2062 v8::Local<v8::Object> creationContext = m_scriptState->context()->Global(); |
| 2063 switch (subTag) { | 2063 switch (subTag) { |
| 2064 case ByteArrayTag: | 2064 case ByteArrayTag: |
| 2065 *value = toV8(DOMInt8Array::create(arrayBuffer, byteOffset, numElements), | 2065 *value = ToV8(DOMInt8Array::create(arrayBuffer, byteOffset, numElements), |
| 2066 creationContext, isolate()); | 2066 creationContext, isolate()); |
| 2067 break; | 2067 break; |
| 2068 case UnsignedByteArrayTag: | 2068 case UnsignedByteArrayTag: |
| 2069 *value = toV8(DOMUint8Array::create(arrayBuffer, byteOffset, numElements), | 2069 *value = ToV8(DOMUint8Array::create(arrayBuffer, byteOffset, numElements), |
| 2070 creationContext, isolate()); | 2070 creationContext, isolate()); |
| 2071 break; | 2071 break; |
| 2072 case UnsignedByteClampedArrayTag: | 2072 case UnsignedByteClampedArrayTag: |
| 2073 *value = toV8( | 2073 *value = ToV8( |
| 2074 DOMUint8ClampedArray::create(arrayBuffer, byteOffset, numElements), | 2074 DOMUint8ClampedArray::create(arrayBuffer, byteOffset, numElements), |
| 2075 creationContext, isolate()); | 2075 creationContext, isolate()); |
| 2076 break; | 2076 break; |
| 2077 case ShortArrayTag: | 2077 case ShortArrayTag: |
| 2078 *value = toV8(DOMInt16Array::create(arrayBuffer, byteOffset, numElements), | 2078 *value = ToV8(DOMInt16Array::create(arrayBuffer, byteOffset, numElements), |
| 2079 creationContext, isolate()); | 2079 creationContext, isolate()); |
| 2080 break; | 2080 break; |
| 2081 case UnsignedShortArrayTag: | 2081 case UnsignedShortArrayTag: |
| 2082 *value = | 2082 *value = |
| 2083 toV8(DOMUint16Array::create(arrayBuffer, byteOffset, numElements), | 2083 ToV8(DOMUint16Array::create(arrayBuffer, byteOffset, numElements), |
| 2084 creationContext, isolate()); | 2084 creationContext, isolate()); |
| 2085 break; | 2085 break; |
| 2086 case IntArrayTag: | 2086 case IntArrayTag: |
| 2087 *value = toV8(DOMInt32Array::create(arrayBuffer, byteOffset, numElements), | 2087 *value = ToV8(DOMInt32Array::create(arrayBuffer, byteOffset, numElements), |
| 2088 creationContext, isolate()); | 2088 creationContext, isolate()); |
| 2089 break; | 2089 break; |
| 2090 case UnsignedIntArrayTag: | 2090 case UnsignedIntArrayTag: |
| 2091 *value = | 2091 *value = |
| 2092 toV8(DOMUint32Array::create(arrayBuffer, byteOffset, numElements), | 2092 ToV8(DOMUint32Array::create(arrayBuffer, byteOffset, numElements), |
| 2093 creationContext, isolate()); | 2093 creationContext, isolate()); |
| 2094 break; | 2094 break; |
| 2095 case FloatArrayTag: | 2095 case FloatArrayTag: |
| 2096 *value = | 2096 *value = |
| 2097 toV8(DOMFloat32Array::create(arrayBuffer, byteOffset, numElements), | 2097 ToV8(DOMFloat32Array::create(arrayBuffer, byteOffset, numElements), |
| 2098 creationContext, isolate()); | 2098 creationContext, isolate()); |
| 2099 break; | 2099 break; |
| 2100 case DoubleArrayTag: | 2100 case DoubleArrayTag: |
| 2101 *value = | 2101 *value = |
| 2102 toV8(DOMFloat64Array::create(arrayBuffer, byteOffset, numElements), | 2102 ToV8(DOMFloat64Array::create(arrayBuffer, byteOffset, numElements), |
| 2103 creationContext, isolate()); | 2103 creationContext, isolate()); |
| 2104 break; | 2104 break; |
| 2105 case DataViewTag: | 2105 case DataViewTag: |
| 2106 *value = toV8(DOMDataView::create(arrayBuffer, byteOffset, byteLength), | 2106 *value = ToV8(DOMDataView::create(arrayBuffer, byteOffset, byteLength), |
| 2107 creationContext, isolate()); | 2107 creationContext, isolate()); |
| 2108 break; | 2108 break; |
| 2109 } | 2109 } |
| 2110 return !value->IsEmpty(); | 2110 return !value->IsEmpty(); |
| 2111 } | 2111 } |
| 2112 | 2112 |
| 2113 bool SerializedScriptValueReader::readRegExp(v8::Local<v8::Value>* value) { | 2113 bool SerializedScriptValueReader::readRegExp(v8::Local<v8::Value>* value) { |
| 2114 v8::Local<v8::Value> pattern; | 2114 v8::Local<v8::Value> pattern; |
| 2115 if (!readString(&pattern)) | 2115 if (!readString(&pattern)) |
| 2116 return false; | 2116 return false; |
| (...skipping 29 matching lines...) Expand all Loading... |
| 2146 uint64_t size; | 2146 uint64_t size; |
| 2147 ASSERT(!m_blobInfo); | 2147 ASSERT(!m_blobInfo); |
| 2148 if (!readWebCoreString(&uuid)) | 2148 if (!readWebCoreString(&uuid)) |
| 2149 return false; | 2149 return false; |
| 2150 if (!readWebCoreString(&type)) | 2150 if (!readWebCoreString(&type)) |
| 2151 return false; | 2151 return false; |
| 2152 if (!doReadUint64(&size)) | 2152 if (!doReadUint64(&size)) |
| 2153 return false; | 2153 return false; |
| 2154 blob = Blob::create(getOrCreateBlobDataHandle(uuid, type, size)); | 2154 blob = Blob::create(getOrCreateBlobDataHandle(uuid, type, size)); |
| 2155 } | 2155 } |
| 2156 *value = toV8(blob, m_scriptState->context()->Global(), isolate()); | 2156 *value = ToV8(blob, m_scriptState->context()->Global(), isolate()); |
| 2157 return !value->IsEmpty(); | 2157 return !value->IsEmpty(); |
| 2158 } | 2158 } |
| 2159 | 2159 |
| 2160 bool SerializedScriptValueReader::readFile(v8::Local<v8::Value>* value, | 2160 bool SerializedScriptValueReader::readFile(v8::Local<v8::Value>* value, |
| 2161 bool isIndexed) { | 2161 bool isIndexed) { |
| 2162 File* file = nullptr; | 2162 File* file = nullptr; |
| 2163 if (isIndexed) { | 2163 if (isIndexed) { |
| 2164 if (m_version < 6) | 2164 if (m_version < 6) |
| 2165 return false; | 2165 return false; |
| 2166 file = readFileIndexHelper(); | 2166 file = readFileIndexHelper(); |
| 2167 } else { | 2167 } else { |
| 2168 file = readFileHelper(); | 2168 file = readFileHelper(); |
| 2169 } | 2169 } |
| 2170 if (!file) | 2170 if (!file) |
| 2171 return false; | 2171 return false; |
| 2172 *value = toV8(file, m_scriptState->context()->Global(), isolate()); | 2172 *value = ToV8(file, m_scriptState->context()->Global(), isolate()); |
| 2173 return !value->IsEmpty(); | 2173 return !value->IsEmpty(); |
| 2174 } | 2174 } |
| 2175 | 2175 |
| 2176 bool SerializedScriptValueReader::readFileList(v8::Local<v8::Value>* value, | 2176 bool SerializedScriptValueReader::readFileList(v8::Local<v8::Value>* value, |
| 2177 bool isIndexed) { | 2177 bool isIndexed) { |
| 2178 if (m_version < 3) | 2178 if (m_version < 3) |
| 2179 return false; | 2179 return false; |
| 2180 uint32_t length; | 2180 uint32_t length; |
| 2181 if (!doReadUint32(&length)) | 2181 if (!doReadUint32(&length)) |
| 2182 return false; | 2182 return false; |
| 2183 FileList* fileList = FileList::create(); | 2183 FileList* fileList = FileList::create(); |
| 2184 for (unsigned i = 0; i < length; ++i) { | 2184 for (unsigned i = 0; i < length; ++i) { |
| 2185 File* file = nullptr; | 2185 File* file = nullptr; |
| 2186 if (isIndexed) { | 2186 if (isIndexed) { |
| 2187 if (m_version < 6) | 2187 if (m_version < 6) |
| 2188 return false; | 2188 return false; |
| 2189 file = readFileIndexHelper(); | 2189 file = readFileIndexHelper(); |
| 2190 } else { | 2190 } else { |
| 2191 file = readFileHelper(); | 2191 file = readFileHelper(); |
| 2192 } | 2192 } |
| 2193 if (!file) | 2193 if (!file) |
| 2194 return false; | 2194 return false; |
| 2195 fileList->append(file); | 2195 fileList->append(file); |
| 2196 } | 2196 } |
| 2197 *value = toV8(fileList, m_scriptState->context()->Global(), isolate()); | 2197 *value = ToV8(fileList, m_scriptState->context()->Global(), isolate()); |
| 2198 return !value->IsEmpty(); | 2198 return !value->IsEmpty(); |
| 2199 } | 2199 } |
| 2200 | 2200 |
| 2201 File* SerializedScriptValueReader::readFileHelper() { | 2201 File* SerializedScriptValueReader::readFileHelper() { |
| 2202 if (m_version < 3) | 2202 if (m_version < 3) |
| 2203 return nullptr; | 2203 return nullptr; |
| 2204 ASSERT(!m_blobInfo); | 2204 ASSERT(!m_blobInfo); |
| 2205 String path; | 2205 String path; |
| 2206 String name; | 2206 String name; |
| 2207 String relativePath; | 2207 String relativePath; |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2467 | 2467 |
| 2468 bool ScriptValueDeserializer::tryGetTransferredMessagePort( | 2468 bool ScriptValueDeserializer::tryGetTransferredMessagePort( |
| 2469 uint32_t index, | 2469 uint32_t index, |
| 2470 v8::Local<v8::Value>* object) { | 2470 v8::Local<v8::Value>* object) { |
| 2471 if (!m_transferredMessagePorts) | 2471 if (!m_transferredMessagePorts) |
| 2472 return false; | 2472 return false; |
| 2473 if (index >= m_transferredMessagePorts->size()) | 2473 if (index >= m_transferredMessagePorts->size()) |
| 2474 return false; | 2474 return false; |
| 2475 v8::Local<v8::Object> creationContext = | 2475 v8::Local<v8::Object> creationContext = |
| 2476 m_reader.getScriptState()->context()->Global(); | 2476 m_reader.getScriptState()->context()->Global(); |
| 2477 *object = toV8(m_transferredMessagePorts->at(index).get(), creationContext, | 2477 *object = ToV8(m_transferredMessagePorts->at(index).get(), creationContext, |
| 2478 m_reader.getScriptState()->isolate()); | 2478 m_reader.getScriptState()->isolate()); |
| 2479 return !object->IsEmpty(); | 2479 return !object->IsEmpty(); |
| 2480 } | 2480 } |
| 2481 | 2481 |
| 2482 bool ScriptValueDeserializer::tryGetTransferredArrayBuffer( | 2482 bool ScriptValueDeserializer::tryGetTransferredArrayBuffer( |
| 2483 uint32_t index, | 2483 uint32_t index, |
| 2484 v8::Local<v8::Value>* object) { | 2484 v8::Local<v8::Value>* object) { |
| 2485 if (!m_arrayBufferContents) | 2485 if (!m_arrayBufferContents) |
| 2486 return false; | 2486 return false; |
| 2487 if (index >= m_arrayBuffers.size()) | 2487 if (index >= m_arrayBuffers.size()) |
| 2488 return false; | 2488 return false; |
| 2489 v8::Local<v8::Value> result = m_arrayBuffers.at(index); | 2489 v8::Local<v8::Value> result = m_arrayBuffers.at(index); |
| 2490 if (result.IsEmpty()) { | 2490 if (result.IsEmpty()) { |
| 2491 DOMArrayBuffer* buffer = | 2491 DOMArrayBuffer* buffer = |
| 2492 DOMArrayBuffer::create(m_arrayBufferContents->at(index)); | 2492 DOMArrayBuffer::create(m_arrayBufferContents->at(index)); |
| 2493 v8::Isolate* isolate = m_reader.getScriptState()->isolate(); | 2493 v8::Isolate* isolate = m_reader.getScriptState()->isolate(); |
| 2494 v8::Local<v8::Object> creationContext = | 2494 v8::Local<v8::Object> creationContext = |
| 2495 m_reader.getScriptState()->context()->Global(); | 2495 m_reader.getScriptState()->context()->Global(); |
| 2496 result = toV8(buffer, creationContext, isolate); | 2496 result = ToV8(buffer, creationContext, isolate); |
| 2497 if (result.IsEmpty()) | 2497 if (result.IsEmpty()) |
| 2498 return false; | 2498 return false; |
| 2499 m_arrayBuffers[index] = result; | 2499 m_arrayBuffers[index] = result; |
| 2500 } | 2500 } |
| 2501 *object = result; | 2501 *object = result; |
| 2502 return true; | 2502 return true; |
| 2503 } | 2503 } |
| 2504 | 2504 |
| 2505 bool ScriptValueDeserializer::tryGetTransferredImageBitmap( | 2505 bool ScriptValueDeserializer::tryGetTransferredImageBitmap( |
| 2506 uint32_t index, | 2506 uint32_t index, |
| 2507 v8::Local<v8::Value>* object) { | 2507 v8::Local<v8::Value>* object) { |
| 2508 if (!m_imageBitmapContents) | 2508 if (!m_imageBitmapContents) |
| 2509 return false; | 2509 return false; |
| 2510 if (index >= m_imageBitmaps.size()) | 2510 if (index >= m_imageBitmaps.size()) |
| 2511 return false; | 2511 return false; |
| 2512 v8::Local<v8::Value> result = m_imageBitmaps.at(index); | 2512 v8::Local<v8::Value> result = m_imageBitmaps.at(index); |
| 2513 if (result.IsEmpty()) { | 2513 if (result.IsEmpty()) { |
| 2514 ImageBitmap* bitmap = ImageBitmap::create(m_imageBitmapContents->at(index)); | 2514 ImageBitmap* bitmap = ImageBitmap::create(m_imageBitmapContents->at(index)); |
| 2515 v8::Isolate* isolate = m_reader.getScriptState()->isolate(); | 2515 v8::Isolate* isolate = m_reader.getScriptState()->isolate(); |
| 2516 v8::Local<v8::Object> creationContext = | 2516 v8::Local<v8::Object> creationContext = |
| 2517 m_reader.getScriptState()->context()->Global(); | 2517 m_reader.getScriptState()->context()->Global(); |
| 2518 result = toV8(bitmap, creationContext, isolate); | 2518 result = ToV8(bitmap, creationContext, isolate); |
| 2519 if (result.IsEmpty()) | 2519 if (result.IsEmpty()) |
| 2520 return false; | 2520 return false; |
| 2521 m_imageBitmaps[index] = result; | 2521 m_imageBitmaps[index] = result; |
| 2522 } | 2522 } |
| 2523 *object = result; | 2523 *object = result; |
| 2524 return true; | 2524 return true; |
| 2525 } | 2525 } |
| 2526 | 2526 |
| 2527 bool ScriptValueDeserializer::tryGetTransferredSharedArrayBuffer( | 2527 bool ScriptValueDeserializer::tryGetTransferredSharedArrayBuffer( |
| 2528 uint32_t index, | 2528 uint32_t index, |
| 2529 v8::Local<v8::Value>* object) { | 2529 v8::Local<v8::Value>* object) { |
| 2530 ASSERT(RuntimeEnabledFeatures::sharedArrayBufferEnabled()); | 2530 ASSERT(RuntimeEnabledFeatures::sharedArrayBufferEnabled()); |
| 2531 if (!m_arrayBufferContents) | 2531 if (!m_arrayBufferContents) |
| 2532 return false; | 2532 return false; |
| 2533 if (index >= m_arrayBuffers.size()) | 2533 if (index >= m_arrayBuffers.size()) |
| 2534 return false; | 2534 return false; |
| 2535 v8::Local<v8::Value> result = m_arrayBuffers.at(index); | 2535 v8::Local<v8::Value> result = m_arrayBuffers.at(index); |
| 2536 if (result.IsEmpty()) { | 2536 if (result.IsEmpty()) { |
| 2537 DOMSharedArrayBuffer* buffer = | 2537 DOMSharedArrayBuffer* buffer = |
| 2538 DOMSharedArrayBuffer::create(m_arrayBufferContents->at(index)); | 2538 DOMSharedArrayBuffer::create(m_arrayBufferContents->at(index)); |
| 2539 v8::Isolate* isolate = m_reader.getScriptState()->isolate(); | 2539 v8::Isolate* isolate = m_reader.getScriptState()->isolate(); |
| 2540 v8::Local<v8::Object> creationContext = | 2540 v8::Local<v8::Object> creationContext = |
| 2541 m_reader.getScriptState()->context()->Global(); | 2541 m_reader.getScriptState()->context()->Global(); |
| 2542 result = toV8(buffer, creationContext, isolate); | 2542 result = ToV8(buffer, creationContext, isolate); |
| 2543 if (result.IsEmpty()) | 2543 if (result.IsEmpty()) |
| 2544 return false; | 2544 return false; |
| 2545 m_arrayBuffers[index] = result; | 2545 m_arrayBuffers[index] = result; |
| 2546 } | 2546 } |
| 2547 *object = result; | 2547 *object = result; |
| 2548 return true; | 2548 return true; |
| 2549 } | 2549 } |
| 2550 | 2550 |
| 2551 bool ScriptValueDeserializer::tryGetTransferredOffscreenCanvas( | 2551 bool ScriptValueDeserializer::tryGetTransferredOffscreenCanvas( |
| 2552 uint32_t width, | 2552 uint32_t width, |
| 2553 uint32_t height, | 2553 uint32_t height, |
| 2554 uint32_t canvasId, | 2554 uint32_t canvasId, |
| 2555 uint32_t clientId, | 2555 uint32_t clientId, |
| 2556 uint32_t sinkId, | 2556 uint32_t sinkId, |
| 2557 v8::Local<v8::Value>* object) { | 2557 v8::Local<v8::Value>* object) { |
| 2558 OffscreenCanvas* offscreenCanvas = OffscreenCanvas::create(width, height); | 2558 OffscreenCanvas* offscreenCanvas = OffscreenCanvas::create(width, height); |
| 2559 offscreenCanvas->setPlaceholderCanvasId(canvasId); | 2559 offscreenCanvas->setPlaceholderCanvasId(canvasId); |
| 2560 offscreenCanvas->setFrameSinkId(clientId, sinkId); | 2560 offscreenCanvas->setFrameSinkId(clientId, sinkId); |
| 2561 *object = toV8(offscreenCanvas, m_reader.getScriptState()); | 2561 *object = ToV8(offscreenCanvas, m_reader.getScriptState()); |
| 2562 if ((*object).IsEmpty()) | 2562 if ((*object).IsEmpty()) |
| 2563 return false; | 2563 return false; |
| 2564 return true; | 2564 return true; |
| 2565 } | 2565 } |
| 2566 | 2566 |
| 2567 bool ScriptValueDeserializer::tryGetObjectFromObjectReference( | 2567 bool ScriptValueDeserializer::tryGetObjectFromObjectReference( |
| 2568 uint32_t reference, | 2568 uint32_t reference, |
| 2569 v8::Local<v8::Value>* object) { | 2569 v8::Local<v8::Value>* object) { |
| 2570 if (reference >= m_objectPool.size()) | 2570 if (reference >= m_objectPool.size()) |
| 2571 return false; | 2571 return false; |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2636 m_openCompositeReferenceStack[m_openCompositeReferenceStack.size() - 1]; | 2636 m_openCompositeReferenceStack[m_openCompositeReferenceStack.size() - 1]; |
| 2637 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() - | 2637 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() - |
| 2638 1); | 2638 1); |
| 2639 if (objectReference >= m_objectPool.size()) | 2639 if (objectReference >= m_objectPool.size()) |
| 2640 return false; | 2640 return false; |
| 2641 *object = m_objectPool[objectReference]; | 2641 *object = m_objectPool[objectReference]; |
| 2642 return true; | 2642 return true; |
| 2643 } | 2643 } |
| 2644 | 2644 |
| 2645 } // namespace blink | 2645 } // namespace blink |
| OLD | NEW |