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

Side by Side Diff: Source/bindings/v8/SerializedScriptValue.cpp

Issue 18590006: Blob support for IDB [Blink] (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Merge fixes [builds, untested] Created 7 years, 3 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 | Annotate | Revision Log
OLDNEW
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 389 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 } 400 }
401 401
402 void writeBlob(const String& url, const String& type, unsigned long long siz e) 402 void writeBlob(const String& url, const String& type, unsigned long long siz e)
403 { 403 {
404 append(BlobTag); 404 append(BlobTag);
405 doWriteWebCoreString(url); 405 doWriteWebCoreString(url);
406 doWriteWebCoreString(type); 406 doWriteWebCoreString(type);
407 doWriteUint64(size); 407 doWriteUint64(size);
408 } 408 }
409 409
410 void writeBlob(int blobIndex)
411 {
412 append(BlobTag);
413 doWriteUint32(blobIndex);
414 }
415
410 void writeDOMFileSystem(int type, const String& name, const String& url) 416 void writeDOMFileSystem(int type, const String& name, const String& url)
411 { 417 {
412 append(DOMFileSystemTag); 418 append(DOMFileSystemTag);
413 doWriteUint32(type); 419 doWriteUint32(type);
414 doWriteWebCoreString(name); 420 doWriteWebCoreString(name);
415 doWriteWebCoreString(url); 421 doWriteWebCoreString(url);
416 } 422 }
417 423
418 void writeFile(const String& path, const String& url, const String& type) 424 void writeFile(const String& path, const String& url, const String& type)
419 { 425 {
420 append(FileTag); 426 append(FileTag);
421 doWriteWebCoreString(path); 427 doWriteWebCoreString(path);
422 doWriteWebCoreString(url); 428 doWriteWebCoreString(url);
423 doWriteWebCoreString(type); 429 doWriteWebCoreString(type);
424 } 430 }
425 431
432 void writeFile(int blobIndex)
433 {
434 append(FileTag);
435 doWriteUint32(blobIndex);
436 }
437
438 // Note: We could dedupe the files in this list, but it's probably
439 // pretty rare that there are any duplicates.
426 void writeFileList(const FileList& fileList) 440 void writeFileList(const FileList& fileList)
427 { 441 {
428 append(FileListTag); 442 append(FileListTag);
429 uint32_t length = fileList.length(); 443 uint32_t length = fileList.length();
430 doWriteUint32(length); 444 doWriteUint32(length);
431 for (unsigned i = 0; i < length; ++i) { 445 for (unsigned i = 0; i < length; ++i) {
432 doWriteWebCoreString(fileList.item(i)->path()); 446 doWriteWebCoreString(fileList.item(i)->path());
433 doWriteWebCoreString(fileList.item(i)->url().string()); 447 doWriteWebCoreString(fileList.item(i)->url().string());
434 doWriteWebCoreString(fileList.item(i)->type()); 448 doWriteWebCoreString(fileList.item(i)->type());
435 } 449 }
436 } 450 }
437 451
452 void writeFileList(const Vector<int>& blobIndices)
453 {
454 append(FileListTag);
455 uint32_t length = blobIndices.size();
456 doWriteUint32(length);
457 for (unsigned i = 0; i < length; ++i) {
458 doWriteUint32(blobIndices[i]);
459 }
460 }
461
438 void writeArrayBuffer(const ArrayBuffer& arrayBuffer) 462 void writeArrayBuffer(const ArrayBuffer& arrayBuffer)
439 { 463 {
440 append(ArrayBufferTag); 464 append(ArrayBufferTag);
441 doWriteArrayBuffer(arrayBuffer); 465 doWriteArrayBuffer(arrayBuffer);
442 } 466 }
443 467
444 void writeArrayBufferView(const ArrayBufferView& arrayBufferView) 468 void writeArrayBufferView(const ArrayBufferView& arrayBufferView)
445 { 469 {
446 append(ArrayBufferViewTag); 470 append(ArrayBufferViewTag);
447 #ifndef NDEBUG 471 #ifndef NDEBUG
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
699 public: 723 public:
700 enum Status { 724 enum Status {
701 Success, 725 Success,
702 InputError, 726 InputError,
703 DataCloneError, 727 DataCloneError,
704 InvalidStateError, 728 InvalidStateError,
705 JSException, 729 JSException,
706 JSFailure 730 JSFailure
707 }; 731 };
708 732
709 Serializer(Writer& writer, MessagePortArray* messagePorts, ArrayBufferArray* arrayBuffers, Vector<String>& blobURLs, v8::TryCatch& tryCatch, v8::Isolate* is olate) 733 Serializer(Writer& writer, MessagePortArray* messagePorts, ArrayBufferArray* arrayBuffers, Vector<BlobInfo>* blobInfo, v8::TryCatch& tryCatch, v8::Isolate* isolate)
710 : m_writer(writer) 734 : m_writer(writer)
711 , m_tryCatch(tryCatch) 735 , m_tryCatch(tryCatch)
712 , m_depth(0) 736 , m_depth(0)
713 , m_execDepth(0) 737 , m_execDepth(0)
714 , m_status(Success) 738 , m_status(Success)
715 , m_nextObjectReference(0) 739 , m_nextObjectReference(0)
716 , m_blobURLs(blobURLs) 740 , m_blobInfo(blobInfo)
717 , m_isolate(isolate) 741 , m_isolate(isolate)
718 { 742 {
719 ASSERT(!tryCatch.HasCaught()); 743 ASSERT(!tryCatch.HasCaught());
720 if (messagePorts) { 744 if (messagePorts) {
721 for (size_t i = 0; i < messagePorts->size(); i++) 745 for (size_t i = 0; i < messagePorts->size(); i++)
722 m_transferredMessagePorts.set(toV8Object(messagePorts->at(i).get (), m_writer.getIsolate()), i); 746 m_transferredMessagePorts.set(toV8Object(messagePorts->at(i).get (), m_writer.getIsolate()), i);
723 } 747 }
724 if (arrayBuffers) { 748 if (arrayBuffers) {
725 for (size_t i = 0; i < arrayBuffers->size(); i++) { 749 for (size_t i = 0; i < arrayBuffers->size(); i++) {
726 v8::Handle<v8::Object> v8ArrayBuffer = toV8Object(arrayBuffers-> at(i).get(), m_writer.getIsolate()); 750 v8::Handle<v8::Object> v8ArrayBuffer = toV8Object(arrayBuffers-> at(i).get(), m_writer.getIsolate());
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after
1074 { 1098 {
1075 v8::Handle<v8::BooleanObject> booleanObject = value.As<v8::BooleanObject >(); 1099 v8::Handle<v8::BooleanObject> booleanObject = value.As<v8::BooleanObject >();
1076 m_writer.writeBooleanObject(booleanObject->BooleanValue()); 1100 m_writer.writeBooleanObject(booleanObject->BooleanValue());
1077 } 1101 }
1078 1102
1079 void writeBlob(v8::Handle<v8::Value> value) 1103 void writeBlob(v8::Handle<v8::Value> value)
1080 { 1104 {
1081 Blob* blob = V8Blob::toNative(value.As<v8::Object>()); 1105 Blob* blob = V8Blob::toNative(value.As<v8::Object>());
1082 if (!blob) 1106 if (!blob)
1083 return; 1107 return;
1084 m_writer.writeBlob(blob->url().string(), blob->type(), blob->size()); 1108 int blobIndex = -1;
1085 m_blobURLs.append(blob->url().string()); 1109 if (appendBlobInfo(blob->url().string(), blob->type(), blob->size(), &bl obIndex)) {
1110 ASSERT(blobIndex >= 0);
1111 m_writer.writeBlob(blobIndex);
1112 } else {
1113 m_writer.writeBlob(blob->url().string(), blob->type(), blob->size()) ;
1114 }
1086 } 1115 }
1087 1116
1088 StateBase* writeDOMFileSystem(v8::Handle<v8::Value> value, StateBase* next) 1117 StateBase* writeDOMFileSystem(v8::Handle<v8::Value> value, StateBase* next)
1089 { 1118 {
1090 DOMFileSystem* fs = V8DOMFileSystem::toNative(value.As<v8::Object>()); 1119 DOMFileSystem* fs = V8DOMFileSystem::toNative(value.As<v8::Object>());
1091 if (!fs) 1120 if (!fs)
1092 return 0; 1121 return 0;
1093 if (!fs->clonable()) 1122 if (!fs->clonable())
1094 return handleError(DataCloneError, next); 1123 return handleError(DataCloneError, next);
1095 m_writer.writeDOMFileSystem(fs->type(), fs->name(), fs->rootURL().string ()); 1124 m_writer.writeDOMFileSystem(fs->type(), fs->name(), fs->rootURL().string ());
1096 return 0; 1125 return 0;
1097 } 1126 }
1098 1127
1099 void writeFile(v8::Handle<v8::Value> value) 1128 void writeFile(v8::Handle<v8::Value> value)
1100 { 1129 {
1101 File* file = V8File::toNative(value.As<v8::Object>()); 1130 File* file = V8File::toNative(value.As<v8::Object>());
1102 if (!file) 1131 if (!file)
1103 return; 1132 return;
1104 m_writer.writeFile(file->path(), file->url().string(), file->type()); 1133 int blobIndex = -1;
1105 m_blobURLs.append(file->url().string()); 1134 if (appendFileInfo(file->path(), file->name(), file->type(), &blobIndex) ) {
1135 ASSERT(blobIndex >= 0);
1136 m_writer.writeFile(blobIndex);
1137 } else {
1138 m_writer.writeFile(file->path(), file->url().string(), file->type()) ;
1139 }
1106 } 1140 }
1107 1141
1108 void writeFileList(v8::Handle<v8::Value> value) 1142 void writeFileList(v8::Handle<v8::Value> value)
1109 { 1143 {
1110 FileList* fileList = V8FileList::toNative(value.As<v8::Object>()); 1144 FileList* fileList = V8FileList::toNative(value.As<v8::Object>());
1111 if (!fileList) 1145 if (!fileList)
1112 return; 1146 return;
1113 m_writer.writeFileList(*fileList);
1114 unsigned length = fileList->length(); 1147 unsigned length = fileList->length();
1115 for (unsigned i = 0; i < length; ++i) 1148 Vector<int> blobIndices;
1116 m_blobURLs.append(fileList->item(i)->url().string()); 1149 bool useBlobIndices = false;
1150 for (unsigned i = 0; i < length; ++i) {
1151 int blobIndex = -1;
1152 const File* file = fileList->item(i);
1153 if (appendFileInfo(file->path(), file->name(), file->type(), &blobIn dex)) {
1154 ASSERT(!i || useBlobIndices);
1155 ASSERT(blobIndex >= 0);
1156 useBlobIndices = true;
1157 blobIndices.append(blobIndex);
1158 }
1159 }
1160 if (useBlobIndices) {
1161 m_writer.writeFileList(blobIndices);
1162 } else {
1163 m_writer.writeFileList(*fileList);
1164 }
1117 } 1165 }
1118 1166
1119 void writeImageData(v8::Handle<v8::Value> value) 1167 void writeImageData(v8::Handle<v8::Value> value)
1120 { 1168 {
1121 ImageData* imageData = V8ImageData::toNative(value.As<v8::Object>()); 1169 ImageData* imageData = V8ImageData::toNative(value.As<v8::Object>());
1122 if (!imageData) 1170 if (!imageData)
1123 return; 1171 return;
1124 Uint8ClampedArray* pixelArray = imageData->data(); 1172 Uint8ClampedArray* pixelArray = imageData->data();
1125 m_writer.writeImageData(imageData->width(), imageData->height(), pixelAr ray->data(), pixelArray->length()); 1173 m_writer.writeImageData(imageData->width(), imageData->height(), pixelAr ray->data(), pixelArray->length());
1126 } 1174 }
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1215 1263
1216 // Marks object as having been visited by the serializer and assigns it a un ique object reference ID. 1264 // Marks object as having been visited by the serializer and assigns it a un ique object reference ID.
1217 // An object may only be greyed once. 1265 // An object may only be greyed once.
1218 void greyObject(const v8::Handle<v8::Object>& object) 1266 void greyObject(const v8::Handle<v8::Object>& object)
1219 { 1267 {
1220 ASSERT(!m_objectPool.contains(object)); 1268 ASSERT(!m_objectPool.contains(object));
1221 uint32_t objectReference = m_nextObjectReference++; 1269 uint32_t objectReference = m_nextObjectReference++;
1222 m_objectPool.set(object, objectReference); 1270 m_objectPool.set(object, objectReference);
1223 } 1271 }
1224 1272
1273 bool appendBlobInfo(const String& url, const String& type, unsigned long lon g size, int* index)
1274 {
1275 if (!m_blobInfo)
1276 return false;
1277 *index = m_blobInfo->size();
1278 m_blobInfo->append(BlobInfo(url, type, size));
1279 return true;
1280 }
1281
1282 bool appendFileInfo(const String& filePath, const String& fileName, const St ring& type, int* index)
1283 {
1284 if (!m_blobInfo)
1285 return false;
1286 *index = m_blobInfo->size();
1287 m_blobInfo->append(BlobInfo(filePath, fileName, type));
1288 return true;
1289 }
1290
1225 Writer& m_writer; 1291 Writer& m_writer;
1226 v8::TryCatch& m_tryCatch; 1292 v8::TryCatch& m_tryCatch;
1227 int m_depth; 1293 int m_depth;
1228 int m_execDepth; 1294 int m_execDepth;
1229 Status m_status; 1295 Status m_status;
1230 typedef V8ObjectMap<v8::Object, uint32_t> ObjectPool; 1296 typedef V8ObjectMap<v8::Object, uint32_t> ObjectPool;
1231 ObjectPool m_objectPool; 1297 ObjectPool m_objectPool;
1232 ObjectPool m_transferredMessagePorts; 1298 ObjectPool m_transferredMessagePorts;
1233 ObjectPool m_transferredArrayBuffers; 1299 ObjectPool m_transferredArrayBuffers;
1234 uint32_t m_nextObjectReference; 1300 uint32_t m_nextObjectReference;
1235 Vector<String>& m_blobURLs; 1301 Vector<BlobInfo>* m_blobInfo;
1236 v8::Isolate* m_isolate; 1302 v8::Isolate* m_isolate;
1237 }; 1303 };
1238 1304
1239 Serializer::StateBase* Serializer::doSerialize(v8::Handle<v8::Value> value, Stat eBase* next) 1305 Serializer::StateBase* Serializer::doSerialize(v8::Handle<v8::Value> value, Stat eBase* next)
1240 { 1306 {
1241 if (m_execDepth + (next ? next->execDepth() : 0) > 1) { 1307 if (m_execDepth + (next ? next->execDepth() : 0) > 1) {
1242 m_writer.writeNull(); 1308 m_writer.writeNull();
1243 return 0; 1309 return 0;
1244 } 1310 }
1245 m_writer.writeReferenceCount(m_nextObjectReference); 1311 m_writer.writeReferenceCount(m_nextObjectReference);
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1335 virtual bool newObject() = 0; 1401 virtual bool newObject() = 0;
1336 virtual bool completeObject(uint32_t numProperties, v8::Handle<v8::Value>*) = 0; 1402 virtual bool completeObject(uint32_t numProperties, v8::Handle<v8::Value>*) = 0;
1337 virtual bool completeSparseArray(uint32_t numProperties, uint32_t length, v8 ::Handle<v8::Value>*) = 0; 1403 virtual bool completeSparseArray(uint32_t numProperties, uint32_t length, v8 ::Handle<v8::Value>*) = 0;
1338 virtual bool completeDenseArray(uint32_t numProperties, uint32_t length, v8: :Handle<v8::Value>*) = 0; 1404 virtual bool completeDenseArray(uint32_t numProperties, uint32_t length, v8: :Handle<v8::Value>*) = 0;
1339 }; 1405 };
1340 1406
1341 // Reader is responsible for deserializing primitive types and 1407 // Reader is responsible for deserializing primitive types and
1342 // restoring information about saved objects of composite types. 1408 // restoring information about saved objects of composite types.
1343 class Reader { 1409 class Reader {
1344 public: 1410 public:
1345 Reader(const uint8_t* buffer, int length, v8::Isolate* isolate) 1411 Reader(const uint8_t* buffer, int length, v8::Isolate* isolate, const Vector <BlobInfo>* blobInfo)
1346 : m_buffer(buffer) 1412 : m_buffer(buffer)
1347 , m_length(length) 1413 , m_length(length)
1348 , m_position(0) 1414 , m_position(0)
1349 , m_version(0) 1415 , m_version(0)
1350 , m_isolate(isolate) 1416 , m_isolate(isolate)
1417 , m_blobInfo(blobInfo)
1351 { 1418 {
1352 ASSERT(!(reinterpret_cast<size_t>(buffer) & 1)); 1419 ASSERT(!(reinterpret_cast<size_t>(buffer) & 1));
1353 ASSERT(length >= 0); 1420 ASSERT(length >= 0);
1354 } 1421 }
1355 1422
1356 bool isEof() const { return m_position >= m_length; } 1423 bool isEof() const { return m_position >= m_length; }
1357 1424
1358 bool read(v8::Handle<v8::Value>* value, CompositeCreator& creator) 1425 bool read(v8::Handle<v8::Value>* value, CompositeCreator& creator)
1359 { 1426 {
1360 SerializationTag tag; 1427 SerializationTag tag;
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after
1854 return false; 1921 return false;
1855 *value = v8::RegExp::New(pattern.As<v8::String>(), static_cast<v8::RegEx p::Flags>(flags)); 1922 *value = v8::RegExp::New(pattern.As<v8::String>(), static_cast<v8::RegEx p::Flags>(flags));
1856 return true; 1923 return true;
1857 } 1924 }
1858 1925
1859 bool readBlob(v8::Handle<v8::Value>* value) 1926 bool readBlob(v8::Handle<v8::Value>* value)
1860 { 1927 {
1861 String url; 1928 String url;
1862 String type; 1929 String type;
1863 uint64_t size; 1930 uint64_t size;
1864 if (!readWebCoreString(&url)) 1931 if (m_blobInfo) {
1865 return false; 1932 uint32_t index;
1866 if (!readWebCoreString(&type)) 1933 if (!doReadUint32(&index) || index >= m_blobInfo->size())
1867 return false; 1934 return false;
1868 if (!doReadUint64(&size)) 1935 const BlobInfo& info = (*m_blobInfo)[index];
1869 return false; 1936 url = info.url();
1870 PassRefPtr<Blob> blob = Blob::create(KURL(ParsedURLString, url), type, s ize); 1937 type = info.type();
1871 *value = toV8(blob, v8::Handle<v8::Object>(), m_isolate); 1938 size = info.size();
1939 } else {
1940 if (!readWebCoreString(&url))
1941 return false;
1942 if (!readWebCoreString(&type))
1943 return false;
1944 if (!doReadUint64(&size))
1945 return false;
1946 }
1947 RefPtr<Blob> blob = Blob::create(KURL(ParsedURLString, url), type, size) ;
1948 *value = toV8(blob.release(), v8::Handle<v8::Object>(), m_isolate);
1872 return true; 1949 return true;
1873 } 1950 }
1874 1951
1875 bool readDOMFileSystem(v8::Handle<v8::Value>* value) 1952 bool readDOMFileSystem(v8::Handle<v8::Value>* value)
1876 { 1953 {
1877 uint32_t type; 1954 uint32_t type;
1878 String name; 1955 String name;
1879 String url; 1956 String url;
1880 if (!doReadUint32(&type)) 1957 if (!doReadUint32(&type))
1881 return false; 1958 return false;
1882 if (!readWebCoreString(&name)) 1959 if (!readWebCoreString(&name))
1883 return false; 1960 return false;
1884 if (!readWebCoreString(&url)) 1961 if (!readWebCoreString(&url))
1885 return false; 1962 return false;
1886 RefPtr<DOMFileSystem> fs = DOMFileSystem::create(getScriptExecutionConte xt(), name, static_cast<WebCore::FileSystemType>(type), KURL(ParsedURLString, ur l)); 1963 RefPtr<DOMFileSystem> fs = DOMFileSystem::create(getScriptExecutionConte xt(), name, static_cast<WebCore::FileSystemType>(type), KURL(ParsedURLString, ur l));
1887 *value = toV8(fs.release(), v8::Handle<v8::Object>(), m_isolate); 1964 *value = toV8(fs.release(), v8::Handle<v8::Object>(), m_isolate);
1888 return true; 1965 return true;
1889 } 1966 }
1890 1967
1968 PassRefPtr<File> readSingleFile()
1969 {
1970 RefPtr<File> file;
1971 if (m_blobInfo) {
1972 uint32_t index;
1973 if (!doReadUint32(&index) || index >= m_blobInfo->size())
1974 return file;
1975 const BlobInfo& info = (*m_blobInfo)[index];
1976 file = File::create(info.filePath(), info.fileName(), KURL(ParsedURL String, info.url()), info.type(), info.lastModified(), info.size());
1977 return file;
1978 }
1979 String path;
1980 String url;
1981 String type;
1982 if (!readWebCoreString(&path))
1983 return file;
1984 if (!readWebCoreString(&url))
1985 return file;
1986 if (!readWebCoreString(&type))
1987 return file;
1988 return File::create(path, KURL(ParsedURLString, url), type);
1989 }
1990
1891 bool readFile(v8::Handle<v8::Value>* value) 1991 bool readFile(v8::Handle<v8::Value>* value)
1892 { 1992 {
1893 String path; 1993 RefPtr<File> file = readSingleFile();
1894 String url; 1994 if (!file.get())
1895 String type;
1896 if (!readWebCoreString(&path))
1897 return false; 1995 return false;
1898 if (!readWebCoreString(&url)) 1996
1899 return false; 1997 *value = toV8(file.release(), v8::Handle<v8::Object>(), m_isolate);
1900 if (!readWebCoreString(&type))
1901 return false;
1902 PassRefPtr<File> file = File::create(path, KURL(ParsedURLString, url), t ype);
1903 *value = toV8(file, v8::Handle<v8::Object>(), m_isolate);
1904 return true; 1998 return true;
1905 } 1999 }
1906 2000
1907 bool readFileList(v8::Handle<v8::Value>* value) 2001 bool readFileList(v8::Handle<v8::Value>* value)
1908 { 2002 {
1909 uint32_t length; 2003 uint32_t length;
1910 if (!doReadUint32(&length)) 2004 if (!doReadUint32(&length))
1911 return false; 2005 return false;
1912 PassRefPtr<FileList> fileList = FileList::create(); 2006 RefPtr<FileList> fileList = FileList::create();
1913 for (unsigned i = 0; i < length; ++i) { 2007 for (unsigned i = 0; i < length; ++i) {
1914 String path; 2008 RefPtr<File> file = readSingleFile();
1915 String urlString; 2009 if (!file.get())
1916 String type;
1917 if (!readWebCoreString(&path))
1918 return false; 2010 return false;
1919 if (!readWebCoreString(&urlString)) 2011 fileList->append(file.get());
1920 return false;
1921 if (!readWebCoreString(&type))
1922 return false;
1923 fileList->append(File::create(path, KURL(ParsedURLString, urlString) , type));
1924 } 2012 }
1925 *value = toV8(fileList, v8::Handle<v8::Object>(), m_isolate); 2013 *value = toV8(fileList.release(), v8::Handle<v8::Object>(), m_isolate);
1926 return true; 2014 return true;
1927 } 2015 }
1928 2016
1929 template<class T> 2017 template<class T>
1930 bool doReadUintHelper(T* value) 2018 bool doReadUintHelper(T* value)
1931 { 2019 {
1932 *value = 0; 2020 *value = 0;
1933 uint8_t currentByte; 2021 uint8_t currentByte;
1934 int shift = 0; 2022 int shift = 0;
1935 do { 2023 do {
(...skipping 24 matching lines...) Expand all
1960 for (unsigned i = 0; i < sizeof(double); ++i) 2048 for (unsigned i = 0; i < sizeof(double); ++i)
1961 numberAsByteArray[i] = m_buffer[m_position++]; 2049 numberAsByteArray[i] = m_buffer[m_position++];
1962 return true; 2050 return true;
1963 } 2051 }
1964 2052
1965 const uint8_t* m_buffer; 2053 const uint8_t* m_buffer;
1966 const unsigned m_length; 2054 const unsigned m_length;
1967 unsigned m_position; 2055 unsigned m_position;
1968 uint32_t m_version; 2056 uint32_t m_version;
1969 v8::Isolate* m_isolate; 2057 v8::Isolate* m_isolate;
2058 const Vector<BlobInfo>* m_blobInfo;
1970 }; 2059 };
1971 2060
1972 2061
1973 typedef Vector<WTF::ArrayBufferContents, 1> ArrayBufferContentsArray; 2062 typedef Vector<WTF::ArrayBufferContents, 1> ArrayBufferContentsArray;
1974 2063
1975 class Deserializer : public CompositeCreator { 2064 class Deserializer : public CompositeCreator {
1976 public: 2065 public:
1977 Deserializer(Reader& reader, MessagePortArray* messagePorts, ArrayBufferCont entsArray* arrayBufferContents) 2066 Deserializer(Reader& reader, MessagePortArray* messagePorts, ArrayBufferCont entsArray* arrayBufferContents)
1978 : m_reader(reader) 2067 : m_reader(reader)
1979 , m_transferredMessagePorts(messagePorts) 2068 , m_transferredMessagePorts(messagePorts)
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
2220 Vector<v8::Handle<v8::Value> > m_objectPool; 2309 Vector<v8::Handle<v8::Value> > m_objectPool;
2221 Vector<uint32_t> m_openCompositeReferenceStack; 2310 Vector<uint32_t> m_openCompositeReferenceStack;
2222 MessagePortArray* m_transferredMessagePorts; 2311 MessagePortArray* m_transferredMessagePorts;
2223 ArrayBufferContentsArray* m_arrayBufferContents; 2312 ArrayBufferContentsArray* m_arrayBufferContents;
2224 Vector<v8::Handle<v8::Object> > m_arrayBuffers; 2313 Vector<v8::Handle<v8::Object> > m_arrayBuffers;
2225 uint32_t m_version; 2314 uint32_t m_version;
2226 }; 2315 };
2227 2316
2228 } // namespace 2317 } // namespace
2229 2318
2319 PassRefPtr<SerializedScriptValue> SerializedScriptValue::create(v8::Handle<v8::V alue> value, Vector<BlobInfo>* blobInfo, bool& didThrow)
2320 {
2321 return create(value, 0, 0, blobInfo, didThrow, v8::Isolate::GetCurrent());
2322 }
2323
2230 PassRefPtr<SerializedScriptValue> SerializedScriptValue::create(v8::Handle<v8::V alue> value, MessagePortArray* messagePorts, ArrayBufferArray* arrayBuffers, boo l& didThrow, v8::Isolate* isolate) 2324 PassRefPtr<SerializedScriptValue> SerializedScriptValue::create(v8::Handle<v8::V alue> value, MessagePortArray* messagePorts, ArrayBufferArray* arrayBuffers, boo l& didThrow, v8::Isolate* isolate)
2231 { 2325 {
2232 return adoptRef(new SerializedScriptValue(value, messagePorts, arrayBuffers, didThrow, isolate)); 2326 return adoptRef(new SerializedScriptValue(value, messagePorts, arrayBuffers, 0, didThrow, isolate));
2327 }
2328
2329 PassRefPtr<SerializedScriptValue> SerializedScriptValue::create(v8::Handle<v8::V alue> value, MessagePortArray* messagePorts, ArrayBufferArray* arrayBuffers, Vec tor<BlobInfo>* blobInfo, bool& didThrow, v8::Isolate* isolate)
2330 {
2331 return adoptRef(new SerializedScriptValue(value, messagePorts, arrayBuffers, blobInfo, didThrow, isolate));
2233 } 2332 }
2234 2333
2235 PassRefPtr<SerializedScriptValue> SerializedScriptValue::create(v8::Handle<v8::V alue> value, v8::Isolate* isolate) 2334 PassRefPtr<SerializedScriptValue> SerializedScriptValue::create(v8::Handle<v8::V alue> value, v8::Isolate* isolate)
2236 { 2335 {
2237 bool didThrow; 2336 bool didThrow;
2238 return adoptRef(new SerializedScriptValue(value, 0, 0, didThrow, isolate)); 2337 return adoptRef(new SerializedScriptValue(value, 0, 0, 0, didThrow, isolate) );
2239 } 2338 }
2240 2339
2241 PassRefPtr<SerializedScriptValue> SerializedScriptValue::createAndSwallowExcepti ons(v8::Handle<v8::Value> value, v8::Isolate* isolate) 2340 PassRefPtr<SerializedScriptValue> SerializedScriptValue::createAndSwallowExcepti ons(v8::Handle<v8::Value> value, v8::Isolate* isolate)
2242 { 2341 {
2243 bool didThrow; 2342 bool didThrow;
2244 return adoptRef(new SerializedScriptValue(value, 0, 0, didThrow, isolate, Do NotThrowExceptions)); 2343 return adoptRef(new SerializedScriptValue(value, 0, 0, 0, didThrow, isolate, DoNotThrowExceptions));
2245 } 2344 }
2246 2345
2247 PassRefPtr<SerializedScriptValue> SerializedScriptValue::createFromWire(const St ring& data) 2346 PassRefPtr<SerializedScriptValue> SerializedScriptValue::createFromWire(const St ring& data)
2248 { 2347 {
2249 return adoptRef(new SerializedScriptValue(data)); 2348 return adoptRef(new SerializedScriptValue(data));
2250 } 2349 }
2251 2350
2252 PassRefPtr<SerializedScriptValue> SerializedScriptValue::createFromWireBytes(con st Vector<uint8_t>& data) 2351 PassRefPtr<SerializedScriptValue> SerializedScriptValue::createFromWireBytes(con st Vector<uint8_t>& data)
2253 { 2352 {
2254 // Decode wire data from big endian to host byte order. 2353 // Decode wire data from big endian to host byte order.
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
2420 return nullptr; 2519 return nullptr;
2421 } 2520 }
2422 2521
2423 neuterBinding(arrayBuffers[i].get()); 2522 neuterBinding(arrayBuffers[i].get());
2424 for (size_t j = 0; j < neuteredViews.size(); j++) 2523 for (size_t j = 0; j < neuteredViews.size(); j++)
2425 neuterBinding(neuteredViews[j].get()); 2524 neuterBinding(neuteredViews[j].get());
2426 } 2525 }
2427 return contents.release(); 2526 return contents.release();
2428 } 2527 }
2429 2528
2430 SerializedScriptValue::SerializedScriptValue(v8::Handle<v8::Value> value, Messag ePortArray* messagePorts, ArrayBufferArray* arrayBuffers, bool& didThrow, v8::Is olate* isolate, ExceptionPolicy policy) 2529 SerializedScriptValue::SerializedScriptValue(v8::Handle<v8::Value> value, Messag ePortArray* messagePorts, ArrayBufferArray* arrayBuffers, Vector<BlobInfo>* blob Info, bool& didThrow, v8::Isolate* isolate, ExceptionPolicy policy)
2431 : m_externallyAllocatedMemory(0) 2530 : m_blobInfo(blobInfo)
2531 , m_externallyAllocatedMemory(0)
2432 { 2532 {
2433 didThrow = false; 2533 didThrow = false;
2434 Writer writer(isolate); 2534 Writer writer(isolate);
2435 Serializer::Status status; 2535 Serializer::Status status;
2436 { 2536 {
2437 v8::TryCatch tryCatch; 2537 v8::TryCatch tryCatch;
2438 Serializer serializer(writer, messagePorts, arrayBuffers, m_blobURLs, tr yCatch, isolate); 2538 Serializer serializer(writer, messagePorts, arrayBuffers, m_blobInfo, tr yCatch, isolate);
2439 status = serializer.serialize(value); 2539 status = serializer.serialize(value);
2440 if (status == Serializer::JSException) { 2540 if (status == Serializer::JSException) {
2441 didThrow = true; 2541 didThrow = true;
2442 // If there was a JS exception thrown, re-throw it. 2542 // If there was a JS exception thrown, re-throw it.
2443 if (policy == ThrowExceptions) 2543 if (policy == ThrowExceptions)
2444 tryCatch.ReThrow(); 2544 tryCatch.ReThrow();
2445 return; 2545 return;
2446 } 2546 }
2447 } 2547 }
2448 switch (status) { 2548 switch (status) {
(...skipping 30 matching lines...) Expand all
2479 } 2579 }
2480 2580
2481 SerializedScriptValue::SerializedScriptValue(const String& wireData) 2581 SerializedScriptValue::SerializedScriptValue(const String& wireData)
2482 : m_externallyAllocatedMemory(0) 2582 : m_externallyAllocatedMemory(0)
2483 { 2583 {
2484 m_data = wireData.isolatedCopy(); 2584 m_data = wireData.isolatedCopy();
2485 } 2585 }
2486 2586
2487 v8::Handle<v8::Value> SerializedScriptValue::deserialize(MessagePortArray* messa gePorts) 2587 v8::Handle<v8::Value> SerializedScriptValue::deserialize(MessagePortArray* messa gePorts)
2488 { 2588 {
2489 return deserialize(v8::Isolate::GetCurrent(), messagePorts); 2589 return deserialize(v8::Isolate::GetCurrent(), messagePorts, 0);
2490 } 2590 }
2491 2591
2492 v8::Handle<v8::Value> SerializedScriptValue::deserialize(v8::Isolate* isolate, M essagePortArray* messagePorts) 2592 v8::Handle<v8::Value> SerializedScriptValue::deserialize(const Vector<BlobInfo>* blobInfo)
2593 {
2594 return deserialize(v8::Isolate::GetCurrent(), 0, blobInfo);
2595 }
2596
2597 v8::Handle<v8::Value> SerializedScriptValue::deserialize(v8::Isolate* isolate, M essagePortArray* messagePorts, const Vector<BlobInfo>* blobInfo)
2493 { 2598 {
2494 if (!m_data.impl()) 2599 if (!m_data.impl())
2495 return v8NullWithCheck(isolate); 2600 return v8NullWithCheck(isolate);
2496 COMPILE_ASSERT(sizeof(BufferValueType) == 2, BufferValueTypeIsTwoBytes); 2601 COMPILE_ASSERT(sizeof(BufferValueType) == 2, BufferValueTypeIsTwoBytes);
2497 m_data.ensure16Bit(); 2602 m_data.ensure16Bit();
2498 // FIXME: SerializedScriptValue shouldn't use String for its underlying 2603 // FIXME: SerializedScriptValue shouldn't use String for its underlying
2499 // storage. Instead, it should use SharedBuffer or Vector<uint8_t>. The 2604 // storage. Instead, it should use SharedBuffer or Vector<uint8_t>. The
2500 // information stored in m_data isn't even encoded in UTF-16. Instead, 2605 // information stored in m_data isn't even encoded in UTF-16. Instead,
2501 // unicode characters are encoded as UTF-8 with two code units per UChar. 2606 // unicode characters are encoded as UTF-8 with two code units per UChar.
2502 Reader reader(reinterpret_cast<const uint8_t*>(m_data.impl()->characters16() ), 2 * m_data.length(), isolate); 2607 Reader reader(reinterpret_cast<const uint8_t*>(m_data.impl()->characters16() ), 2 * m_data.length(), isolate, blobInfo);
2503 Deserializer deserializer(reader, messagePorts, m_arrayBufferContentsArray.g et()); 2608 Deserializer deserializer(reader, messagePorts, m_arrayBufferContentsArray.g et());
2504 2609
2505 // deserialize() can run arbitrary script (e.g., setters), which could resul t in |this| being destroyed. 2610 // deserialize() can run arbitrary script (e.g., setters), which could resul t in |this| being destroyed.
2506 // Holding a RefPtr ensures we are alive (along with our internal data) thro ughout the operation. 2611 // Holding a RefPtr ensures we are alive (along with our internal data) thro ughout the operation.
2507 RefPtr<SerializedScriptValue> protect(this); 2612 RefPtr<SerializedScriptValue> protect(this);
2508 return deserializer.deserialize(); 2613 return deserializer.deserialize();
2509 } 2614 }
2510 2615
2511 ScriptValue SerializedScriptValue::deserializeForInspector(ScriptState* scriptSt ate) 2616 ScriptValue SerializedScriptValue::deserializeForInspector(ScriptState* scriptSt ate)
2512 { 2617 {
(...skipping 21 matching lines...) Expand all
2534 v8::V8::AdjustAmountOfExternalAllocatedMemory(-m_externallyAllocatedMemo ry); 2639 v8::V8::AdjustAmountOfExternalAllocatedMemory(-m_externallyAllocatedMemo ry);
2535 } 2640 }
2536 } 2641 }
2537 2642
2538 uint32_t SerializedScriptValue::wireFormatVersion() 2643 uint32_t SerializedScriptValue::wireFormatVersion()
2539 { 2644 {
2540 return WebCore::wireFormatVersion; 2645 return WebCore::wireFormatVersion;
2541 } 2646 }
2542 2647
2543 } // namespace WebCore 2648 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698