Move JoinString to the base namespace.

Change "Separator" from string to StringPIece (most are constants). Remove char versions for symmetry with SplitString.

Update callers who pass empty separators to use a base::StringPiece()

Change chromecast/base/metrics/cast_metrics_helper.cc to not use JoinString at all and just append to the output (code is simpler and faster).

[email protected] for chromeos

Committed: https://crrev.com/0eabfa001ba06d3c66992b95b69a988ef0633992
Cr-Commit-Position: refs/heads/master@{#338762}

patch from issue 1223153003 at patchset 160001 (http://crrev.com/1223153003#ps160001)

BUG=

Review URL: https://codereview.chromium.org/1230243005

Cr-Commit-Position: refs/heads/master@{#338819}
diff --git a/chrome/browser/android/preferences/pref_service_bridge.cc b/chrome/browser/android/preferences/pref_service_bridge.cc
index eaf5d86..a96218f 100644
--- a/chrome/browser/android/preferences/pref_service_bridge.cc
+++ b/chrome/browser/android/preferences/pref_service_bridge.cc
@@ -826,7 +826,7 @@
       parts.push_back(language);
     }
     parts.push_back(*accept_languages);
-    *accept_languages = JoinString(parts, ',');
+    *accept_languages = base::JoinString(parts, ",");
   }
 }
 
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc
index e00b5e1b..163c614 100644
--- a/chrome/browser/chrome_content_browser_client.cc
+++ b/chrome/browser/chrome_content_browser_client.cc
@@ -1231,7 +1231,7 @@
   }
 
   command_line->AppendSwitchASCII(switches::kBlinkSettings,
-                                  JoinString(blink_settings, ','));
+                                  base::JoinString(blink_settings, ","));
 }
 
 }  // namespace
diff --git a/chrome/browser/chromeos/accessibility/accessibility_manager.cc b/chrome/browser/chromeos/accessibility/accessibility_manager.cc
index 279bf3b2..993d426 100644
--- a/chrome/browser/chromeos/accessibility/accessibility_manager.cc
+++ b/chrome/browser/chromeos/accessibility/accessibility_manager.cc
@@ -845,7 +845,7 @@
   else
     preload_engines.erase(it);
   pref_service->SetString(prefs::kLanguagePreloadEngines,
-                          JoinString(preload_engines, ','));
+                          base::JoinString(preload_engines, ","));
   braille_ime_current_ = false;
 }
 
diff --git a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
index bff428c..89a42bb 100644
--- a/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
+++ b/chrome/browser/chromeos/input_method/input_method_manager_impl.cc
@@ -610,7 +610,8 @@
   manager_->MigrateInputMethods(&layouts);
 
   PrefService* prefs = g_browser_process->local_state();
-  prefs->SetString(prefs::kHardwareKeyboardLayout, JoinString(layouts, ","));
+  prefs->SetString(prefs::kHardwareKeyboardLayout,
+                   base::JoinString(layouts, ","));
 
   // This asks the file thread to save the prefs (i.e. doesn't block).
   // The latest values of Local State reside in memory so we can safely
diff --git a/chrome/browser/chromeos/input_method/input_method_syncer.cc b/chrome/browser/chromeos/input_method/input_method_syncer.cc
index b76080cd..6823f23 100644
--- a/chrome/browser/chromeos/input_method/input_method_syncer.cc
+++ b/chrome/browser/chromeos/input_method/input_method_syncer.cc
@@ -92,7 +92,7 @@
     value_iter = values.erase(value_iter);
   }
 
-  return JoinString(values, ',');
+  return base::JoinString(values, ",");
 }
 
 // Appends tokens from |src| that are not in |dest| to |dest|.
@@ -197,14 +197,14 @@
 
   // Append the synced values to the current values.
   MergeLists(&new_tokens, synced_tokens);
-  preferred_languages_syncable_.SetValue(JoinString(new_tokens, ','));
+  preferred_languages_syncable_.SetValue(base::JoinString(new_tokens, ","));
 
   base::SplitString(
       enabled_extension_imes_syncable_.GetValue(), ',', &synced_tokens);
   base::SplitString(enabled_extension_imes_.GetValue(), ',', &new_tokens);
 
   MergeLists(&new_tokens, synced_tokens);
