Improve JSONReader performance by up to 55% by using std::string instead of wstring.

Before this change, JSONReader would:
1. Take std::string input
2. Convert it to wstring
3. Parse
4. Decode strings for the object representation, converting wstring to string16
5. Create a base::Value with a string16, which internally converts back to std::string

After this change, JSONReader does:
1. Take std::string input
2. Parse
3. Create a base::Value with a std::string

BUG=111581
TEST=Covered by unittests.


Review URL: http://codereview.chromium.org/9801007

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@128678 0039d316-1c4b-4281-b951-d872f2087c98


CrOS-Libchrome-Original-Commit: 27cc5a09bba00e877f8815d592d0ba955f62002b
diff --git a/base/json/json_reader_unittest.cc b/base/json/json_reader_unittest.cc
index 432512c..5900781 100644
--- a/base/json/json_reader_unittest.cc
+++ b/base/json/json_reader_unittest.cc
@@ -457,6 +457,38 @@
                                       false, false));
   EXPECT_FALSE(root.get());
 
+  // Test utf16 encoded strings.
+  root.reset(JSONReader().JsonToValue("\"\\u20ac3,14\"", false, false));
+  ASSERT_TRUE(root.get());
+  EXPECT_TRUE(root->IsType(Value::TYPE_STRING));
+  str_val.clear();
+  EXPECT_TRUE(root->GetAsString(&str_val));
+  EXPECT_EQ("\xe2\x82\xac""3,14", str_val);
+
+  root.reset(JSONReader().JsonToValue("\"\\ud83d\\udca9\\ud83d\\udc6c\"",
+                                      false, false));
+  ASSERT_TRUE(root.get());
+  EXPECT_TRUE(root->IsType(Value::TYPE_STRING));
+  str_val.clear();
+  EXPECT_TRUE(root->GetAsString(&str_val));
+  EXPECT_EQ("\xf0\x9f\x92\xa9\xf0\x9f\x91\xac", str_val);
+
+  // Test invalid utf16 strings.
+  const char* cases[] = {
+    "\"\\u123\"",  // Invalid scalar.
+    "\"\\ud83d\"",  // Invalid scalar.
+    "\"\\u$%@!\"",  // Invalid scalar.
+    "\"\\uzz89\"",  // Invalid scalar.
+    "\"\\ud83d\\udca\"",  // Invalid lower surrogate.
+    "\"\\ud83d\\ud83d\"",  // Invalid lower surrogate.
+    "\"\\ud83foo\"",  // No lower surrogate.
+    "\"\\ud83\\foo\""  // No lower surrogate.
+  };
+  for (size_t i = 0; i < arraysize(cases); ++i) {
+    root.reset(JSONReader().JsonToValue(cases[i], false, false));
+    EXPECT_FALSE(root.get()) << cases[i];
+  }
+
   // Test invalid root objects.
   root.reset(JSONReader::Read("null", false));
   EXPECT_FALSE(root.get());