diff options
Diffstat (limited to 'ext')
| -rw-r--r-- | ext/bg/js/json-schema.js | 27 | 
1 files changed, 27 insertions, 0 deletions
| diff --git a/ext/bg/js/json-schema.js b/ext/bg/js/json-schema.js index b777ac09..7cc87bb0 100644 --- a/ext/bg/js/json-schema.js +++ b/ext/bg/js/json-schema.js @@ -326,6 +326,11 @@ class JsonSchemaValidator {              throw new JsonSchemaValidationError(`Value type ${type} does not match schema type ${schemaType}`, value, schema, info);          } +        const schemaConst = schema.const; +        if (typeof schemaConst !== 'undefined' && !this.valuesAreEqual(value, schemaConst)) { +            throw new JsonSchemaValidationError('Invalid constant value', value, schema, info); +        } +          const schemaEnum = schema.enum;          if (Array.isArray(schemaEnum) && !this.valuesAreEqualAny(value, schemaEnum)) {              throw new JsonSchemaValidationError('Invalid enum value', value, schema, info); @@ -414,6 +419,8 @@ class JsonSchemaValidator {              throw new JsonSchemaValidationError('Array length too long', value, schema, info);          } +        this.validateArrayContains(value, schema, info); +          for (let i = 0, ii = value.length; i < ii; ++i) {              const schemaPath = [];              const propertySchema = this.getPropertySchema(schema, i, value, schemaPath); @@ -431,6 +438,26 @@ class JsonSchemaValidator {          }      } +    validateArrayContains(value, schema, info) { +        const containsSchema = schema.contains; +        if (!this.isObject(containsSchema)) { return; } + +        info.schemaPush('contains', containsSchema); +        for (let i = 0, ii = value.length; i < ii; ++i) { +            const propertyValue = value[i]; +            info.valuePush(i, propertyValue); +            try { +                this.validate(propertyValue, containsSchema, info); +                info.schemaPop(); +                return; +            } catch (e) { +                // NOP +            } +            info.valuePop(); +        } +        throw new JsonSchemaValidationError('contains schema didn\'t match', value, schema, info); +    } +      validateObject(value, schema, info) {          const properties = new Set(Object.getOwnPropertyNames(value)); |