-  enabled_extension_imes_syncable_.SetValue(JoinString(new_tokens, ','));
+  enabled_extension_imes_syncable_.SetValue(base::JoinString(new_tokens, ","));
 
   // Revert preload engines to legacy component IDs.
   base::SplitString(preload_engines_.GetValue(), ',', &new_tokens);
@@ -214,7 +214,7 @@
       preload_engines_syncable_.GetValue(), ',', &synced_tokens);
 
   MergeLists(&new_tokens, synced_tokens);
-  preload_engines_syncable_.SetValue(JoinString(new_tokens, ','));
+  preload_engines_syncable_.SetValue(base::JoinString(new_tokens, ","));
 
   // Second, set the local prefs, incorporating new values from the sync server.
   preload_engines_.SetValue(
@@ -278,7 +278,7 @@
 
   // Do the actual merging.
   MergeLists(&old_tokens, new_tokens);
-  return JoinString(old_tokens, ',');
+  return base::JoinString(old_tokens, ",");
 }
 
 void InputMethodSyncer::FinishMerge(const std::string& languages) {
@@ -311,7 +311,7 @@
   base::SplitString(preload_engines_.GetValue(), ',', &engines);
   std::transform(engines.begin(), engines.end(), engines.begin(),
                  extension_ime_util::GetComponentIDByInputMethodID);
-  preload_engines_syncable_.SetValue(JoinString(engines, ','));
+  preload_engines_syncable_.SetValue(base::JoinString(engines, ","));
 }
 
 void InputMethodSyncer::OnIsSyncingChanged() {
diff --git a/chrome/browser/chromeos/login/session/user_session_manager.cc b/chrome/browser/chromeos/login/session/user_session_manager.cc
index af0f026..0a02b539 100644
--- a/chrome/browser/chromeos/login/session/user_session_manager.cc
+++ b/chrome/browser/chromeos/login/session/user_session_manager.cc
@@ -156,7 +156,7 @@
   // Save the input methods in the user's preferences.
   StringPrefMember language_preload_engines;
   language_preload_engines.Init(prefs::kLanguagePreloadEngines, prefs);
-  language_preload_engines.SetValue(JoinString(input_method_ids, ','));
+  language_preload_engines.SetValue(base::JoinString(input_method_ids, ","));
   BootTimesRecorder::Get()->AddLoginTimeMarker("IMEStarted", false);
 
   // Second, we'll set kLanguagePreferredLanguages.
@@ -184,7 +184,7 @@
 
   // Save the preferred languages in the user's preferences.
   prefs->SetString(prefs::kLanguagePreferredLanguages,
-                   JoinString(language_codes, ','));
+                   base::JoinString(language_codes, ","));
 
   // Indicate that we need to merge the syncable input methods when we sync,
   // since we have not applied the synced prefs before.
diff --git a/chrome/browser/chromeos/power/peripheral_battery_observer.cc b/chrome/browser/chromeos/power/peripheral_battery_observer.cc
index 32438ae2..22089fa 100644
--- a/chrome/browser/chromeos/power/peripheral_battery_observer.cc
+++ b/chrome/browser/chromeos/power/peripheral_battery_observer.cc
@@ -66,7 +66,7 @@
   std::vector<std::string> result;
   base::SplitString(reverse_address, ':', &result);
   std::reverse(result.begin(), result.end());
-  std::string address = JoinString(result, ':');
+  std::string address = base::JoinString(result, ":");
   return address;
 }
 
diff --git a/chrome/browser/chromeos/preferences.cc b/chrome/browser/chromeos/preferences.cc
index db334bf..e19c8ff 100644
--- a/chrome/browser/chromeos/preferences.cc
+++ b/chrome/browser/chromeos/preferences.cc
@@ -627,7 +627,7 @@
 
   // Transfers the xkb id to extension-xkb id.
   if (input_method_manager_->MigrateInputMethods(&split_values))
-    preload_engines_.SetValue(JoinString(split_values, ','));
+    preload_engines_.SetValue(base::JoinString(split_values, ","));
 
   if (section == std::string(language_prefs::kGeneralSectionName) &&
       name == std::string(language_prefs::kPreloadEnginesConfigName)) {
diff --git a/chrome/browser/chromeos/preferences_unittest.cc b/chrome/browser/chromeos/preferences_unittest.cc
index 60a4829..f790cba1 100644
--- a/chrome/browser/chromeos/preferences_unittest.cc
+++ b/chrome/browser/chromeos/preferences_unittest.cc
@@ -344,7 +344,7 @@
     base::SplitString(value, ',', &tokens);
     std::transform(tokens.begin(), tokens.end(), tokens.begin(),
                    &extension_ime_util::GetInputMethodIDByEngineID);
-    return JoinString(tokens, ',');
+    return base::JoinString(tokens, ",");
   }
 
   StringPrefMember preferred_languages_;
