| 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 |