Fixes bug where JSON reader errored on reading vertical tabs (\v). The
writer properly escapes a vertical tab, but the readed instead errored
on the vertical this. This resulted in lost bookmarks:(
BUG=3031
TEST=covered by unit tests
Review URL: http://codereview.chromium.org/5628
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@2759 0039d316-1c4b-4281-b951-d872f2087c98
CrOS-Libchrome-Original-Commit: d46d6f3b80099ce0c630185a2e86b649bba49254
diff --git a/base/json_reader.cc b/base/json_reader.cc
index 8d0cab4..c0e019b 100644
--- a/base/json_reader.cc
+++ b/base/json_reader.cc
@@ -361,6 +361,7 @@
case 'n':
case 'r':
case 't':
+ case 'v':
case '"':
break;
default:
@@ -406,6 +407,9 @@
case 't':
decoded_str.push_back('\t');
break;
+ case 'v':
+ decoded_str.push_back('\v');
+ break;
case 'x':
decoded_str.push_back((HexToInt(*(token.begin + i + 1)) << 4) +
diff --git a/base/json_reader_unittest.cc b/base/json_reader_unittest.cc
index c2d6a42..4339be1 100644
--- a/base/json_reader_unittest.cc
+++ b/base/json_reader_unittest.cc
@@ -214,13 +214,13 @@
// Test basic string escapes
root = NULL;
- ASSERT_TRUE(JSONReader::JsonToValue("\" \\\"\\\\\\/\\b\\f\\n\\r\\t\"", &root,
+ ASSERT_TRUE(JSONReader::JsonToValue("\" \\\"\\\\\\/\\b\\f\\n\\r\\t\\v\"", &root,
false, false));
ASSERT_TRUE(root);
ASSERT_TRUE(root->IsType(Value::TYPE_STRING));
str_val.clear();
ASSERT_TRUE(root->GetAsString(&str_val));
- ASSERT_EQ(L" \"\\/\b\f\n\r\t", str_val);
+ ASSERT_EQ(L" \"\\/\b\f\n\r\t\v", str_val);
delete root;
// Test hex and unicode escapes including the null character.
diff --git a/base/string_escape.cc b/base/string_escape.cc
index 5b85e9c..c2fc542 100644
--- a/base/string_escape.cc
+++ b/base/string_escape.cc
@@ -14,6 +14,7 @@
// returns true and appends the escape sequence to |dst|.
template<typename CHAR>
static bool JavascriptSingleEscapeChar(const CHAR c, std::string* dst) {
+ // WARNING: if you add a new case here, you need to update the reader as well.
switch (c) {
case '\b':
dst->append("\\b");