diff --git a/chrome/browser/chromeos/system_logs/debug_daemon_log_source.cc b/chrome/browser/chromeos/system_logs/debug_daemon_log_source.cc
index 263d03cb..44e4820 100644
--- a/chrome/browser/chromeos/system_logs/debug_daemon_log_source.cc
+++ b/chrome/browser/chromeos/system_logs/debug_daemon_log_source.cc
@@ -80,7 +80,7 @@
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
 
   if (succeeded)
-    (*response_)[kRoutesKeyName] = JoinString(routes, '\n');
+    (*response_)[kRoutesKeyName] = base::JoinString(routes, "\n");
   else
     (*response_)[kRoutesKeyName] = kNotAvailable;
   RequestCompleted();
diff --git a/chrome/browser/extensions/api/identity/gaia_web_auth_flow.cc b/chrome/browser/extensions/api/identity/gaia_web_auth_flow.cc
index 6b7232e..d97fca42 100644
--- a/chrome/browser/extensions/api/identity/gaia_web_auth_flow.cc
+++ b/chrome/browser/extensions/api/identity/gaia_web_auth_flow.cc
@@ -55,7 +55,7 @@
   std::vector<std::string> client_id_parts;
   base::SplitString(oauth2_client_id, '.', &client_id_parts);
   std::reverse(client_id_parts.begin(), client_id_parts.end());
-  redirect_scheme_ = JoinString(client_id_parts, '.');
+  redirect_scheme_ = base::JoinString(client_id_parts, ".");
   std::string signin_scoped_device_id;
   // profile_ can be nullptr in unittests.
   SigninClient* signin_client =
@@ -69,7 +69,7 @@
   std::string oauth2_authorize_params = base::StringPrintf(
       kOAuth2AuthorizeFormat,
       oauth2_client_id.c_str(),
-      net::EscapeUrlEncodedData(JoinString(scopes, ' '), true).c_str(),
+      net::EscapeUrlEncodedData(base::JoinString(scopes, " "), true).c_str(),
       token_key->extension_id.c_str(),
       redirect_scheme_.c_str(),
       token_key->extension_id.c_str(),
diff --git a/chrome/browser/extensions/api/networking_private/crypto_verify_impl.cc b/chrome/browser/extensions/api/networking_private/crypto_verify_impl.cc
index 9110b02..2385a3e 100644
--- a/chrome/browser/extensions/api/networking_private/crypto_verify_impl.cc
+++ b/chrome/browser/extensions/api/networking_private/crypto_verify_impl.cc
@@ -168,7 +168,7 @@
   data_parts.push_back(properties.device_bssid);
   data_parts.push_back(properties.public_key);
   data_parts.push_back(properties.nonce);
-  unsigned_data = JoinString(data_parts, ",");
+  unsigned_data = base::JoinString(data_parts, ",");
 
   device_bssid = properties.device_bssid;
   public_key = properties.public_key;
diff --git a/chrome/browser/extensions/chrome_content_verifier_delegate.cc b/chrome/browser/extensions/chrome_content_verifier_delegate.cc
index 5e412e7..c181e5e 100644
--- a/chrome/browser/extensions/chrome_content_verifier_delegate.cc
+++ b/chrome/browser/extensions/chrome_content_verifier_delegate.cc
@@ -135,7 +135,7 @@
   parts.push_back("id=" + extension_id);
   parts.push_back("v=" + version.GetString());
   std::string x_value =
-      net::EscapeQueryParamValue(JoinString(parts, "&"), true);
+      net::EscapeQueryParamValue(base::JoinString(parts, "&"), true);
   std::string query = "response=redirect&x=" + x_value;
 
   GURL base_url = extension_urls::GetWebstoreUpdateUrl();
diff --git a/chrome/browser/extensions/content_capabilities_browsertest.cc b/chrome/browser/extensions/content_capabilities_browsertest.cc
index 8a4b96b..cb7a512c 100644
--- a/chrome/browser/extensions/content_capabilities_browsertest.cc
+++ b/chrome/browser/extensions/content_capabilities_browsertest.cc
@@ -74,7 +74,7 @@
       v.push_back(s1);
     if (!s2.empty())
       v.push_back(s2);
-    std::string list = JoinString(v, "\",\"");
+    std::string list = base::JoinString(v, "\",\"");
     if (!list.empty())
       list = "\"" + list + "\"";
     return "[" + list + "]";
diff --git a/chrome/browser/extensions/crx_installer.cc b/chrome/browser/extensions/crx_installer.cc
index 714906c..2effb1a 100644
--- a/chrome/browser/extensions/crx_installer.cc
+++ b/chrome/browser/extensions/crx_installer.cc
@@ -536,8 +536,8 @@
     if (error_on_unsupported_requirements_) {
       ReportFailureFromUIThread(
           CrxInstallError(CrxInstallError::ERROR_DECLINED,
-                          base::UTF8ToUTF16(JoinString(
-                              install_checker_.requirement_errors(), ' '))));
+                          base::UTF8ToUTF16(base::JoinString(
+                              install_checker_.requirement_errors(), " "))));
       return;
     }
     install_flags_ |= kInstallFlagHasRequirementErrors;
