Index: base/command_line.cc |
diff --git a/base/command_line.cc b/base/command_line.cc |
index ca4af9754cb07a22268992bee0a79f79ad313fc4..6694cd17da6b650637905413a06ae547667c15c4 100644 |
--- a/base/command_line.cc |
+++ b/base/command_line.cc |
@@ -105,10 +105,16 @@ std::string LowerASCIIOnWindows(const std::string& string) { |
#if defined(OS_WIN) |
// Quote a string as necessary for CommandLineToArgvW compatiblity *on Windows*. |
-std::wstring QuoteForCommandLineToArgvW(const std::wstring& arg) { |
+std::wstring QuoteForCommandLineToArgvW(const std::wstring& arg, |
+ bool quote_placeholders) { |
// We follow the quoting rules of CommandLineToArgvW. |
// http://msdn.microsoft.com/en-us/library/17w5ykft.aspx |
- if (arg.find_first_of(L" \\\"") == std::wstring::npos) { |
+ std::wstring quotable_chars(L" \\\""); |
+ // We may also be required to quote '%', which is commonly used in a command |
+ // line as a placeholder. (It may be substituted for a string with spaces.) |
+ if (quote_placeholders) |
+ quotable_chars.push_back(L'%'); |
+ if (arg.find_first_of(quotable_chars) == std::wstring::npos) { |
// No quoting necessary. |
return arg; |
} |
@@ -247,12 +253,13 @@ void CommandLine::InitFromArgv(const StringVector& argv) { |
AppendSwitchesAndArguments(*this, argv); |
} |
-CommandLine::StringType CommandLine::GetCommandLineString() const { |
+CommandLine::StringType CommandLine::GetCommandLineString( |
+ bool quote_placeholders) const { |
StringType string(argv_[0]); |
#if defined(OS_WIN) |
- string = QuoteForCommandLineToArgvW(string); |
+ string = QuoteForCommandLineToArgvW(string, quote_placeholders); |
#endif |
- StringType params(GetArgumentsString()); |
+ StringType params(GetArgumentsString(quote_placeholders)); |
if (!params.empty()) { |
string.append(StringType(FILE_PATH_LITERAL(" "))); |
string.append(params); |
@@ -260,7 +267,8 @@ CommandLine::StringType CommandLine::GetCommandLineString() const { |
return string; |
} |
-CommandLine::StringType CommandLine::GetArgumentsString() const { |
+CommandLine::StringType CommandLine::GetArgumentsString( |
+ bool quote_placeholders) const { |
StringType params; |
// Append switches and arguments. |
bool parse_switches = true; |
@@ -275,14 +283,15 @@ CommandLine::StringType CommandLine::GetArgumentsString() const { |
params.append(switch_string); |
if (!switch_value.empty()) { |
#if defined(OS_WIN) |
- switch_value = QuoteForCommandLineToArgvW(switch_value); |
+ switch_value = |
+ QuoteForCommandLineToArgvW(switch_value, quote_placeholders); |
#endif |
params.append(kSwitchValueSeparator + switch_value); |
} |
} |
else { |
#if defined(OS_WIN) |
- arg = QuoteForCommandLineToArgvW(arg); |
+ arg = QuoteForCommandLineToArgvW(arg, quote_placeholders); |
#endif |
params.append(arg); |
} |