Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(382)

Side by Side Diff: Source/bindings/core/v8/ScriptValueSerializer.cpp

Issue 1100223003: bindings: Add empty checks for toV8() (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: rebase Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « Source/bindings/core/v8/ScriptPromiseProperty.h ('k') | Source/bindings/core/v8/V8Binding.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « Source/bindings/core/v8/ScriptPromiseProperty.h ('k') | Source/bindings/core/v8/V8Binding.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698