diff --git a/chrome/browser/extensions/extension_install_prompt.cc b/chrome/browser/extensions/extension_install_prompt.cc
index 6c093e1..4cdcf4d7 100644
--- a/chrome/browser/extensions/extension_install_prompt.cc
+++ b/chrome/browser/extensions/extension_install_prompt.cc
@@ -269,7 +269,8 @@
                                             detail_line);
       }
 
-      details = JoinString(detail_lines_with_bullets, '\n');
+      details = base::JoinString(detail_lines_with_bullets,
+                                 base::ASCIIToUTF16("\n"));
     }
     install_permissions.details.push_back(details);
     install_permissions.is_showing_details.push_back(false);
diff --git a/chrome/browser/extensions/extension_message_bubble_controller.cc b/chrome/browser/extensions/extension_message_bubble_controller.cc
index ac198fd..0bc2802 100644
--- a/chrome/browser/extensions/extension_message_bubble_controller.cc
+++ b/chrome/browser/extensions/extension_message_bubble_controller.cc
@@ -141,7 +141,7 @@
   base::string16 prefix = bullet_point + base::ASCIIToUTF16(" ");
   for (base::string16& str : extension_list)
     str.insert(0, prefix);
-  return JoinString(extension_list, base::ASCIIToUTF16("\n"));
+  return base::JoinString(extension_list, base::ASCIIToUTF16("\n"));
 }
 
 const ExtensionIdList& ExtensionMessageBubbleController::GetExtensionIdList() {
diff --git a/chrome/browser/extensions/extension_service_unittest.cc b/chrome/browser/extensions/extension_service_unittest.cc
index 0a4c7fa..3378d72d 100644
--- a/chrome/browser/extensions/extension_service_unittest.cc
+++ b/chrome/browser/extensions/extension_service_unittest.cc
@@ -1806,8 +1806,9 @@
   EXPECT_TRUE(installed_) << "Nothing was installed.";
   EXPECT_FALSE(was_update_) << path.value();
   ASSERT_EQ(1u, loaded_.size()) << "Nothing was loaded.";
-  EXPECT_EQ(0u, errors.size()) << "There were errors: "
-                               << JoinString(errors, ',');
+  EXPECT_EQ(0u, errors.size())
+      << "There were errors: "
+      << base::JoinString(errors, base::ASCIIToUTF16(","));
   EXPECT_TRUE(service()->GetExtensionById(loaded_[0]->id(), false))
       << path.value();
 
diff --git a/chrome/browser/extensions/extension_startup_browsertest.cc b/chrome/browser/extensions/extension_startup_browsertest.cc
index bf8faf4..ad5f1ab 100644
--- a/chrome/browser/extensions/extension_startup_browsertest.cc
+++ b/chrome/browser/extensions/extension_startup_browsertest.cc
@@ -67,7 +67,9 @@
       unauthenticated_load_allowed_ = false;
 #endif
     } else {
-      base::FilePath::StringType paths = JoinString(load_extensions_, ',');
+      base::FilePath::StringType paths =
+          base::JoinString(load_extensions_,
+                           base::FilePath::StringType(1, ','));
       command_line->AppendSwitchNative(switches::kLoadExtension,
                                        paths);
       command_line->AppendSwitch(switches::kDisableExtensionsFileAccessCheck);
diff --git a/chrome/browser/extensions/requirements_checker_browsertest.cc b/chrome/browser/extensions/requirements_checker_browsertest.cc
index efda739..7ff03d91 100644
--- a/chrome/browser/extensions/requirements_checker_browsertest.cc
+++ b/chrome/browser/extensions/requirements_checker_browsertest.cc
@@ -65,7 +65,7 @@
       "  \"entries\": [\n"
       "    {\n"
       "      \"id\": 1,\n"
-      "      \"features\": [\"" + JoinString(features, "\", \"") + "\"]\n"
+      "      \"features\": [\"" + base::JoinString(features, "\", \"") + "\"]\n"
       "    }\n"
       "  ]\n"
       "}";
diff --git a/chrome/browser/extensions/unpacked_installer.cc b/chrome/browser/extensions/unpacked_installer.cc
index 5f702b9b..6fd2f9b 100644
--- a/chrome/browser/extensions/unpacked_installer.cc
+++ b/chrome/browser/extensions/unpacked_installer.cc
@@ -251,7 +251,7 @@
 
   if (!install_checker_.requirement_errors().empty()) {
     ReportExtensionLoadError(
-        JoinString(install_checker_.requirement_errors(), ' '));
+        base::JoinString(install_checker_.requirement_errors(), " "));
     return;
   }
 
