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

Unified Diff: components/json_schema/json_schema_validator.cc

Issue 94043003: Ignore unknown attributes when parsing JSON schemas. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: added Options enum Created 7 years 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 side-by-side diff with in-line comments
Download patch
Index: components/json_schema/json_schema_validator.cc
diff --git a/components/json_schema/json_schema_validator.cc b/components/json_schema/json_schema_validator.cc
index 32cb93ca2547c08a34b34bd575401a0a0720d6a8..310975ae7ec7cc87c97b14c5f2e5fd7d760d9bbe 100644
--- a/components/json_schema/json_schema_validator.cc
+++ b/components/json_schema/json_schema_validator.cc
@@ -65,7 +65,9 @@ const base::Value* ExtractNameFromDictionary(const base::Value* value) {
return value;
}
-bool IsValidSchema(const base::DictionaryValue* dict, std::string* error) {
+bool IsValidSchema(const base::DictionaryValue* dict,
+ int options,
+ std::string* error) {
// This array must be sorted, so that std::lower_bound can perform a
// binary search.
static const ExpectedType kExpectedTypes[] = {
@@ -126,7 +128,7 @@ bool IsValidSchema(const base::DictionaryValue* dict, std::string* error) {
// Validate the "items" attribute, which is a schema or a list of schemas.
if (it.key() == schema::kItems) {
if (it.value().GetAsDictionary(&dictionary_value)) {
- if (!IsValidSchema(dictionary_value, error)) {
+ if (!IsValidSchema(dictionary_value, options, error)) {
DCHECK(!error->empty());
return false;
}
@@ -138,7 +140,7 @@ bool IsValidSchema(const base::DictionaryValue* dict, std::string* error) {
static_cast<int>(i));
return false;
}
- if (!IsValidSchema(dictionary_value, error)) {
+ if (!IsValidSchema(dictionary_value, options, error)) {
DCHECK(!error->empty());
return false;
}
@@ -155,9 +157,12 @@ bool IsValidSchema(const base::DictionaryValue* dict, std::string* error) {
const ExpectedType* entry = std::lower_bound(
kExpectedTypes, end, it.key(), CompareToString);
if (entry == end || entry->key != it.key()) {
+ if (options & JSONSchemaValidator::OPTIONS_IGNORE_UNKNOWN_ATTRIBUTES)
+ continue;
*error = base::StringPrintf("Invalid attribute %s", it.key().c_str());
return false;
}
+
if (!it.value().IsType(entry->type)) {
*error = base::StringPrintf("Invalid value for %s attribute",
it.key().c_str());
@@ -185,7 +190,7 @@ bool IsValidSchema(const base::DictionaryValue* dict, std::string* error) {
*error = "Invalid value for properties attribute";
return false;
}
- if (!IsValidSchema(dictionary_value, error)) {
+ if (!IsValidSchema(dictionary_value, options, error)) {
DCHECK(!error->empty());
return false;
}
@@ -195,7 +200,7 @@ bool IsValidSchema(const base::DictionaryValue* dict, std::string* error) {
// Validate "additionalProperties" attribute, which is a schema.
if (it.key() == schema::kAdditionalProperties) {
it.value().GetAsDictionary(&dictionary_value);
- if (!IsValidSchema(dictionary_value, error)) {
+ if (!IsValidSchema(dictionary_value, options, error)) {
DCHECK(!error->empty());
return false;
}
@@ -236,7 +241,7 @@ bool IsValidSchema(const base::DictionaryValue* dict, std::string* error) {
*error = "Invalid choices attribute";
return false;
}
- if (!IsValidSchema(dictionary_value, error)) {
+ if (!IsValidSchema(dictionary_value, options, error)) {
DCHECK(!error->empty());
return false;
}
@@ -356,9 +361,17 @@ std::string JSONSchemaValidator::FormatErrorMessage(const std::string& format,
scoped_ptr<base::DictionaryValue> JSONSchemaValidator::IsValidSchema(
const std::string& schema,
std::string* error) {
- base::JSONParserOptions options = base::JSON_PARSE_RFC;
+ return JSONSchemaValidator::IsValidSchema(schema, 0, error);
+}
+
+// static
+scoped_ptr<base::DictionaryValue> JSONSchemaValidator::IsValidSchema(
+ const std::string& schema,
+ int validator_options,
+ std::string* error) {
+ base::JSONParserOptions json_options = base::JSON_PARSE_RFC;
scoped_ptr<base::Value> json(
- base::JSONReader::ReadAndReturnError(schema, options, NULL, error));
+ base::JSONReader::ReadAndReturnError(schema, json_options, NULL, error));
if (!json)
return scoped_ptr<base::DictionaryValue>();
base::DictionaryValue* dict = NULL;
@@ -366,7 +379,7 @@ scoped_ptr<base::DictionaryValue> JSONSchemaValidator::IsValidSchema(
*error = "Schema must be a JSON object";
return scoped_ptr<base::DictionaryValue>();
}
- if (!::IsValidSchema(dict, error))
+ if (!::IsValidSchema(dict, validator_options, error))
return scoped_ptr<base::DictionaryValue>();
ignore_result(json.release());
return make_scoped_ptr(dict);
« no previous file with comments | « components/json_schema/json_schema_validator.h ('k') | components/json_schema/json_schema_validator_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698