| Index: chrome/common/json_schema_validator.h
|
| diff --git a/chrome/common/json_schema_validator.h b/chrome/common/json_schema_validator.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..27a801022905ad6020453d56fb0aa702cde4ffab
|
| --- /dev/null
|
| +++ b/chrome/common/json_schema_validator.h
|
| @@ -0,0 +1,177 @@
|
| +// Copyright (c) 2010 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#ifndef CHROME_COMMON_JSON_SCHEMA_VALIDATOR_H_
|
| +#define CHROME_COMMON_JSON_SCHEMA_VALIDATOR_H_
|
| +
|
| +#include <map>
|
| +#include <string>
|
| +#include <vector>
|
| +
|
| +#include "base/basictypes.h"
|
| +
|
| +class DictionaryValue;
|
| +class FundamentalValue;
|
| +class ListValue;
|
| +class StringValue;
|
| +class Value;
|
| +
|
| +//==============================================================================
|
| +// This class implements a subset of JSON Schema.
|
| +// See: http://www.json.com/json-schema-proposal/ for more details.
|
| +//
|
| +// There is also an older JavaScript implementation of the same functionality in
|
| +// chrome/renderer/resources/json_schema.js.
|
| +//
|
| +// The following features of JSON Schema are not implemented:
|
| +// - requires
|
| +// - unique
|
| +// - disallow
|
| +// - union types (but replaced with 'choices')
|
| +// - number.maxDecimal
|
| +// - string.pattern
|
| +//
|
| +// The following properties are not applicable to the interface exposed by
|
| +// this class:
|
| +// - options
|
| +// - readonly
|
| +// - title
|
| +// - description
|
| +// - format
|
| +// - default
|
| +// - transient
|
| +// - hidden
|
| +//
|
| +// There are also these departures from the JSON Schema proposal:
|
| +// - null counts as 'unspecified' for optional values
|
| +// - added the 'choices' property, to allow specifying a list of possible types
|
| +// for a value
|
| +// - by default an "object" typed schema does not allow additional properties.
|
| +// if present, "additionalProperties" is to be a schema against which all
|
| +// additional properties will be validated.
|
| +//==============================================================================
|
| +class JSONSchemaValidator {
|
| + public:
|
| + // Details about a validation error.
|
| + struct Error {
|
| + Error();
|
| +
|
| + explicit Error(const std::string& message);
|
| +
|
| + Error(const std::string& path, const std::string& message);
|
| +
|
| + // The path to the location of the error in the JSON structure.
|
| + std::string path;
|
| +
|
| + // An english message describing the error.
|
| + std::string message;
|
| + };
|
| +
|
| + // Error messages.
|
| + static const char kUnknownTypeReference[];
|
| + static const char kInvalidChoice[];
|
| + static const char kInvalidEnum[];
|
| + static const char kObjectPropertyIsRequired[];
|
| + static const char kUnexpectedProperty[];
|
| + static const char kArrayMinItems[];
|
| + static const char kArrayMaxItems[];
|
| + static const char kArrayItemRequired[];
|
| + static const char kStringMinLength[];
|
| + static const char kStringMaxLength[];
|
| + static const char kStringPattern[];
|
| + static const char kInfinityNaNNotSupported[];
|
| + static const char kNumberMinimum[];
|
| + static const char kNumberMaximum[];
|
| + static const char kInvalidType[];
|
| +
|
| + // Utility methods to format error messages.
|
| + static std::string FormatErrorMessage(const std::string& format,
|
| + const std::string& s1);
|
| + static std::string FormatErrorMessage(const std::string& format,
|
| + const std::string& s1,
|
| + const std::string& s2);
|
| +
|
| + // Creates a validator for the specified schema.
|
| + explicit JSONSchemaValidator(DictionaryValue* schema);
|
| +
|
| + // Creates a validator for the specified schema and user-defined types. Each
|
| + // type must have an "id" property that can be referred to within the schema
|
| + // with "ref".
|
| + JSONSchemaValidator(DictionaryValue* schema, ListValue* types);
|
| +
|
| + // Whether the validator allows additional items for objects and lists, beyond
|
| + // those defined by their schema, by default.
|
| + //
|
| + // This setting defaults to false: all items in an instance list or object
|
| + // must be defined by the corresponding schema.
|
| + //
|
| + // This setting can be overridden on individual object and list schemas by
|
| + // setting the "additionalProperties" field.
|
| + bool default_allow_additional_properties() const {
|
| + return default_allow_additional_properties_;
|
| + }
|
| +
|
| + void set_default_allow_additional_properties(bool val) {
|
| + default_allow_additional_properties_ = val;
|
| + }
|
| +
|
| + // Returns any errors from the last call to to Validate().
|
| + const std::vector<Error>& errors() const {
|
| + return errors_;
|
| + }
|
| +
|
| + // Validates a JSON value. Returns true if the instance is valid, false
|
| + // otherwise. If false is returned any errors are available from the errors()
|
| + // getter.
|
| + bool Validate(Value* instance);
|
| +
|
| + private:
|
| + typedef std::map<std::string, DictionaryValue*> TypeMap;
|
| +
|
| + void Validate(Value* instance, DictionaryValue* schema,
|
| + const std::string& path);
|
| +
|
| + void ValidateChoices(Value* instance, ListValue* choices,
|
| + const std::string& path);
|
| +
|
| + void ValidateEnum(Value* instance, ListValue* choices,
|
| + const std::string& path);
|
| +
|
| + void ValidateObject(DictionaryValue* instance, DictionaryValue* schema,
|
| + const std::string& path);
|
| +
|
| + void ValidateArray(ListValue* instance, DictionaryValue* schema,
|
| + const std::string& path);
|
| +
|
| + void ValidateString(StringValue* instance, DictionaryValue* schema,
|
| + const std::string& path);
|
| +
|
| + void ValidateNumber(Value* instance, DictionaryValue* schema,
|
| + const std::string& path);
|
| +
|
| + bool ValidateType(Value* instance, const std::string& expected_type,
|
| + const std::string& path);
|
| +
|
| + // Returns true if |schema| will allow additional items of any type.
|
| + bool SchemaAllowsAnyAdditionalItems(
|
| + DictionaryValue* schema, DictionaryValue** addition_items_schema);
|
| +
|
| + // The root schema node.
|
| + DictionaryValue* schema_root_;
|
| +
|
| + // Map of user-defined name to type.
|
| + TypeMap types_;
|
| +
|
| + // Whether we allow additional properties on objects by default. This can be
|
| + // overridden by the allow_additional_properties flag on an Object schema.
|
| + bool default_allow_additional_properties_;
|
| +
|
| + // Errors accumulated since the last call to Validate().
|
| + std::vector<Error> errors_;
|
| +
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(JSONSchemaValidator);
|
| +};
|
| +
|
| +#endif // CHROME_COMMON_JSON_SCHEMA_VALIDATOR_H_
|
|
|