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 (function() { | 5 (function() { |
6 var internal = mojo.internal; | 6 var internal = mojo.internal; |
7 | 7 |
8 var validationError = { | 8 var validationError = { |
9 NONE: 'VALIDATION_ERROR_NONE', | 9 NONE: 'VALIDATION_ERROR_NONE', |
10 MISALIGNED_OBJECT: 'VALIDATION_ERROR_MISALIGNED_OBJECT', | 10 MISALIGNED_OBJECT: 'VALIDATION_ERROR_MISALIGNED_OBJECT', |
11 ILLEGAL_MEMORY_RANGE: 'VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE', | 11 ILLEGAL_MEMORY_RANGE: 'VALIDATION_ERROR_ILLEGAL_MEMORY_RANGE', |
12 UNEXPECTED_STRUCT_HEADER: 'VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER', | 12 UNEXPECTED_STRUCT_HEADER: 'VALIDATION_ERROR_UNEXPECTED_STRUCT_HEADER', |
13 UNEXPECTED_ARRAY_HEADER: 'VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER', | 13 UNEXPECTED_ARRAY_HEADER: 'VALIDATION_ERROR_UNEXPECTED_ARRAY_HEADER', |
14 ILLEGAL_HANDLE: 'VALIDATION_ERROR_ILLEGAL_HANDLE', | 14 ILLEGAL_HANDLE: 'VALIDATION_ERROR_ILLEGAL_HANDLE', |
15 UNEXPECTED_INVALID_HANDLE: 'VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE', | 15 UNEXPECTED_INVALID_HANDLE: 'VALIDATION_ERROR_UNEXPECTED_INVALID_HANDLE', |
16 ILLEGAL_POINTER: 'VALIDATION_ERROR_ILLEGAL_POINTER', | 16 ILLEGAL_POINTER: 'VALIDATION_ERROR_ILLEGAL_POINTER', |
17 UNEXPECTED_NULL_POINTER: 'VALIDATION_ERROR_UNEXPECTED_NULL_POINTER', | 17 UNEXPECTED_NULL_POINTER: 'VALIDATION_ERROR_UNEXPECTED_NULL_POINTER', |
| 18 ILLEGAL_INTERFACE_ID: 'VALIDATION_ERROR_ILLEGAL_INTERFACE_ID', |
| 19 UNEXPECTED_INVALID_INTERFACE_ID: |
| 20 'VALIDATION_ERROR_UNEXPECTED_INVALID_INTERFACE_ID', |
18 MESSAGE_HEADER_INVALID_FLAGS: | 21 MESSAGE_HEADER_INVALID_FLAGS: |
19 'VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS', | 22 'VALIDATION_ERROR_MESSAGE_HEADER_INVALID_FLAGS', |
20 MESSAGE_HEADER_MISSING_REQUEST_ID: | 23 MESSAGE_HEADER_MISSING_REQUEST_ID: |
21 'VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID', | 24 'VALIDATION_ERROR_MESSAGE_HEADER_MISSING_REQUEST_ID', |
22 DIFFERENT_SIZED_ARRAYS_IN_MAP: | 25 DIFFERENT_SIZED_ARRAYS_IN_MAP: |
23 'VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP', | 26 'VALIDATION_ERROR_DIFFERENT_SIZED_ARRAYS_IN_MAP', |
24 INVALID_UNION_SIZE: 'VALIDATION_ERROR_INVALID_UNION_SIZE', | 27 INVALID_UNION_SIZE: 'VALIDATION_ERROR_INVALID_UNION_SIZE', |
25 UNEXPECTED_NULL_UNION: 'VALIDATION_ERROR_UNEXPECTED_NULL_UNION', | 28 UNEXPECTED_NULL_UNION: 'VALIDATION_ERROR_UNEXPECTED_NULL_UNION', |
26 UNKNOWN_ENUM_VALUE: 'VALIDATION_ERROR_UNKNOWN_ENUM_VALUE', | 29 UNKNOWN_ENUM_VALUE: 'VALIDATION_ERROR_UNKNOWN_ENUM_VALUE', |
27 }; | 30 }; |
28 | 31 |
29 var NULL_MOJO_POINTER = "NULL_MOJO_POINTER"; | 32 var NULL_MOJO_POINTER = "NULL_MOJO_POINTER"; |
| 33 var gValidationErrorObserver = null; |
| 34 |
| 35 function reportValidationError(error) { |
| 36 if (gValidationErrorObserver) { |
| 37 gValidationErrorObserver.setLastError(error); |
| 38 } |
| 39 } |
| 40 |
| 41 var ValidationErrorObserverForTesting = (function() { |
| 42 function Observer() { |
| 43 this.lastError = validationError.NONE; |
| 44 this.callback = null; |
| 45 } |
| 46 |
| 47 Observer.prototype.setLastError = function(error) { |
| 48 this.lastError = error; |
| 49 if (this.callback) { |
| 50 this.callback(error); |
| 51 } |
| 52 }; |
| 53 |
| 54 Observer.prototype.reset = function(error) { |
| 55 this.lastError = validationError.NONE; |
| 56 this.callback = null; |
| 57 }; |
| 58 |
| 59 return { |
| 60 getInstance: function() { |
| 61 if (!gValidationErrorObserver) { |
| 62 gValidationErrorObserver = new Observer(); |
| 63 } |
| 64 return gValidationErrorObserver; |
| 65 } |
| 66 }; |
| 67 })(); |
| 68 |
| 69 function isTestingMode() { |
| 70 return Boolean(gValidationErrorObserver); |
| 71 } |
| 72 |
| 73 function clearTestingMode() { |
| 74 gValidationErrorObserver = null; |
| 75 } |
30 | 76 |
31 function isEnumClass(cls) { | 77 function isEnumClass(cls) { |
32 return cls instanceof internal.Enum; | 78 return cls instanceof internal.Enum; |
33 } | 79 } |
34 | 80 |
35 function isStringClass(cls) { | 81 function isStringClass(cls) { |
36 return cls === internal.String || cls === internal.NullableString; | 82 return cls === internal.String || cls === internal.NullableString; |
37 } | 83 } |
38 | 84 |
39 function isHandleClass(cls) { | 85 function isHandleClass(cls) { |
40 return cls === internal.Handle || cls === internal.NullableHandle; | 86 return cls === internal.Handle || cls === internal.NullableHandle; |
41 } | 87 } |
42 | 88 |
43 function isInterfaceClass(cls) { | 89 function isInterfaceClass(cls) { |
44 return cls instanceof internal.Interface; | 90 return cls instanceof internal.Interface; |
45 } | 91 } |
46 | 92 |
47 function isInterfaceRequestClass(cls) { | 93 function isInterfaceRequestClass(cls) { |
48 return cls === internal.InterfaceRequest || | 94 return cls === internal.InterfaceRequest || |
49 cls === internal.NullableInterfaceRequest; | 95 cls === internal.NullableInterfaceRequest; |
50 } | 96 } |
51 | 97 |
| 98 function isAssociatedInterfaceClass(cls) { |
| 99 return cls === internal.AssociatedInterfacePtrInfo || |
| 100 cls === internal.NullableAssociatedInterfacePtrInfo; |
| 101 } |
| 102 |
| 103 function isAssociatedInterfaceRequestClass(cls) { |
| 104 return cls === internal.AssociatedInterfaceRequest || |
| 105 cls === internal.NullableAssociatedInterfaceRequest; |
| 106 } |
| 107 |
52 function isNullable(type) { | 108 function isNullable(type) { |
53 return type === internal.NullableString || | 109 return type === internal.NullableString || |
54 type === internal.NullableHandle || | 110 type === internal.NullableHandle || |
| 111 type === internal.NullableAssociatedInterfacePtrInfo || |
| 112 type === internal.NullableAssociatedInterfaceRequest || |
55 type === internal.NullableInterface || | 113 type === internal.NullableInterface || |
56 type === internal.NullableInterfaceRequest || | 114 type === internal.NullableInterfaceRequest || |
57 type instanceof internal.NullableArrayOf || | 115 type instanceof internal.NullableArrayOf || |
58 type instanceof internal.NullablePointerTo; | 116 type instanceof internal.NullablePointerTo; |
59 } | 117 } |
60 | 118 |
61 function Validator(message) { | 119 function Validator(message) { |
62 this.message = message; | 120 this.message = message; |
63 this.offset = 0; | 121 this.offset = 0; |
64 this.handleIndex = 0; | 122 this.handleIndex = 0; |
| 123 this.associatedEndpointHandleIndex = 0; |
| 124 this.payloadInterfaceIds = null; |
| 125 this.offsetLimit = this.message.buffer.byteLength; |
65 } | 126 } |
66 | 127 |
67 Object.defineProperty(Validator.prototype, "offsetLimit", { | |
68 get: function() { return this.message.buffer.byteLength; } | |
69 }); | |
70 | |
71 Object.defineProperty(Validator.prototype, "handleIndexLimit", { | 128 Object.defineProperty(Validator.prototype, "handleIndexLimit", { |
72 get: function() { return this.message.handles.length; } | 129 get: function() { return this.message.handles.length; } |
73 }); | 130 }); |
74 | 131 |
| 132 Object.defineProperty(Validator.prototype, "associatedHandleIndexLimit", { |
| 133 get: function() { |
| 134 return this.payloadInterfaceIds ? this.payloadInterfaceIds.length : 0; |
| 135 } |
| 136 }); |
| 137 |
75 // True if we can safely allocate a block of bytes from start to | 138 // True if we can safely allocate a block of bytes from start to |
76 // to start + numBytes. | 139 // to start + numBytes. |
77 Validator.prototype.isValidRange = function(start, numBytes) { | 140 Validator.prototype.isValidRange = function(start, numBytes) { |
78 // Only positive JavaScript integers that are less than 2^53 | 141 // Only positive JavaScript integers that are less than 2^53 |
79 // (Number.MAX_SAFE_INTEGER) can be represented exactly. | 142 // (Number.MAX_SAFE_INTEGER) can be represented exactly. |
80 if (start < this.offset || numBytes <= 0 || | 143 if (start < this.offset || numBytes <= 0 || |
81 !Number.isSafeInteger(start) || | 144 !Number.isSafeInteger(start) || |
82 !Number.isSafeInteger(numBytes)) | 145 !Number.isSafeInteger(numBytes)) |
83 return false; | 146 return false; |
84 | 147 |
(...skipping 17 matching lines...) Expand all Loading... |
102 return true; | 165 return true; |
103 | 166 |
104 if (index < this.handleIndex || index >= this.handleIndexLimit) | 167 if (index < this.handleIndex || index >= this.handleIndexLimit) |
105 return false; | 168 return false; |
106 | 169 |
107 // This is safe because handle indices are uint32. | 170 // This is safe because handle indices are uint32. |
108 this.handleIndex = index + 1; | 171 this.handleIndex = index + 1; |
109 return true; | 172 return true; |
110 }; | 173 }; |
111 | 174 |
| 175 Validator.prototype.claimAssociatedEndpointHandle = function(index) { |
| 176 if (index === internal.kEncodedInvalidHandleValue) { |
| 177 return true; |
| 178 } |
| 179 |
| 180 if (index < this.associatedEndpointHandleIndex || |
| 181 index >= this.associatedHandleIndexLimit) { |
| 182 return false; |
| 183 } |
| 184 |
| 185 // This is safe because handle indices are uint32. |
| 186 this.associatedEndpointHandleIndex = index + 1; |
| 187 return true; |
| 188 }; |
| 189 |
112 Validator.prototype.validateEnum = function(offset, enumClass) { | 190 Validator.prototype.validateEnum = function(offset, enumClass) { |
113 // Note: Assumes that enums are always 32 bits! But this matches | 191 // Note: Assumes that enums are always 32 bits! But this matches |
114 // mojom::generate::pack::PackedField::GetSizeForKind, so it should be okay. | 192 // mojom::generate::pack::PackedField::GetSizeForKind, so it should be okay. |
115 var value = this.message.buffer.getInt32(offset); | 193 var value = this.message.buffer.getInt32(offset); |
116 return enumClass.validate(value); | 194 return enumClass.validate(value); |
117 } | 195 } |
118 | 196 |
119 Validator.prototype.validateHandle = function(offset, nullable) { | 197 Validator.prototype.validateHandle = function(offset, nullable) { |
120 var index = this.message.buffer.getUint32(offset); | 198 var index = this.message.buffer.getUint32(offset); |
121 | 199 |
122 if (index === internal.kEncodedInvalidHandleValue) | 200 if (index === internal.kEncodedInvalidHandleValue) |
123 return nullable ? | 201 return nullable ? |
124 validationError.NONE : validationError.UNEXPECTED_INVALID_HANDLE; | 202 validationError.NONE : validationError.UNEXPECTED_INVALID_HANDLE; |
125 | 203 |
126 if (!this.claimHandle(index)) | 204 if (!this.claimHandle(index)) |
127 return validationError.ILLEGAL_HANDLE; | 205 return validationError.ILLEGAL_HANDLE; |
128 | 206 |
129 return validationError.NONE; | 207 return validationError.NONE; |
130 }; | 208 }; |
131 | 209 |
| 210 Validator.prototype.validateAssociatedEndpointHandle = function(offset, |
| 211 nullable) { |
| 212 var index = this.message.buffer.getUint32(offset); |
| 213 |
| 214 if (index === internal.kEncodedInvalidHandleValue) { |
| 215 return nullable ? validationError.NONE : |
| 216 validationError.UNEXPECTED_INVALID_INTERFACE_ID; |
| 217 } |
| 218 |
| 219 if (!this.claimAssociatedEndpointHandle(index)) { |
| 220 return validationError.ILLEGAL_INTERFACE_ID; |
| 221 } |
| 222 |
| 223 return validationError.NONE; |
| 224 }; |
| 225 |
132 Validator.prototype.validateInterface = function(offset, nullable) { | 226 Validator.prototype.validateInterface = function(offset, nullable) { |
133 return this.validateHandle(offset, nullable); | 227 return this.validateHandle(offset, nullable); |
134 }; | 228 }; |
135 | 229 |
136 Validator.prototype.validateInterfaceRequest = function(offset, nullable) { | 230 Validator.prototype.validateInterfaceRequest = function(offset, nullable) { |
137 return this.validateHandle(offset, nullable); | 231 return this.validateHandle(offset, nullable); |
138 }; | 232 }; |
139 | 233 |
| 234 Validator.prototype.validateAssociatedInterface = function(offset, |
| 235 nullable) { |
| 236 return this.validateAssociatedEndpointHandle(offset, nullable); |
| 237 }; |
| 238 |
| 239 Validator.prototype.validateAssociatedInterfaceRequest = function( |
| 240 offset, nullable) { |
| 241 return this.validateAssociatedEndpointHandle(offset, nullable); |
| 242 }; |
| 243 |
140 Validator.prototype.validateStructHeader = function(offset, minNumBytes) { | 244 Validator.prototype.validateStructHeader = function(offset, minNumBytes) { |
141 if (!internal.isAligned(offset)) | 245 if (!internal.isAligned(offset)) |
142 return validationError.MISALIGNED_OBJECT; | 246 return validationError.MISALIGNED_OBJECT; |
143 | 247 |
144 if (!this.isValidRange(offset, internal.kStructHeaderSize)) | 248 if (!this.isValidRange(offset, internal.kStructHeaderSize)) |
145 return validationError.ILLEGAL_MEMORY_RANGE; | 249 return validationError.ILLEGAL_MEMORY_RANGE; |
146 | 250 |
147 var numBytes = this.message.buffer.getUint32(offset); | 251 var numBytes = this.message.buffer.getUint32(offset); |
148 | 252 |
149 if (numBytes < minNumBytes) | 253 if (numBytes < minNumBytes) |
(...skipping 24 matching lines...) Expand all Loading... |
174 | 278 |
175 return validationError.NONE; | 279 return validationError.NONE; |
176 }; | 280 }; |
177 | 281 |
178 Validator.prototype.isFieldInStructVersion = function(offset, fieldVersion) { | 282 Validator.prototype.isFieldInStructVersion = function(offset, fieldVersion) { |
179 var structVersion = this.message.buffer.getUint32(offset + 4); | 283 var structVersion = this.message.buffer.getUint32(offset + 4); |
180 return fieldVersion <= structVersion; | 284 return fieldVersion <= structVersion; |
181 }; | 285 }; |
182 | 286 |
183 Validator.prototype.validateMessageHeader = function() { | 287 Validator.prototype.validateMessageHeader = function() { |
184 | 288 var err = this.validateStructHeader(0, internal.kMessageV0HeaderSize); |
185 var err = this.validateStructHeader(0, internal.kMessageHeaderSize); | 289 if (err != validationError.NONE) { |
186 if (err != validationError.NONE) | |
187 return err; | 290 return err; |
| 291 } |
188 | 292 |
189 var numBytes = this.message.getHeaderNumBytes(); | 293 var numBytes = this.message.getHeaderNumBytes(); |
190 var version = this.message.getHeaderVersion(); | 294 var version = this.message.getHeaderVersion(); |
191 | 295 |
192 var validVersionAndNumBytes = | 296 var validVersionAndNumBytes = |
193 (version == 0 && numBytes == internal.kMessageHeaderSize) || | 297 (version == 0 && numBytes == internal.kMessageV0HeaderSize) || |
194 (version == 1 && | 298 (version == 1 && numBytes == internal.kMessageV1HeaderSize) || |
195 numBytes == internal.kMessageWithRequestIDHeaderSize) || | 299 (version == 2 && numBytes == internal.kMessageV2HeaderSize) || |
196 (version > 1 && | 300 (version > 2 && numBytes >= internal.kMessageV2HeaderSize); |
197 numBytes >= internal.kMessageWithRequestIDHeaderSize); | 301 |
198 if (!validVersionAndNumBytes) | 302 if (!validVersionAndNumBytes) { |
199 return validationError.UNEXPECTED_STRUCT_HEADER; | 303 return validationError.UNEXPECTED_STRUCT_HEADER; |
| 304 } |
200 | 305 |
201 var expectsResponse = this.message.expectsResponse(); | 306 var expectsResponse = this.message.expectsResponse(); |
202 var isResponse = this.message.isResponse(); | 307 var isResponse = this.message.isResponse(); |
203 | 308 |
204 if (version == 0 && (expectsResponse || isResponse)) | 309 if (version == 0 && (expectsResponse || isResponse)) { |
205 return validationError.MESSAGE_HEADER_MISSING_REQUEST_ID; | 310 return validationError.MESSAGE_HEADER_MISSING_REQUEST_ID; |
| 311 } |
206 | 312 |
207 if (isResponse && expectsResponse) | 313 if (isResponse && expectsResponse) { |
208 return validationError.MESSAGE_HEADER_INVALID_FLAGS; | 314 return validationError.MESSAGE_HEADER_INVALID_FLAGS; |
| 315 } |
| 316 |
| 317 if (version < 2) { |
| 318 return validationError.NONE; |
| 319 } |
| 320 |
| 321 var err = this.validateArrayPointer( |
| 322 internal.kMessagePayloadInterfaceIdsPointerOffset, |
| 323 internal.Uint32.encodedSize, internal.Uint32, true, [0], 0); |
| 324 |
| 325 if (err != validationError.NONE) { |
| 326 return err; |
| 327 } |
| 328 |
| 329 this.payloadInterfaceIds = this.message.getPayloadInterfaceIds(); |
| 330 if (this.payloadInterfaceIds) { |
| 331 for (var interfaceId of this.payloadInterfaceIds) { |
| 332 if (!internal.isValidInterfaceId(interfaceId) || |
| 333 internal.isMasterInterfaceId(interfaceId)) { |
| 334 return validationError.ILLEGAL_INTERFACE_ID; |
| 335 } |
| 336 } |
| 337 } |
| 338 |
| 339 // Set offset to the start of the payload and offsetLimit to the start of |
| 340 // the payload interface Ids so that payload can be validated using the |
| 341 // same messageValidator. |
| 342 this.offset = this.message.getHeaderNumBytes(); |
| 343 this.offsetLimit = this.decodePointer( |
| 344 internal.kMessagePayloadInterfaceIdsPointerOffset); |
209 | 345 |
210 return validationError.NONE; | 346 return validationError.NONE; |
211 }; | 347 }; |
212 | 348 |
213 Validator.prototype.validateMessageIsRequestWithoutResponse = function() { | 349 Validator.prototype.validateMessageIsRequestWithoutResponse = function() { |
214 if (this.message.isResponse() || this.message.expectsResponse()) { | 350 if (this.message.isResponse() || this.message.expectsResponse()) { |
215 return validationError.MESSAGE_HEADER_INVALID_FLAGS; | 351 return validationError.MESSAGE_HEADER_INVALID_FLAGS; |
216 } | 352 } |
217 return validationError.NONE; | 353 return validationError.NONE; |
218 }; | 354 }; |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
316 // struct {array<keyClass> keys; array<valueClass> values}; | 452 // struct {array<keyClass> keys; array<valueClass> values}; |
317 var structOffset = this.decodePointer(offset); | 453 var structOffset = this.decodePointer(offset); |
318 if (structOffset === null) | 454 if (structOffset === null) |
319 return validationError.ILLEGAL_POINTER; | 455 return validationError.ILLEGAL_POINTER; |
320 | 456 |
321 if (structOffset === NULL_MOJO_POINTER) | 457 if (structOffset === NULL_MOJO_POINTER) |
322 return mapIsNullable ? | 458 return mapIsNullable ? |
323 validationError.NONE : validationError.UNEXPECTED_NULL_POINTER; | 459 validationError.NONE : validationError.UNEXPECTED_NULL_POINTER; |
324 | 460 |
325 var mapEncodedSize = internal.kStructHeaderSize + | 461 var mapEncodedSize = internal.kStructHeaderSize + |
326 internal.kMapStructPayloadSize; | 462 internal.kMapStructPayloadSize; |
327 var err = this.validateStructHeader(structOffset, mapEncodedSize); | 463 var err = this.validateStructHeader(structOffset, mapEncodedSize); |
328 if (err !== validationError.NONE) | 464 if (err !== validationError.NONE) |
329 return err; | 465 return err; |
330 | 466 |
331 // Validate the keys array. | 467 // Validate the keys array. |
332 var keysArrayPointerOffset = structOffset + internal.kStructHeaderSize; | 468 var keysArrayPointerOffset = structOffset + internal.kStructHeaderSize; |
333 err = this.validateArrayPointer( | 469 err = this.validateArrayPointer( |
334 keysArrayPointerOffset, keyClass.encodedSize, keyClass, false, [0], 0); | 470 keysArrayPointerOffset, keyClass.encodedSize, keyClass, false, [0], 0); |
335 if (err !== validationError.NONE) | 471 if (err !== validationError.NONE) |
336 return err; | 472 return err; |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
401 var nullable = isNullable(elementType); | 537 var nullable = isNullable(elementType); |
402 | 538 |
403 if (isHandleClass(elementType)) | 539 if (isHandleClass(elementType)) |
404 return this.validateHandleElements(elementsOffset, numElements, nullable); | 540 return this.validateHandleElements(elementsOffset, numElements, nullable); |
405 if (isInterfaceClass(elementType)) | 541 if (isInterfaceClass(elementType)) |
406 return this.validateInterfaceElements( | 542 return this.validateInterfaceElements( |
407 elementsOffset, numElements, nullable); | 543 elementsOffset, numElements, nullable); |
408 if (isInterfaceRequestClass(elementType)) | 544 if (isInterfaceRequestClass(elementType)) |
409 return this.validateInterfaceRequestElements( | 545 return this.validateInterfaceRequestElements( |
410 elementsOffset, numElements, nullable); | 546 elementsOffset, numElements, nullable); |
| 547 if (isAssociatedInterfaceClass(elementType)) |
| 548 return this.validateAssociatedInterfaceElements( |
| 549 elementsOffset, numElements, nullable); |
| 550 if (isAssociatedInterfaceRequestClass(elementType)) |
| 551 return this.validateAssociatedInterfaceRequestElements( |
| 552 elementsOffset, numElements, nullable); |
411 if (isStringClass(elementType)) | 553 if (isStringClass(elementType)) |
412 return this.validateArrayElements( | 554 return this.validateArrayElements( |
413 elementsOffset, numElements, internal.Uint8, nullable, [0], 0); | 555 elementsOffset, numElements, internal.Uint8, nullable, [0], 0); |
414 if (elementType instanceof internal.PointerTo) | 556 if (elementType instanceof internal.PointerTo) |
415 return this.validateStructElements( | 557 return this.validateStructElements( |
416 elementsOffset, numElements, elementType.cls, nullable); | 558 elementsOffset, numElements, elementType.cls, nullable); |
417 if (elementType instanceof internal.ArrayOf) | 559 if (elementType instanceof internal.ArrayOf) |
418 return this.validateArrayElements( | 560 return this.validateArrayElements( |
419 elementsOffset, numElements, elementType.cls, nullable, | 561 elementsOffset, numElements, elementType.cls, nullable, |
420 expectedDimensionSizes, currentDimension + 1); | 562 expectedDimensionSizes, currentDimension + 1); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
458 var elementSize = internal.InterfaceRequest.encodedSize; | 600 var elementSize = internal.InterfaceRequest.encodedSize; |
459 for (var i = 0; i < numElements; i++) { | 601 for (var i = 0; i < numElements; i++) { |
460 var elementOffset = offset + i * elementSize; | 602 var elementOffset = offset + i * elementSize; |
461 var err = this.validateInterfaceRequest(elementOffset, nullable); | 603 var err = this.validateInterfaceRequest(elementOffset, nullable); |
462 if (err != validationError.NONE) | 604 if (err != validationError.NONE) |
463 return err; | 605 return err; |
464 } | 606 } |
465 return validationError.NONE; | 607 return validationError.NONE; |
466 }; | 608 }; |
467 | 609 |
| 610 Validator.prototype.validateAssociatedInterfaceElements = |
| 611 function(offset, numElements, nullable) { |
| 612 var elementSize = internal.AssociatedInterfacePtrInfo.prototype.encodedSize; |
| 613 for (var i = 0; i < numElements; i++) { |
| 614 var elementOffset = offset + i * elementSize; |
| 615 var err = this.validateAssociatedInterface(elementOffset, nullable); |
| 616 if (err != validationError.NONE) { |
| 617 return err; |
| 618 } |
| 619 } |
| 620 return validationError.NONE; |
| 621 }; |
| 622 |
| 623 Validator.prototype.validateAssociatedInterfaceRequestElements = |
| 624 function(offset, numElements, nullable) { |
| 625 var elementSize = internal.AssociatedInterfaceRequest.encodedSize; |
| 626 for (var i = 0; i < numElements; i++) { |
| 627 var elementOffset = offset + i * elementSize; |
| 628 var err = this.validateAssociatedInterfaceRequest(elementOffset, |
| 629 nullable); |
| 630 if (err != validationError.NONE) { |
| 631 return err; |
| 632 } |
| 633 } |
| 634 return validationError.NONE; |
| 635 }; |
| 636 |
468 // The elementClass parameter is the element type of the element arrays. | 637 // The elementClass parameter is the element type of the element arrays. |
469 Validator.prototype.validateArrayElements = | 638 Validator.prototype.validateArrayElements = |
470 function(offset, numElements, elementClass, nullable, | 639 function(offset, numElements, elementClass, nullable, |
471 expectedDimensionSizes, currentDimension) { | 640 expectedDimensionSizes, currentDimension) { |
472 var elementSize = internal.PointerTo.prototype.encodedSize; | 641 var elementSize = internal.PointerTo.prototype.encodedSize; |
473 for (var i = 0; i < numElements; i++) { | 642 for (var i = 0; i < numElements; i++) { |
474 var elementOffset = offset + i * elementSize; | 643 var elementOffset = offset + i * elementSize; |
475 var err = this.validateArrayPointer( | 644 var err = this.validateArrayPointer( |
476 elementOffset, elementClass.encodedSize, elementClass, nullable, | 645 elementOffset, elementClass.encodedSize, elementClass, nullable, |
477 expectedDimensionSizes, currentDimension); | 646 expectedDimensionSizes, currentDimension); |
(...skipping 23 matching lines...) Expand all Loading... |
501 var elementOffset = offset + i * elementSize; | 670 var elementOffset = offset + i * elementSize; |
502 var err = this.validateEnum(elementOffset, enumClass); | 671 var err = this.validateEnum(elementOffset, enumClass); |
503 if (err != validationError.NONE) | 672 if (err != validationError.NONE) |
504 return err; | 673 return err; |
505 } | 674 } |
506 return validationError.NONE; | 675 return validationError.NONE; |
507 }; | 676 }; |
508 | 677 |
509 internal.validationError = validationError; | 678 internal.validationError = validationError; |
510 internal.Validator = Validator; | 679 internal.Validator = Validator; |
| 680 internal.ValidationErrorObserverForTesting = |
| 681 ValidationErrorObserverForTesting; |
| 682 internal.reportValidationError = reportValidationError; |
| 683 internal.isTestingMode = isTestingMode; |
| 684 internal.clearTestingMode = clearTestingMode; |
511 })(); | 685 })(); |
OLD | NEW |