| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 #include "chrome/common/json_schema_validator.h" | 5 #include "chrome/common/json_schema_validator.h" |
| 6 | 6 |
| 7 #include <cfloat> | 7 #include <cfloat> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 | 9 |
| 10 #include "base/string_number_conversions.h" | 10 #include "base/string_number_conversions.h" |
| 11 #include "base/string_util.h" | 11 #include "base/string_util.h" |
| 12 #include "base/values.h" | 12 #include "base/values.h" |
| 13 #include "ui/base/l10n/l10n_util.h" | 13 #include "ui/base/l10n/l10n_util.h" |
| 14 | 14 |
| 15 namespace { | 15 namespace { |
| 16 | 16 |
| 17 double GetNumberValue(Value* value) { | 17 double GetNumberValue(Value* value) { |
| 18 double result = 0; | 18 double result = 0; |
| 19 if (value->GetAsDouble(&result)) | 19 CHECK(value->GetAsDouble(&result)) |
| 20 return result; | 20 << "Unexpected value type: " << value->GetType(); |
| 21 | 21 return result; |
| 22 int int_result = 0; | |
| 23 if (value->GetAsInteger(&int_result)) { | |
| 24 return int_result; | |
| 25 } | |
| 26 | |
| 27 CHECK(false) << "Unexpected value type: " << value->GetType(); | |
| 28 return 0; | |
| 29 } | |
| 30 | |
| 31 bool GetNumberFromDictionary(DictionaryValue* value, const std::string& key, | |
| 32 double* number) { | |
| 33 if (value->GetDouble(key, number)) | |
| 34 return true; | |
| 35 | |
| 36 int int_value = 0; | |
| 37 if (value->GetInteger(key, &int_value)) { | |
| 38 *number = int_value; | |
| 39 return true; | |
| 40 } | |
| 41 | |
| 42 return false; | |
| 43 } | 22 } |
| 44 | 23 |
| 45 } // namespace | 24 } // namespace |
| 46 | 25 |
| 47 | 26 |
| 48 JSONSchemaValidator::Error::Error() { | 27 JSONSchemaValidator::Error::Error() { |
| 49 } | 28 } |
| 50 | 29 |
| 51 JSONSchemaValidator::Error::Error(const std::string& message) | 30 JSONSchemaValidator::Error::Error(const std::string& message) |
| 52 : path(message) { | 31 : path(message) { |
| (...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 452 | 431 |
| 453 void JSONSchemaValidator::ValidateNumber(Value* instance, | 432 void JSONSchemaValidator::ValidateNumber(Value* instance, |
| 454 DictionaryValue* schema, | 433 DictionaryValue* schema, |
| 455 const std::string& path) { | 434 const std::string& path) { |
| 456 double value = GetNumberValue(instance); | 435 double value = GetNumberValue(instance); |
| 457 | 436 |
| 458 // TODO(aa): It would be good to test that the double is not infinity or nan, | 437 // TODO(aa): It would be good to test that the double is not infinity or nan, |
| 459 // but isnan and isinf aren't defined on Windows. | 438 // but isnan and isinf aren't defined on Windows. |
| 460 | 439 |
| 461 double minimum = 0; | 440 double minimum = 0; |
| 462 if (GetNumberFromDictionary(schema, "minimum", &minimum)) { | 441 if (schema->GetDouble("minimum", &minimum)) { |
| 463 if (value < minimum) | 442 if (value < minimum) |
| 464 errors_.push_back(Error(path, FormatErrorMessage( | 443 errors_.push_back(Error(path, FormatErrorMessage( |
| 465 kNumberMinimum, base::DoubleToString(minimum)))); | 444 kNumberMinimum, base::DoubleToString(minimum)))); |
| 466 } | 445 } |
| 467 | 446 |
| 468 double maximum = 0; | 447 double maximum = 0; |
| 469 if (GetNumberFromDictionary(schema, "maximum", &maximum)) { | 448 if (schema->GetDouble("maximum", &maximum)) { |
| 470 if (value > maximum) | 449 if (value > maximum) |
| 471 errors_.push_back(Error(path, FormatErrorMessage( | 450 errors_.push_back(Error(path, FormatErrorMessage( |
| 472 kNumberMaximum, base::DoubleToString(maximum)))); | 451 kNumberMaximum, base::DoubleToString(maximum)))); |
| 473 } | 452 } |
| 474 } | 453 } |
| 475 | 454 |
| 476 bool JSONSchemaValidator::ValidateType(Value* instance, | 455 bool JSONSchemaValidator::ValidateType(Value* instance, |
| 477 const std::string& expected_type, | 456 const std::string& expected_type, |
| 478 const std::string& path) { | 457 const std::string& path) { |
| 479 std::string actual_type = GetJSONSchemaType(instance); | 458 std::string actual_type = GetJSONSchemaType(instance); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 495 | 474 |
| 496 if (*additional_properties_schema) { | 475 if (*additional_properties_schema) { |
| 497 std::string additional_properties_type("any"); | 476 std::string additional_properties_type("any"); |
| 498 CHECK((*additional_properties_schema)->GetString( | 477 CHECK((*additional_properties_schema)->GetString( |
| 499 "type", &additional_properties_type)); | 478 "type", &additional_properties_type)); |
| 500 return additional_properties_type == "any"; | 479 return additional_properties_type == "any"; |
| 501 } else { | 480 } else { |
| 502 return default_allow_additional_properties_; | 481 return default_allow_additional_properties_; |
| 503 } | 482 } |
| 504 } | 483 } |
| OLD | NEW |