Moved/renamed EscapeString from visual_studio_writer to XmlEscape in xml_element_writer.

Added XmlEscape unit test.

BUG=708705

Review-Url: https://codereview.chromium.org/2813213002
Cr-Original-Commit-Position: refs/heads/master@{#464756}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: ac2df0acb000d21cd5493fdcc529212d1ba65198
diff --git a/tools/gn/visual_studio_writer.cc b/tools/gn/visual_studio_writer.cc
index 76ebc56..aa01d82 100644
--- a/tools/gn/visual_studio_writer.cc
+++ b/tools/gn/visual_studio_writer.cc
@@ -37,41 +37,9 @@
 
 namespace {
 
-std::string EscapeString(const std::string& value) {
-  std::string result;
-  for (char c : value) {
-    switch (c) {
-      case '\n':
-        result += "
";
-        break;
-      case '\r':
-        result += "
";
-        break;
-      case '\t':
-        result += "	";
-        break;
-      case '"':
-        result += """;
-        break;
-      case '<':
-        result += "&lt;";
-        break;
-      case '>':
-        result += "&gt;";
-        break;
-      case '&':
-        result += "&amp;";
-        break;
-      default:
-        result += c;
-    }
-  }
-  return result;
-}
-
 struct SemicolonSeparatedWriter {
   void operator()(const std::string& value, std::ostream& out) const {
-    out << EscapeString(value) + ';';
+    out << XmlEscape(value) + ';';
   }
 };
 
diff --git a/tools/gn/xml_element_writer.cc b/tools/gn/xml_element_writer.cc
index fcf34b2..bb0d232 100644
--- a/tools/gn/xml_element_writer.cc
+++ b/tools/gn/xml_element_writer.cc
@@ -81,3 +81,35 @@
 
   return out_;
 }
+
+std::string XmlEscape(const std::string& value) {
+  std::string result;
+  for (char c : value) {
+    switch (c) {
+      case '\n':
+        result += "&#10;";
+        break;
+      case '\r':
+        result += "&#13;";
+        break;
+      case '\t':
+        result += "&#9;";
+        break;
+      case '"':
+        result += "&quot;";
+        break;
+      case '<':
+        result += "&lt;";
+        break;
+      case '>':
+        result += "&gt;";
+        break;
+      case '&':
+        result += "&amp;";
+        break;
+      default:
+        result += c;
+    }
+  }
+  return result;
+}
diff --git a/tools/gn/xml_element_writer.h b/tools/gn/xml_element_writer.h
index 8a83df0..01346d2 100644
--- a/tools/gn/xml_element_writer.h
+++ b/tools/gn/xml_element_writer.h
@@ -120,4 +120,6 @@
       out_, tag, attribute_name, attribute_value_writer, indent_ + 2));
 }
 
+std::string XmlEscape(const std::string& value);
+
 #endif  // TOOLS_GN_XML_ELEMENT_WRITER_H_
diff --git a/tools/gn/xml_element_writer_unittest.cc b/tools/gn/xml_element_writer_unittest.cc
index 93dfd47..cc21c4b 100644
--- a/tools/gn/xml_element_writer_unittest.cc
+++ b/tools/gn/xml_element_writer_unittest.cc
@@ -84,3 +84,10 @@
   }
   EXPECT_EQ("<foo bar=\"baz\">Hello world!</foo>\n", out.str());
 }
+
+TEST(XmlElementWriter, TestXmlEscape) {
+  std::string input = "\r \n \t & < > \"";
+  std::string output = XmlEscape(input);
+  std::string expected = "&#13; &#10; &#9; &amp; &lt; &gt; &quot;";
+  EXPECT_EQ(expected, output);
+}