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 29 matching lines...) Expand all Loading... |
40 #include "ExceptionCode.h" | 40 #include "ExceptionCode.h" |
41 #include "File.h" | 41 #include "File.h" |
42 #include "FileList.h" | 42 #include "FileList.h" |
43 #include "Float32Array.h" | 43 #include "Float32Array.h" |
44 #include "Float64Array.h" | 44 #include "Float64Array.h" |
45 #include "ImageData.h" | 45 #include "ImageData.h" |
46 #include "Int16Array.h" | 46 #include "Int16Array.h" |
47 #include "Int32Array.h" | 47 #include "Int32Array.h" |
48 #include "Int8Array.h" | 48 #include "Int8Array.h" |
49 #include "MessagePort.h" | 49 #include "MessagePort.h" |
| 50 #include "ScriptValueDeserializer.h" |
| 51 #include "ScriptValueSerializer.h" |
50 #include "SharedBuffer.h" | 52 #include "SharedBuffer.h" |
51 #include "Uint16Array.h" | 53 #include "Uint16Array.h" |
52 #include "Uint32Array.h" | 54 #include "Uint32Array.h" |
53 #include "Uint8Array.h" | 55 #include "Uint8Array.h" |
54 #include "V8ArrayBuffer.h" | 56 #include "V8ArrayBuffer.h" |
55 #include "V8ArrayBufferView.h" | 57 #include "V8ArrayBufferView.h" |
56 #include "V8Binding.h" | 58 #include "V8Binding.h" |
57 #include "V8Blob.h" | 59 #include "V8Blob.h" |
58 #include "V8DataView.h" | 60 #include "V8DataView.h" |
59 #include "V8File.h" | 61 #include "V8File.h" |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
260 value >>= 1; | 262 value >>= 1; |
261 return value; | 263 return value; |
262 } | 264 } |
263 | 265 |
264 private: | 266 private: |
265 ZigZag(); | 267 ZigZag(); |
266 }; | 268 }; |
267 | 269 |
268 // Writer is responsible for serializing primitive types and storing | 270 // Writer is responsible for serializing primitive types and storing |
269 // information used to reconstruct composite types. | 271 // information used to reconstruct composite types. |
270 class Writer { | 272 class Writer : public ScriptValueWriter { |
271 WTF_MAKE_NONCOPYABLE(Writer); | 273 WTF_MAKE_NONCOPYABLE(Writer); |
272 public: | 274 public: |
273 Writer() | 275 Writer() |
274 : m_position(0) | 276 : m_position(0) |
275 { | 277 { |
276 } | 278 } |
277 | 279 |
278 // Write functions for primitive types. | 280 // Write functions for primitive types. |
279 | 281 |
280 void writeUndefined() { append(UndefinedTag); } | 282 void writeUndefined() { append(UndefinedTag); } |
(...skipping 819 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1100 if (isHostObject(jsObject) || jsObject->IsCallable() || value->IsNat
iveError()) | 1102 if (isHostObject(jsObject) || jsObject->IsCallable() || value->IsNat
iveError()) |
1101 return handleError(DataCloneError, next); | 1103 return handleError(DataCloneError, next); |
1102 m_writer.writeGenerateFreshObject(); | 1104 m_writer.writeGenerateFreshObject(); |
1103 return push(newObjectState(jsObject, next)); | 1105 return push(newObjectState(jsObject, next)); |
1104 } else | 1106 } else |
1105 return handleError(DataCloneError, next); | 1107 return handleError(DataCloneError, next); |
1106 } | 1108 } |
1107 return 0; | 1109 return 0; |
1108 } | 1110 } |
1109 | 1111 |
1110 // Interface used by Reader to create objects of composite types. | |
1111 class CompositeCreator { | |
1112 public: | |
1113 virtual ~CompositeCreator() { } | |
1114 | |
1115 virtual bool consumeTopOfStack(v8::Handle<v8::Value>*) = 0; | |
1116 virtual uint32_t objectReferenceCount() = 0; | |
1117 virtual void pushObjectReference(const v8::Handle<v8::Value>&) = 0; | |
1118 virtual bool tryGetObjectFromObjectReference(uint32_t reference, v8::Handle<
v8::Value>*) = 0; | |
1119 virtual bool tryGetTransferredMessagePort(uint32_t index, v8::Handle<v8::Val
ue>*) = 0; | |
1120 virtual bool newArray(uint32_t length) = 0; | |
1121 virtual bool newObject() = 0; | |
1122 virtual bool completeArray(uint32_t length, v8::Handle<v8::Value>*) = 0; | |
1123 virtual bool completeObject(uint32_t numProperties, v8::Handle<v8::Value>*)
= 0; | |
1124 virtual bool completeSparseArray(uint32_t numProperties, uint32_t length, v8
::Handle<v8::Value>*) = 0; | |
1125 }; | |
1126 | |
1127 // Reader is responsible for deserializing primitive types and | 1112 // Reader is responsible for deserializing primitive types and |
1128 // restoring information about saved objects of composite types. | 1113 // restoring information about saved objects of composite types. |
1129 class Reader { | 1114 class Reader { |
1130 public: | 1115 public: |
1131 Reader(const uint8_t* buffer, int length) | 1116 Reader(const uint8_t* buffer, int length) |
1132 : m_buffer(buffer) | 1117 : m_buffer(buffer) |
1133 , m_length(length) | 1118 , m_length(length) |
1134 , m_position(0) | 1119 , m_position(0) |
1135 , m_version(0) | 1120 , m_version(0) |
1136 { | 1121 { |
1137 ASSERT(length >= 0); | 1122 ASSERT(length >= 0); |
1138 } | 1123 } |
1139 | 1124 |
| 1125 uint32_t version() const { return m_version; } |
| 1126 |
| 1127 bool read(ScriptValueDeserializer& deserializer) |
| 1128 { |
| 1129 if (!readVersion(m_version) || m_version > wireFormatVersion) |
| 1130 return false; |
| 1131 |
| 1132 while (!isEof()) { |
| 1133 SerializationTag tag; |
| 1134 if (!readTag(&tag)) |
| 1135 return false; |
| 1136 switch (tag) { |
| 1137 case ReferenceCountTag: { |
| 1138 if (m_version <= 0) |
| 1139 return false; |
| 1140 uint32_t referenceTableSize; |
| 1141 if (!doReadUint32(&referenceTableSize)) |
| 1142 return false; |
| 1143 // If this test fails, then the serializer and deserializer disa
gree about the assignment |
| 1144 // of object reference IDs. |
| 1145 if (referenceTableSize != deserializer.objectReferenceCount()) |
| 1146 return false; |
| 1147 break; |
| 1148 } |
| 1149 case InvalidTag: |
| 1150 return false; |
| 1151 case PaddingTag: |
| 1152 break; |
| 1153 case UndefinedTag: |
| 1154 if (!deserializer.pushUndefined()) |
| 1155 return false; |
| 1156 break; |
| 1157 case NullTag: |
| 1158 if (!deserializer.pushNull()) |
| 1159 return false; |
| 1160 break; |
| 1161 case TrueTag: |
| 1162 if (!deserializer.pushTrue()) |
| 1163 return false; |
| 1164 break; |
| 1165 case FalseTag: |
| 1166 if (!deserializer.pushFalse()) |
| 1167 return false; |
| 1168 break; |
| 1169 case TrueObjectTag: |
| 1170 if (!deserializer.pushTrueObject()) |
| 1171 return false; |
| 1172 deserializer.addReferenceForTop(); |
| 1173 break; |
| 1174 case FalseObjectTag: |
| 1175 if (!deserializer.pushFalseObject()) |
| 1176 return false; |
| 1177 deserializer.addReferenceForTop(); |
| 1178 break; |
| 1179 case StringTag: |
| 1180 if (!readString(deserializer)) |
| 1181 return false; |
| 1182 break; |
| 1183 case StringObjectTag: |
| 1184 if (!readStringObject(deserializer)) |
| 1185 return false; |
| 1186 break; |
| 1187 case Int32Tag: |
| 1188 if (!readInt32(deserializer)) |
| 1189 return false; |
| 1190 break; |
| 1191 case Uint32Tag: |
| 1192 if (!readUint32(deserializer)) |
| 1193 return false; |
| 1194 break; |
| 1195 case DateTag: |
| 1196 if (!readDate(deserializer)) |
| 1197 return false; |
| 1198 break; |
| 1199 case NumberTag: |
| 1200 if (!readNumber(deserializer)) |
| 1201 return false; |
| 1202 break; |
| 1203 case NumberObjectTag: |
| 1204 if (!readNumberObject(deserializer)) |
| 1205 return false; |
| 1206 break; |
| 1207 case BlobTag: |
| 1208 if (!readBlob(deserializer)) |
| 1209 return false; |
| 1210 break; |
| 1211 case FileTag: |
| 1212 if (!readFile(deserializer)) |
| 1213 return false; |
| 1214 break; |
| 1215 case FileListTag: |
| 1216 if (!readFileList(deserializer)) |
| 1217 return false; |
| 1218 break; |
| 1219 case ImageDataTag: |
| 1220 if (!readImageData(deserializer)) |
| 1221 return false; |
| 1222 break; |
| 1223 case ArrayTag: { |
| 1224 uint32_t length; |
| 1225 if (!doReadUint32(&length)) |
| 1226 return false; |
| 1227 if (!deserializer.pushArray(length)) |
| 1228 return false; |
| 1229 break; |
| 1230 } |
| 1231 case RegExpTag: |
| 1232 if (!readRegExp(deserializer)) |
| 1233 return false; |
| 1234 break; |
| 1235 case ObjectTag: { |
| 1236 uint32_t numProperties; |
| 1237 if (!doReadUint32(&numProperties)) |
| 1238 return false; |
| 1239 if (!deserializer.pushObject(numProperties)) |
| 1240 return false; |
| 1241 break; |
| 1242 } |
| 1243 case SparseArrayTag: { |
| 1244 uint32_t numProperties; |
| 1245 uint32_t length; |
| 1246 if (!doReadUint32(&numProperties)) |
| 1247 return false; |
| 1248 if (!doReadUint32(&length)) |
| 1249 return false; |
| 1250 if (!deserializer.pushSparseArray(numProperties, length)) |
| 1251 return false; |
| 1252 break; |
| 1253 } |
| 1254 case ArrayBufferViewTag: { |
| 1255 if (m_version <= 0) |
| 1256 return false; |
| 1257 if (!readArrayBufferView(deserializer)) |
| 1258 return false; |
| 1259 break; |
| 1260 } |
| 1261 case ArrayBufferTag: { |
| 1262 if (m_version <= 0) |
| 1263 return false; |
| 1264 if (!readArrayBuffer(deserializer)) |
| 1265 return false; |
| 1266 break; |
| 1267 } |
| 1268 case GenerateFreshObjectTag: { |
| 1269 if (m_version <= 0) |
| 1270 return false; |
| 1271 if (!deserializer.newObject()) |
| 1272 return false; |
| 1273 break; |
| 1274 } |
| 1275 case GenerateFreshArrayTag: { |
| 1276 if (m_version <= 0) |
| 1277 return false; |
| 1278 uint32_t length; |
| 1279 if (!doReadUint32(&length)) |
| 1280 return false; |
| 1281 if (!deserializer.newArray(length)) |
| 1282 return false; |
| 1283 break; |
| 1284 } |
| 1285 // FIXMEDART: uncomment this. |
| 1286 /* |
| 1287 case MessagePortTag: { |
| 1288 if (m_version <= 0) |
| 1289 return false; |
| 1290 uint32_t index; |
| 1291 if (!doReadUint32(&index)) |
| 1292 return false; |
| 1293 if (!deserializer.tryGetTransferredMessagePort(index, value)) |
| 1294 return false; |
| 1295 break; |
| 1296 } |
| 1297 */ |
| 1298 case ObjectReferenceTag: { |
| 1299 if (m_version <= 0) |
| 1300 return false; |
| 1301 uint32_t reference; |
| 1302 if (!doReadUint32(&reference)) |
| 1303 return false; |
| 1304 if (!deserializer.tryGetObjectFromObjectReference(reference)) |
| 1305 return false; |
| 1306 break; |
| 1307 } |
| 1308 default: |
| 1309 return false; |
| 1310 } |
| 1311 } |
| 1312 |
| 1313 return true; |
| 1314 } |
| 1315 |
| 1316 private: |
1140 bool isEof() const { return m_position >= m_length; } | 1317 bool isEof() const { return m_position >= m_length; } |
1141 | 1318 |
1142 bool read(v8::Handle<v8::Value>* value, CompositeCreator& creator) | |
1143 { | |
1144 SerializationTag tag; | |
1145 if (!readTag(&tag)) | |
1146 return false; | |
1147 switch (tag) { | |
1148 case ReferenceCountTag: { | |
1149 if (m_version <= 0) | |
1150 return false; | |
1151 uint32_t referenceTableSize; | |
1152 if (!doReadUint32(&referenceTableSize)) | |
1153 return false; | |
1154 // If this test fails, then the serializer and deserializer disagree
about the assignment | |
1155 // of object reference IDs. On the deserialization side, this means
there are too many or too few | |
1156 // calls to pushObjectReference. | |
1157 if (referenceTableSize != creator.objectReferenceCount()) | |
1158 return false; | |
1159 return true; | |
1160 } | |
1161 case InvalidTag: | |
1162 return false; | |
1163 case PaddingTag: | |
1164 return true; | |
1165 case UndefinedTag: | |
1166 *value = v8::Undefined(); | |
1167 break; | |
1168 case NullTag: | |
1169 *value = v8::Null(); | |
1170 break; | |
1171 case TrueTag: | |
1172 *value = v8::True(); | |
1173 break; | |
1174 case FalseTag: | |
1175 *value = v8::False(); | |
1176 break; | |
1177 case TrueObjectTag: | |
1178 *value = v8::BooleanObject::New(true); | |
1179 creator.pushObjectReference(*value); | |
1180 break; | |
1181 case FalseObjectTag: | |
1182 *value = v8::BooleanObject::New(false); | |
1183 creator.pushObjectReference(*value); | |
1184 break; | |
1185 case StringTag: | |
1186 if (!readString(value)) | |
1187 return false; | |
1188 break; | |
1189 case StringObjectTag: | |
1190 if (!readStringObject(value)) | |
1191 return false; | |
1192 creator.pushObjectReference(*value); | |
1193 break; | |
1194 case Int32Tag: | |
1195 if (!readInt32(value)) | |
1196 return false; | |
1197 break; | |
1198 case Uint32Tag: | |
1199 if (!readUint32(value)) | |
1200 return false; | |
1201 break; | |
1202 case DateTag: | |
1203 if (!readDate(value)) | |
1204 return false; | |
1205 creator.pushObjectReference(*value); | |
1206 break; | |
1207 case NumberTag: | |
1208 if (!readNumber(value)) | |
1209 return false; | |
1210 break; | |
1211 case NumberObjectTag: | |
1212 if (!readNumberObject(value)) | |
1213 return false; | |
1214 creator.pushObjectReference(*value); | |
1215 break; | |
1216 case BlobTag: | |
1217 if (!readBlob(value)) | |
1218 return false; | |
1219 creator.pushObjectReference(*value); | |
1220 break; | |
1221 case FileTag: | |
1222 if (!readFile(value)) | |
1223 return false; | |
1224 creator.pushObjectReference(*value); | |
1225 break; | |
1226 case FileListTag: | |
1227 if (!readFileList(value)) | |
1228 return false; | |
1229 creator.pushObjectReference(*value); | |
1230 break; | |
1231 case ImageDataTag: | |
1232 if (!readImageData(value)) | |
1233 return false; | |
1234 creator.pushObjectReference(*value); | |
1235 break; | |
1236 | |
1237 case ArrayTag: { | |
1238 uint32_t length; | |
1239 if (!doReadUint32(&length)) | |
1240 return false; | |
1241 if (!creator.completeArray(length, value)) | |
1242 return false; | |
1243 break; | |
1244 } | |
1245 case RegExpTag: | |
1246 if (!readRegExp(value)) | |
1247 return false; | |
1248 creator.pushObjectReference(*value); | |
1249 break; | |
1250 case ObjectTag: { | |
1251 uint32_t numProperties; | |
1252 if (!doReadUint32(&numProperties)) | |
1253 return false; | |
1254 if (!creator.completeObject(numProperties, value)) | |
1255 return false; | |
1256 break; | |
1257 } | |
1258 case SparseArrayTag: { | |
1259 uint32_t numProperties; | |
1260 uint32_t length; | |
1261 if (!doReadUint32(&numProperties)) | |
1262 return false; | |
1263 if (!doReadUint32(&length)) | |
1264 return false; | |
1265 if (!creator.completeSparseArray(numProperties, length, value)) | |
1266 return false; | |
1267 break; | |
1268 } | |
1269 case ArrayBufferViewTag: { | |
1270 if (m_version <= 0) | |
1271 return false; | |
1272 if (!readArrayBufferView(value, creator)) | |
1273 return false; | |
1274 creator.pushObjectReference(*value); | |
1275 break; | |
1276 } | |
1277 case ArrayBufferTag: { | |
1278 if (m_version <= 0) | |
1279 return false; | |
1280 if (!readArrayBuffer(value)) | |
1281 return false; | |
1282 creator.pushObjectReference(*value); | |
1283 break; | |
1284 } | |
1285 case GenerateFreshObjectTag: { | |
1286 if (m_version <= 0) | |
1287 return false; | |
1288 if (!creator.newObject()) | |
1289 return false; | |
1290 return true; | |
1291 } | |
1292 case GenerateFreshArrayTag: { | |
1293 if (m_version <= 0) | |
1294 return false; | |
1295 uint32_t length; | |
1296 if (!doReadUint32(&length)) | |
1297 return false; | |
1298 if (!creator.newArray(length)) | |
1299 return false; | |
1300 return true; | |
1301 } | |
1302 case MessagePortTag: { | |
1303 if (m_version <= 0) | |
1304 return false; | |
1305 uint32_t index; | |
1306 if (!doReadUint32(&index)) | |
1307 return false; | |
1308 if (!creator.tryGetTransferredMessagePort(index, value)) | |
1309 return false; | |
1310 break; | |
1311 } | |
1312 case ObjectReferenceTag: { | |
1313 if (m_version <= 0) | |
1314 return false; | |
1315 uint32_t reference; | |
1316 if (!doReadUint32(&reference)) | |
1317 return false; | |
1318 if (!creator.tryGetObjectFromObjectReference(reference, value)) | |
1319 return false; | |
1320 break; | |
1321 } | |
1322 default: | |
1323 return false; | |
1324 } | |
1325 return !value->IsEmpty(); | |
1326 } | |
1327 | |
1328 bool readVersion(uint32_t& version) | 1319 bool readVersion(uint32_t& version) |
1329 { | 1320 { |
1330 SerializationTag tag; | 1321 SerializationTag tag; |
1331 if (!readTag(&tag)) { | 1322 if (!readTag(&tag)) { |
1332 // This is a nullary buffer. We're still version 0. | 1323 // This is a nullary buffer. We're still version 0. |
1333 version = 0; | 1324 version = 0; |
1334 return true; | 1325 return true; |
1335 } | 1326 } |
1336 if (tag != VersionTag) { | 1327 if (tag != VersionTag) { |
1337 // Versions of the format past 0 start with the version tag. | 1328 // Versions of the format past 0 start with the version tag. |
1338 version = 0; | 1329 version = 0; |
1339 // Put back the tag. | 1330 // Put back the tag. |
1340 undoReadTag(); | 1331 undoReadTag(); |
1341 return true; | 1332 return true; |
1342 } | 1333 } |
1343 // Version-bearing messages are obligated to finish the version tag. | 1334 // Version-bearing messages are obligated to finish the version tag. |
1344 return doReadUint32(&version); | 1335 return doReadUint32(&version); |
1345 } | 1336 } |
1346 | 1337 |
1347 void setVersion(uint32_t version) | |
1348 { | |
1349 m_version = version; | |
1350 } | |
1351 | |
1352 private: | |
1353 bool readTag(SerializationTag* tag) | 1338 bool readTag(SerializationTag* tag) |
1354 { | 1339 { |
1355 if (m_position >= m_length) | 1340 if (m_position >= m_length) |
1356 return false; | 1341 return false; |
1357 *tag = static_cast<SerializationTag>(m_buffer[m_position++]); | 1342 *tag = static_cast<SerializationTag>(m_buffer[m_position++]); |
1358 return true; | 1343 return true; |
1359 } | 1344 } |
1360 | 1345 |
1361 void undoReadTag() | 1346 void undoReadTag() |
1362 { | 1347 { |
1363 if (m_position > 0) | 1348 if (m_position > 0) |
1364 --m_position; | 1349 --m_position; |
1365 } | 1350 } |
1366 | 1351 |
1367 bool readArrayBufferViewSubTag(ArrayBufferViewSubTag* tag) | 1352 bool readArrayBufferViewSubTag(ArrayBufferViewSubTag* tag) |
1368 { | 1353 { |
1369 if (m_position >= m_length) | 1354 if (m_position >= m_length) |
1370 return false; | 1355 return false; |
1371 *tag = static_cast<ArrayBufferViewSubTag>(m_buffer[m_position++]); | 1356 *tag = static_cast<ArrayBufferViewSubTag>(m_buffer[m_position++]); |
1372 return true; | 1357 return true; |
1373 } | 1358 } |
1374 | 1359 |
1375 bool readString(v8::Handle<v8::Value>* value) | 1360 bool readString(ScriptValueDeserializer& deserializer) |
1376 { | 1361 { |
1377 uint32_t length; | 1362 uint32_t length; |
1378 if (!doReadUint32(&length)) | 1363 if (!doReadUint32(&length)) |
1379 return false; | 1364 return false; |
1380 if (m_position + length > m_length) | 1365 if (m_position + length > m_length) |
1381 return false; | 1366 return false; |
1382 *value = v8::String::New(reinterpret_cast<const char*>(m_buffer + m_posi
tion), length); | 1367 const char* data = reinterpret_cast<const char*>(m_buffer + m_position); |
1383 m_position += length; | 1368 m_position += length; |
| 1369 return deserializer.pushScriptString(data, length); |
| 1370 } |
| 1371 |
| 1372 bool readStringObject(ScriptValueDeserializer& deserializer) |
| 1373 { |
| 1374 if (!readString(deserializer)) |
| 1375 return false; |
| 1376 if (!deserializer.pushScriptStringObject()) |
| 1377 return false; |
| 1378 deserializer.addReferenceForTop(); |
1384 return true; | 1379 return true; |
1385 } | 1380 } |
1386 | 1381 |
1387 bool readStringObject(v8::Handle<v8::Value>* value) | |
1388 { | |
1389 v8::Handle<v8::Value> stringValue; | |
1390 if (!readString(&stringValue) || !stringValue->IsString()) | |
1391 return false; | |
1392 *value = v8::StringObject::New(stringValue.As<v8::String>()); | |
1393 return true; | |
1394 } | |
1395 | |
1396 bool readWebCoreString(String* string) | 1382 bool readWebCoreString(String* string) |
1397 { | 1383 { |
1398 uint32_t length; | 1384 uint32_t length; |
1399 if (!doReadUint32(&length)) | 1385 if (!doReadUint32(&length)) |
1400 return false; | 1386 return false; |
1401 if (m_position + length > m_length) | 1387 if (m_position + length > m_length) |
1402 return false; | 1388 return false; |
1403 *string = String::fromUTF8(reinterpret_cast<const char*>(m_buffer + m_po
sition), length); | 1389 *string = String::fromUTF8(reinterpret_cast<const char*>(m_buffer + m_po
sition), length); |
1404 m_position += length; | 1390 m_position += length; |
1405 return true; | 1391 return true; |
1406 } | 1392 } |
1407 | 1393 |
1408 bool readInt32(v8::Handle<v8::Value>* value) | 1394 bool readInt32(ScriptValueDeserializer& deserializer) |
1409 { | 1395 { |
1410 uint32_t rawValue; | 1396 uint32_t rawValue; |
1411 if (!doReadUint32(&rawValue)) | 1397 if (!doReadUint32(&rawValue)) |
1412 return false; | 1398 return false; |
1413 *value = v8::Integer::New(static_cast<int32_t>(ZigZag::decode(rawValue))
); | 1399 return deserializer.pushInt32(static_cast<int32_t>(ZigZag::decode(rawVal
ue))); |
1414 return true; | |
1415 } | 1400 } |
1416 | 1401 |
1417 bool readUint32(v8::Handle<v8::Value>* value) | 1402 bool readUint32(ScriptValueDeserializer& deserializer) |
1418 { | 1403 { |
1419 uint32_t rawValue; | 1404 uint32_t rawValue; |
1420 if (!doReadUint32(&rawValue)) | 1405 if (!doReadUint32(&rawValue)) |
1421 return false; | 1406 return false; |
1422 *value = v8::Integer::NewFromUnsigned(rawValue); | 1407 return deserializer.pushUInt32(rawValue); |
1423 return true; | |
1424 } | 1408 } |
1425 | 1409 |
1426 bool readDate(v8::Handle<v8::Value>* value) | 1410 bool readDate(ScriptValueDeserializer& deserializer) |
1427 { | 1411 { |
1428 double numberValue; | 1412 double numberValue; |
1429 if (!doReadNumber(&numberValue)) | 1413 if (!doReadNumber(&numberValue)) |
1430 return false; | 1414 return false; |
1431 *value = v8::Date::New(numberValue); | 1415 if (!deserializer.pushDate(numberValue)) |
| 1416 return false; |
| 1417 deserializer.addReferenceForTop(); |
1432 return true; | 1418 return true; |
1433 } | 1419 } |
1434 | 1420 |
1435 bool readNumber(v8::Handle<v8::Value>* value) | 1421 bool readNumber(ScriptValueDeserializer& deserializer) |
1436 { | 1422 { |
1437 double number; | 1423 double number; |
1438 if (!doReadNumber(&number)) | 1424 if (!doReadNumber(&number)) |
1439 return false; | 1425 return false; |
1440 *value = v8::Number::New(number); | 1426 return deserializer.pushNumber(number); |
1441 return true; | |
1442 } | 1427 } |
1443 | 1428 |
1444 bool readNumberObject(v8::Handle<v8::Value>* value) | 1429 bool readNumberObject(ScriptValueDeserializer& deserializer) |
1445 { | 1430 { |
1446 double number; | 1431 double number; |
1447 if (!doReadNumber(&number)) | 1432 if (!doReadNumber(&number)) |
1448 return false; | 1433 return false; |
1449 *value = v8::NumberObject::New(number); | 1434 if (!deserializer.pushNumberObject(number)) |
| 1435 return false; |
| 1436 deserializer.addReferenceForTop(); |
1450 return true; | 1437 return true; |
1451 } | 1438 } |
1452 | 1439 |
1453 bool readImageData(v8::Handle<v8::Value>* value) | 1440 bool readImageData(ScriptValueDeserializer& deserializer) |
1454 { | 1441 { |
1455 uint32_t width; | 1442 uint32_t width; |
1456 uint32_t height; | 1443 uint32_t height; |
1457 uint32_t pixelDataLength; | 1444 uint32_t pixelDataLength; |
1458 if (!doReadUint32(&width)) | 1445 if (!doReadUint32(&width)) |
1459 return false; | 1446 return false; |
1460 if (!doReadUint32(&height)) | 1447 if (!doReadUint32(&height)) |
1461 return false; | 1448 return false; |
1462 if (!doReadUint32(&pixelDataLength)) | 1449 if (!doReadUint32(&pixelDataLength)) |
1463 return false; | 1450 return false; |
1464 if (m_position + pixelDataLength > m_length) | 1451 if (m_position + pixelDataLength > m_length) |
1465 return false; | 1452 return false; |
1466 RefPtr<ImageData> imageData = ImageData::create(IntSize(width, height)); | 1453 RefPtr<ImageData> imageData = ImageData::create(IntSize(width, height)); |
1467 WTF::ByteArray* pixelArray = imageData->data()->data(); | 1454 WTF::ByteArray* pixelArray = imageData->data()->data(); |
1468 ASSERT(pixelArray); | 1455 ASSERT(pixelArray); |
1469 ASSERT(pixelArray->length() >= pixelDataLength); | 1456 ASSERT(pixelArray->length() >= pixelDataLength); |
1470 memcpy(pixelArray->data(), m_buffer + m_position, pixelDataLength); | 1457 memcpy(pixelArray->data(), m_buffer + m_position, pixelDataLength); |
1471 m_position += pixelDataLength; | 1458 m_position += pixelDataLength; |
1472 *value = toV8(imageData.release()); | 1459 if (!deserializer.pushImageData(imageData)) |
| 1460 return false; |
| 1461 deserializer.addReferenceForTop(); |
1473 return true; | 1462 return true; |
1474 } | 1463 } |
1475 | 1464 |
1476 PassRefPtr<ArrayBuffer> doReadArrayBuffer() | 1465 PassRefPtr<ArrayBuffer> doReadArrayBuffer() |
1477 { | 1466 { |
1478 uint32_t byteLength; | 1467 uint32_t byteLength; |
1479 if (!doReadUint32(&byteLength)) | 1468 if (!doReadUint32(&byteLength)) |
1480 return 0; | 1469 return 0; |
1481 if (m_position + byteLength > m_length) | 1470 if (m_position + byteLength > m_length) |
1482 return 0; | 1471 return 0; |
1483 const void* bufferStart = m_buffer + m_position; | 1472 const void* bufferStart = m_buffer + m_position; |
1484 RefPtr<ArrayBuffer> arrayBuffer = ArrayBuffer::create(bufferStart, byteL
ength); | 1473 RefPtr<ArrayBuffer> arrayBuffer = ArrayBuffer::create(bufferStart, byteL
ength); |
1485 m_position += byteLength; | 1474 m_position += byteLength; |
1486 return arrayBuffer.release(); | 1475 return arrayBuffer.release(); |
1487 } | 1476 } |
1488 | 1477 |
1489 bool readArrayBuffer(v8::Handle<v8::Value>* value) | 1478 bool readArrayBuffer(ScriptValueDeserializer& deserializer) |
1490 { | 1479 { |
1491 RefPtr<ArrayBuffer> arrayBuffer = doReadArrayBuffer(); | 1480 RefPtr<ArrayBuffer> arrayBuffer = doReadArrayBuffer(); |
1492 if (!arrayBuffer) | 1481 if (!arrayBuffer) |
1493 return false; | 1482 return false; |
1494 *value = toV8(arrayBuffer.release()); | 1483 if (!deserializer.pushArrayBuffer(arrayBuffer)) |
| 1484 return false; |
| 1485 deserializer.addReferenceForTop(); |
1495 return true; | 1486 return true; |
1496 } | 1487 } |
1497 | 1488 |
1498 bool readArrayBufferView(v8::Handle<v8::Value>* value, CompositeCreator& cre
ator) | 1489 bool readArrayBufferView(ScriptValueDeserializer& deserializer) |
1499 { | 1490 { |
1500 ArrayBufferViewSubTag subTag; | 1491 ArrayBufferViewSubTag subTag; |
1501 uint32_t byteOffset; | 1492 uint32_t byteOffset; |
1502 uint32_t byteLength; | 1493 uint32_t byteLength; |
1503 RefPtr<ArrayBuffer> arrayBuffer; | 1494 RefPtr<ArrayBuffer> arrayBuffer; |
1504 v8::Handle<v8::Value> arrayBufferV8Value; | |
1505 if (!readArrayBufferViewSubTag(&subTag)) | 1495 if (!readArrayBufferViewSubTag(&subTag)) |
1506 return false; | 1496 return false; |
1507 if (!doReadUint32(&byteOffset)) | 1497 if (!doReadUint32(&byteOffset)) |
1508 return false; | 1498 return false; |
1509 if (!doReadUint32(&byteLength)) | 1499 if (!doReadUint32(&byteLength)) |
1510 return false; | 1500 return false; |
1511 if (!creator.consumeTopOfStack(&arrayBufferV8Value)) | |
1512 return false; | |
1513 arrayBuffer = V8ArrayBuffer::toNative(arrayBufferV8Value.As<v8::Object>(
)); | |
1514 if (!arrayBuffer) | |
1515 return false; | |
1516 switch (subTag) { | 1501 switch (subTag) { |
1517 case ByteArrayTag: | 1502 case ByteArrayTag: |
1518 *value = toV8(Int8Array::create(arrayBuffer.release(), byteOffset, b
yteLength)); | 1503 if (!deserializer.pushInt8Array(byteOffset, byteLength)) |
1519 break; | 1504 return false; |
| 1505 deserializer.addReferenceForTop(); |
| 1506 return true; |
1520 case UnsignedByteArrayTag: | 1507 case UnsignedByteArrayTag: |
1521 *value = toV8(Uint8Array::create(arrayBuffer.release(), byteOffset,
byteLength)); | 1508 return deserializer.pushUint8Array(byteOffset, byteLength); |
1522 break; | |
1523 case ShortArrayTag: { | 1509 case ShortArrayTag: { |
1524 uint32_t shortLength = byteLength / sizeof(int16_t); | 1510 uint32_t shortLength = byteLength / sizeof(int16_t); |
1525 if (shortLength * sizeof(int16_t) != byteLength) | 1511 if (shortLength * sizeof(int16_t) != byteLength) |
1526 return false; | 1512 return false; |
1527 *value = toV8(Int16Array::create(arrayBuffer.release(), byteOffset,
shortLength)); | 1513 if (!deserializer.pushInt16Array(byteOffset, byteLength)) |
1528 break; | 1514 return false; |
| 1515 deserializer.addReferenceForTop(); |
| 1516 return true; |
1529 } | 1517 } |
1530 case UnsignedShortArrayTag: { | 1518 case UnsignedShortArrayTag: { |
1531 uint32_t shortLength = byteLength / sizeof(uint16_t); | 1519 uint32_t shortLength = byteLength / sizeof(uint16_t); |
1532 if (shortLength * sizeof(uint16_t) != byteLength) | 1520 if (shortLength * sizeof(uint16_t) != byteLength) |
1533 return false; | 1521 return false; |
1534 *value = toV8(Uint16Array::create(arrayBuffer.release(), byteOffset,
shortLength)); | 1522 if (!deserializer.pushUint16Array(byteOffset, byteLength)) |
1535 break; | 1523 return false; |
| 1524 deserializer.addReferenceForTop(); |
| 1525 return true; |
1536 } | 1526 } |
1537 case IntArrayTag: { | 1527 case IntArrayTag: { |
1538 uint32_t intLength = byteLength / sizeof(int32_t); | 1528 uint32_t intLength = byteLength / sizeof(int32_t); |
1539 if (intLength * sizeof(int32_t) != byteLength) | 1529 if (intLength * sizeof(int32_t) != byteLength) |
1540 return false; | 1530 return false; |
1541 *value = toV8(Int32Array::create(arrayBuffer.release(), byteOffset,
intLength)); | 1531 if (!deserializer.pushInt32Array(byteOffset, byteLength)) |
1542 break; | 1532 return false; |
| 1533 deserializer.addReferenceForTop(); |
| 1534 return true; |
1543 } | 1535 } |
1544 case UnsignedIntArrayTag: { | 1536 case UnsignedIntArrayTag: { |
1545 uint32_t intLength = byteLength / sizeof(uint32_t); | 1537 uint32_t intLength = byteLength / sizeof(uint32_t); |
1546 if (intLength * sizeof(uint32_t) != byteLength) | 1538 if (intLength * sizeof(uint32_t) != byteLength) |
1547 return false; | 1539 return false; |
1548 *value = toV8(Uint32Array::create(arrayBuffer.release(), byteOffset,
intLength)); | 1540 if (!deserializer.pushUint32Array(byteOffset, byteLength)) |
1549 break; | 1541 return false; |
| 1542 deserializer.addReferenceForTop(); |
| 1543 return true; |
1550 } | 1544 } |
1551 case FloatArrayTag: { | 1545 case FloatArrayTag: { |
1552 uint32_t floatLength = byteLength / sizeof(float); | 1546 uint32_t floatLength = byteLength / sizeof(float); |
1553 if (floatLength * sizeof(float) != byteLength) | 1547 if (floatLength * sizeof(float) != byteLength) |
1554 return false; | 1548 return false; |
1555 *value = toV8(Float32Array::create(arrayBuffer.release(), byteOffset
, floatLength)); | 1549 if (!deserializer.pushFloat32Array(byteOffset, byteLength)) |
1556 break; | 1550 return false; |
| 1551 deserializer.addReferenceForTop(); |
| 1552 return true; |
1557 } | 1553 } |
1558 case DoubleArrayTag: { | 1554 case DoubleArrayTag: { |
1559 uint32_t floatLength = byteLength / sizeof(double); | 1555 uint32_t floatLength = byteLength / sizeof(double); |
1560 if (floatLength * sizeof(double) != byteLength) | 1556 if (floatLength * sizeof(double) != byteLength) |
1561 return false; | 1557 return false; |
1562 *value = toV8(Float64Array::create(arrayBuffer.release(), byteOffset
, floatLength)); | 1558 if (!deserializer.pushFloat64Array(byteOffset, byteLength)) |
1563 break; | 1559 return false; |
| 1560 deserializer.addReferenceForTop(); |
| 1561 return true; |
1564 } | 1562 } |
1565 case DataViewTag: | 1563 case DataViewTag: |
1566 *value = toV8(DataView::create(arrayBuffer.release(), byteOffset, by
teLength)); | 1564 if (!deserializer.pushDataView(byteOffset, byteLength)) |
1567 break; | 1565 return false; |
| 1566 deserializer.addReferenceForTop(); |
| 1567 return true; |
1568 default: | 1568 default: |
1569 return false; | 1569 return false; |
1570 } | 1570 } |
1571 // The various *Array::create() methods will return null if the range th
e view expects is | |
1572 // mismatched with the range the buffer can provide or if the byte offse
t is not aligned | |
1573 // to the size of the element type. | |
1574 return !value->IsEmpty(); | |
1575 } | 1571 } |
1576 | 1572 |
1577 bool readRegExp(v8::Handle<v8::Value>* value) | 1573 bool readRegExp(ScriptValueDeserializer& deserializer) |
1578 { | 1574 { |
1579 v8::Handle<v8::Value> pattern; | 1575 if (!readString(deserializer)) |
1580 if (!readString(&pattern)) | |
1581 return false; | 1576 return false; |
1582 uint32_t flags; | 1577 uint32_t flags; |
1583 if (!doReadUint32(&flags)) | 1578 if (!doReadUint32(&flags)) |
1584 return false; | 1579 return false; |
1585 *value = v8::RegExp::New(pattern.As<v8::String>(), static_cast<v8::RegEx
p::Flags>(flags)); | 1580 if (!deserializer.pushRegExp(flags)) |
| 1581 return false; |
| 1582 deserializer.addReferenceForTop(); |
1586 return true; | 1583 return true; |
1587 } | 1584 } |
1588 | 1585 |
1589 bool readBlob(v8::Handle<v8::Value>* value) | 1586 bool readBlob(ScriptValueDeserializer& deserializer) |
1590 { | 1587 { |
1591 String url; | 1588 String url; |
1592 String type; | 1589 String type; |
1593 uint64_t size; | 1590 uint64_t size; |
1594 if (!readWebCoreString(&url)) | 1591 if (!readWebCoreString(&url)) |
1595 return false; | 1592 return false; |
1596 if (!readWebCoreString(&type)) | 1593 if (!readWebCoreString(&type)) |
1597 return false; | 1594 return false; |
1598 if (!doReadUint64(&size)) | 1595 if (!doReadUint64(&size)) |
1599 return false; | 1596 return false; |
1600 PassRefPtr<Blob> blob = Blob::create(KURL(ParsedURLString, url), type, s
ize); | 1597 if (!deserializer.pushBlob(Blob::create(KURL(ParsedURLString, url), type
, size))) |
1601 *value = toV8(blob); | 1598 return false; |
| 1599 deserializer.addReferenceForTop(); |
1602 return true; | 1600 return true; |
1603 } | 1601 } |
1604 | 1602 |
1605 bool readFile(v8::Handle<v8::Value>* value) | 1603 bool readFile(ScriptValueDeserializer& deserializer) |
1606 { | 1604 { |
1607 String path; | 1605 String path; |
1608 String url; | 1606 String url; |
1609 String type; | 1607 String type; |
1610 if (!readWebCoreString(&path)) | 1608 if (!readWebCoreString(&path)) |
1611 return false; | 1609 return false; |
1612 if (!readWebCoreString(&url)) | 1610 if (!readWebCoreString(&url)) |
1613 return false; | 1611 return false; |
1614 if (!readWebCoreString(&type)) | 1612 if (!readWebCoreString(&type)) |
1615 return false; | 1613 return false; |
1616 PassRefPtr<File> file = File::create(path, KURL(ParsedURLString, url), t
ype); | 1614 if (!deserializer.pushFile(File::create(path, KURL(ParsedURLString, url)
, type))) |
1617 *value = toV8(file); | 1615 return false; |
| 1616 deserializer.addReferenceForTop(); |
1618 return true; | 1617 return true; |
1619 } | 1618 } |
1620 | 1619 |
1621 bool readFileList(v8::Handle<v8::Value>* value) | 1620 bool readFileList(ScriptValueDeserializer& deserializer) |
1622 { | 1621 { |
1623 uint32_t length; | 1622 uint32_t length; |
1624 if (!doReadUint32(&length)) | 1623 if (!doReadUint32(&length)) |
1625 return false; | 1624 return false; |
1626 PassRefPtr<FileList> fileList = FileList::create(); | 1625 RefPtr<FileList> fileList = FileList::create(); |
1627 for (unsigned i = 0; i < length; ++i) { | 1626 for (unsigned i = 0; i < length; ++i) { |
1628 String path; | 1627 String path; |
1629 String urlString; | 1628 String urlString; |
1630 String type; | 1629 String type; |
1631 if (!readWebCoreString(&path)) | 1630 if (!readWebCoreString(&path)) |
1632 return false; | 1631 return false; |
1633 if (!readWebCoreString(&urlString)) | 1632 if (!readWebCoreString(&urlString)) |
1634 return false; | 1633 return false; |
1635 if (!readWebCoreString(&type)) | 1634 if (!readWebCoreString(&type)) |
1636 return false; | 1635 return false; |
1637 fileList->append(File::create(path, KURL(ParsedURLString, urlString)
, type)); | 1636 fileList->append(File::create(path, KURL(ParsedURLString, urlString)
, type)); |
1638 } | 1637 } |
1639 *value = toV8(fileList); | 1638 if (!deserializer.pushFileList(fileList)) |
| 1639 return false; |
| 1640 deserializer.addReferenceForTop(); |
1640 return true; | 1641 return true; |
1641 } | 1642 } |
1642 | 1643 |
1643 template<class T> | 1644 template<class T> |
1644 bool doReadUintHelper(T* value) | 1645 bool doReadUintHelper(T* value) |
1645 { | 1646 { |
1646 *value = 0; | 1647 *value = 0; |
1647 uint8_t currentByte; | 1648 uint8_t currentByte; |
1648 int shift = 0; | 1649 int shift = 0; |
1649 do { | 1650 do { |
(...skipping 25 matching lines...) Expand all Loading... |
1675 numberAsByteArray[i] = m_buffer[m_position++]; | 1676 numberAsByteArray[i] = m_buffer[m_position++]; |
1676 return true; | 1677 return true; |
1677 } | 1678 } |
1678 | 1679 |
1679 const uint8_t* m_buffer; | 1680 const uint8_t* m_buffer; |
1680 const unsigned m_length; | 1681 const unsigned m_length; |
1681 unsigned m_position; | 1682 unsigned m_position; |
1682 uint32_t m_version; | 1683 uint32_t m_version; |
1683 }; | 1684 }; |
1684 | 1685 |
1685 class Deserializer : public CompositeCreator { | 1686 class V8Deserializer : public ScriptValueDeserializer { |
1686 public: | 1687 public: |
1687 explicit Deserializer(Reader& reader, MessagePortArray* messagePorts) | 1688 explicit V8Deserializer(Reader& reader, MessagePortArray* messagePorts) |
1688 : m_reader(reader) | 1689 : m_reader(reader) |
1689 , m_transferredMessagePorts(messagePorts) | 1690 , m_transferredMessagePorts(messagePorts) |
1690 , m_version(0) | 1691 , m_version(0) |
1691 { | 1692 { |
1692 } | 1693 } |
1693 | 1694 |
1694 v8::Handle<v8::Value> deserialize() | 1695 v8::Handle<v8::Value> deserialize() |
1695 { | 1696 { |
1696 if (!m_reader.readVersion(m_version) || m_version > wireFormatVersion) | 1697 v8::HandleScope scope; |
| 1698 if (!m_reader.read(*this)) |
1697 return v8::Null(); | 1699 return v8::Null(); |
1698 m_reader.setVersion(m_version); | |
1699 v8::HandleScope scope; | |
1700 while (!m_reader.isEof()) { | |
1701 if (!doDeserialize()) | |
1702 return v8::Null(); | |
1703 } | |
1704 if (stackDepth() != 1 || m_openCompositeReferenceStack.size()) | 1700 if (stackDepth() != 1 || m_openCompositeReferenceStack.size()) |
1705 return v8::Null(); | 1701 return v8::Null(); |
1706 v8::Handle<v8::Value> result = scope.Close(element(0)); | 1702 return scope.Close(element(0)); |
1707 return result; | |
1708 } | 1703 } |
1709 | 1704 |
1710 virtual bool newArray(uint32_t length) | 1705 virtual bool newArray(uint32_t length) |
1711 { | 1706 { |
1712 v8::Local<v8::Array> array = v8::Array::New(length); | 1707 v8::Local<v8::Array> array = v8::Array::New(length); |
1713 if (array.IsEmpty()) | 1708 if (array.IsEmpty()) |
1714 return false; | 1709 return false; |
1715 openComposite(array); | 1710 openComposite(array); |
1716 return true; | 1711 return true; |
1717 } | 1712 } |
1718 | 1713 |
1719 virtual bool consumeTopOfStack(v8::Handle<v8::Value>* object) | 1714 virtual bool newObject() |
| 1715 { |
| 1716 v8::Local<v8::Object> object = v8::Object::New(); |
| 1717 if (object.IsEmpty()) |
| 1718 return false; |
| 1719 openComposite(object); |
| 1720 return true; |
| 1721 } |
| 1722 |
| 1723 virtual bool tryGetObjectFromObjectReference(uint32_t reference) |
| 1724 { |
| 1725 if (reference >= m_objectPool.size()) |
| 1726 return false; |
| 1727 v8::Handle<v8::Value> value = m_objectPool[reference]; |
| 1728 ASSERT(!value.IsEmpty()); |
| 1729 return push(value); |
| 1730 } |
| 1731 |
| 1732 virtual bool tryGetTransferredMessagePort(uint32_t index, v8::Handle<v8::Val
ue>* object) |
| 1733 { |
| 1734 if (!m_transferredMessagePorts) |
| 1735 return false; |
| 1736 if (index >= m_transferredMessagePorts->size()) |
| 1737 return false; |
| 1738 *object = V8MessagePort::wrap(m_transferredMessagePorts->at(index).get()
); |
| 1739 return true; |
| 1740 } |
| 1741 |
| 1742 virtual uint32_t objectReferenceCount() |
| 1743 { |
| 1744 return m_objectPool.size(); |
| 1745 } |
| 1746 |
| 1747 virtual void addReferenceForTop() |
| 1748 { |
| 1749 ASSERT(stackDepth() > 0); |
| 1750 v8::Handle<v8::Value> value = element(stackDepth() - 1); |
| 1751 ASSERT(!value.IsEmpty()); |
| 1752 m_objectPool.append(value); |
| 1753 } |
| 1754 |
| 1755 |
| 1756 virtual bool pushUndefined() { return push(v8::Undefined()); } |
| 1757 virtual bool pushNull() { return push(v8::Null()); } |
| 1758 virtual bool pushTrue() { return push(v8::True()); } |
| 1759 virtual bool pushTrueObject() { return push(v8::BooleanObject::New(true)); } |
| 1760 virtual bool pushFalse() { return push(v8::False()); } |
| 1761 virtual bool pushFalseObject() { return push(v8::BooleanObject::New(false));
} |
| 1762 virtual bool pushScriptString(const char* data, uint32_t length) { return pu
sh(v8::String::New(data, length)); } |
| 1763 virtual bool pushScriptStringObject() |
1720 { | 1764 { |
1721 if (stackDepth() < 1) | 1765 if (stackDepth() < 1) |
1722 return false; | 1766 return false; |
1723 *object = element(stackDepth() - 1); | 1767 v8::Handle<v8::Value> string = popValue(); |
1724 pop(1); | 1768 return push(v8::StringObject::New(string.As<v8::String>())); |
1725 return true; | |
1726 } | 1769 } |
| 1770 virtual bool pushInt32(int32_t value) { return push(v8::Integer::New(value))
; } |
| 1771 virtual bool pushUInt32(uint32_t value) { return push(v8::Integer::NewFromUn
signed(value)); } |
| 1772 virtual bool pushDate(double numberValue) { return push(v8::Date::New(number
Value)); } |
| 1773 virtual bool pushNumber(double value) { return push(v8::Number::New(value));
} |
| 1774 virtual bool pushNumberObject(double value) { return push(v8::NumberObject::
New(value)); } |
| 1775 virtual bool pushBlob(PassRefPtr<Blob> blob) { return push(toV8(blob)); } |
| 1776 virtual bool pushFile(PassRefPtr<File> file) { return push(toV8(file)); } |
| 1777 virtual bool pushFileList(PassRefPtr<FileList> fileList) { return push(toV8(
fileList)); } |
| 1778 virtual bool pushImageData(PassRefPtr<ImageData> imageData) { return push(to
V8(imageData)); } |
1727 | 1779 |
1728 virtual bool completeArray(uint32_t length, v8::Handle<v8::Value>* value) | 1780 virtual bool pushArray(uint32_t length) |
1729 { | 1781 { |
1730 if (length > stackDepth()) | 1782 if (length > stackDepth()) |
1731 return false; | 1783 return false; |
1732 v8::Local<v8::Array> array; | 1784 v8::Local<v8::Array> array; |
1733 if (m_version > 0) { | 1785 if (m_reader.version() > 0) { |
1734 v8::Local<v8::Value> composite; | 1786 v8::Local<v8::Value> composite; |
1735 if (!closeComposite(&composite)) | 1787 if (!closeComposite(&composite)) |
1736 return false; | 1788 return false; |
1737 array = composite.As<v8::Array>(); | 1789 array = composite.As<v8::Array>(); |
1738 } else | 1790 } else |
1739 array = v8::Array::New(length); | 1791 array = v8::Array::New(length); |
1740 if (array.IsEmpty()) | 1792 if (array.IsEmpty()) |
1741 return false; | 1793 return false; |
1742 const int depth = stackDepth() - length; | 1794 const int depth = stackDepth() - length; |
1743 // The V8 API ensures space exists for any index argument to Set; it wil
l (eg) resize arrays as necessary. | 1795 // The V8 API ensures space exists for any index argument to Set; it wil
l (eg) resize arrays as necessary. |
1744 for (unsigned i = 0; i < length; ++i) | 1796 for (unsigned i = 0; i < length; ++i) |
1745 array->Set(i, element(depth + i)); | 1797 array->Set(i, element(depth + i)); |
1746 pop(length); | 1798 pop(length); |
1747 *value = array; | 1799 return push(array); |
1748 return true; | |
1749 } | 1800 } |
1750 | 1801 |
1751 virtual bool newObject() | 1802 virtual bool pushRegExp(uint32_t flags) |
1752 { | 1803 { |
1753 v8::Local<v8::Object> object = v8::Object::New(); | 1804 if (stackDepth() < 1) |
1754 if (object.IsEmpty()) | |
1755 return false; | 1805 return false; |
1756 openComposite(object); | 1806 v8::Handle<v8::Value> pattern = popValue(); |
1757 return true; | 1807 return push(v8::RegExp::New(pattern.As<v8::String>(), static_cast<v8::Re
gExp::Flags>(flags))); |
1758 } | 1808 } |
1759 | 1809 |
1760 virtual bool completeObject(uint32_t numProperties, v8::Handle<v8::Value>* v
alue) | 1810 virtual bool pushObject(uint32_t numProperties) |
1761 { | 1811 { |
1762 v8::Local<v8::Object> object; | 1812 v8::Local<v8::Object> object; |
1763 if (m_version > 0) { | 1813 if (m_reader.version() > 0) { |
1764 v8::Local<v8::Value> composite; | 1814 v8::Local<v8::Value> composite; |
1765 if (!closeComposite(&composite)) | 1815 if (!closeComposite(&composite)) |
1766 return false; | 1816 return false; |
1767 object = composite.As<v8::Object>(); | 1817 object = composite.As<v8::Object>(); |
1768 } else | 1818 } else |
1769 object = v8::Object::New(); | 1819 object = v8::Object::New(); |
1770 if (object.IsEmpty()) | 1820 if (object.IsEmpty()) |
1771 return false; | 1821 return false; |
1772 return initializeObject(object, numProperties, value); | 1822 return initializeObject(object, numProperties); |
1773 } | 1823 } |
1774 | 1824 |
1775 virtual bool completeSparseArray(uint32_t numProperties, uint32_t length, v8
::Handle<v8::Value>* value) | 1825 virtual bool pushSparseArray(uint32_t numProperties, uint32_t length) |
1776 { | 1826 { |
1777 v8::Local<v8::Array> array; | 1827 v8::Local<v8::Array> array; |
1778 if (m_version > 0) { | 1828 if (m_reader.version() > 0) { |
1779 v8::Local<v8::Value> composite; | 1829 v8::Local<v8::Value> composite; |
1780 if (!closeComposite(&composite)) | 1830 if (!closeComposite(&composite)) |
1781 return false; | 1831 return false; |
1782 array = composite.As<v8::Array>(); | 1832 array = composite.As<v8::Array>(); |
1783 } else | 1833 } else |
1784 array = v8::Array::New(length); | 1834 array = v8::Array::New(length); |
1785 if (array.IsEmpty()) | 1835 if (array.IsEmpty()) |
1786 return false; | 1836 return false; |
1787 return initializeObject(array, numProperties, value); | 1837 return initializeObject(array, numProperties); |
1788 } | 1838 } |
1789 | 1839 |
1790 virtual void pushObjectReference(const v8::Handle<v8::Value>& object) | 1840 virtual bool pushInt8Array(uint32_t byteOffset, uint32_t byteLength) { retur
n pushTypedArray<Int8Array>(byteOffset, byteLength); } |
| 1841 virtual bool pushUint8Array(uint32_t byteOffset, uint32_t byteLength) { retu
rn pushTypedArray<Uint8Array>(byteOffset, byteLength); } |
| 1842 virtual bool pushInt16Array(uint32_t byteOffset, uint32_t byteLength) { retu
rn pushTypedArray<Int16Array>(byteOffset, byteLength); } |
| 1843 virtual bool pushUint16Array(uint32_t byteOffset, uint32_t byteLength) { ret
urn pushTypedArray<Uint16Array>(byteOffset, byteLength); } |
| 1844 virtual bool pushInt32Array(uint32_t byteOffset, uint32_t byteLength) { retu
rn pushTypedArray<Int32Array>(byteOffset, byteLength); } |
| 1845 virtual bool pushUint32Array(uint32_t byteOffset, uint32_t byteLength) { ret
urn pushTypedArray<Uint32Array>(byteOffset, byteLength); } |
| 1846 virtual bool pushFloat32Array(uint32_t byteOffset, uint32_t byteLength) { re
turn pushTypedArray<Float32Array>(byteOffset, byteLength); } |
| 1847 virtual bool pushFloat64Array(uint32_t byteOffset, uint32_t byteLength) { re
turn pushTypedArray<Float64Array>(byteOffset, byteLength); } |
| 1848 virtual bool pushDataView(uint32_t byteOffset, uint32_t byteLength) { return
pushTypedArray<DataView>(byteOffset, byteLength); } |
| 1849 virtual bool pushArrayBuffer(PassRefPtr<ArrayBuffer> arrayBuffer) { return p
ush(toV8(arrayBuffer)); } |
| 1850 |
| 1851 private: |
| 1852 template <class C> |
| 1853 bool pushTypedArray(uint32_t byteOffset, uint32_t byteLength) |
1791 { | 1854 { |
1792 m_objectPool.append(object); | 1855 if (stackDepth() < 1) |
| 1856 return false; |
| 1857 RefPtr<ArrayBuffer> arrayBuffer = V8ArrayBuffer::toNative(popValue().As<
v8::Object>()); |
| 1858 if (!arrayBuffer) |
| 1859 return false; |
| 1860 |
| 1861 // The various *Array::create() methods will return null if the range th
e view expects is |
| 1862 // mismatched with the range the buffer can provide or if the byte offse
t is not aligned |
| 1863 // to the size of the element type. |
| 1864 return push(toV8(C::create(arrayBuffer.release(), byteOffset, byteLength
))); |
1793 } | 1865 } |
1794 | 1866 |
1795 virtual bool tryGetTransferredMessagePort(uint32_t index, v8::Handle<v8::Val
ue>* object) | 1867 bool initializeObject(v8::Handle<v8::Object> object, uint32_t numProperties) |
1796 { | 1868 { |
1797 if (!m_transferredMessagePorts) | 1869 ASSERT(!object.IsEmpty()); |
1798 return false; | |
1799 if (index >= m_transferredMessagePorts->size()) | |
1800 return false; | |
1801 *object = V8MessagePort::wrap(m_transferredMessagePorts->at(index).get()
); | |
1802 return true; | |
1803 } | |
1804 | |
1805 virtual bool tryGetObjectFromObjectReference(uint32_t reference, v8::Handle<
v8::Value>* object) | |
1806 { | |
1807 if (reference >= m_objectPool.size()) | |
1808 return false; | |
1809 *object = m_objectPool[reference]; | |
1810 return object; | |
1811 } | |
1812 | |
1813 virtual uint32_t objectReferenceCount() | |
1814 { | |
1815 return m_objectPool.size(); | |
1816 } | |
1817 | |
1818 private: | |
1819 bool initializeObject(v8::Handle<v8::Object> object, uint32_t numProperties,
v8::Handle<v8::Value>* value) | |
1820 { | |
1821 unsigned length = 2 * numProperties; | 1870 unsigned length = 2 * numProperties; |
1822 if (length > stackDepth()) | 1871 if (length > stackDepth()) |
1823 return false; | 1872 return false; |
1824 for (unsigned i = stackDepth() - length; i < stackDepth(); i += 2) { | 1873 for (unsigned i = stackDepth() - length; i < stackDepth(); i += 2) { |
1825 v8::Local<v8::Value> propertyName = element(i); | 1874 v8::Handle<v8::Value> propertyName = element(i); |
1826 v8::Local<v8::Value> propertyValue = element(i + 1); | 1875 v8::Handle<v8::Value> propertyValue = element(i + 1); |
1827 object->Set(propertyName, propertyValue); | 1876 object->Set(propertyName, propertyValue); |
1828 } | 1877 } |
1829 pop(length); | 1878 pop(length); |
1830 *value = object; | 1879 return push(object); |
| 1880 } |
| 1881 |
| 1882 bool push(v8::Handle<v8::Value> value) |
| 1883 { |
| 1884 if (value.IsEmpty()) |
| 1885 return false; |
| 1886 m_stack.append(value); |
1831 return true; | 1887 return true; |
1832 } | 1888 } |
1833 | 1889 |
1834 bool doDeserialize() | |
1835 { | |
1836 v8::Local<v8::Value> value; | |
1837 if (!m_reader.read(&value, *this)) | |
1838 return false; | |
1839 if (!value.IsEmpty()) | |
1840 push(value); | |
1841 return true; | |
1842 } | |
1843 | |
1844 void push(v8::Local<v8::Value> value) { m_stack.append(value); } | |
1845 | |
1846 void pop(unsigned length) | 1890 void pop(unsigned length) |
1847 { | 1891 { |
1848 ASSERT(length <= m_stack.size()); | 1892 ASSERT(length <= m_stack.size()); |
1849 m_stack.shrink(m_stack.size() - length); | 1893 m_stack.shrink(m_stack.size() - length); |
1850 } | 1894 } |
1851 | 1895 |
| 1896 v8::Handle<v8::Value> popValue() |
| 1897 { |
| 1898 ASSERT(stackDepth() >= 1); |
| 1899 v8::Handle<v8::Value> top = element(stackDepth() - 1); |
| 1900 pop(1); |
| 1901 return top; |
| 1902 } |
| 1903 |
1852 unsigned stackDepth() const { return m_stack.size(); } | 1904 unsigned stackDepth() const { return m_stack.size(); } |
1853 | 1905 |
1854 v8::Local<v8::Value> element(unsigned index) | 1906 v8::Handle<v8::Value> element(unsigned index) |
1855 { | 1907 { |
1856 ASSERT(index < m_stack.size()); | 1908 ASSERT(index < m_stack.size()); |
1857 return m_stack[index]; | 1909 return m_stack[index]; |
1858 } | 1910 } |
1859 | 1911 |
1860 void openComposite(const v8::Local<v8::Value>& object) | 1912 void openComposite(const v8::Local<v8::Value>& object) |
1861 { | 1913 { |
1862 uint32_t newObjectReference = m_objectPool.size(); | 1914 uint32_t newObjectReference = m_objectPool.size(); |
1863 m_openCompositeReferenceStack.append(newObjectReference); | 1915 m_openCompositeReferenceStack.append(newObjectReference); |
1864 m_objectPool.append(object); | 1916 m_objectPool.append(object); |
1865 } | 1917 } |
1866 | 1918 |
1867 bool closeComposite(v8::Handle<v8::Value>* object) | 1919 bool closeComposite(v8::Handle<v8::Value>* object) |
1868 { | 1920 { |
1869 if (!m_openCompositeReferenceStack.size()) | 1921 if (!m_openCompositeReferenceStack.size()) |
1870 return false; | 1922 return false; |
1871 uint32_t objectReference = m_openCompositeReferenceStack[m_openComposite
ReferenceStack.size() - 1]; | 1923 uint32_t objectReference = m_openCompositeReferenceStack[m_openComposite
ReferenceStack.size() - 1]; |
1872 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size(
) - 1); | 1924 m_openCompositeReferenceStack.shrink(m_openCompositeReferenceStack.size(
) - 1); |
1873 if (objectReference >= m_objectPool.size()) | 1925 if (objectReference >= m_objectPool.size()) |
1874 return false; | 1926 return false; |
1875 *object = m_objectPool[objectReference]; | 1927 *object = m_objectPool[objectReference]; |
1876 return true; | 1928 return true; |
1877 } | 1929 } |
1878 | 1930 |
1879 Reader& m_reader; | 1931 Reader& m_reader; |
1880 Vector<v8::Local<v8::Value> > m_stack; | 1932 Vector<v8::Handle<v8::Value> > m_stack; |
1881 Vector<v8::Handle<v8::Value> > m_objectPool; | 1933 Vector<v8::Handle<v8::Value> > m_objectPool; |
1882 Vector<uint32_t> m_openCompositeReferenceStack; | 1934 Vector<uint32_t> m_openCompositeReferenceStack; |
1883 MessagePortArray* m_transferredMessagePorts; | 1935 MessagePortArray* m_transferredMessagePorts; |
1884 uint32_t m_version; | 1936 uint32_t m_version; |
1885 }; | 1937 }; |
1886 | 1938 |
1887 } // namespace | 1939 } // namespace |
1888 void SerializedScriptValue::deserializeAndSetProperty(v8::Handle<v8::Object> obj
ect, const char* propertyName, | 1940 void SerializedScriptValue::deserializeAndSetProperty(v8::Handle<v8::Object> obj
ect, const char* propertyName, |
1889 v8::PropertyAttribute attr
ibute, SerializedScriptValue* value) | 1941 v8::PropertyAttribute attr
ibute, SerializedScriptValue* value) |
1890 { | 1942 { |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2008 { | 2060 { |
2009 m_data = wireData.isolatedCopy(); | 2061 m_data = wireData.isolatedCopy(); |
2010 } | 2062 } |
2011 | 2063 |
2012 v8::Handle<v8::Value> SerializedScriptValue::deserialize(MessagePortArray* messa
gePorts) | 2064 v8::Handle<v8::Value> SerializedScriptValue::deserialize(MessagePortArray* messa
gePorts) |
2013 { | 2065 { |
2014 if (!m_data.impl()) | 2066 if (!m_data.impl()) |
2015 return v8::Null(); | 2067 return v8::Null(); |
2016 COMPILE_ASSERT(sizeof(BufferValueType) == 2, BufferValueTypeIsTwoBytes); | 2068 COMPILE_ASSERT(sizeof(BufferValueType) == 2, BufferValueTypeIsTwoBytes); |
2017 Reader reader(reinterpret_cast<const uint8_t*>(m_data.impl()->characters()),
2 * m_data.length()); | 2069 Reader reader(reinterpret_cast<const uint8_t*>(m_data.impl()->characters()),
2 * m_data.length()); |
2018 Deserializer deserializer(reader, messagePorts); | 2070 V8Deserializer deserializer(reader, messagePorts); |
2019 return deserializer.deserialize(); | 2071 return deserializer.deserialize(); |
2020 } | 2072 } |
2021 | 2073 |
| 2074 PassRefPtr<SerializedScriptValue> SerializedScriptValue::create(ScriptValueSeria
lizer* serializer) |
| 2075 { |
| 2076 Writer writer; |
| 2077 serializer->serialize(&writer); |
| 2078 return adoptRef(new SerializedScriptValue(StringImpl::adopt(writer.data())))
; |
| 2079 } |
| 2080 |
| 2081 bool SerializedScriptValue::deserialize(ScriptValueDeserializer* deserializer) |
| 2082 { |
| 2083 if (!m_data.impl()) |
| 2084 return false; |
| 2085 COMPILE_ASSERT(sizeof(BufferValueType) == 2, BufferValueTypeIsTwoBytes); |
| 2086 Reader reader(reinterpret_cast<const uint8_t*>(m_data.impl()->characters()),
2 * m_data.length()); |
| 2087 return reader.read(*deserializer); |
| 2088 } |
| 2089 |
2022 } // namespace WebCore | 2090 } // namespace WebCore |
OLD | NEW |