OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 define("mojo/public/js/codec", [ | 5 define("mojo/public/js/codec", [ |
6 "mojo/public/js/unicode", | 6 "mojo/public/js/unicode", |
7 "mojo/public/js/buffer", | 7 "mojo/public/js/buffer", |
8 ], function(unicode, buffer) { | 8 ], function(unicode, buffer) { |
9 | 9 |
10 var kErrorUnsigned = "Passing negative value to unsigned"; | 10 var kErrorUnsigned = "Passing negative value to unsigned"; |
| 11 var kErrorArray = "Passing non Array for array type"; |
| 12 var kErrorString = "Passing non String for string type"; |
| 13 var kErrorMap = "Passing non Map for map type"; |
11 | 14 |
12 // Memory ------------------------------------------------------------------- | 15 // Memory ------------------------------------------------------------------- |
13 | 16 |
14 var kAlignment = 8; | 17 var kAlignment = 8; |
15 | 18 |
16 function align(size) { | 19 function align(size) { |
17 return size + (kAlignment - (size % kAlignment)) % kAlignment; | 20 return size + (kAlignment - (size % kAlignment)) % kAlignment; |
18 } | 21 } |
19 | 22 |
20 function isAligned(offset) { | 23 function isAligned(offset) { |
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
345 var encoder = this.createAndEncodeEncoder(cls.encodedSize); | 348 var encoder = this.createAndEncodeEncoder(cls.encodedSize); |
346 cls.encode(encoder, val); | 349 cls.encode(encoder, val); |
347 }; | 350 }; |
348 | 351 |
349 Encoder.prototype.encodeArrayPointer = function(cls, val) { | 352 Encoder.prototype.encodeArrayPointer = function(cls, val) { |
350 if (val == null) { | 353 if (val == null) { |
351 // Also handles undefined, since undefined == null. | 354 // Also handles undefined, since undefined == null. |
352 this.encodePointer(val); | 355 this.encodePointer(val); |
353 return; | 356 return; |
354 } | 357 } |
| 358 |
355 var numberOfElements = val.length; | 359 var numberOfElements = val.length; |
| 360 if (!Number.isSafeInteger(numberOfElements) || numberOfElements < 0) |
| 361 throw new Error(kErrorArray); |
| 362 |
356 var encodedSize = kArrayHeaderSize + ((cls === PackedBool) ? | 363 var encodedSize = kArrayHeaderSize + ((cls === PackedBool) ? |
357 Math.ceil(numberOfElements / 8) : cls.encodedSize * numberOfElements); | 364 Math.ceil(numberOfElements / 8) : cls.encodedSize * numberOfElements); |
358 var encoder = this.createAndEncodeEncoder(encodedSize); | 365 var encoder = this.createAndEncodeEncoder(encodedSize); |
359 encoder.encodeArray(cls, val, numberOfElements, encodedSize); | 366 encoder.encodeArray(cls, val, numberOfElements, encodedSize); |
360 }; | 367 }; |
361 | 368 |
362 Encoder.prototype.encodeStringPointer = function(val) { | 369 Encoder.prototype.encodeStringPointer = function(val) { |
363 if (val == null) { | 370 if (val == null) { |
364 // Also handles undefined, since undefined == null. | 371 // Also handles undefined, since undefined == null. |
365 this.encodePointer(val); | 372 this.encodePointer(val); |
366 return; | 373 return; |
367 } | 374 } |
| 375 // Only accepts string primivites, not String Objects like new String("foo") |
| 376 if (typeof(val) !== "string") { |
| 377 throw new Error(kErrorString); |
| 378 } |
368 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); | 379 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); |
369 var encoder = this.createAndEncodeEncoder(encodedSize); | 380 var encoder = this.createAndEncodeEncoder(encodedSize); |
370 encoder.encodeString(val); | 381 encoder.encodeString(val); |
371 }; | 382 }; |
372 | 383 |
373 Encoder.prototype.encodeMap = function(keyClass, valueClass, val) { | 384 Encoder.prototype.encodeMap = function(keyClass, valueClass, val) { |
374 var keys = new Array(val.size); | 385 var keys = new Array(val.size); |
375 var values = new Array(val.size); | 386 var values = new Array(val.size); |
376 var i = 0; | 387 var i = 0; |
377 val.forEach(function(value, key) { | 388 val.forEach(function(value, key) { |
378 values[i] = value; | 389 values[i] = value; |
379 keys[i++] = key; | 390 keys[i++] = key; |
380 }); | 391 }); |
381 this.writeUint32(kStructHeaderSize + kMapStructPayloadSize); | 392 this.writeUint32(kStructHeaderSize + kMapStructPayloadSize); |
382 this.writeUint32(2); // two fields: keys, values | 393 this.writeUint32(2); // two fields: keys, values |
383 this.encodeArrayPointer(keyClass, keys); | 394 this.encodeArrayPointer(keyClass, keys); |
384 this.encodeArrayPointer(valueClass, values); | 395 this.encodeArrayPointer(valueClass, values); |
385 } | 396 } |
386 | 397 |
387 Encoder.prototype.encodeMapPointer = function(keyClass, valueClass, val) { | 398 Encoder.prototype.encodeMapPointer = function(keyClass, valueClass, val) { |
388 if (val == null) { | 399 if (val == null) { |
389 // Also handles undefined, since undefined == null. | 400 // Also handles undefined, since undefined == null. |
390 this.encodePointer(val); | 401 this.encodePointer(val); |
391 return; | 402 return; |
392 } | 403 } |
| 404 if (!(val instanceof Map)) { |
| 405 throw new Error(kErrorMap); |
| 406 } |
393 var encodedSize = kStructHeaderSize + kMapStructPayloadSize; | 407 var encodedSize = kStructHeaderSize + kMapStructPayloadSize; |
394 var encoder = this.createAndEncodeEncoder(encodedSize); | 408 var encoder = this.createAndEncodeEncoder(encodedSize); |
395 encoder.encodeMap(keyClass, valueClass, val); | 409 encoder.encodeMap(keyClass, valueClass, val); |
396 }; | 410 }; |
397 | 411 |
398 // Message ------------------------------------------------------------------ | 412 // Message ------------------------------------------------------------------ |
399 | 413 |
400 var kMessageNameOffset = kStructHeaderSize; | 414 var kMessageNameOffset = kStructHeaderSize; |
401 var kMessageFlagsOffset = kMessageNameOffset + 4; | 415 var kMessageFlagsOffset = kMessageNameOffset + 4; |
402 var kMessageRequestIDOffset = kMessageFlagsOffset + 4; | 416 var kMessageRequestIDOffset = kMessageFlagsOffset + 4; |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
806 exports.NullablePointerTo = NullablePointerTo; | 820 exports.NullablePointerTo = NullablePointerTo; |
807 exports.ArrayOf = ArrayOf; | 821 exports.ArrayOf = ArrayOf; |
808 exports.NullableArrayOf = NullableArrayOf; | 822 exports.NullableArrayOf = NullableArrayOf; |
809 exports.PackedBool = PackedBool; | 823 exports.PackedBool = PackedBool; |
810 exports.Handle = Handle; | 824 exports.Handle = Handle; |
811 exports.NullableHandle = NullableHandle; | 825 exports.NullableHandle = NullableHandle; |
812 exports.MapOf = MapOf; | 826 exports.MapOf = MapOf; |
813 exports.NullableMapOf = NullableMapOf; | 827 exports.NullableMapOf = NullableMapOf; |
814 return exports; | 828 return exports; |
815 }); | 829 }); |
OLD | NEW |