From c2c467f69fc00d353879d7add5f2c04a6acabbb1 Mon Sep 17 00:00:00 2001 From: David 'Digit' Turner Date: Wed, 20 Mar 2019 21:41:09 +0000 Subject: [PATCH] base: Value::FindDoubleKey() converts integers to doubles Ensure that FindDoubleKey() can return the value of an INTEGER key as a double. This is consistent with the behaviour of Value::GetDouble() which will auto-convert INTEGER values to doubles. BUG=646113 R=dcheng@chromium.org,jdoerrie@chromium.org,sdefresne@chromium.org,hidehiko@chromium.org Change-Id: I2c08cb91b6cfd5db268a182ffffe16682d848008 Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1529017 Reviewed-by: Sylvain Defresne Reviewed-by: Daniel Cheng Commit-Queue: David Turner Cr-Commit-Position: refs/heads/master@{#642680} --- base/values.cc | 10 ++++++++-- base/values.h | 2 ++ base/values_unittest.cc | 2 +- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/base/values.cc b/base/values.cc index 035aa2350cde..69d66ff8ab00 100644 --- a/base/values.cc +++ b/base/values.cc @@ -339,8 +339,14 @@ base::Optional Value::FindIntKey(StringPiece key) const { } base::Optional Value::FindDoubleKey(StringPiece key) const { - const Value* result = FindKeyOfType(key, Type::DOUBLE); - return result ? base::make_optional(result->double_value_) : base::nullopt; + const Value* result = FindKey(key); + if (result) { + if (result->is_int()) + return base::make_optional(static_cast(result->int_value_)); + if (result->is_double()) + return base::make_optional(result->double_value_); + } + return base::nullopt; } const std::string* Value::FindStringKey(StringPiece key) const { diff --git a/base/values.h b/base/values.h index e31cadd83102..6f2cd3cc3d79 100644 --- a/base/values.h +++ b/base/values.h @@ -200,6 +200,8 @@ class BASE_EXPORT Value { // function's name. base::Optional FindBoolKey(StringPiece key) const; base::Optional FindIntKey(StringPiece key) const; + // Note FindDoubleKey() will auto-convert INTEGER keys to their double + // value, for consistency with GetDouble(). base::Optional FindDoubleKey(StringPiece key) const; // |FindStringKey| returns |nullptr| if value is not found or not a string. diff --git a/base/values_unittest.cc b/base/values_unittest.cc index b23fd8332491..7c545c09d947 100644 --- a/base/values_unittest.cc +++ b/base/values_unittest.cc @@ -674,7 +674,7 @@ TEST(ValuesTest, FindDoubleKey) { const Value dict(std::move(storage)); EXPECT_EQ(base::nullopt, dict.FindDoubleKey("null")); EXPECT_EQ(base::nullopt, dict.FindDoubleKey("bool")); - EXPECT_EQ(base::nullopt, dict.FindDoubleKey("int")); + EXPECT_NE(base::nullopt, dict.FindDoubleKey("int")); EXPECT_NE(base::nullopt, dict.FindDoubleKey("double")); EXPECT_EQ(base::nullopt, dict.FindDoubleKey("string")); EXPECT_EQ(base::nullopt, dict.FindDoubleKey("blob")); -- 2.21.0