| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2010 Google Inc. All rights reserved. | 2 * Copyright (C) 2010 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 29 */ | 29 */ |
| 30 | 30 |
| 31 #include "config.h" | 31 #include "config.h" |
| 32 #include "bindings/core/v8/SerializedScriptValue.h" | 32 #include "bindings/core/v8/SerializedScriptValue.h" |
| 33 | 33 |
| 34 #include "bindings/core/v8/ExceptionState.h" | 34 #include "bindings/core/v8/ExceptionState.h" |
| 35 #include "bindings/core/v8/V8ArrayBuffer.h" |
| 36 #include "bindings/core/v8/V8ArrayBufferView.h" |
| 35 #include "bindings/core/v8/V8Binding.h" | 37 #include "bindings/core/v8/V8Binding.h" |
| 36 #include "bindings/core/v8/V8Blob.h" | 38 #include "bindings/core/v8/V8Blob.h" |
| 39 #include "bindings/core/v8/V8DataView.h" |
| 37 #include "bindings/core/v8/V8File.h" | 40 #include "bindings/core/v8/V8File.h" |
| 38 #include "bindings/core/v8/V8FileList.h" | 41 #include "bindings/core/v8/V8FileList.h" |
| 42 #include "bindings/core/v8/V8Float32Array.h" |
| 43 #include "bindings/core/v8/V8Float64Array.h" |
| 39 #include "bindings/core/v8/V8ImageData.h" | 44 #include "bindings/core/v8/V8ImageData.h" |
| 45 #include "bindings/core/v8/V8Int16Array.h" |
| 46 #include "bindings/core/v8/V8Int32Array.h" |
| 47 #include "bindings/core/v8/V8Int8Array.h" |
| 40 #include "bindings/core/v8/V8MessagePort.h" | 48 #include "bindings/core/v8/V8MessagePort.h" |
| 49 #include "bindings/core/v8/V8Uint16Array.h" |
| 50 #include "bindings/core/v8/V8Uint32Array.h" |
| 51 #include "bindings/core/v8/V8Uint8Array.h" |
| 52 #include "bindings/core/v8/V8Uint8ClampedArray.h" |
| 41 #include "bindings/core/v8/WorkerScriptController.h" | 53 #include "bindings/core/v8/WorkerScriptController.h" |
| 42 #include "bindings/core/v8/custom/V8ArrayBufferCustom.h" | |
| 43 #include "bindings/core/v8/custom/V8ArrayBufferViewCustom.h" | |
| 44 #include "bindings/core/v8/custom/V8DataViewCustom.h" | |
| 45 #include "bindings/core/v8/custom/V8Float32ArrayCustom.h" | |
| 46 #include "bindings/core/v8/custom/V8Float64ArrayCustom.h" | |
| 47 #include "bindings/core/v8/custom/V8Int16ArrayCustom.h" | |
| 48 #include "bindings/core/v8/custom/V8Int32ArrayCustom.h" | |
| 49 #include "bindings/core/v8/custom/V8Int8ArrayCustom.h" | |
| 50 #include "bindings/core/v8/custom/V8Uint16ArrayCustom.h" | |
| 51 #include "bindings/core/v8/custom/V8Uint32ArrayCustom.h" | |
| 52 #include "bindings/core/v8/custom/V8Uint8ArrayCustom.h" | |
| 53 #include "bindings/core/v8/custom/V8Uint8ClampedArrayCustom.h" | |
| 54 #include "bindings/modules/v8/V8CryptoKey.h" | 54 #include "bindings/modules/v8/V8CryptoKey.h" |
| 55 #include "bindings/modules/v8/V8DOMFileSystem.h" | 55 #include "bindings/modules/v8/V8DOMFileSystem.h" |
| 56 #include "core/dom/ExceptionCode.h" | 56 #include "core/dom/ExceptionCode.h" |
| 57 #include "core/dom/MessagePort.h" | 57 #include "core/dom/MessagePort.h" |
| 58 #include "core/fileapi/Blob.h" | 58 #include "core/fileapi/Blob.h" |
| 59 #include "core/fileapi/File.h" | 59 #include "core/fileapi/File.h" |
| 60 #include "core/fileapi/FileList.h" | 60 #include "core/fileapi/FileList.h" |
| 61 #include "core/html/ImageData.h" | 61 #include "core/html/ImageData.h" |
| 62 #include "core/html/canvas/DataView.h" | 62 #include "core/html/canvas/DataView.h" |
| 63 #include "platform/SharedBuffer.h" | 63 #include "platform/SharedBuffer.h" |
| (...skipping 843 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 907 | 907 |
| 908 static v8::Handle<v8::Object> toV8Object(MessagePort* impl, v8::Handle<v8::Objec
t> creationContext, v8::Isolate* isolate) | 908 static v8::Handle<v8::Object> toV8Object(MessagePort* impl, v8::Handle<v8::Objec
t> creationContext, v8::Isolate* isolate) |
| 909 { | 909 { |
| 910 if (!impl) | 910 if (!impl) |
| 911 return v8::Handle<v8::Object>(); | 911 return v8::Handle<v8::Object>(); |
| 912 v8::Handle<v8::Value> wrapper = toV8(impl, creationContext, isolate); | 912 v8::Handle<v8::Value> wrapper = toV8(impl, creationContext, isolate); |
| 913 ASSERT(wrapper->IsObject()); | 913 ASSERT(wrapper->IsObject()); |
| 914 return wrapper.As<v8::Object>(); | 914 return wrapper.As<v8::Object>(); |
| 915 } | 915 } |
| 916 | 916 |
| 917 static v8::Handle<v8::ArrayBuffer> toV8Object(ArrayBuffer* impl, v8::Handle<v8::
Object> creationContext, v8::Isolate* isolate) | 917 static v8::Handle<v8::ArrayBuffer> toV8Object(DOMArrayBuffer* impl, v8::Handle<v
8::Object> creationContext, v8::Isolate* isolate) |
| 918 { | 918 { |
| 919 if (!impl) | 919 if (!impl) |
| 920 return v8::Handle<v8::ArrayBuffer>(); | 920 return v8::Handle<v8::ArrayBuffer>(); |
| 921 v8::Handle<v8::Value> wrapper = toV8(impl, creationContext, isolate); | 921 v8::Handle<v8::Value> wrapper = toV8(impl, creationContext, isolate); |
| 922 ASSERT(wrapper->IsArrayBuffer()); | 922 ASSERT(wrapper->IsArrayBuffer()); |
| 923 return wrapper.As<v8::ArrayBuffer>(); | 923 return wrapper.As<v8::ArrayBuffer>(); |
| 924 } | 924 } |
| 925 | 925 |
| 926 class Serializer { | 926 class Serializer { |
| 927 class StateBase; | 927 class StateBase; |
| (...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1369 | 1369 |
| 1370 void writeRegExp(v8::Handle<v8::Value> value) | 1370 void writeRegExp(v8::Handle<v8::Value> value) |
| 1371 { | 1371 { |
| 1372 v8::Handle<v8::RegExp> regExp = value.As<v8::RegExp>(); | 1372 v8::Handle<v8::RegExp> regExp = value.As<v8::RegExp>(); |
| 1373 m_writer.writeRegExp(regExp->GetSource(), regExp->GetFlags()); | 1373 m_writer.writeRegExp(regExp->GetSource(), regExp->GetFlags()); |
| 1374 } | 1374 } |
| 1375 | 1375 |
| 1376 StateBase* writeAndGreyArrayBufferView(v8::Handle<v8::Object> object, StateB
ase* next) | 1376 StateBase* writeAndGreyArrayBufferView(v8::Handle<v8::Object> object, StateB
ase* next) |
| 1377 { | 1377 { |
| 1378 ASSERT(!object.IsEmpty()); | 1378 ASSERT(!object.IsEmpty()); |
| 1379 ArrayBufferView* arrayBufferView = V8ArrayBufferView::toImpl(object); | 1379 DOMArrayBufferView* arrayBufferView = V8ArrayBufferView::toImpl(object); |
| 1380 if (!arrayBufferView) | 1380 if (!arrayBufferView) |
| 1381 return 0; | 1381 return 0; |
| 1382 if (!arrayBufferView->buffer()) | 1382 if (!arrayBufferView->buffer()) |
| 1383 return handleError(DataCloneError, "An ArrayBuffer could not be clon
ed.", next); | 1383 return handleError(DataCloneError, "An ArrayBuffer could not be clon
ed.", next); |
| 1384 v8::Handle<v8::Value> underlyingBuffer = toV8(arrayBufferView->buffer(),
m_scriptState->context()->Global(), isolate()); | 1384 v8::Handle<v8::Value> underlyingBuffer = toV8(arrayBufferView->buffer(),
m_scriptState->context()->Global(), isolate()); |
| 1385 if (underlyingBuffer.IsEmpty()) | 1385 if (underlyingBuffer.IsEmpty()) |
| 1386 return handleError(DataCloneError, "An ArrayBuffer could not be clon
ed.", next); | 1386 return handleError(DataCloneError, "An ArrayBuffer could not be clon
ed.", next); |
| 1387 StateBase* stateOut = doSerializeArrayBuffer(underlyingBuffer, next); | 1387 StateBase* stateOut = doSerializeArrayBuffer(underlyingBuffer, next); |
| 1388 if (stateOut) | 1388 if (stateOut) |
| 1389 return stateOut; | 1389 return stateOut; |
| 1390 m_writer.writeArrayBufferView(*arrayBufferView); | 1390 m_writer.writeArrayBufferView(*arrayBufferView->view()); |
| 1391 // This should be safe: we serialize something that we know to be a wrap
per (see | 1391 // This should be safe: we serialize something that we know to be a wrap
per (see |
| 1392 // the toV8 call above), so the call to doSerializeArrayBuffer should ne
ither | 1392 // the toV8 call above), so the call to doSerializeArrayBuffer should ne
ither |
| 1393 // cause the system stack to overflow nor should it have potential to re
ach | 1393 // cause the system stack to overflow nor should it have potential to re
ach |
| 1394 // this ArrayBufferView again. | 1394 // this ArrayBufferView again. |
| 1395 // | 1395 // |
| 1396 // We do need to grey the underlying buffer before we grey its view, how
ever; | 1396 // We do need to grey the underlying buffer before we grey its view, how
ever; |
| 1397 // ArrayBuffers may be shared, so they need to be given reference IDs, a
nd an | 1397 // ArrayBuffers may be shared, so they need to be given reference IDs, a
nd an |
| 1398 // ArrayBufferView cannot be constructed without a corresponding ArrayBu
ffer | 1398 // ArrayBufferView cannot be constructed without a corresponding ArrayBu
ffer |
| 1399 // (or without an additional tag that would allow us to do two-stage con
struction | 1399 // (or without an additional tag that would allow us to do two-stage con
struction |
| 1400 // like we do for Objects and Arrays). | 1400 // like we do for Objects and Arrays). |
| 1401 greyObject(object); | 1401 greyObject(object); |
| 1402 return 0; | 1402 return 0; |
| 1403 } | 1403 } |
| 1404 | 1404 |
| 1405 StateBase* writeArrayBuffer(v8::Handle<v8::Value> value, StateBase* next) | 1405 StateBase* writeArrayBuffer(v8::Handle<v8::Value> value, StateBase* next) |
| 1406 { | 1406 { |
| 1407 ArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl(value.As<v8::Object>())
; | 1407 DOMArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl(value.As<v8::Object>
()); |
| 1408 if (!arrayBuffer) | 1408 if (!arrayBuffer) |
| 1409 return 0; | 1409 return 0; |
| 1410 if (arrayBuffer->isNeutered()) | 1410 if (arrayBuffer->isNeutered()) |
| 1411 return handleError(DataCloneError, "An ArrayBuffer is neutered and c
ould not be cloned.", next); | 1411 return handleError(DataCloneError, "An ArrayBuffer is neutered and c
ould not be cloned.", next); |
| 1412 ASSERT(!m_transferredArrayBuffers.contains(value.As<v8::Object>())); | 1412 ASSERT(!m_transferredArrayBuffers.contains(value.As<v8::Object>())); |
| 1413 m_writer.writeArrayBuffer(*arrayBuffer); | 1413 m_writer.writeArrayBuffer(*arrayBuffer->buffer()); |
| 1414 return 0; | 1414 return 0; |
| 1415 } | 1415 } |
| 1416 | 1416 |
| 1417 StateBase* writeTransferredArrayBuffer(v8::Handle<v8::Value> value, uint32_t
index, StateBase* next) | 1417 StateBase* writeTransferredArrayBuffer(v8::Handle<v8::Value> value, uint32_t
index, StateBase* next) |
| 1418 { | 1418 { |
| 1419 ArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl(value.As<v8::Object>())
; | 1419 DOMArrayBuffer* arrayBuffer = V8ArrayBuffer::toImpl(value.As<v8::Object>
()); |
| 1420 if (!arrayBuffer) | 1420 if (!arrayBuffer) |
| 1421 return 0; | 1421 return 0; |
| 1422 if (arrayBuffer->isNeutered()) | 1422 if (arrayBuffer->isNeutered()) |
| 1423 return handleError(DataCloneError, "An ArrayBuffer is neutered and c
ould not be cloned.", next); | 1423 return handleError(DataCloneError, "An ArrayBuffer is neutered and c
ould not be cloned.", next); |
| 1424 m_writer.writeTransferredArrayBuffer(index); | 1424 m_writer.writeTransferredArrayBuffer(index); |
| 1425 return 0; | 1425 return 0; |
| 1426 } | 1426 } |
| 1427 | 1427 |
| 1428 static bool shouldSerializeDensely(uint32_t length, uint32_t propertyCount) | 1428 static bool shouldSerializeDensely(uint32_t length, uint32_t propertyCount) |
| 1429 { | 1429 { |
| (...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2030 } | 2030 } |
| 2031 | 2031 |
| 2032 PassRefPtr<ArrayBuffer> doReadArrayBuffer() | 2032 PassRefPtr<ArrayBuffer> doReadArrayBuffer() |
| 2033 { | 2033 { |
| 2034 uint32_t byteLength; | 2034 uint32_t byteLength; |
| 2035 if (!doReadUint32(&byteLength)) | 2035 if (!doReadUint32(&byteLength)) |
| 2036 return nullptr; | 2036 return nullptr; |
| 2037 if (m_position + byteLength > m_length) | 2037 if (m_position + byteLength > m_length) |
| 2038 return nullptr; | 2038 return nullptr; |
| 2039 const void* bufferStart = m_buffer + m_position; | 2039 const void* bufferStart = m_buffer + m_position; |
| 2040 RefPtr<ArrayBuffer> arrayBuffer = ArrayBuffer::create(bufferStart, byteL
ength); | |
| 2041 arrayBuffer->setDeallocationObserver(V8ArrayBufferDeallocationObserver::
instanceTemplate()); | |
| 2042 m_position += byteLength; | 2040 m_position += byteLength; |
| 2043 return arrayBuffer.release(); | 2041 return ArrayBuffer::create(bufferStart, byteLength); |
| 2044 } | 2042 } |
| 2045 | 2043 |
| 2046 bool readArrayBuffer(v8::Handle<v8::Value>* value) | 2044 bool readArrayBuffer(v8::Handle<v8::Value>* value) |
| 2047 { | 2045 { |
| 2048 RefPtr<ArrayBuffer> arrayBuffer = doReadArrayBuffer(); | 2046 RefPtr<ArrayBuffer> arrayBuffer = doReadArrayBuffer(); |
| 2049 if (!arrayBuffer) | 2047 if (!arrayBuffer) |
| 2050 return false; | 2048 return false; |
| 2051 *value = toV8(arrayBuffer.release(), m_scriptState->context()->Global(),
isolate()); | 2049 *value = toV8(DOMArrayBuffer::create(arrayBuffer.release()), m_scriptSta
te->context()->Global(), isolate()); |
| 2052 return true; | 2050 return true; |
| 2053 } | 2051 } |
| 2054 | 2052 |
| 2055 bool readArrayBufferView(v8::Handle<v8::Value>* value, CompositeCreator& cre
ator) | 2053 bool readArrayBufferView(v8::Handle<v8::Value>* value, CompositeCreator& cre
ator) |
| 2056 { | 2054 { |
| 2057 ArrayBufferViewSubTag subTag; | 2055 ArrayBufferViewSubTag subTag; |
| 2058 uint32_t byteOffset; | 2056 uint32_t byteOffset; |
| 2059 uint32_t byteLength; | 2057 uint32_t byteLength; |
| 2060 RefPtr<ArrayBuffer> arrayBuffer; | 2058 RefPtr<DOMArrayBuffer> arrayBuffer; |
| 2061 v8::Handle<v8::Value> arrayBufferV8Value; | 2059 v8::Handle<v8::Value> arrayBufferV8Value; |
| 2062 if (!readArrayBufferViewSubTag(&subTag)) | 2060 if (!readArrayBufferViewSubTag(&subTag)) |
| 2063 return false; | 2061 return false; |
| 2064 if (!doReadUint32(&byteOffset)) | 2062 if (!doReadUint32(&byteOffset)) |
| 2065 return false; | 2063 return false; |
| 2066 if (!doReadUint32(&byteLength)) | 2064 if (!doReadUint32(&byteLength)) |
| 2067 return false; | 2065 return false; |
| 2068 if (!creator.consumeTopOfStack(&arrayBufferV8Value)) | 2066 if (!creator.consumeTopOfStack(&arrayBufferV8Value)) |
| 2069 return false; | 2067 return false; |
| 2070 if (arrayBufferV8Value.IsEmpty()) | 2068 if (arrayBufferV8Value.IsEmpty()) |
| 2071 return false; | 2069 return false; |
| 2072 arrayBuffer = V8ArrayBuffer::toImpl(arrayBufferV8Value.As<v8::Object>())
; | 2070 arrayBuffer = V8ArrayBuffer::toImpl(arrayBufferV8Value.As<v8::Object>())
; |
| 2073 if (!arrayBuffer) | 2071 if (!arrayBuffer) |
| 2074 return false; | 2072 return false; |
| 2075 | 2073 |
| 2076 v8::Handle<v8::Object> creationContext = m_scriptState->context()->Globa
l(); | 2074 v8::Handle<v8::Object> creationContext = m_scriptState->context()->Globa
l(); |
| 2077 switch (subTag) { | 2075 switch (subTag) { |
| 2078 case ByteArrayTag: | 2076 case ByteArrayTag: |
| 2079 *value = toV8(Int8Array::create(arrayBuffer.release(), byteOffset, b
yteLength), creationContext, isolate()); | 2077 *value = toV8(DOMInt8Array::create(arrayBuffer.release(), byteOffset
, byteLength), creationContext, isolate()); |
| 2080 break; | 2078 break; |
| 2081 case UnsignedByteArrayTag: | 2079 case UnsignedByteArrayTag: |
| 2082 *value = toV8(Uint8Array::create(arrayBuffer.release(), byteOffset,
byteLength), creationContext, isolate()); | 2080 *value = toV8(DOMUint8Array::create(arrayBuffer.release(), byteOffse
t, byteLength), creationContext, isolate()); |
| 2083 break; | 2081 break; |
| 2084 case UnsignedByteClampedArrayTag: | 2082 case UnsignedByteClampedArrayTag: |
| 2085 *value = toV8(Uint8ClampedArray::create(arrayBuffer.release(), byteO
ffset, byteLength), creationContext, isolate()); | 2083 *value = toV8(DOMUint8ClampedArray::create(arrayBuffer.release(), by
teOffset, byteLength), creationContext, isolate()); |
| 2086 break; | 2084 break; |
| 2087 case ShortArrayTag: { | 2085 case ShortArrayTag: { |
| 2088 uint32_t shortLength = byteLength / sizeof(int16_t); | 2086 uint32_t shortLength = byteLength / sizeof(int16_t); |
| 2089 if (shortLength * sizeof(int16_t) != byteLength) | 2087 if (shortLength * sizeof(int16_t) != byteLength) |
| 2090 return false; | 2088 return false; |
| 2091 *value = toV8(Int16Array::create(arrayBuffer.release(), byteOffset,
shortLength), creationContext, isolate()); | 2089 *value = toV8(DOMInt16Array::create(arrayBuffer.release(), byteOffse
t, shortLength), creationContext, isolate()); |
| 2092 break; | 2090 break; |
| 2093 } | 2091 } |
| 2094 case UnsignedShortArrayTag: { | 2092 case UnsignedShortArrayTag: { |
| 2095 uint32_t shortLength = byteLength / sizeof(uint16_t); | 2093 uint32_t shortLength = byteLength / sizeof(uint16_t); |
| 2096 if (shortLength * sizeof(uint16_t) != byteLength) | 2094 if (shortLength * sizeof(uint16_t) != byteLength) |
| 2097 return false; | 2095 return false; |
| 2098 *value = toV8(Uint16Array::create(arrayBuffer.release(), byteOffset,
shortLength), creationContext, isolate()); | 2096 *value = toV8(DOMUint16Array::create(arrayBuffer.release(), byteOffs
et, shortLength), creationContext, isolate()); |
| 2099 break; | 2097 break; |
| 2100 } | 2098 } |
| 2101 case IntArrayTag: { | 2099 case IntArrayTag: { |
| 2102 uint32_t intLength = byteLength / sizeof(int32_t); | 2100 uint32_t intLength = byteLength / sizeof(int32_t); |
| 2103 if (intLength * sizeof(int32_t) != byteLength) | 2101 if (intLength * sizeof(int32_t) != byteLength) |
| 2104 return false; | 2102 return false; |
| 2105 *value = toV8(Int32Array::create(arrayBuffer.release(), byteOffset,
intLength), creationContext, isolate()); | 2103 *value = toV8(DOMInt32Array::create(arrayBuffer.release(), byteOffse
t, intLength), creationContext, isolate()); |
| 2106 break; | 2104 break; |
| 2107 } | 2105 } |
| 2108 case UnsignedIntArrayTag: { | 2106 case UnsignedIntArrayTag: { |
| 2109 uint32_t intLength = byteLength / sizeof(uint32_t); | 2107 uint32_t intLength = byteLength / sizeof(uint32_t); |
| 2110 if (intLength * sizeof(uint32_t) != byteLength) | 2108 if (intLength * sizeof(uint32_t) != byteLength) |
| 2111 return false; | 2109 return false; |
| 2112 *value = toV8(Uint32Array::create(arrayBuffer.release(), byteOffset,
intLength), creationContext, isolate()); | 2110 *value = toV8(DOMUint32Array::create(arrayBuffer.release(), byteOffs
et, intLength), creationContext, isolate()); |
| 2113 break; | 2111 break; |
| 2114 } | 2112 } |
| 2115 case FloatArrayTag: { | 2113 case FloatArrayTag: { |
| 2116 uint32_t floatLength = byteLength / sizeof(float); | 2114 uint32_t floatLength = byteLength / sizeof(float); |
| 2117 if (floatLength * sizeof(float) != byteLength) | 2115 if (floatLength * sizeof(float) != byteLength) |
| 2118 return false; | 2116 return false; |
| 2119 *value = toV8(Float32Array::create(arrayBuffer.release(), byteOffset
, floatLength), creationContext, isolate()); | 2117 *value = toV8(DOMFloat32Array::create(arrayBuffer.release(), byteOff
set, floatLength), creationContext, isolate()); |
| 2120 break; | 2118 break; |
| 2121 } | 2119 } |
| 2122 case DoubleArrayTag: { | 2120 case DoubleArrayTag: { |
| 2123 uint32_t floatLength = byteLength / sizeof(double); | 2121 uint32_t floatLength = byteLength / sizeof(double); |
| 2124 if (floatLength * sizeof(double) != byteLength) | 2122 if (floatLength * sizeof(double) != byteLength) |
| 2125 return false; | 2123 return false; |
| 2126 *value = toV8(Float64Array::create(arrayBuffer.release(), byteOffset
, floatLength), creationContext, isolate()); | 2124 *value = toV8(DOMFloat64Array::create(arrayBuffer.release(), byteOff
set, floatLength), creationContext, isolate()); |
| 2127 break; | 2125 break; |
| 2128 } | 2126 } |
| 2129 case DataViewTag: | 2127 case DataViewTag: |
| 2130 *value = toV8(DataView::create(arrayBuffer.release(), byteOffset, by
teLength), creationContext, isolate()); | 2128 *value = toV8(DOMDataView::create(arrayBuffer.release(), byteOffset,
byteLength), creationContext, isolate()); |
| 2131 break; | 2129 break; |
| 2132 default: | 2130 default: |
| 2133 return false; | 2131 return false; |
| 2134 } | 2132 } |
| 2135 // The various *Array::create() methods will return null if the range th
e view expects is | 2133 // The various *Array::create() methods will return null if the range th
e view expects is |
| 2136 // mismatched with the range the buffer can provide or if the byte offse
t is not aligned | 2134 // mismatched with the range the buffer can provide or if the byte offse
t is not aligned |
| 2137 // to the size of the element type. | 2135 // to the size of the element type. |
| 2138 return !value->IsEmpty(); | 2136 return !value->IsEmpty(); |
| 2139 } | 2137 } |
| 2140 | 2138 |
| (...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2696 } | 2694 } |
| 2697 | 2695 |
| 2698 virtual bool tryGetTransferredArrayBuffer(uint32_t index, v8::Handle<v8::Val
ue>* object) override | 2696 virtual bool tryGetTransferredArrayBuffer(uint32_t index, v8::Handle<v8::Val
ue>* object) override |
| 2699 { | 2697 { |
| 2700 if (!m_arrayBufferContents) | 2698 if (!m_arrayBufferContents) |
| 2701 return false; | 2699 return false; |
| 2702 if (index >= m_arrayBuffers.size()) | 2700 if (index >= m_arrayBuffers.size()) |
| 2703 return false; | 2701 return false; |
| 2704 v8::Handle<v8::Object> result = m_arrayBuffers.at(index); | 2702 v8::Handle<v8::Object> result = m_arrayBuffers.at(index); |
| 2705 if (result.IsEmpty()) { | 2703 if (result.IsEmpty()) { |
| 2706 RefPtr<ArrayBuffer> buffer = ArrayBuffer::create(m_arrayBufferConten
ts->at(index)); | 2704 RefPtr<DOMArrayBuffer> buffer = DOMArrayBuffer::create(m_arrayBuffer
Contents->at(index)); |
| 2707 buffer->setDeallocationObserver(V8ArrayBufferDeallocationObserver::i
nstanceTemplate()); | |
| 2708 v8::Isolate* isolate = m_reader.scriptState()->isolate(); | 2705 v8::Isolate* isolate = m_reader.scriptState()->isolate(); |
| 2709 v8::Handle<v8::Object> creationContext = m_reader.scriptState()->con
text()->Global(); | 2706 v8::Handle<v8::Object> creationContext = m_reader.scriptState()->con
text()->Global(); |
| 2710 isolate->AdjustAmountOfExternalAllocatedMemory(buffer->byteLength())
; | |
| 2711 result = toV8Object(buffer.get(), creationContext, isolate); | 2707 result = toV8Object(buffer.get(), creationContext, isolate); |
| 2712 m_arrayBuffers[index] = result; | 2708 m_arrayBuffers[index] = result; |
| 2713 } | 2709 } |
| 2714 *object = result; | 2710 *object = result; |
| 2715 return true; | 2711 return true; |
| 2716 } | 2712 } |
| 2717 | 2713 |
| 2718 virtual bool tryGetObjectFromObjectReference(uint32_t reference, v8::Handle<
v8::Value>* object) override | 2714 virtual bool tryGetObjectFromObjectReference(uint32_t reference, v8::Handle<
v8::Value>* object) override |
| 2719 { | 2715 { |
| 2720 if (reference >= m_objectPool.size()) | 2716 if (reference >= m_objectPool.size()) |
| (...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2880 for (size_t i = 0; i < length; i++) | 2876 for (size_t i = 0; i < length; i++) |
| 2881 dst[i] = htons(src[i]); | 2877 dst[i] = htons(src[i]); |
| 2882 } | 2878 } |
| 2883 } | 2879 } |
| 2884 | 2880 |
| 2885 SerializedScriptValue::SerializedScriptValue() | 2881 SerializedScriptValue::SerializedScriptValue() |
| 2886 : m_externallyAllocatedMemory(0) | 2882 : m_externallyAllocatedMemory(0) |
| 2887 { | 2883 { |
| 2888 } | 2884 } |
| 2889 | 2885 |
| 2890 static void neuterArrayBufferInAllWorlds(ArrayBuffer* object) | 2886 static void neuterArrayBufferInAllWorlds(DOMArrayBuffer* object) |
| 2891 { | 2887 { |
| 2892 v8::Isolate* isolate = v8::Isolate::GetCurrent(); | 2888 v8::Isolate* isolate = v8::Isolate::GetCurrent(); |
| 2893 if (isMainThread()) { | 2889 if (isMainThread()) { |
| 2894 Vector<RefPtr<DOMWrapperWorld> > worlds; | 2890 Vector<RefPtr<DOMWrapperWorld> > worlds; |
| 2895 DOMWrapperWorld::allWorldsInMainThread(worlds); | 2891 DOMWrapperWorld::allWorldsInMainThread(worlds); |
| 2896 for (size_t i = 0; i < worlds.size(); i++) { | 2892 for (size_t i = 0; i < worlds.size(); i++) { |
| 2897 v8::Handle<v8::Object> wrapper = worlds[i]->domDataStore().get<V8Arr
ayBuffer>(object, isolate); | 2893 v8::Handle<v8::Object> wrapper = worlds[i]->domDataStore().get<V8Arr
ayBuffer>(object, isolate); |
| 2898 if (!wrapper.IsEmpty()) { | 2894 if (!wrapper.IsEmpty()) { |
| 2899 ASSERT(wrapper->IsArrayBuffer()); | 2895 ASSERT(wrapper->IsArrayBuffer()); |
| 2900 v8::Handle<v8::ArrayBuffer>::Cast(wrapper)->Neuter(); | 2896 v8::Handle<v8::ArrayBuffer>::Cast(wrapper)->Neuter(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2915 | 2911 |
| 2916 for (size_t i = 0; i < arrayBuffers.size(); i++) { | 2912 for (size_t i = 0; i < arrayBuffers.size(); i++) { |
| 2917 if (arrayBuffers[i]->isNeutered()) { | 2913 if (arrayBuffers[i]->isNeutered()) { |
| 2918 exceptionState.throwDOMException(DataCloneError, "ArrayBuffer at ind
ex " + String::number(i) + " is already neutered."); | 2914 exceptionState.throwDOMException(DataCloneError, "ArrayBuffer at ind
ex " + String::number(i) + " is already neutered."); |
| 2919 return nullptr; | 2915 return nullptr; |
| 2920 } | 2916 } |
| 2921 } | 2917 } |
| 2922 | 2918 |
| 2923 OwnPtr<ArrayBufferContentsArray> contents = adoptPtr(new ArrayBufferContents
Array(arrayBuffers.size())); | 2919 OwnPtr<ArrayBufferContentsArray> contents = adoptPtr(new ArrayBufferContents
Array(arrayBuffers.size())); |
| 2924 | 2920 |
| 2925 HashSet<ArrayBuffer*> visited; | 2921 HashSet<DOMArrayBuffer*> visited; |
| 2926 for (size_t i = 0; i < arrayBuffers.size(); i++) { | 2922 for (size_t i = 0; i < arrayBuffers.size(); i++) { |
| 2927 if (visited.contains(arrayBuffers[i].get())) | 2923 if (visited.contains(arrayBuffers[i].get())) |
| 2928 continue; | 2924 continue; |
| 2929 visited.add(arrayBuffers[i].get()); | 2925 visited.add(arrayBuffers[i].get()); |
| 2930 | 2926 |
| 2931 bool result = arrayBuffers[i]->transfer(contents->at(i)); | 2927 bool result = arrayBuffers[i]->transfer(contents->at(i)); |
| 2932 if (!result) { | 2928 if (!result) { |
| 2933 exceptionState.throwDOMException(DataCloneError, "ArrayBuffer at ind
ex " + String::number(i) + " could not be transferred."); | 2929 exceptionState.throwDOMException(DataCloneError, "ArrayBuffer at ind
ex " + String::number(i) + " could not be transferred."); |
| 2934 return nullptr; | 2930 return nullptr; |
| 2935 } | 2931 } |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3035 // Validation of Objects implementing an interface, per WebIDL spec 4.1.
15. | 3031 // Validation of Objects implementing an interface, per WebIDL spec 4.1.
15. |
| 3036 if (V8MessagePort::hasInstance(transferrable, isolate)) { | 3032 if (V8MessagePort::hasInstance(transferrable, isolate)) { |
| 3037 RefPtrWillBeRawPtr<MessagePort> port = V8MessagePort::toImpl(v8::Han
dle<v8::Object>::Cast(transferrable)); | 3033 RefPtrWillBeRawPtr<MessagePort> port = V8MessagePort::toImpl(v8::Han
dle<v8::Object>::Cast(transferrable)); |
| 3038 // Check for duplicate MessagePorts. | 3034 // Check for duplicate MessagePorts. |
| 3039 if (ports.contains(port)) { | 3035 if (ports.contains(port)) { |
| 3040 exceptionState.throwDOMException(DataCloneError, "Message port a
t index " + String::number(i) + " is a duplicate of an earlier port."); | 3036 exceptionState.throwDOMException(DataCloneError, "Message port a
t index " + String::number(i) + " is a duplicate of an earlier port."); |
| 3041 return false; | 3037 return false; |
| 3042 } | 3038 } |
| 3043 ports.append(port.release()); | 3039 ports.append(port.release()); |
| 3044 } else if (V8ArrayBuffer::hasInstance(transferrable, isolate)) { | 3040 } else if (V8ArrayBuffer::hasInstance(transferrable, isolate)) { |
| 3045 RefPtr<ArrayBuffer> arrayBuffer = V8ArrayBuffer::toImpl(v8::Handle<v
8::Object>::Cast(transferrable)); | 3041 RefPtr<DOMArrayBuffer> arrayBuffer = V8ArrayBuffer::toImpl(v8::Handl
e<v8::Object>::Cast(transferrable)); |
| 3046 if (arrayBuffers.contains(arrayBuffer)) { | 3042 if (arrayBuffers.contains(arrayBuffer)) { |
| 3047 exceptionState.throwDOMException(DataCloneError, "ArrayBuffer at
index " + String::number(i) + " is a duplicate of an earlier ArrayBuffer."); | 3043 exceptionState.throwDOMException(DataCloneError, "ArrayBuffer at
index " + String::number(i) + " is a duplicate of an earlier ArrayBuffer."); |
| 3048 return false; | 3044 return false; |
| 3049 } | 3045 } |
| 3050 arrayBuffers.append(arrayBuffer.release()); | 3046 arrayBuffers.append(arrayBuffer.release()); |
| 3051 } else { | 3047 } else { |
| 3052 exceptionState.throwDOMException(DataCloneError, "Value at index " +
String::number(i) + " does not have a transferable type."); | 3048 exceptionState.throwDOMException(DataCloneError, "Value at index " +
String::number(i) + " does not have a transferable type."); |
| 3053 return false; | 3049 return false; |
| 3054 } | 3050 } |
| 3055 } | 3051 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 3069 // If the allocated memory was not registered before, then this class is lik
ely | 3065 // If the allocated memory was not registered before, then this class is lik
ely |
| 3070 // used in a context other then Worker's onmessage environment and the prese
nce of | 3066 // used in a context other then Worker's onmessage environment and the prese
nce of |
| 3071 // current v8 context is not guaranteed. Avoid calling v8 then. | 3067 // current v8 context is not guaranteed. Avoid calling v8 then. |
| 3072 if (m_externallyAllocatedMemory) { | 3068 if (m_externallyAllocatedMemory) { |
| 3073 ASSERT(v8::Isolate::GetCurrent()); | 3069 ASSERT(v8::Isolate::GetCurrent()); |
| 3074 v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(-m_exte
rnallyAllocatedMemory); | 3070 v8::Isolate::GetCurrent()->AdjustAmountOfExternalAllocatedMemory(-m_exte
rnallyAllocatedMemory); |
| 3075 } | 3071 } |
| 3076 } | 3072 } |
| 3077 | 3073 |
| 3078 } // namespace blink | 3074 } // namespace blink |
| OLD | NEW |