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

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: Corrected validation for array map values 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 Validator.prototype.arrayLength = function(arrayPointerOffset) {
yzshen1 2014/10/16 20:22:47 nit: please consider commenting that |arrayPointer
hansmuller 2014/10/16 20:43:41 Done.
195 var arrayOffset = this.decodePointer(arrayPointerOffset);
196 return this.message.buffer.getUint32(arrayOffset + 4);
197 }
198
199 Validator.prototype.validateMapPointer = function(
200 offset, mapIsNullable, keyClass, valueClass, valueIsNullable) {
201 // Validate the implicit map struct:
202 // struct {array<keyClass> keys; array<valueClass> values};
203 var structOffset = this.decodePointer(offset);
204 if (structOffset === null)
205 return validationError.ILLEGAL_POINTER;
206
207 if (structOffset === NULL_MOJO_POINTER)
208 return mapIsNullable ?
209 validationError.NONE : validationError.UNEXPECTED_NULL_POINTER;
210
211 var mapEncodedSize = codec.kStructHeaderSize + codec.kMapStructPayloadSize;
212 var err = this.validateStructHeader(structOffset, mapEncodedSize, 2);
213 if (err !== validationError.NONE)
214 return err;
215
216 // Validate the keys array.
217 var keysArrayPointerOffset = structOffset + codec.kStructHeaderSize;
218 err = this.validateArrayPointer(
219 keysArrayPointerOffset, keyClass.encodedSize, keyClass, false, [0], 0);
220 if (err !== validationError.NONE)
221 return err;
222
223 // Validate the values array.
224 var valuesArrayPointerOffset = keysArrayPointerOffset + 8;
225 var valuesArrayDimensions = [0]; // Validate the actual length below.
226 if (valueClass instanceof codec.ArrayOf)
227 valuesArrayDimensions =
228 valuesArrayDimensions.concat(valueClass.dimensions());
229 var err = this.validateArrayPointer(valuesArrayPointerOffset,
230 valueClass.encodedSize,
231 valueClass,
232 valueIsNullable,
233 valuesArrayDimensions,
234 0);
235 if (err !== validationError.NONE)
236 return err;
237
238 // Validate the lengths of the keys and values arrays.
239 var keysArrayLength = this.arrayLength(keysArrayPointerOffset);
240 var valuesArrayLength = this.arrayLength(valuesArrayPointerOffset);
241 if (keysArrayLength != valuesArrayLength)
242 return validationError.DIFFERENT_SIZED_ARRAYS_IN_MAP;
243
244 return validationError.NONE;
245 }
246
192 Validator.prototype.validateStringPointer = function(offset, nullable) { 247 Validator.prototype.validateStringPointer = function(offset, nullable) {
193 return this.validateArrayPointer( 248 return this.validateArrayPointer(
194 offset, codec.Uint8.encodedSize, codec.Uint8, nullable, [0], 0); 249 offset, codec.Uint8.encodedSize, codec.Uint8, nullable, [0], 0);
195 } 250 }
196 251
197 // Similar to Array_Data<T>::Validate() 252 // Similar to Array_Data<T>::Validate()
198 // mojo/public/cpp/bindings/lib/array_internal.h 253 // mojo/public/cpp/bindings/lib/array_internal.h
199 254
200 Validator.prototype.validateArray = 255 Validator.prototype.validateArray =
201 function (offset, elementSize, elementType, expectedDimensionSizes, 256 function (offset, elementSize, elementType, expectedDimensionSizes,
(...skipping 25 matching lines...) Expand all
227 282
228 // Validate the array's elements if they are pointers or handles. 283 // Validate the array's elements if they are pointers or handles.
229 284
230 var elementsOffset = offset + codec.kArrayHeaderSize; 285 var elementsOffset = offset + codec.kArrayHeaderSize;
231 var nullable = isNullable(elementType); 286 var nullable = isNullable(elementType);
232 287
233 if (isHandleClass(elementType)) 288 if (isHandleClass(elementType))
234 return this.validateHandleElements(elementsOffset, numElements, nullable); 289 return this.validateHandleElements(elementsOffset, numElements, nullable);
235 if (isStringClass(elementType)) 290 if (isStringClass(elementType))
236 return this.validateArrayElements( 291 return this.validateArrayElements(
237 elementsOffset, numElements, codec.Uint8, nullable, 292 elementsOffset, numElements, codec.Uint8, nullable, [0], 0);
238 expectedDimensionSizes, currentDimension + 1)
239 if (elementType instanceof codec.PointerTo) 293 if (elementType instanceof codec.PointerTo)
240 return this.validateStructElements( 294 return this.validateStructElements(
241 elementsOffset, numElements, elementType.cls, nullable); 295 elementsOffset, numElements, elementType.cls, nullable);
242 if (elementType instanceof codec.ArrayOf) 296 if (elementType instanceof codec.ArrayOf)
243 return this.validateArrayElements( 297 return this.validateArrayElements(
244 elementsOffset, numElements, elementType.cls, nullable, 298 elementsOffset, numElements, elementType.cls, nullable,
245 expectedDimensionSizes, currentDimension + 1); 299 expectedDimensionSizes, currentDimension + 1);
246 300
247 return validationError.NONE; 301 return validationError.NONE;
248 } 302 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 return err; 344 return err;
291 } 345 }
292 return validationError.NONE; 346 return validationError.NONE;
293 } 347 }
294 348
295 var exports = {}; 349 var exports = {};
296 exports.validationError = validationError; 350 exports.validationError = validationError;
297 exports.Validator = Validator; 351 exports.Validator = Validator;
298 return exports; 352 return exports;
299 }); 353 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698