diff --git a/chrome/browser/extensions/webstore_installer.cc b/chrome/browser/extensions/webstore_installer.cc
index cbfd025a..6ab5475 100644
--- a/chrome/browser/extensions/webstore_installer.cc
+++ b/chrome/browser/extensions/webstore_installer.cc
@@ -217,7 +217,8 @@
   GURL url(url_string + "?response=redirect&" +
            update_client::UpdateQueryParams::Get(
                update_client::UpdateQueryParams::CRX) +
-           "&x=" + net::EscapeQueryParamValue(JoinString(params, '&'), true));
+           "&x=" + net::EscapeQueryParamValue(base::JoinString(params, "&"),
+                                              true));
   DCHECK(url.is_valid());
 
   return url;
diff --git a/chrome/browser/net/firefox_proxy_settings.cc b/chrome/browser/net/firefox_proxy_settings.cc
index 2b23e01d5..203d9557 100644
--- a/chrome/browser/net/firefox_proxy_settings.cc
+++ b/chrome/browser/net/firefox_proxy_settings.cc
@@ -236,7 +236,7 @@
   }
 
   config->proxy_rules().bypass_rules.ParseFromStringUsingSuffixMatching(
-      JoinString(proxy_bypass_list_, ';'));
+      base::JoinString(proxy_bypass_list_, ";"));
 
   return true;
 }
diff --git a/chrome/browser/net/predictor.cc b/chrome/browser/net/predictor.cc
index 9299b63..0241aa0 100644
--- a/chrome/browser/net/predictor.cc
+++ b/chrome/browser/net/predictor.cc
@@ -504,7 +504,7 @@
     std::vector<std::string> parts;
     base::SplitString(url.host(), '.', &parts);
     std::reverse(parts.begin(), parts.end());
-    std::string reversed_host = JoinString(parts, '.');
+    std::string reversed_host = base::JoinString(parts, ".");
 
     // Return the new URL.
     GURL::Replacements url_components;
diff --git a/chrome/browser/net/safe_search_util.cc b/chrome/browser/net/safe_search_util.cc
index 9e34a64b..ac29b6f 100644
--- a/chrome/browser/net/safe_search_util.cc
+++ b/chrome/browser/net/safe_search_util.cc
@@ -63,7 +63,7 @@
 
   new_parameters.push_back(safe_parameter);
   new_parameters.push_back(ssui_parameter);
-  return JoinString(new_parameters, '&');
+  return base::JoinString(new_parameters, "&");
 }
 
 } // namespace
diff --git a/chrome/browser/search/suggestions/suggestions_source.cc b/chrome/browser/search/suggestions/suggestions_source.cc
index 486d53d..79ea0be6 100644
--- a/chrome/browser/search/suggestions/suggestions_source.cc
+++ b/chrome/browser/search/suggestions/suggestions_source.cc
@@ -78,7 +78,7 @@
   }
   out.push_back("</ul>");
   out.push_back(kHtmlFooter);
-  *output = JoinString(out, "");
+  *output = base::JoinString(out, base::StringPiece());
 }
 
 // Fills |output| with the HTML needed to display that no suggestions are
