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

Side by Side Diff: mojo/public/js/codec.js

Issue 803173003: Add more type validation to codec.js (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | mojo/public/js/codec_unittests.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 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-like to array"; 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";
12 14
13 // Memory ------------------------------------------------------------------- 15 // Memory -------------------------------------------------------------------
14 16
15 var kAlignment = 8; 17 var kAlignment = 8;
16 18
17 function align(size) { 19 function align(size) {
18 return size + (kAlignment - (size % kAlignment)) % kAlignment; 20 return size + (kAlignment - (size % kAlignment)) % kAlignment;
19 } 21 }
20 22
21 function isAligned(offset) { 23 function isAligned(offset) {
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 var encoder = this.createAndEncodeEncoder(cls.encodedSize); 348 var encoder = this.createAndEncodeEncoder(cls.encodedSize);
347 cls.encode(encoder, val); 349 cls.encode(encoder, val);
348 }; 350 };
349 351
350 Encoder.prototype.encodeArrayPointer = function(cls, val) { 352 Encoder.prototype.encodeArrayPointer = function(cls, val) {
351 if (val == null) { 353 if (val == null) {
352 // Also handles undefined, since undefined == null. 354 // Also handles undefined, since undefined == null.
353 this.encodePointer(val); 355 this.encodePointer(val);
354 return; 356 return;
355 } 357 }
356 if (val.length === undefined) { 358 if (!(val instanceof Array)) {
357 throw new Error(kErrorArray); 359 throw new Error(kErrorArray);
358 } 360 }
359 var numberOfElements = val.length; 361 var numberOfElements = val.length;
360 var encodedSize = kArrayHeaderSize + ((cls === PackedBool) ? 362 var encodedSize = kArrayHeaderSize + ((cls === PackedBool) ?
361 Math.ceil(numberOfElements / 8) : cls.encodedSize * numberOfElements); 363 Math.ceil(numberOfElements / 8) : cls.encodedSize * numberOfElements);
362 var encoder = this.createAndEncodeEncoder(encodedSize); 364 var encoder = this.createAndEncodeEncoder(encodedSize);
363 encoder.encodeArray(cls, val, numberOfElements, encodedSize); 365 encoder.encodeArray(cls, val, numberOfElements, encodedSize);
364 }; 366 };
365 367
366 Encoder.prototype.encodeStringPointer = function(val) { 368 Encoder.prototype.encodeStringPointer = function(val) {
367 if (val == null) { 369 if (val == null) {
368 // Also handles undefined, since undefined == null. 370 // Also handles undefined, since undefined == null.
369 this.encodePointer(val); 371 this.encodePointer(val);
370 return; 372 return;
371 } 373 }
374 // This only accepts literal strings, not new String("foo").
375 if (typeof(val) !== "string") {
hansmuller 2014/12/16 01:10:41 Don't you mean primitive strings?
eseidel 2014/12/16 01:13:04 I'm not sure what you mean. I mean string literal
376 throw new Error(kErrorString);
377 }
372 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val); 378 var encodedSize = kArrayHeaderSize + unicode.utf8Length(val);
373 var encoder = this.createAndEncodeEncoder(encodedSize); 379 var encoder = this.createAndEncodeEncoder(encodedSize);
374 encoder.encodeString(val); 380 encoder.encodeString(val);
375 }; 381 };
376 382
377 Encoder.prototype.encodeMap = function(keyClass, valueClass, val) { 383 Encoder.prototype.encodeMap = function(keyClass, valueClass, val) {
378 var keys = new Array(val.size); 384 var keys = new Array(val.size);
379 var values = new Array(val.size); 385 var values = new Array(val.size);
380 var i = 0; 386 var i = 0;
381 val.forEach(function(value, key) { 387 val.forEach(function(value, key) {
382 values[i] = value; 388 values[i] = value;
383 keys[i++] = key; 389 keys[i++] = key;
384 }); 390 });
385 this.writeUint32(kStructHeaderSize + kMapStructPayloadSize); 391 this.writeUint32(kStructHeaderSize + kMapStructPayloadSize);
386 this.writeUint32(2); // two fields: keys, values 392 this.writeUint32(2); // two fields: keys, values
387 this.encodeArrayPointer(keyClass, keys); 393 this.encodeArrayPointer(keyClass, keys);
388 this.encodeArrayPointer(valueClass, values); 394 this.encodeArrayPointer(valueClass, values);
389 } 395 }
390 396
391 Encoder.prototype.encodeMapPointer = function(keyClass, valueClass, val) { 397 Encoder.prototype.encodeMapPointer = function(keyClass, valueClass, val) {
392 if (val == null) { 398 if (val == null) {
393 // Also handles undefined, since undefined == null. 399 // Also handles undefined, since undefined == null.
394 this.encodePointer(val); 400 this.encodePointer(val);
395 return; 401 return;
396 } 402 }
403 if (!(val instanceof Map)) {
404 throw new Error(kErrorMap);
405 }
397 var encodedSize = kStructHeaderSize + kMapStructPayloadSize; 406 var encodedSize = kStructHeaderSize + kMapStructPayloadSize;
398 var encoder = this.createAndEncodeEncoder(encodedSize); 407 var encoder = this.createAndEncodeEncoder(encodedSize);
399 encoder.encodeMap(keyClass, valueClass, val); 408 encoder.encodeMap(keyClass, valueClass, val);
400 }; 409 };
401 410
402 // Message ------------------------------------------------------------------ 411 // Message ------------------------------------------------------------------
403 412
404 var kMessageNameOffset = kStructHeaderSize; 413 var kMessageNameOffset = kStructHeaderSize;
405 var kMessageFlagsOffset = kMessageNameOffset + 4; 414 var kMessageFlagsOffset = kMessageNameOffset + 4;
406 var kMessageRequestIDOffset = kMessageFlagsOffset + 4; 415 var kMessageRequestIDOffset = kMessageFlagsOffset + 4;
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after
810 exports.NullablePointerTo = NullablePointerTo; 819 exports.NullablePointerTo = NullablePointerTo;
811 exports.ArrayOf = ArrayOf; 820 exports.ArrayOf = ArrayOf;
812 exports.NullableArrayOf = NullableArrayOf; 821 exports.NullableArrayOf = NullableArrayOf;
813 exports.PackedBool = PackedBool; 822 exports.PackedBool = PackedBool;
814 exports.Handle = Handle; 823 exports.Handle = Handle;
815 exports.NullableHandle = NullableHandle; 824 exports.NullableHandle = NullableHandle;
816 exports.MapOf = MapOf; 825 exports.MapOf = MapOf;
817 exports.NullableMapOf = NullableMapOf; 826 exports.NullableMapOf = NullableMapOf;
818 return exports; 827 return exports;
819 }); 828 });
OLDNEW
« no previous file with comments | « no previous file | mojo/public/js/codec_unittests.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698