Browse Source

fix: command-line scheme switch values' spillover (#19939)

trop[bot] 5 years ago
parent
commit
6cd9f303fe
1 changed files with 24 additions and 29 deletions
  1. 24 29
      atom/app/atom_content_client.cc

+ 24 - 29
atom/app/atom_content_client.cc

@@ -5,6 +5,7 @@
 #include "atom/app/atom_content_client.h"
 
 #include <string>
+#include <utility>
 #include <vector>
 
 #include "atom/common/options_switches.h"
@@ -161,14 +162,19 @@ void ComputeBuiltInPlugins(std::vector<content::PepperPluginInfo>* plugins) {
 #endif  // BUILDFLAG(ENABLE_PDF_VIEWER)
 }
 
-void ConvertStringWithSeparatorToVector(std::vector<std::string>* vec,
-                                        const char* separator,
-                                        const char* cmd_switch) {
+void AppendDelimitedSwitchToVector(const base::StringPiece cmd_switch,
+                                   std::vector<std::string>* append_me) {
   auto* command_line = base::CommandLine::ForCurrentProcess();
-  auto string_with_separator = command_line->GetSwitchValueASCII(cmd_switch);
-  if (!string_with_separator.empty())
-    *vec = base::SplitString(string_with_separator, separator,
-                             base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
+  auto switch_value = command_line->GetSwitchValueASCII(cmd_switch);
+  if (!switch_value.empty()) {
+    constexpr base::StringPiece delimiter(",", 1);
+    auto tokens =
+        base::SplitString(switch_value, delimiter, base::TRIM_WHITESPACE,
+                          base::SPLIT_WANT_NONEMPTY);
+    append_me->reserve(append_me->size() + tokens.size());
+    std::move(std::begin(tokens), std::end(tokens),
+              std::back_inserter(*append_me));
+  }
 }
 
 }  // namespace
@@ -200,30 +206,19 @@ base::RefCountedMemory* AtomContentClient::GetDataResourceBytes(
 }
 
 void AtomContentClient::AddAdditionalSchemes(Schemes* schemes) {
-  std::vector<std::string> splited;
-  ConvertStringWithSeparatorToVector(&splited, ",",
-                                     switches::kServiceWorkerSchemes);
-  for (const std::string& scheme : splited)
-    schemes->service_worker_schemes.push_back(scheme);
-  schemes->service_worker_schemes.push_back(url::kFileScheme);
+  AppendDelimitedSwitchToVector(switches::kServiceWorkerSchemes,
+                                &schemes->service_worker_schemes);
+  AppendDelimitedSwitchToVector(switches::kStandardSchemes,
+                                &schemes->standard_schemes);
+  AppendDelimitedSwitchToVector(switches::kSecureSchemes,
+                                &schemes->secure_schemes);
+  AppendDelimitedSwitchToVector(switches::kBypassCSPSchemes,
+                                &schemes->csp_bypassing_schemes);
+  AppendDelimitedSwitchToVector(switches::kCORSSchemes,
+                                &schemes->cors_enabled_schemes);
 
-  ConvertStringWithSeparatorToVector(&splited, ",", switches::kStandardSchemes);
-  for (const std::string& scheme : splited)
-    schemes->standard_schemes.push_back(scheme);
+  schemes->service_worker_schemes.push_back(url::kFileScheme);
   schemes->standard_schemes.push_back("chrome-extension");
-
-  ConvertStringWithSeparatorToVector(&splited, ",", switches::kSecureSchemes);
-  for (const std::string& scheme : splited)
-    schemes->secure_schemes.push_back(scheme);
-
-  ConvertStringWithSeparatorToVector(&splited, ",",
-                                     switches::kBypassCSPSchemes);
-  for (const std::string& scheme : splited)
-    schemes->csp_bypassing_schemes.push_back(scheme);
-
-  ConvertStringWithSeparatorToVector(&splited, ",", switches::kCORSSchemes);
-  for (const std::string& scheme : splited)
-    schemes->cors_enabled_schemes.push_back(scheme);
 }
 
 void AtomContentClient::AddPepperPlugins(