Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7071)

Unified Diff: chrome/install_static/install_util.cc

Issue 2422643002: Windows install_static refactor. (Closed)
Patch Set: sync to position 431863 Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/install_static/install_util.cc
diff --git a/chrome/install_static/install_util.cc b/chrome/install_static/install_util.cc
index fc7f95fd5a00f97bd023a78bf474340bac53b538..edec76d2e567b011248c619f0f601cedeb09bc7a 100644
--- a/chrome/install_static/install_util.cc
+++ b/chrome/install_static/install_util.cc
@@ -6,56 +6,26 @@
#include <windows.h>
#include <assert.h>
+#include <string.h>
+
#include <algorithm>
-#include <iostream>
-#include <iterator>
#include <memory>
#include <sstream>
+#include "chrome/install_static/install_details.h"
+#include "chrome/install_static/install_modes.h"
#include "chrome_elf/nt_registry/nt_registry.h"
namespace install_static {
ProcessType g_process_type = ProcessType::UNINITIALIZED;
+const wchar_t kRegValueChromeStatsSample[] = L"UsageStatsInSample";
+
// TODO(ananta)
// http://crbug.com/604923
// The constants defined in this file are also defined in chrome/installer and
// other places. we need to unify them.
-
-// Chrome channel display names.
-const wchar_t kChromeChannelUnknown[] = L"unknown";
-const wchar_t kChromeChannelCanary[] = L"canary";
-const wchar_t kChromeChannelDev[] = L"dev";
-const wchar_t kChromeChannelBeta[] = L"beta";
-const wchar_t kChromeChannelStable[] = L"";
-const wchar_t kChromeChannelStableExplicit[] = L"stable";
-const wchar_t kRegApField[] = L"ap";
-
-#if defined(GOOGLE_CHROME_BUILD)
-const wchar_t kRegPathClientState[] = L"Software\\Google\\Update\\ClientState";
-const wchar_t kRegPathClientStateMedium[] =
- L"Software\\Google\\Update\\ClientStateMedium";
-const wchar_t kRegPathChromePolicy[] = L"SOFTWARE\\Policies\\Google\\Chrome";
-#else
-const wchar_t kRegPathClientState[] =
- L"Software\\Chromium\\Update\\ClientState";
-const wchar_t kRegPathClientStateMedium[] =
- L"Software\\Chromium\\Update\\ClientStateMedium";
-const wchar_t kRegPathChromePolicy[] = L"SOFTWARE\\Policies\\Chromium";
-#endif
-
-const wchar_t kRegValueChromeStatsSample[] = L"UsageStatsInSample";
-const wchar_t kRegValueUsageStats[] = L"usagestats";
-const wchar_t kUninstallArgumentsField[] = L"UninstallArguments";
-const wchar_t kMetricsReportingEnabled[] = L"MetricsReportingEnabled";
-
-const wchar_t kAppGuidCanary[] = L"{4ea16ac7-fd5a-47c3-875b-dbf4a2008c20}";
-const wchar_t kAppGuidGoogleChrome[] =
- L"{8A69D345-D564-463c-AFF1-A69D9E530F96}";
-const wchar_t kAppGuidGoogleBinaries[] =
- L"{4DC8B4CA-1BDA-483e-B5FA-D3C12E15B62D}";
-
const wchar_t kHeadless[] = L"CHROME_HEADLESS";
const wchar_t kShowRestart[] = L"CHROME_CRASHED";
const wchar_t kRestartInfo[] = L"CHROME_RESTART";
@@ -72,21 +42,24 @@ namespace {
// TODO(ananta)
// http://crbug.com/604923
+// The constants defined in this file are also defined in chrome/installer and
+// other places. we need to unify them.
+// Chrome channel display names.
+constexpr wchar_t kChromeChannelDev[] = L"dev";
+constexpr wchar_t kChromeChannelBeta[] = L"beta";
+constexpr wchar_t kChromeChannelStableExplicit[] = L"stable";
+
+// TODO(ananta)
+// http://crbug.com/604923
// These constants are defined in the chrome/installer directory as well. We
// need to unify them.
-#if defined(GOOGLE_CHROME_BUILD)
-const wchar_t kSxSSuffix[] = L" SxS";
-const wchar_t kGoogleChromeInstallSubDir1[] = L"Google";
-const wchar_t kGoogleChromeInstallSubDir2[] = L"Chrome";
-#else
-const wchar_t kChromiumInstallSubDir[] = L"Chromium";
-#endif // defined(GOOGLE_CHROME_BUILD)
+constexpr wchar_t kRegValueAp[] = L"ap";
+constexpr wchar_t kRegValueUsageStats[] = L"usagestats";
+constexpr wchar_t kMetricsReportingEnabled[] = L"MetricsReportingEnabled";
-const wchar_t kUserDataDirname[] = L"User Data";
-const wchar_t kBrowserCrashDumpMetricsSubKey[] = L"\\BrowserCrashDumpAttempts";
-
-const wchar_t kRegPathGoogleUpdate[] = L"Software\\Google\\Update";
-const wchar_t kRegGoogleUpdateVersion[] = L"version";
+constexpr wchar_t kUserDataDirname[] = L"User Data";
+constexpr wchar_t kBrowserCrashDumpMetricsSubKey[] =
+ L"\\BrowserCrashDumpAttempts";
void Trace(const wchar_t* format_string, ...) {
static const int kMaxLogBufferSize = 1024;
@@ -178,14 +151,6 @@ bool GetValueFromVersionResource(const char* version_resource,
return false;
}
-// Returns the executable path for the current process.
-std::wstring GetCurrentProcessExePath() {
- wchar_t exe_path[MAX_PATH];
- if (::GetModuleFileName(nullptr, exe_path, MAX_PATH) == 0)
- return std::wstring();
- return exe_path;
-}
-
bool RecursiveDirectoryCreate(const std::wstring& full_path) {
// If the path exists, we've succeeded if it's a directory, failed otherwise.
const wchar_t* full_path_str = full_path.c_str();
@@ -235,47 +200,24 @@ bool RecursiveDirectoryCreate(const std::wstring& full_path) {
return true;
}
-std::wstring GetChromeInstallRegistryPath() {
- std::wstring registry_path = L"Software\\";
- registry_path += GetChromeInstallSubDirectory();
- return registry_path;
-}
-
-bool GetCollectStatsConsentImpl(const std::wstring& exe_path) {
- bool enabled = true;
-
- if (ReportingIsEnforcedByPolicy(&enabled))
- return enabled;
-
- bool system_install = IsSystemInstall(exe_path.c_str());
- std::wstring app_guid;
-
- if (IsSxSChrome(exe_path.c_str())) {
- app_guid = kAppGuidCanary;
- } else {
- app_guid = IsMultiInstall(system_install) ? kAppGuidGoogleBinaries
- : kAppGuidGoogleChrome;
+// Appends "[kCompanyPathName\]kProductPathName[install_suffix]" to |path|,
+// returning a reference to |path|.
+std::wstring& AppendChromeInstallSubDirectory(std::wstring* path,
+ bool include_suffix) {
+ if (*kCompanyPathName) {
+ path->append(kCompanyPathName);
+ path->push_back(L'\\');
}
+ path->append(kProductPathName, kProductPathNameLength);
+ if (!include_suffix)
+ return *path;
+ return path->append(InstallDetails::Get().install_suffix());
+}
- DWORD out_value = 0;
-
- // If system_install, first try kRegPathClientStateMedium.
- std::wstring full_key_path(kRegPathClientStateMedium);
- full_key_path.append(1, L'\\');
- full_key_path.append(app_guid);
- if (system_install &&
- nt::QueryRegValueDWORD(nt::HKLM, nt::WOW6432, full_key_path.c_str(),
- kRegValueUsageStats, &out_value))
- return (out_value == 1);
-
- // Second, try kRegPathClientState.
- full_key_path = kRegPathClientState;
- full_key_path.append(1, L'\\');
- full_key_path.append(app_guid);
- return (nt::QueryRegValueDWORD((system_install ? nt::HKLM : nt::HKCU),
- nt::WOW6432, full_key_path.c_str(),
- kRegValueUsageStats, &out_value) &&
- out_value == 1);
+std::wstring GetChromeInstallRegistryPath() {
+ std::wstring registry_path = L"Software\\";
+ return AppendChromeInstallSubDirectory(&registry_path,
+ true /* include_suffix */);
}
// Returns true if the |source| string matches the |pattern|. The pattern
@@ -354,12 +296,6 @@ void TrimT(StringType* str) {
str->erase(0, str->find_first_not_of(GetWhiteSpacesForType<StringType>()));
}
-bool IsValidNumber(const std::string& str) {
- if (str.empty())
- return false;
- return std::all_of(str.begin(), str.end(), ::isdigit);
-}
-
// Tokenizes a string based on a single character delimiter.
template <class StringType>
std::vector<StringType> TokenizeStringT(
@@ -376,47 +312,88 @@ std::vector<StringType> TokenizeStringT(
return tokens;
}
-} // namespace
+std::wstring ChannelFromAdditionalParameters(const InstallConstants& mode,
+ bool system_level,
+ bool binaries) {
+ assert(kUseGoogleUpdateIntegration);
+ // InitChannelInfo in google_update_settings.cc only reports a failure in the
+ // case of multi-install Chrome where the binaries' ClientState key exists,
+ // but that the "ap" value therein cannot be read due to some reason *other*
+ // than it not being present. This should be exceedingly rare. For
+ // simplicity's sake, use an empty |value| in case of any error whatsoever
+ // here.
+ std::wstring value;
+ nt::QueryRegValueSZ(system_level ? nt::HKLM : nt::HKCU, nt::WOW6432,
+ (binaries ? GetBinariesClientStateKeyPath()
+ : GetClientStateKeyPath(mode.app_guid))
+ .c_str(),
+ kRegValueAp, &value);
-bool IsSxSChrome(const wchar_t* exe_path) {
- return ::wcsstr(exe_path, L"Chrome SxS\\Application") != nullptr;
-}
+ static constexpr wchar_t kChromeChannelBetaPattern[] = L"1?1-*";
+ static constexpr wchar_t kChromeChannelBetaX64Pattern[] = L"*x64-beta*";
+ static constexpr wchar_t kChromeChannelDevPattern[] = L"2?0-d*";
+ static constexpr wchar_t kChromeChannelDevX64Pattern[] = L"*x64-dev*";
-bool IsSystemInstall(const wchar_t* exe_path) {
- wchar_t program_dir[MAX_PATH] = {};
- DWORD ret = ::GetEnvironmentVariable(L"PROGRAMFILES", program_dir, MAX_PATH);
- if (ret && ret < MAX_PATH && !::wcsnicmp(exe_path, program_dir, ret)) {
- return true;
- }
+ std::transform(value.begin(), value.end(), value.begin(), ::tolower);
- ret = ::GetEnvironmentVariable(L"PROGRAMFILES(X86)", program_dir, MAX_PATH);
- if (ret && ret < MAX_PATH && !::wcsnicmp(exe_path, program_dir, ret)) {
- return true;
+ // Empty channel names or those containing "stable" should be reported as
+ // an empty string.
+ std::wstring channel_name;
+ if (value.empty() ||
+ (value.find(kChromeChannelStableExplicit) != std::wstring::npos)) {
+ } else if (MatchPattern(value, kChromeChannelDevPattern) ||
+ MatchPattern(value, kChromeChannelDevX64Pattern)) {
+ channel_name.assign(kChromeChannelDev);
+ } else if (MatchPattern(value, kChromeChannelBetaPattern) ||
+ MatchPattern(value, kChromeChannelBetaX64Pattern)) {
+ channel_name.assign(kChromeChannelBeta);
}
+ // Else report values with garbage as stable since they will match the stable
+ // rules in the update configs. ChannelInfo::GetChannelName painstakingly
+ // strips off known modifiers (e.g., "-multi-full") to see if the empty string
+ // remains, returning channel "unknown" if not. This differs here in that some
+ // clients will tag crashes as "stable" rather than "unknown" via this
+ // codepath, but it is an accurate reflection of which update channel the
+ // client is on according to the server-side rules.
- return false;
+ return channel_name;
}
-bool IsMultiInstall(bool is_system_install) {
- std::wstring args;
+} // namespace
- std::wstring full_key_path(kRegPathClientState);
- full_key_path.append(1, L'\\');
- full_key_path.append(kAppGuidGoogleChrome);
- if (!nt::QueryRegValueSZ((is_system_install ? nt::HKLM : nt::HKCU),
- nt::WOW6432, full_key_path.c_str(),
- kUninstallArgumentsField, &args))
- return false;
+bool IsSystemInstall() {
+ return InstallDetails::Get().system_level();
+}
- return (args.find(L"--multi-install") != std::wstring::npos);
+bool IsMultiInstall() {
+ return InstallDetails::Get().multi_install();
}
bool GetCollectStatsConsent() {
- return GetCollectStatsConsentImpl(GetCurrentProcessExePath());
-}
+ bool enabled = true;
+
+ if (ReportingIsEnforcedByPolicy(&enabled))
+ return enabled;
+
+ const bool system_install = IsSystemInstall();
+
+ DWORD out_value = 0;
+
+ // If system_install, first try ClientStateMedium in HKLM.
+ if (system_install &&
+ nt::QueryRegValueDWORD(
+ nt::HKLM, nt::WOW6432,
+ InstallDetails::Get().GetClientStateMediumKeyPath(true).c_str(),
+ kRegValueUsageStats, &out_value)) {
+ return (out_value == 1);
+ }
-bool GetCollectStatsConsentForTesting(const std::wstring& exe_path) {
- return GetCollectStatsConsentImpl(exe_path);
+ // Second, try ClientState.
+ return (nt::QueryRegValueDWORD(
+ system_install ? nt::HKLM : nt::HKCU, nt::WOW6432,
+ InstallDetails::Get().GetClientStateKeyPath(true).c_str(),
+ kRegValueUsageStats, &out_value) &&
+ out_value == 1);
}
bool GetCollectStatsInSample() {
@@ -438,26 +415,29 @@ bool SetCollectStatsInSample(bool in_sample) {
HANDLE key_handle = INVALID_HANDLE_VALUE;
if (!nt::CreateRegKey(nt::HKCU, registry_path.c_str(),
KEY_SET_VALUE | KEY_WOW64_32KEY, &key_handle)) {
- nt::CloseRegKey(key_handle);
return false;
}
- return nt::SetRegValueDWORD(key_handle, kRegValueChromeStatsSample,
- in_sample ? 1 : 0);
+ bool success = nt::SetRegValueDWORD(key_handle, kRegValueChromeStatsSample,
+ in_sample ? 1 : 0);
+ nt::CloseRegKey(key_handle);
+ return success;
}
bool ReportingIsEnforcedByPolicy(bool* crash_reporting_enabled) {
+ std::wstring policies_path = L"SOFTWARE\\Policies\\";
+ AppendChromeInstallSubDirectory(&policies_path, false /* !include_suffix */);
DWORD value = 0;
// First, try HKLM.
- if (nt::QueryRegValueDWORD(nt::HKLM, nt::NONE, kRegPathChromePolicy,
+ if (nt::QueryRegValueDWORD(nt::HKLM, nt::NONE, policies_path.c_str(),
kMetricsReportingEnabled, &value)) {
*crash_reporting_enabled = (value != 0);
return true;
}
// Second, try HKCU.
- if (nt::QueryRegValueDWORD(nt::HKCU, nt::NONE, kRegPathChromePolicy,
+ if (nt::QueryRegValueDWORD(nt::HKCU, nt::NONE, policies_path.c_str(),
kMetricsReportingEnabled, &value)) {
*crash_reporting_enabled = (value != 0);
return true;
@@ -494,39 +474,27 @@ bool IsNonBrowserProcess() {
}
bool GetDefaultUserDataDirectory(std::wstring* result) {
- static const wchar_t kLocalAppData[] = L"%LOCALAPPDATA%";
-
- std::unique_ptr<wchar_t> user_data_dir_path;
-
- // This environment variable should be set on Windows 7 and up.
- // If we fail to find this variable then we default to the temporary files
- // path.
- DWORD size = ::ExpandEnvironmentStrings(kLocalAppData, nullptr, 0);
- if (size) {
- user_data_dir_path.reset(new wchar_t[size]);
- if (::ExpandEnvironmentStrings(kLocalAppData, user_data_dir_path.get(),
- size) != size) {
- user_data_dir_path.reset();
- }
- }
- // We failed to find the %LOCALAPPDATA% folder. Fallback to the temporary
- // files path. If we fail to find this we bail.
- if (!user_data_dir_path.get()) {
- size = ::GetTempPath(0, nullptr);
+ // This environment variable should be set on Windows Vista and later
+ // (https://msdn.microsoft.com/library/windows/desktop/dd378457.aspx).
+ std::wstring user_data_dir = GetEnvironmentString16(L"LOCALAPPDATA");
+
+ if (user_data_dir.empty()) {
+ // LOCALAPPDATA was not set; fallback to the temporary files path.
+ DWORD size = ::GetTempPath(0, nullptr);
if (!size)
return false;
- user_data_dir_path.reset(new wchar_t[size + 1]);
- if (::GetTempPath(size + 1, user_data_dir_path.get()) != size)
+ user_data_dir.resize(size + 1);
+ size = ::GetTempPath(size + 1, &user_data_dir[0]);
+ if (!size || size >= user_data_dir.size())
return false;
+ user_data_dir.resize(size);
}
- std::wstring install_sub_directory = GetChromeInstallSubDirectory();
-
- *result = user_data_dir_path.get();
+ result->swap(user_data_dir);
if ((*result)[result->length() - 1] != L'\\')
- result->append(L"\\");
- result->append(install_sub_directory);
- result->append(L"\\");
+ result->push_back(L'\\');
+ AppendChromeInstallSubDirectory(result, true /* include_suffix */);
+ result->push_back(L'\\');
result->append(kUserDataDirname);
return true;
}
@@ -540,24 +508,28 @@ bool GetDefaultCrashDumpLocation(std::wstring* crash_dir) {
// We have to make sure the user data dir exists on first run. See
// http://crbug.com/591504.
- if (!RecursiveDirectoryCreate(crash_dir->c_str()))
+ if (!RecursiveDirectoryCreate(*crash_dir))
return false;
crash_dir->append(L"\\Crashpad");
return true;
}
std::string GetEnvironmentString(const std::string& variable_name) {
- return UTF16ToUTF8(GetEnvironmentString16(UTF8ToUTF16(variable_name)));
+ return UTF16ToUTF8(
+ GetEnvironmentString16(UTF8ToUTF16(variable_name).c_str()));
}
-std::wstring GetEnvironmentString16(const std::wstring& variable_name) {
- DWORD value_length =
- ::GetEnvironmentVariable(variable_name.c_str(), nullptr, 0);
- if (value_length == 0)
+std::wstring GetEnvironmentString16(const wchar_t* variable_name) {
+ DWORD value_length = ::GetEnvironmentVariableW(variable_name, nullptr, 0);
+ if (!value_length)
+ return std::wstring();
+ std::wstring value(value_length, L'\0');
+ value_length =
+ ::GetEnvironmentVariableW(variable_name, &value[0], value_length);
+ if (!value_length || value_length >= value.size())
return std::wstring();
- std::unique_ptr<wchar_t[]> value(new wchar_t[value_length]);
- ::GetEnvironmentVariable(variable_name.c_str(), value.get(), value_length);
- return value.get();
+ value.resize(value_length);
+ return value;
}
bool SetEnvironmentString(const std::string& variable_name,
@@ -579,7 +551,7 @@ bool HasEnvironmentVariable16(const std::wstring& variable_name) {
return !!::GetEnvironmentVariable(variable_name.c_str(), nullptr, 0);
}
-bool GetExecutableVersionDetails(const std::wstring& exe_path,
+void GetExecutableVersionDetails(const std::wstring& exe_path,
std::wstring* product_name,
std::wstring* version,
std::wstring* special_build,
@@ -592,7 +564,6 @@ bool GetExecutableVersionDetails(const std::wstring& exe_path,
// Default values in case we don't find a version resource.
*product_name = L"Chrome";
*version = L"0.0.0.0-devel";
- *channel_name = kChromeChannelUnknown;
special_build->clear();
DWORD dummy = 0;
@@ -612,107 +583,20 @@ bool GetExecutableVersionDetails(const std::wstring& exe_path,
GetValueFromVersionResource(data.get(), L"SpecialBuild", special_build);
}
}
- GetChromeChannelName(!IsSystemInstall(exe_path.c_str()), true, channel_name);
- return true;
-}
-
-void GetChromeChannelName(bool is_per_user_install,
- bool add_modifier,
- std::wstring* channel_name) {
- // See GoogleChromeSxSDistribution::GetChromeChannel.
- if (IsSxSChrome(GetCurrentProcessExePath().c_str())) {
- channel_name->assign(kChromeChannelCanary);
- return;
- }
-
- // InitChannelInfo in google_update_settings.cc only reports a failure in the
- // case of multi-install Chrome where the binaries' ClientState key exists,
- // but that the "ap" value therein cannot be read due to some reason *other*
- // than it not being present. This should be exceedingly rare. For
- // simplicity's sake, use an empty |value| in case of any error whatsoever
- // here.
- std::wstring value;
- bool is_multi_install = IsMultiInstall(!is_per_user_install);
- if (is_multi_install) {
- std::wstring full_key_path(kRegPathClientState);
- full_key_path.append(1, L'\\');
- full_key_path.append(kAppGuidGoogleBinaries);
- nt::QueryRegValueSZ(is_per_user_install ? nt::HKCU : nt::HKLM, nt::WOW6432,
- full_key_path.c_str(), kRegApField, &value);
- } else {
- std::wstring full_key_path(kRegPathClientState);
- full_key_path.append(1, L'\\');
- full_key_path.append(kAppGuidGoogleChrome);
- nt::QueryRegValueSZ(is_per_user_install ? nt::HKCU : nt::HKLM, nt::WOW6432,
- full_key_path.c_str(), kRegApField, &value);
- }
-
- static constexpr wchar_t kChromeChannelBetaPattern[] = L"1?1-*";
- static constexpr wchar_t kChromeChannelBetaX64Pattern[] = L"*x64-beta*";
- static constexpr wchar_t kChromeChannelDevPattern[] = L"2?0-d*";
- static constexpr wchar_t kChromeChannelDevX64Pattern[] = L"*x64-dev*";
-
- std::transform(value.begin(), value.end(), value.begin(), ::tolower);
-
- // Empty channel names or those containing "stable" should be reported as
- // an empty string (with the optional modifier).
- if (value.empty() ||
- (value.find(kChromeChannelStableExplicit) != std::wstring::npos)) {
- channel_name->clear();
- } else if (MatchPattern(value, kChromeChannelDevPattern) ||
- MatchPattern(value, kChromeChannelDevX64Pattern)) {
- channel_name->assign(kChromeChannelDev);
- } else if (MatchPattern(value, kChromeChannelBetaPattern) ||
- MatchPattern(value, kChromeChannelBetaX64Pattern)) {
- channel_name->assign(kChromeChannelBeta);
- } else {
- // Report values with garbage as stable since they will match the stable
- // rules in the update configs. ChannelInfo::GetChannelName painstakingly
- // strips off known modifiers (e.g., "-multi-full") to see if the empty
- // string remains, returning channel "unknown" if not. This differs here in
- // that some clients will tag crashes as "stable" rather than "unknown" via
- // this codepath, but it is an accurate reflection of which update channel
- // the client is on according to the server-side rules.
- channel_name->clear();
- }
-
- // Tag the channel name if this is a multi-install.
- if (add_modifier && is_multi_install) {
- if (!channel_name->empty())
- channel_name->push_back(L'-');
- channel_name->push_back(L'm');
- }
+ *channel_name = GetChromeChannelName(true /* add_modifier */);
}
-std::string GetGoogleUpdateVersion() {
- // TODO(ananta)
- // Consider whether Chromium should connect to Google update to manage
- // updates. Should this be returning an empty string for Chromium builds?.
- std::wstring update_version;
- if (nt::QueryRegValueSZ(nt::AUTO, nt::WOW6432, kRegPathGoogleUpdate,
- kRegGoogleUpdateVersion, &update_version))
- return UTF16ToUTF8(update_version);
-
- return std::string();
-}
-
-std::wstring GetChromeInstallSubDirectory() {
-#if defined(GOOGLE_CHROME_BUILD)
- std::wstring result = kGoogleChromeInstallSubDir1;
- result += L"\\";
- result += kGoogleChromeInstallSubDir2;
- if (IsSxSChrome(GetCurrentProcessExePath().c_str()))
- result += kSxSSuffix;
- return result;
-#else
- return std::wstring(kChromiumInstallSubDir);
-#endif
+std::wstring GetChromeChannelName(bool add_modifier) {
+ const std::wstring& channel = InstallDetails::Get().channel();
+ if (!add_modifier || !IsMultiInstall())
+ return channel;
+ if (channel.empty())
+ return L"m";
+ return channel + L"-m";
}
std::wstring GetBrowserCrashDumpAttemptsRegistryPath() {
- std::wstring registry_path = GetChromeInstallRegistryPath();
- registry_path += kBrowserCrashDumpMetricsSubKey;
- return registry_path;
+ return GetChromeInstallRegistryPath().append(kBrowserCrashDumpMetricsSubKey);
}
bool MatchPattern(const std::wstring& source, const std::wstring& pattern) {
@@ -767,83 +651,6 @@ std::vector<std::wstring> TokenizeString16(const std::wstring& str,
return TokenizeStringT<std::wstring>(str, delimiter, trim_spaces);
}
-bool CompareVersionStrings(const std::string& version1,
- const std::string& version2,
- int* result) {
- if (version1.empty() || version2.empty())
- return false;
-
- // Tokenize both version strings with "." as the separator. If either of
- // the returned token lists are empty then bail.
- std::vector<std::string> version1_components =
- TokenizeString(version1, '.', false);
- if (version1_components.empty())
- return false;
-
- std::vector<std::string> version2_components =
- TokenizeString(version2, '.', false);
- if (version2_components.empty())
- return false;
-
- // You may have less tokens in either string. Use the minimum of the number
- // of tokens as the initial count.
- const size_t count =
- std::min(version1_components.size(), version2_components.size());
- for (size_t i = 0; i < count; ++i) {
- // If either of the version components don't contain valid numeric digits
- // bail.
- if (!IsValidNumber(version1_components[i]) ||
- !IsValidNumber(version2_components[i])) {
- return false;
- }
-
- int version1_component = std::stoi(version1_components[i]);
- int version2_component = std::stoi(version2_components[i]);
-
- if (version1_component > version2_component) {
- *result = 1;
- return true;
- }
-
- if (version1_component < version2_component) {
- *result = -1;
- return true;
- }
- }
-
- // Handle remaining tokens. Here if we have non zero tokens remaining in the
- // version 1 list then it means that the version1 string is larger. If the
- // version 1 token list has tokens left, then if either of these tokens is
- // greater than 0 then it means that the version1 string is smaller than the
- // version2 string.
- if (version1_components.size() > version2_components.size()) {
- for (size_t i = count; i < version1_components.size(); ++i) {
- // If the version components don't contain valid numeric digits bail.
- if (!IsValidNumber(version1_components[i]))
- return false;
-
- if (std::stoi(version1_components[i]) > 0) {
- *result = 1;
- return true;
- }
- }
- } else if (version1_components.size() < version2_components.size()) {
- for (size_t i = count; i < version2_components.size(); ++i) {
- // If the version components don't contain valid numeric digits bail.
- if (!IsValidNumber(version2_components[i]))
- return false;
-
- if (std::stoi(version2_components[i]) > 0) {
- *result = -1;
- return true;
- }
- }
- }
- // Here it means that both versions are equal.
- *result = 0;
- return true;
-}
-
std::string GetSwitchValueFromCommandLine(const std::string& command_line,
const std::string& switch_name) {
assert(!command_line.empty());
@@ -886,4 +693,25 @@ std::string GetSwitchValueFromCommandLine(const std::string& command_line,
return switch_value;
}
+// This function takes these inputs rather than accessing the module's
+// InstallDetails instance since it is used to bootstrap InstallDetails.
+std::wstring DetermineChannel(const InstallConstants& mode,
+ bool system_level,
+ bool multi_install) {
+ if (!kUseGoogleUpdateIntegration)
+ return std::wstring();
+
+ switch (mode.channel_strategy) {
+ case ChannelStrategy::UNSUPPORTED:
+ assert(false);
+ break;
+ case ChannelStrategy::ADDITIONAL_PARAMETERS:
+ return ChannelFromAdditionalParameters(mode, system_level, multi_install);
+ case ChannelStrategy::FIXED:
+ return mode.default_channel_name;
+ }
+
+ return std::wstring();
+}
+
} // namespace install_static

Powered by Google App Engine
This is Rietveld 408576698