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

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

Issue 2380303003: [Mojo] Make javascript enums extensible. (Closed)
Patch Set: rebase Created 4 years, 2 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
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/validator", [ 5 define("mojo/public/js/validator", [
6 "mojo/public/js/codec", 6 "mojo/public/js/codec",
7 ], function(codec) { 7 ], function(codec) {
8 8
9 var validationError = { 9 var validationError = {
10 NONE: 'VALIDATION_ERROR_NONE', 10 NONE: 'VALIDATION_ERROR_NONE',
11 MISALIGNED_OBJECT: 'VALIDATION_ERROR_MISALIGNED_OBJECT', 11 MISALIGNED_OBJECT: 'VALIDATION_ERROR_MISALIGNED_OBJECT',
12 ILLEGAL_MEMORY_RANGE: 'VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE', 12 ILLEGAL_MEMORY_RANGE: 'VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE',
13 UNEXPECTED_STRUCT_HEADER: 'VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER', 13 UNEXPECTED_STRUCT_HEADER: 'VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER',
14 UNEXPECTED_ARRAY_HEADER: 'VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER', 14 UNEXPECTED_ARRAY_HEADER: 'VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER',
15 ILLEGAL_HANDLE: 'VALIDATION_ERROR_ILLEGAL_HANDLE', 15 ILLEGAL_HANDLE: 'VALIDATION_ERROR_ILLEGAL_HANDLE',
16 UNEXPECTED_INVALID_HANDLE: 'VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE', 16 UNEXPECTED_INVALID_HANDLE: 'VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE',
17 ILLEGAL_POINTER: 'VALIDATION_ERROR_ILLEGAL_POINTER', 17 ILLEGAL_POINTER: 'VALIDATION_ERROR_ILLEGAL_POINTER',
18 UNEXPECTED_NULL_POINTER: 'VALIDATION_ERROR_UNEXPECTED_NULL_POINTER', 18 UNEXPECTED_NULL_POINTER: 'VALIDATION_ERROR_UNEXPECTED_NULL_POINTER',
19 MESSAGE_HEADER_INVALID_FLAGS: 19 MESSAGE_HEADER_INVALID_FLAGS:
20 'VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS', 20 'VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS',
21 MESSAGE_HEADER_MISSING_REQUEST_ID: 21 MESSAGE_HEADER_MISSING_REQUEST_ID:
22 'VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID', 22 'VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID',
23 DIFFERENT_SIZED_ARRAYS_IN_MAP: 23 DIFFERENT_SIZED_ARRAYS_IN_MAP:
24 'VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP', 24 'VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP',
25 INVALID_UNION_SIZE: 'VALIDATION_ERROR_INVALID_UNION_SIZE', 25 INVALID_UNION_SIZE: 'VALIDATION_ERROR_INVALID_UNION_SIZE',
26 UNEXPECTED_NULL_UNION: 'VALIDATION_ERROR_UNEXPECTED_NULL_UNION', 26 UNEXPECTED_NULL_UNION: 'VALIDATION_ERROR_UNEXPECTED_NULL_UNION',
27 UNKNOWN_ENUM_VALUE: 'VALIDATION_ERROR_UNKNOWN_ENUM_VALUE',
27 }; 28 };
28 29
29 var NULL_MOJO_POINTER = "NULL_MOJO_POINTER"; 30 var NULL_MOJO_POINTER = "NULL_MOJO_POINTER";
30 31
32 function isEnumClass(cls) {
33 return cls instanceof codec.Enum;
34 }
35
31 function isStringClass(cls) { 36 function isStringClass(cls) {
32 return cls === codec.String || cls === codec.NullableString; 37 return cls === codec.String || cls === codec.NullableString;
33 } 38 }
34 39
35 function isHandleClass(cls) { 40 function isHandleClass(cls) {
36 return cls === codec.Handle || cls === codec.NullableHandle; 41 return cls === codec.Handle || cls === codec.NullableHandle;
37 } 42 }
38 43
39 function isInterfaceClass(cls) { 44 function isInterfaceClass(cls) {
40 return cls === codec.Interface || cls === codec.NullableInterface; 45 return cls === codec.Interface || cls === codec.NullableInterface;
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 return true; 96 return true;
92 97
93 if (index < this.handleIndex || index >= this.handleIndexLimit) 98 if (index < this.handleIndex || index >= this.handleIndexLimit)
94 return false; 99 return false;
95 100
96 // This is safe because handle indices are uint32. 101 // This is safe because handle indices are uint32.
97 this.handleIndex = index + 1; 102 this.handleIndex = index + 1;
98 return true; 103 return true;
99 } 104 }
100 105
106 Validator.prototype.validateEnum = function(offset, enumClass, nullable) {
107 // Note: Assumes that enums are always 32 bits! But this matches
108 // mojom::generate::pack::PackedField::GetSizeForKind, so it should be okay.
109 var value = this.message.buffer.getInt32(offset);
110 return enumClass.validate(value);
111 }
112
101 Validator.prototype.validateHandle = function(offset, nullable) { 113 Validator.prototype.validateHandle = function(offset, nullable) {
102 var index = this.message.buffer.getUint32(offset); 114 var index = this.message.buffer.getUint32(offset);
103 115
104 if (index === codec.kEncodedInvalidHandleValue) 116 if (index === codec.kEncodedInvalidHandleValue)
105 return nullable ? 117 return nullable ?
106 validationError.NONE : validationError.UNEXPECTED_INVALID_HANDLE; 118 validationError.NONE : validationError.UNEXPECTED_INVALID_HANDLE;
107 119
108 if (!this.claimHandle(index)) 120 if (!this.claimHandle(index))
109 return validationError.ILLEGAL_HANDLE; 121 return validationError.ILLEGAL_HANDLE;
110 return validationError.NONE; 122 return validationError.NONE;
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after
340 if (isStringClass(elementType)) 352 if (isStringClass(elementType))
341 return this.validateArrayElements( 353 return this.validateArrayElements(
342 elementsOffset, numElements, codec.Uint8, nullable, [0], 0); 354 elementsOffset, numElements, codec.Uint8, nullable, [0], 0);
343 if (elementType instanceof codec.PointerTo) 355 if (elementType instanceof codec.PointerTo)
344 return this.validateStructElements( 356 return this.validateStructElements(
345 elementsOffset, numElements, elementType.cls, nullable); 357 elementsOffset, numElements, elementType.cls, nullable);
346 if (elementType instanceof codec.ArrayOf) 358 if (elementType instanceof codec.ArrayOf)
347 return this.validateArrayElements( 359 return this.validateArrayElements(
348 elementsOffset, numElements, elementType.cls, nullable, 360 elementsOffset, numElements, elementType.cls, nullable,
349 expectedDimensionSizes, currentDimension + 1); 361 expectedDimensionSizes, currentDimension + 1);
362 if (isEnumClass(elementType))
363 return this.validateEnum(elementsOffset, elementType.cls, nullable);
350 364
351 return validationError.NONE; 365 return validationError.NONE;
352 } 366 }
353 367
354 // Note: the |offset + i * elementSize| computation in the validateFooElements 368 // Note: the |offset + i * elementSize| computation in the validateFooElements
355 // methods below is "safe" because elementSize <= 8, offset and 369 // methods below is "safe" because elementSize <= 8, offset and
356 // numElements are uint32, and 0 <= i < numElements. 370 // numElements are uint32, and 0 <= i < numElements.
357 371
358 Validator.prototype.validateHandleElements = 372 Validator.prototype.validateHandleElements =
359 function(offset, numElements, nullable) { 373 function(offset, numElements, nullable) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 return err; 420 return err;
407 } 421 }
408 return validationError.NONE; 422 return validationError.NONE;
409 } 423 }
410 424
411 var exports = {}; 425 var exports = {};
412 exports.validationError = validationError; 426 exports.validationError = validationError;
413 exports.Validator = Validator; 427 exports.Validator = Validator;
414 return exports; 428 return exports;
415 }); 429 });
OLDNEW
« no previous file with comments | « mojo/public/js/validation_unittests.js ('k') | mojo/public/tools/bindings/generators/js_templates/enum_definition.tmpl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698