| 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 "config.h" | 5 #include "config.h" |
| 6 #include "bindings/core/v8/ScriptValueSerializer.h" | 6 #include "bindings/core/v8/ScriptValueSerializer.h" |
| 7 | 7 |
| 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 565 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 576 ScriptValueSerializer::StateBase* ScriptValueSerializer::SparseArrayState::objec
tDone(unsigned numProperties, ScriptValueSerializer& serializer) | 576 ScriptValueSerializer::StateBase* ScriptValueSerializer::SparseArrayState::objec
tDone(unsigned numProperties, ScriptValueSerializer& serializer) |
| 577 { | 577 { |
| 578 return serializer.writeSparseArray(numProperties, composite().As<v8::Array>(
)->Length(), this); | 578 return serializer.writeSparseArray(numProperties, composite().As<v8::Array>(
)->Length(), this); |
| 579 } | 579 } |
| 580 | 580 |
| 581 static v8::Local<v8::Object> toV8Object(MessagePort* impl, v8::Local<v8::Object>
creationContext, v8::Isolate* isolate) | 581 static v8::Local<v8::Object> toV8Object(MessagePort* impl, v8::Local<v8::Object>
creationContext, v8::Isolate* isolate) |
| 582 { | 582 { |
| 583 if (!impl) | 583 if (!impl) |
| 584 return v8::Local<v8::Object>(); | 584 return v8::Local<v8::Object>(); |
| 585 v8::Local<v8::Value> wrapper = toV8(impl, creationContext, isolate); | 585 v8::Local<v8::Value> wrapper = toV8(impl, creationContext, isolate); |
| 586 if (wrapper.IsEmpty()) |
| 587 return v8::Local<v8::Object>(); |
| 586 ASSERT(wrapper->IsObject()); | 588 ASSERT(wrapper->IsObject()); |
| 587 return wrapper.As<v8::Object>(); | 589 return wrapper.As<v8::Object>(); |
| 588 } | 590 } |
| 589 | 591 |
| 590 static v8::Local<v8::ArrayBuffer> toV8Object(DOMArrayBuffer* impl, v8::Local<v8:
:Object> creationContext, v8::Isolate* isolate) | 592 static v8::Local<v8::ArrayBuffer> toV8Object(DOMArrayBuffer* impl, v8::Local<v8:
:Object> creationContext, v8::Isolate* isolate) |
| 591 { | 593 { |
| 592 if (!impl) | 594 if (!impl) |
| 593 return v8::Local<v8::ArrayBuffer>(); | 595 return v8::Local<v8::ArrayBuffer>(); |
| 594 v8::Local<v8::Value> wrapper = toV8(impl, creationContext, isolate); | 596 v8::Local<v8::Value> wrapper = toV8(impl, creationContext, isolate); |
| 597 if (wrapper.IsEmpty()) |
| 598 return v8::Local<v8::ArrayBuffer>(); |
| 595 ASSERT(wrapper->IsArrayBuffer()); | 599 ASSERT(wrapper->IsArrayBuffer()); |
| 596 return wrapper.As<v8::ArrayBuffer>(); | 600 return wrapper.As<v8::ArrayBuffer>(); |
| 597 } | 601 } |
| 598 | 602 |
| 599 // Returns true if the provided object is to be considered a 'host object', as u
sed in the | 603 // Returns true if the provided object is to be considered a 'host object', as u
sed in the |
| 600 // HTML5 structured clone algorithm. | 604 // HTML5 structured clone algorithm. |
| 601 static bool isHostObject(v8::Local<v8::Object> object) | 605 static bool isHostObject(v8::Local<v8::Object> object) |
| 602 { | 606 { |
| 603 // If the object has any internal fields, then we won't be able to serialize
or deserialize | 607 // If the object has any internal fields, then we won't be able to serialize
or deserialize |
| 604 // them; conveniently, this is also a quick way to detect DOM wrapper object
s, because | 608 // them; conveniently, this is also a quick way to detect DOM wrapper object
s, because |
| (...skipping 795 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1400 return false; | 1404 return false; |
| 1401 if (m_position + pixelDataLength > m_length) | 1405 if (m_position + pixelDataLength > m_length) |
| 1402 return false; | 1406 return false; |
| 1403 ImageData* imageData = ImageData::create(IntSize(width, height)); | 1407 ImageData* imageData = ImageData::create(IntSize(width, height)); |
| 1404 DOMUint8ClampedArray* pixelArray = imageData->data(); | 1408 DOMUint8ClampedArray* pixelArray = imageData->data(); |
| 1405 ASSERT(pixelArray); | 1409 ASSERT(pixelArray); |
| 1406 ASSERT(pixelArray->length() >= pixelDataLength); | 1410 ASSERT(pixelArray->length() >= pixelDataLength); |
| 1407 memcpy(pixelArray->data(), m_buffer + m_position, pixelDataLength); | 1411 memcpy(pixelArray->data(), m_buffer + m_position, pixelDataLength); |
| 1408 m_position += pixelDataLength; | 1412 m_position += pixelDataLength; |
| 1409 *value = toV8(imageData, m_scriptState->context()->Global(), isolate()); | 1413 *value = toV8(imageData, m_scriptState->context()->Global(), isolate()); |
| 1410 return true; | 1414 return !value->IsEmpty(); |
| 1411 } | 1415 } |
| 1412 | 1416 |
| 1413 bool SerializedScriptValueReader::readCompositorProxy(v8::Local<v8::Value>* valu
e) | 1417 bool SerializedScriptValueReader::readCompositorProxy(v8::Local<v8::Value>* valu
e) |
| 1414 { | 1418 { |
| 1415 uint32_t attributes; | 1419 uint32_t attributes; |
| 1416 uint64_t element; | 1420 uint64_t element; |
| 1417 if (!doReadUint64(&element)) | 1421 if (!doReadUint64(&element)) |
| 1418 return false; | 1422 return false; |
| 1419 if (!doReadUint32(&attributes)) | 1423 if (!doReadUint32(&attributes)) |
| 1420 return false; | 1424 return false; |
| 1421 | 1425 |
| 1422 CompositorProxy* compositorProxy = CompositorProxy::create(element, attribut
es); | 1426 CompositorProxy* compositorProxy = CompositorProxy::create(element, attribut
es); |
| 1423 *value = toV8(compositorProxy, m_scriptState->context()->Global(), isolate()
); | 1427 *value = toV8(compositorProxy, m_scriptState->context()->Global(), isolate()
); |
| 1424 return true; | 1428 return !value->IsEmpty(); |
| 1425 } | 1429 } |
| 1426 | 1430 |
| 1427 PassRefPtr<DOMArrayBuffer> SerializedScriptValueReader::doReadArrayBuffer() | 1431 PassRefPtr<DOMArrayBuffer> SerializedScriptValueReader::doReadArrayBuffer() |
| 1428 { | 1432 { |
| 1429 uint32_t byteLength; | 1433 uint32_t byteLength; |
| 1430 if (!doReadUint32(&byteLength)) | 1434 if (!doReadUint32(&byteLength)) |
| 1431 return nullptr; | 1435 return nullptr; |
| 1432 if (m_position + byteLength > m_length) | 1436 if (m_position + byteLength > m_length) |
| 1433 return nullptr; | 1437 return nullptr; |
| 1434 const void* bufferStart = m_buffer + m_position; | 1438 const void* bufferStart = m_buffer + m_position; |
| 1435 m_position += byteLength; | 1439 m_position += byteLength; |
| 1436 return DOMArrayBuffer::create(bufferStart, byteLength); | 1440 return DOMArrayBuffer::create(bufferStart, byteLength); |
| 1437 } | 1441 } |
| 1438 | 1442 |
| 1439 bool SerializedScriptValueReader::readArrayBuffer(v8::Local<v8::Value>* value) | 1443 bool SerializedScriptValueReader::readArrayBuffer(v8::Local<v8::Value>* value) |
| 1440 { | 1444 { |
| 1441 RefPtr<DOMArrayBuffer> arrayBuffer = doReadArrayBuffer(); | 1445 RefPtr<DOMArrayBuffer> arrayBuffer = doReadArrayBuffer(); |
| 1442 if (!arrayBuffer) | 1446 if (!arrayBuffer) |
| 1443 return false; | 1447 return false; |
| 1444 *value = toV8(arrayBuffer.release(), m_scriptState->context()->Global(), iso
late()); | 1448 *value = toV8(arrayBuffer.release(), m_scriptState->context()->Global(), iso
late()); |
| 1445 return true; | 1449 return !value->IsEmpty(); |
| 1446 } | 1450 } |
| 1447 | 1451 |
| 1448 bool SerializedScriptValueReader::readArrayBufferView(v8::Local<v8::Value>* valu
e, ScriptValueCompositeCreator& creator) | 1452 bool SerializedScriptValueReader::readArrayBufferView(v8::Local<v8::Value>* valu
e, ScriptValueCompositeCreator& creator) |
| 1449 { | 1453 { |
| 1450 ArrayBufferViewSubTag subTag; | 1454 ArrayBufferViewSubTag subTag; |
| 1451 uint32_t byteOffset; | 1455 uint32_t byteOffset; |
| 1452 uint32_t byteLength; | 1456 uint32_t byteLength; |
| 1453 RefPtr<DOMArrayBuffer> arrayBuffer; | 1457 RefPtr<DOMArrayBuffer> arrayBuffer; |
| 1454 v8::Local<v8::Value> arrayBufferV8Value; | 1458 v8::Local<v8::Value> arrayBufferV8Value; |
| 1455 if (!readArrayBufferViewSubTag(&subTag)) | 1459 if (!readArrayBufferViewSubTag(&subTag)) |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1580 ASSERT(!m_blobInfo); | 1584 ASSERT(!m_blobInfo); |
| 1581 if (!readWebCoreString(&uuid)) | 1585 if (!readWebCoreString(&uuid)) |
| 1582 return false; | 1586 return false; |
| 1583 if (!readWebCoreString(&type)) | 1587 if (!readWebCoreString(&type)) |
| 1584 return false; | 1588 return false; |
| 1585 if (!doReadUint64(&size)) | 1589 if (!doReadUint64(&size)) |
| 1586 return false; | 1590 return false; |
| 1587 blob = Blob::create(getOrCreateBlobDataHandle(uuid, type, size)); | 1591 blob = Blob::create(getOrCreateBlobDataHandle(uuid, type, size)); |
| 1588 } | 1592 } |
| 1589 *value = toV8(blob, m_scriptState->context()->Global(), isolate()); | 1593 *value = toV8(blob, m_scriptState->context()->Global(), isolate()); |
| 1590 return true; | 1594 return !value->IsEmpty(); |
| 1591 } | 1595 } |
| 1592 | 1596 |
| 1593 bool SerializedScriptValueReader::readFile(v8::Local<v8::Value>* value, bool isI
ndexed) | 1597 bool SerializedScriptValueReader::readFile(v8::Local<v8::Value>* value, bool isI
ndexed) |
| 1594 { | 1598 { |
| 1595 File* file = nullptr; | 1599 File* file = nullptr; |
| 1596 if (isIndexed) { | 1600 if (isIndexed) { |
| 1597 if (m_version < 6) | 1601 if (m_version < 6) |
| 1598 return false; | 1602 return false; |
| 1599 file = readFileIndexHelper(); | 1603 file = readFileIndexHelper(); |
| 1600 } else { | 1604 } else { |
| 1601 file = readFileHelper(); | 1605 file = readFileHelper(); |
| 1602 } | 1606 } |
| 1603 if (!file) | 1607 if (!file) |
| 1604 return false; | 1608 return false; |
| 1605 *value = toV8(file, m_scriptState->context()->Global(), isolate()); | 1609 *value = toV8(file, m_scriptState->context()->Global(), isolate()); |
| 1606 return true; | 1610 return !value->IsEmpty(); |
| 1607 } | 1611 } |
| 1608 | 1612 |
| 1609 bool SerializedScriptValueReader::readFileList(v8::Local<v8::Value>* value, bool
isIndexed) | 1613 bool SerializedScriptValueReader::readFileList(v8::Local<v8::Value>* value, bool
isIndexed) |
| 1610 { | 1614 { |
| 1611 if (m_version < 3) | 1615 if (m_version < 3) |
| 1612 return false; | 1616 return false; |
| 1613 uint32_t length; | 1617 uint32_t length; |
| 1614 if (!doReadUint32(&length)) | 1618 if (!doReadUint32(&length)) |
| 1615 return false; | 1619 return false; |
| 1616 FileList* fileList = FileList::create(); | 1620 FileList* fileList = FileList::create(); |
| 1617 for (unsigned i = 0; i < length; ++i) { | 1621 for (unsigned i = 0; i < length; ++i) { |
| 1618 File* file = nullptr; | 1622 File* file = nullptr; |
| 1619 if (isIndexed) { | 1623 if (isIndexed) { |
| 1620 if (m_version < 6) | 1624 if (m_version < 6) |
| 1621 return false; | 1625 return false; |
| 1622 file = readFileIndexHelper(); | 1626 file = readFileIndexHelper(); |
| 1623 } else { | 1627 } else { |
| 1624 file = readFileHelper(); | 1628 file = readFileHelper(); |
| 1625 } | 1629 } |
| 1626 if (!file) | 1630 if (!file) |
| 1627 return false; | 1631 return false; |
| 1628 fileList->append(file); | 1632 fileList->append(file); |
| 1629 } | 1633 } |
| 1630 *value = toV8(fileList, m_scriptState->context()->Global(), isolate()); | 1634 *value = toV8(fileList, m_scriptState->context()->Global(), isolate()); |
| 1631 return true; | 1635 return !value->IsEmpty(); |
| 1632 } | 1636 } |
| 1633 | 1637 |
| 1634 File* SerializedScriptValueReader::readFileHelper() | 1638 File* SerializedScriptValueReader::readFileHelper() |
| 1635 { | 1639 { |
| 1636 if (m_version < 3) | 1640 if (m_version < 3) |
| 1637 return nullptr; | 1641 return nullptr; |
| 1638 ASSERT(!m_blobInfo); | 1642 ASSERT(!m_blobInfo); |
| 1639 String path; | 1643 String path; |
| 1640 String name; | 1644 String name; |
| 1641 String relativePath; | 1645 String relativePath; |
| (...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1841 } | 1845 } |
| 1842 | 1846 |
| 1843 bool ScriptValueDeserializer::tryGetTransferredMessagePort(uint32_t index, v8::L
ocal<v8::Value>* object) | 1847 bool ScriptValueDeserializer::tryGetTransferredMessagePort(uint32_t index, v8::L
ocal<v8::Value>* object) |
| 1844 { | 1848 { |
| 1845 if (!m_transferredMessagePorts) | 1849 if (!m_transferredMessagePorts) |
| 1846 return false; | 1850 return false; |
| 1847 if (index >= m_transferredMessagePorts->size()) | 1851 if (index >= m_transferredMessagePorts->size()) |
| 1848 return false; | 1852 return false; |
| 1849 v8::Local<v8::Object> creationContext = m_reader.scriptState()->context()->G
lobal(); | 1853 v8::Local<v8::Object> creationContext = m_reader.scriptState()->context()->G
lobal(); |
| 1850 *object = toV8(m_transferredMessagePorts->at(index).get(), creationContext,
m_reader.scriptState()->isolate()); | 1854 *object = toV8(m_transferredMessagePorts->at(index).get(), creationContext,
m_reader.scriptState()->isolate()); |
| 1851 return true; | 1855 return !object->IsEmpty(); |
| 1852 } | 1856 } |
| 1853 | 1857 |
| 1854 bool ScriptValueDeserializer::tryGetTransferredArrayBuffer(uint32_t index, v8::L
ocal<v8::Value>* object) | 1858 bool ScriptValueDeserializer::tryGetTransferredArrayBuffer(uint32_t index, v8::L
ocal<v8::Value>* object) |
| 1855 { | 1859 { |
| 1856 if (!m_arrayBufferContents) | 1860 if (!m_arrayBufferContents) |
| 1857 return false; | 1861 return false; |
| 1858 if (index >= m_arrayBuffers.size()) | 1862 if (index >= m_arrayBuffers.size()) |
| 1859 return false; | 1863 return false; |
| 1860 v8::Local<v8::Value> result = m_arrayBuffers.at(index); | 1864 v8::Local<v8::Value> result = m_arrayBuffers.at(index); |
| 1861 if (result.IsEmpty()) { | 1865 if (result.IsEmpty()) { |
| 1862 RefPtr<DOMArrayBuffer> buffer = DOMArrayBuffer::create(m_arrayBufferCont
ents->at(index)); | 1866 RefPtr<DOMArrayBuffer> buffer = DOMArrayBuffer::create(m_arrayBufferCont
ents->at(index)); |
| 1863 v8::Isolate* isolate = m_reader.scriptState()->isolate(); | 1867 v8::Isolate* isolate = m_reader.scriptState()->isolate(); |
| 1864 v8::Local<v8::Object> creationContext = m_reader.scriptState()->context(
)->Global(); | 1868 v8::Local<v8::Object> creationContext = m_reader.scriptState()->context(
)->Global(); |
| 1865 result = toV8(buffer.get(), creationContext, isolate); | 1869 result = toV8(buffer.get(), creationContext, isolate); |
| 1870 if (result.IsEmpty()) |
| 1871 return false; |
| 1866 m_arrayBuffers[index] = result; | 1872 m_arrayBuffers[index] = result; |
| 1867 } | 1873 } |
| 1868 *object = result; | 1874 *object = result; |
| 1869 return true; | 1875 return true; |
| 1870 } | 1876 } |
| 1871 | 1877 |
| 1872 bool ScriptValueDeserializer::tryGetObjectFromObjectReference(uint32_t reference
, v8::Local<v8::Value>* object) | 1878 bool ScriptValueDeserializer::tryGetObjectFromObjectReference(uint32_t reference
, v8::Local<v8::Value>* object) |
| 1873 { | 1879 { |
| 1874 if (reference >= m_objectPool.size()) | 1880 if (reference >= m_objectPool.size()) |
| 1875 return false; | 1881 return false; |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1934 return false; | 1940 return false; |
| 1935 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe
renceStack.size() - 1]; | 1941 uint32_t objectReference = m_openCompositeReferenceStack[m_openCompositeRefe
renceStack.size() - 1]; |
| 1936 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() -
1); | 1942 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size() -
1); |
| 1937 if (objectReference >= m_objectPool.size()) | 1943 if (objectReference >= m_objectPool.size()) |
| 1938 return false; | 1944 return false; |
| 1939 *object = m_objectPool[objectReference]; | 1945 *object = m_objectPool[objectReference]; |
| 1940 return true; | 1946 return true; |
| 1941 } | 1947 } |
| 1942 | 1948 |
| 1943 } // namespace blink | 1949 } // namespace blink |
| OLD | NEW |