Use a tokenizer to parse the command line for applications.
This enables the use of spaces within arguments, as those can now
be quoted.
R=ppi@chromium.org, ppi, qsr
Review URL: https://codereview.chromium.org/1905353002 .
diff --git a/shell/command_line_util.cc b/shell/command_line_util.cc
index dfa2986..b128868 100644
--- a/shell/command_line_util.cc
+++ b/shell/command_line_util.cc
@@ -5,10 +5,12 @@
#include "shell/command_line_util.h"
#include <functional>
+#include <string>
+#include <vector>
#include "base/command_line.h"
#include "base/logging.h"
-#include "base/strings/string_split.h"
+#include "base/strings/string_tokenizer.h"
#include "base/strings/utf_string_conversions.h"
#include "shell/context.h"
#include "shell/switches.h"
@@ -46,7 +48,12 @@
const std::string& app_url_and_args,
std::vector<std::string>* args) {
// SplitString() returns empty strings for extra delimeter characters (' ').
- base::SplitString(app_url_and_args, ' ', args);
+ base::StringTokenizer tokenizer =
+ base::StringTokenizer(app_url_and_args, " ");
+ tokenizer.set_quote_chars("'\"");
+ while (tokenizer.GetNext()) {
+ args->push_back(tokenizer.token());
+ }
args->erase(std::remove_if(args->begin(), args->end(),
[](const std::string& a) { return a.empty(); }),
args->end());
diff --git a/shell/command_line_util_unittest.cc b/shell/command_line_util_unittest.cc
index 58d7649..5fa63ad 100644
--- a/shell/command_line_util_unittest.cc
+++ b/shell/command_line_util_unittest.cc
@@ -39,6 +39,7 @@
const char* NO_ARGUMENTS[] = {nullptr};
const char* ONE_ARGUMENTS[] = {"1", nullptr};
const char* TWO_ARGUMENTS[] = {"1", "two", nullptr};
+ const char* QUOTED_ARGUMENTS[] = {"'1 two'", nullptr};
static const struct Expectation {
const char* args;
const char* url;
@@ -54,9 +55,9 @@
{"http://example.com 1 ", "http://example.com", ONE_ARGUMENTS},
{"http://example.com 1 ", "http://example.com", ONE_ARGUMENTS},
{"http://example.com 1 two", "http://example.com", TWO_ARGUMENTS},
- {" http://example.com 1 two ",
- "http://example.com",
- TWO_ARGUMENTS}};
+ {" http://example.com 1 two ", "http://example.com", TWO_ARGUMENTS},
+ {"http://example.com '1 two' ", "http://example.com", QUOTED_ARGUMENTS},
+ };
Context context;
context.SetCommandLineCWD(base::FilePath("/root"));
for (auto& expectation : EXPECTATIONS) {