@@ -90,7 +90,7 @@
   out.push_back("<h1>Suggestions</h1>\n");
   out.push_back("<p>You have no suggestions.</p>\n");
   out.push_back(kHtmlFooter);
-  *output = JoinString(out, "");
+  *output = base::JoinString(out, base::StringPiece());
 }
 
 }  // namespace
diff --git a/chrome/browser/ssl/certificate_error_report.cc b/chrome/browser/ssl/certificate_error_report.cc
index 67e8edd..c63e8975 100644
--- a/chrome/browser/ssl/certificate_error_report.cc
+++ b/chrome/browser/ssl/certificate_error_report.cc
@@ -56,7 +56,7 @@
   if (!cert->GetPEMEncodedChain(&pem_encoded_chain))
     return false;
 
-  *result = JoinString(pem_encoded_chain, std::string());
+  *result = base::JoinString(pem_encoded_chain, base::StringPiece());
   return true;
 }
 
diff --git a/chrome/browser/ssl/ssl_blocking_page.cc b/chrome/browser/ssl/ssl_blocking_page.cc
index b47aa2e..327fbad 100644
--- a/chrome/browser/ssl/ssl_blocking_page.cc
+++ b/chrome/browser/ssl/ssl_blocking_page.cc
@@ -455,7 +455,7 @@
   ssl_info_.cert->GetPEMEncodedChain(
       &encoded_chain);
   load_time_data->SetString(
-      "pem", JoinString(encoded_chain, std::string()));
+      "pem", base::JoinString(encoded_chain, base::StringPiece()));
 
   cert_report_helper_->PopulateExtendedReportingOption(load_time_data);
 }
diff --git a/chrome/browser/sxs_linux.cc b/chrome/browser/sxs_linux.cc
index 040011d..2990693 100644
--- a/chrome/browser/sxs_linux.cc
+++ b/chrome/browser/sxs_linux.cc
@@ -81,7 +81,7 @@
   user_data_dir_channels.push_back(product_channel_name);
   return base::ImportantFileWriter::WriteFileAtomically(
       channels_path,
-      JoinString(user_data_dir_channels, "\n"));
+      base::JoinString(user_data_dir_channels, "\n"));
 }
 
 }  // namespace
diff --git a/chrome/browser/sync/profile_sync_service_android_unittest.cc b/chrome/browser/sync/profile_sync_service_android_unittest.cc
index 14c6d0b..0377f12 100644
--- a/chrome/browser/sync/profile_sync_service_android_unittest.cc
+++ b/chrome/browser/sync/profile_sync_service_android_unittest.cc
@@ -97,7 +97,7 @@
   }
 
   std::sort(invalidation_names.begin(), invalidation_names.end());
-  EXPECT_EQ(JoinString(invalidation_names, ", "),
+  EXPECT_EQ(base::JoinString(invalidation_names, ", "),
             ProfileSyncServiceAndroid::ModelTypeSelectionToStringForTest(
                 model_type_selection));
 }
diff --git a/chrome/browser/sync_file_system/drive_backend/metadata_database.cc b/chrome/browser/sync_file_system/drive_backend/metadata_database.cc
index f120fe3..0859ba1c 100644
--- a/chrome/browser/sync_file_system/drive_backend/metadata_database.cc
+++ b/chrome/browser/sync_file_system/drive_backend/metadata_database.cc
@@ -1743,7 +1743,7 @@
       std::vector<std::string> parents;
       for (int i = 0; i < details.parent_folder_ids_size(); ++i)
         parents.push_back(details.parent_folder_ids(i));
-      dict->SetString("parents", JoinString(parents, ","));
+      dict->SetString("parents", base::JoinString(parents, ","));
     }
     files->Append(dict);
   }
diff --git a/chrome/browser/thumbnails/thumbnail_list_source.cc b/chrome/browser/thumbnails/thumbnail_list_source.cc
index 604b3d3..0cad21f 100644
--- a/chrome/browser/thumbnails/thumbnail_list_source.cc
+++ b/chrome/browser/thumbnails/thumbnail_list_source.cc
@@ -164,6 +164,6 @@
   }
   out.push_back(kHtmlFooter);
 
-  std::string out_html = JoinString(out, "");
+  std::string out_html = base::JoinString(out, base::StringPiece());
   callback.Run(base::RefCountedString::TakeString(&out_html));
 }
