Chromium Code Reviews| Index: ui/base/template_expressions.cc |
| diff --git a/ui/base/template_expressions.cc b/ui/base/template_expressions.cc |
| index b8867d8cfaa1bdf2f3d5d42935063284235164d9..7c6771bdb72086ffa1716f7cd44918e936b27b5d 100644 |
| --- a/ui/base/template_expressions.cc |
| +++ b/ui/base/template_expressions.cc |
| @@ -15,6 +15,29 @@ const char kLeader[] = "$i18n"; |
| const size_t kLeaderSize = arraysize(kLeader) - 1; |
| const char kKeyOpen = '{'; |
| const char kKeyClose = '}'; |
| + |
| +// Escape quotes and backslashes ('"\) with backslashes. |
| +std::string BackslashEscape(const std::string& in_string) { |
| + std::string out; |
| + out.reserve(in_string.size() * 2); |
| + for (const auto& c : in_string) { |
|
Dan Beam
2017/02/14 00:25:54
nit: a ref is probably bigger than a char
dschuyler
2017/02/14 00:38:35
I expect that internally a ref uses several bytes
Dan Beam
2017/02/14 00:58:46
can you just do
for (const char c : in_string) {
dschuyler
2017/02/14 02:30:12
Done.
|
| + switch (c) { |
| + case '\\': |
| + out.append("\\\\"); |
| + break; |
| + case '\'': |
| + out.append("\\'"); |
| + break; |
| + case '"': |
| + out.append("\\\""); |
| + break; |
| + default: |
| + out += c; |
| + } |
| + } |
| + return out; |
| +} |
| + |
| } // namespace |
| namespace ui { |
| @@ -77,6 +100,9 @@ std::string ReplaceTemplateExpressions( |
| replacement = net::EscapeForHTML(replacement); |
| } else if (context == "Raw") { |
| // Pass the replacement through unchanged. |
| + } else if (context == "Polymer") { |
| + // Escape quotes and backslash for '$i18nPolymer{}' use (i.e. quoted). |
| + replacement = BackslashEscape(replacement); |
| } else { |
| CHECK(false) << "Unknown context " << context; |
| } |