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

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

Issue 654843005: Mojo JS Bindings: add support for associative arrays (Mojo map type) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 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/bindings/validator", [ 5 define("mojo/public/js/bindings/validator", [
6 "mojo/public/js/bindings/codec", 6 "mojo/public/js/bindings/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_FLAG_COMBINATION: 19 MESSAGE_HEADER_INVALID_FLAG_COMBINATION:
20 'VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAG_COMBINATION', 20 'VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAG_COMBINATION',
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:
24 'VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP',
23 }; 25 };
24 26
25 var NULL_MOJO_POINTER = "NULL_MOJO_POINTER"; 27 var NULL_MOJO_POINTER = "NULL_MOJO_POINTER";
26 28
27 function isStringClass(cls) { 29 function isStringClass(cls) {
28 return cls === codec.String || cls === codec.NullableString; 30 return cls === codec.String || cls === codec.NullableString;
29 } 31 }
30 32
31 function isHandleClass(cls) { 33 function isHandleClass(cls) {
32 return cls === codec.Handle || cls === codec.NullableHandle; 34 return cls === codec.Handle || cls === codec.NullableHandle;
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
170 172
171 if (arrayOffset === NULL_MOJO_POINTER) 173 if (arrayOffset === NULL_MOJO_POINTER)
172 return nullable ? 174 return nullable ?
173 validationError.NONE : validationError.UNEXPECTED_NULL_POINTER; 175 validationError.NONE : validationError.UNEXPECTED_NULL_POINTER;
174 176
175 return this.validateArray(arrayOffset, elementSize, elementType, 177 return this.validateArray(arrayOffset, elementSize, elementType,
176 expectedDimensionSizes, currentDimension); 178 expectedDimensionSizes, currentDimension);
177 } 179 }
178 180
179 Validator.prototype.validateStructPointer = function( 181 Validator.prototype.validateStructPointer = function(
180 offset, structClass, nullable) { 182 offset, structClass, nullable) {
181 var structOffset = this.decodePointer(offset); 183 var structOffset = this.decodePointer(offset);
182 if (structOffset === null) 184 if (structOffset === null)
183 return validationError.ILLEGAL_POINTER; 185 return validationError.ILLEGAL_POINTER;
184 186
185 if (structOffset === NULL_MOJO_POINTER) 187 if (structOffset === NULL_MOJO_POINTER)
186 return nullable ? 188 return nullable ?
187 validationError.NONE : validationError.UNEXPECTED_NULL_POINTER; 189 validationError.NONE : validationError.UNEXPECTED_NULL_POINTER;
188 190
189 return structClass.validate(this, structOffset); 191 return structClass.validate(this, structOffset);
190 } 192 }
191 193
194 // This method assumes that the array at arrayPointerOffset has
195 // been validated.
196
197 Validator.prototype.arrayLength = function(arrayPointerOffset) {
198 var arrayOffset = this.decodePointer(arrayPointerOffset);
199 return this.message.buffer.getUint32(arrayOffset + 4);
200 }
201
202 Validator.prototype.validateMapPointer = function(
203 offset, mapIsNullable, keyClass, valueClass, valueIsNullable) {
204 // Validate the implicit map struct:
205 // struct {array<keyClass> keys; array<valueClass> values};
206 var structOffset = this.decodePointer(offset);
207 if (structOffset === null)
208 return validationError.ILLEGAL_POINTER;
209
210 if (structOffset === NULL_MOJO_POINTER)
211 return mapIsNullable ?
212 validationError.NONE : validationError.UNEXPECTED_NULL_POINTER;
213
214 var mapEncodedSize = codec.kStructHeaderSize + codec.kMapStructPayloadSize;
215 var err = this.validateStructHeader(structOffset, mapEncodedSize, 2);
216 if (err !== validationError.NONE)
217 return err;
218
219 // Validate the keys array.
220 var keysArrayPointerOffset = structOffset + codec.kStructHeaderSize;
221 err = this.validateArrayPointer(
222 keysArrayPointerOffset, keyClass.encodedSize, keyClass, false, [0], 0);
223 if (err !== validationError.NONE)
224 return err;
225
226 // Validate the values array.
227 var valuesArrayPointerOffset = keysArrayPointerOffset + 8;
228 var valuesArrayDimensions = [0]; // Validate the actual length below.
229 if (valueClass instanceof codec.ArrayOf)
230 valuesArrayDimensions =
231 valuesArrayDimensions.concat(valueClass.dimensions());
232 var err = this.validateArrayPointer(valuesArrayPointerOffset,
233 valueClass.encodedSize,
234 valueClass,
235 valueIsNullable,
236 valuesArrayDimensions,
237 0);
238 if (err !== validationError.NONE)
239 return err;
240
241 // Validate the lengths of the keys and values arrays.
242 var keysArrayLength = this.arrayLength(keysArrayPointerOffset);
243 var valuesArrayLength = this.arrayLength(valuesArrayPointerOffset);
244 if (keysArrayLength != valuesArrayLength)
245 return validationError.DIFFERENT_SIZED_ARRAYS_IN_MAP;
246
247 return validationError.NONE;
248 }
249
192 Validator.prototype.validateStringPointer = function(offset, nullable) { 250 Validator.prototype.validateStringPointer = function(offset, nullable) {
193 return this.validateArrayPointer( 251 return this.validateArrayPointer(
194 offset, codec.Uint8.encodedSize, codec.Uint8, nullable, [0], 0); 252 offset, codec.Uint8.encodedSize, codec.Uint8, nullable, [0], 0);
195 } 253 }
196 254
197 // Similar to Array_Data<T>::Validate() 255 // Similar to Array_Data<T>::Validate()
198 // mojo/public/cpp/bindings/lib/array_internal.h 256 // mojo/public/cpp/bindings/lib/array_internal.h
199 257
200 Validator.prototype.validateArray = 258 Validator.prototype.validateArray =
201 function (offset, elementSize, elementType, expectedDimensionSizes, 259 function (offset, elementSize, elementType, expectedDimensionSizes,
(...skipping 25 matching lines...) Expand all
227 285
228 // Validate the array's elements if they are pointers or handles. 286 // Validate the array's elements if they are pointers or handles.
229 287
230 var elementsOffset = offset + codec.kArrayHeaderSize; 288 var elementsOffset = offset + codec.kArrayHeaderSize;
231 var nullable = isNullable(elementType); 289 var nullable = isNullable(elementType);
232 290
233 if (isHandleClass(elementType)) 291 if (isHandleClass(elementType))
234 return this.validateHandleElements(elementsOffset, numElements, nullable); 292 return this.validateHandleElements(elementsOffset, numElements, nullable);
235 if (isStringClass(elementType)) 293 if (isStringClass(elementType))
236 return this.validateArrayElements( 294 return this.validateArrayElements(
237 elementsOffset, numElements, codec.Uint8, nullable, 295 elementsOffset, numElements, codec.Uint8, nullable, [0], 0);
238 expectedDimensionSizes, currentDimension + 1)
239 if (elementType instanceof codec.PointerTo) 296 if (elementType instanceof codec.PointerTo)
240 return this.validateStructElements( 297 return this.validateStructElements(
241 elementsOffset, numElements, elementType.cls, nullable); 298 elementsOffset, numElements, elementType.cls, nullable);
242 if (elementType instanceof codec.ArrayOf) 299 if (elementType instanceof codec.ArrayOf)
243 return this.validateArrayElements( 300 return this.validateArrayElements(
244 elementsOffset, numElements, elementType.cls, nullable, 301 elementsOffset, numElements, elementType.cls, nullable,
245 expectedDimensionSizes, currentDimension + 1); 302 expectedDimensionSizes, currentDimension + 1);
246 303
247 return validationError.NONE; 304 return validationError.NONE;
248 } 305 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 return err; 347 return err;
291 } 348 }
292 return validationError.NONE; 349 return validationError.NONE;
293 } 350 }
294 351
295 var exports = {}; 352 var exports = {};
296 exports.validationError = validationError; 353 exports.validationError = validationError;
297 exports.Validator = Validator; 354 exports.Validator = Validator;
298 return exports; 355 return exports;
299 }); 356 });
OLDNEW
« no previous file with comments | « mojo/public/js/bindings/struct_unittests.js ('k') | mojo/public/tools/bindings/generators/js_templates/struct_definition.tmpl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698