diff --git a/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc b/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc
index ad9e51f..b664989 100644
--- a/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc
+++ b/chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos_unittest.cc
@@ -316,7 +316,7 @@
 
   std::vector<std::string> owner_list;
   owner_list.insert(owner_list.begin(), owners.begin(), owners.end());
-  return JoinString(owner_list, ' ');
+  return base::JoinString(owner_list, " ");
 }
 
 // Testing basic assumptions like default state and existence of manager.
diff --git a/chrome/browser/ui/autofill/autofill_dialog_types.cc b/chrome/browser/ui/autofill/autofill_dialog_types.cc
index 95dfd44..b990097 100644
--- a/chrome/browser/ui/autofill/autofill_dialog_types.cc
+++ b/chrome/browser/ui/autofill/autofill_dialog_types.cc
@@ -34,7 +34,7 @@
     size_t start = pieces[0].size();
     size_t end = start + pieces[1].size();
     link_range_ = gfx::Range(start, end);
-    display_text_ = JoinString(pieces, base::string16());
+    display_text_ = base::JoinString(pieces, base::StringPiece16());
   }
 }
 
diff --git a/chrome/browser/ui/autofill/data_model_wrapper.cc b/chrome/browser/ui/autofill/data_model_wrapper.cc
index 2bc42aa..83912866a 100644
--- a/chrome/browser/ui/autofill/data_model_wrapper.cc
+++ b/chrome/browser/ui/autofill/data_model_wrapper.cc
@@ -79,7 +79,7 @@
   non_address_info += base::ASCIIToUTF16("\n") + phone;
 
   *vertically_compact = base::UTF8ToUTF16(single_line) + non_address_info;
-  *horizontally_compact = base::UTF8ToUTF16(JoinString(lines, "\n")) +
+  *horizontally_compact = base::UTF8ToUTF16(base::JoinString(lines, "\n")) +
       non_address_info;
 
   return true;
diff --git a/chrome/browser/ui/cocoa/global_error_bubble_controller.mm b/chrome/browser/ui/cocoa/global_error_bubble_controller.mm
index c2604d9..d62343f 100644
--- a/chrome/browser/ui/cocoa/global_error_bubble_controller.mm
+++ b/chrome/browser/ui/cocoa/global_error_bubble_controller.mm
@@ -82,7 +82,7 @@
 
   [title_ setStringValue:SysUTF16ToNSString(error_->GetBubbleViewTitle())];
   std::vector<base::string16> messages = error_->GetBubbleViewMessages();
-  base::string16 message = JoinString(messages, '\n');
+  base::string16 message = base::JoinString(messages, base::ASCIIToUTF16("\n"));
 
   base::scoped_nsobject<NSMutableAttributedString> messageValue(
       [[NSMutableAttributedString alloc]
diff --git a/chrome/browser/ui/libgtk2ui/select_file_dialog_impl_gtk2.cc b/chrome/browser/ui/libgtk2ui/select_file_dialog_impl_gtk2.cc
index f9c8b53..638407e3 100644
--- a/chrome/browser/ui/libgtk2ui/select_file_dialog_impl_gtk2.cc
+++ b/chrome/browser/ui/libgtk2ui/select_file_dialog_impl_gtk2.cc
@@ -319,7 +319,8 @@
       // the extensions themselves if the description is blank.
       std::vector<std::string> fallback_labels_vector(fallback_labels.begin(),
                                                       fallback_labels.end());
-      std::string fallback_label = JoinString(fallback_labels_vector, ',');
+      std::string fallback_label =
+          base::JoinString(fallback_labels_vector, ",");
       gtk_file_filter_set_name(filter, fallback_label.c_str());
     }
 
diff --git a/chrome/browser/ui/webui/gcm_internals_ui.cc b/chrome/browser/ui/webui/gcm_internals_ui.cc
index f5754ce..5fe3189 100644
--- a/chrome/browser/ui/webui/gcm_internals_ui.cc
+++ b/chrome/browser/ui/webui/gcm_internals_ui.cc
@@ -162,7 +162,7 @@
     device_info->SetBoolean("connectionClientCreated",
                             stats->connection_client_created);
     device_info->SetString("registeredAppIds",
-                           JoinString(stats->registered_app_ids, ","));
+                           base::JoinString(stats->registered_app_ids, ","));
     if (stats->connection_client_created)
       device_info->SetString("connectionState", stats->connection_state);
     if (stats->android_id > 0) {