| Index: chrome/app/client_util.cc
|
| diff --git a/chrome/app/client_util.cc b/chrome/app/client_util.cc
|
| index 1fd5e10cafd425734acd6da5f4f595024c06e5f3..905f9df0eac28ae56c78713e734e7dc9749b4363 100644
|
| --- a/chrome/app/client_util.cc
|
| +++ b/chrome/app/client_util.cc
|
| @@ -9,10 +9,12 @@
|
| #include "base/debug/trace_event.h"
|
| #include "base/environment.h"
|
| #include "base/file_util.h"
|
| +#include "base/file_version_info.h"
|
| #include "base/logging.h"
|
| #include "base/memory/scoped_ptr.h"
|
| #include "base/rand_util.h" // For PreRead experiment.
|
| #include "base/sha1.h" // For PreRead experiment.
|
| +#include "base/string16.h"
|
| #include "base/string_util.h"
|
| #include "base/stringprintf.h"
|
| #include "base/utf_string_conversions.h"
|
| @@ -40,7 +42,7 @@ typedef void (*RelaunchChromeBrowserWithNewCommandLineIfNeededFunc)();
|
| // Gets chrome version according to the load path. |exe_path| must be the
|
| // backslash terminated directory of the current chrome.exe.
|
| bool GetChromeVersion(const wchar_t* exe_dir, const wchar_t* key_path,
|
| - std::wstring* version) {
|
| + string16* version) {
|
| HKEY reg_root = InstallUtil::IsPerUserInstall(exe_dir) ? HKEY_CURRENT_USER :
|
| HKEY_LOCAL_MACHINE;
|
| bool success = false;
|
| @@ -51,7 +53,7 @@ bool GetChromeVersion(const wchar_t* exe_dir, const wchar_t* key_path,
|
| // running. We need to consult the opv value so we can load the old dll.
|
| // TODO(cpu) : This is solving the same problem as the environment variable
|
| // so one of them will eventually be deprecated.
|
| - std::wstring new_chrome_exe(exe_dir);
|
| + string16 new_chrome_exe(exe_dir);
|
| new_chrome_exe.append(installer::kChromeNewExe);
|
| if (::PathFileExistsW(new_chrome_exe.c_str()) &&
|
| key.ReadValue(google_update::kRegOldVersionField,
|
| @@ -67,7 +69,7 @@ bool GetChromeVersion(const wchar_t* exe_dir, const wchar_t* key_path,
|
| }
|
|
|
| // Not generic, we only handle strings up to 128 chars.
|
| -bool EnvQueryStr(const wchar_t* key_name, std::wstring* value) {
|
| +bool EnvQueryStr(const wchar_t* key_name, string16* value) {
|
| wchar_t out[128];
|
| DWORD count = sizeof(out)/sizeof(out[0]);
|
| DWORD rv = ::GetEnvironmentVariableW(key_name, out, count);
|
| @@ -166,7 +168,7 @@ bool GetPreReadExperimentGroup(DWORD* pre_read_percentage) {
|
| // Get the MetricsId of the installation. This is only set if the user has
|
| // opted in to reporting. Doing things this way ensures that we only enable
|
| // the experiment if its results are actually going to be reported.
|
| - std::wstring metrics_id;
|
| + string16 metrics_id;
|
| if (!GoogleUpdateSettings::GetMetricsId(&metrics_id) || metrics_id.empty())
|
| return false;
|
|
|
| @@ -198,7 +200,7 @@ bool GetPreReadExperimentGroup(DWORD* pre_read_percentage) {
|
| // Expects that |dir| has a trailing backslash. |dir| is modified so it
|
| // contains the full path that was tried. Caller must check for the return
|
| // value not being null to determine if this path contains a valid dll.
|
| -HMODULE LoadChromeWithDirectory(std::wstring* dir) {
|
| +HMODULE LoadChromeWithDirectory(string16* dir) {
|
| ::SetCurrentDirectoryW(dir->c_str());
|
| const CommandLine& cmd_line = *CommandLine::ForCurrentProcess();
|
| dir->append(installer::kChromeDll);
|
| @@ -307,24 +309,24 @@ HMODULE LoadChromeWithDirectory(std::wstring* dir) {
|
| LOAD_WITH_ALTERED_SEARCH_PATH);
|
| }
|
|
|
| -void RecordDidRun(const std::wstring& dll_path) {
|
| +void RecordDidRun(const string16& dll_path) {
|
| bool system_level = !InstallUtil::IsPerUserInstall(dll_path.c_str());
|
| GoogleUpdateSettings::UpdateDidRunState(true, system_level);
|
| }
|
|
|
| -void ClearDidRun(const std::wstring& dll_path) {
|
| +void ClearDidRun(const string16& dll_path) {
|
| bool system_level = !InstallUtil::IsPerUserInstall(dll_path.c_str());
|
| GoogleUpdateSettings::UpdateDidRunState(false, system_level);
|
| }
|
|
|
| } // namespace
|
|
|
| -std::wstring GetExecutablePath() {
|
| +string16 GetExecutablePath() {
|
| wchar_t path[MAX_PATH];
|
| ::GetModuleFileNameW(NULL, path, MAX_PATH);
|
| if (!::PathRemoveFileSpecW(path))
|
| - return std::wstring();
|
| - std::wstring exe_path(path);
|
| + return string16();
|
| + string16 exe_path(path);
|
| return exe_path.append(1, L'\\');
|
| }
|
|
|
| @@ -346,14 +348,14 @@ MainDllLoader::~MainDllLoader() {
|
| // If that fails then finally we look at the registry which should point us
|
| // to the latest version. This is the expected path for the first chrome.exe
|
| // browser instance in an installed build.
|
| -HMODULE MainDllLoader::Load(std::wstring* out_version, std::wstring* out_file) {
|
| - const std::wstring dir(GetExecutablePath());
|
| +HMODULE MainDllLoader::Load(string16* out_version, string16* out_file) {
|
| + const string16 dir(GetExecutablePath());
|
| *out_file = dir;
|
| HMODULE dll = LoadChromeWithDirectory(out_file);
|
| if (dll)
|
| return dll;
|
|
|
| - std::wstring version_string;
|
| + string16 version_string;
|
| Version version;
|
| const CommandLine& cmd_line = *CommandLine::ForCurrentProcess();
|
| if (cmd_line.HasSwitch(switches::kChromeVersion)) {
|
| @@ -367,7 +369,22 @@ HMODULE MainDllLoader::Load(std::wstring* out_version, std::wstring* out_file) {
|
| }
|
| }
|
|
|
| - // If no version on the command line, then look in the environment.
|
| + // If no version on the command line, then look at the version resource in
|
| + // the current module and try loading that.
|
| + if (!version.IsValid()) {
|
| + scoped_ptr<FileVersionInfo> file_version_info(
|
| + FileVersionInfo::CreateFileVersionInfoForCurrentModule());
|
| + if (file_version_info.get()) {
|
| + version_string = file_version_info->file_version();
|
| + version = Version(WideToASCII(version_string));
|
| + }
|
| + }
|
| +
|
| + // TODO(robertshield): in theory, these next two checks (env and registry)
|
| + // should never be needed. Remove them when I become 100% certain this is
|
| + // also true in practice.
|
| +
|
| + // If no version in the current module, then look in the environment.
|
| if (!version.IsValid()) {
|
| if (EnvQueryStr(ASCIIToWide(chrome::kChromeVersionEnvVar).c_str(),
|
| &version_string)) {
|
| @@ -403,8 +420,8 @@ HMODULE MainDllLoader::Load(std::wstring* out_version, std::wstring* out_file) {
|
| // add custom code in the OnBeforeLaunch callback.
|
| int MainDllLoader::Launch(HINSTANCE instance,
|
| sandbox::SandboxInterfaceInfo* sbox_info) {
|
| - std::wstring version;
|
| - std::wstring file;
|
| + string16 version;
|
| + string16 file;
|
| dll_ = Load(&version, &file);
|
| if (!dll_)
|
| return chrome::RESULT_CODE_MISSING_DATA;
|
| @@ -424,12 +441,12 @@ int MainDllLoader::Launch(HINSTANCE instance,
|
| return OnBeforeExit(rc, file);
|
| }
|
|
|
| -std::wstring MainDllLoader::GetVersion() {
|
| - std::wstring reg_path(GetRegistryPath());
|
| - std::wstring version_string;
|
| - std::wstring dir(GetExecutablePath());
|
| +string16 MainDllLoader::GetVersion() {
|
| + string16 reg_path(GetRegistryPath());
|
| + string16 version_string;
|
| + string16 dir(GetExecutablePath());
|
| if (!GetChromeVersion(dir.c_str(), reg_path.c_str(), &version_string))
|
| - return std::wstring();
|
| + return string16();
|
| return version_string;
|
| }
|
|
|
| @@ -450,18 +467,18 @@ void MainDllLoader::RelaunchChromeBrowserWithNewCommandLineIfNeeded() {
|
|
|
| class ChromeDllLoader : public MainDllLoader {
|
| public:
|
| - virtual std::wstring GetRegistryPath() {
|
| - std::wstring key(google_update::kRegPathClients);
|
| + virtual string16 GetRegistryPath() {
|
| + string16 key(google_update::kRegPathClients);
|
| BrowserDistribution* dist = BrowserDistribution::GetDistribution();
|
| key.append(L"\\").append(dist->GetAppGuid());
|
| return key;
|
| }
|
|
|
| - virtual void OnBeforeLaunch(const std::wstring& dll_path) {
|
| + virtual void OnBeforeLaunch(const string16& dll_path) {
|
| RecordDidRun(dll_path);
|
| }
|
|
|
| - virtual int OnBeforeExit(int return_code, const std::wstring& dll_path) {
|
| + virtual int OnBeforeExit(int return_code, const string16& dll_path) {
|
| // NORMAL_EXIT_CANCEL is used for experiments when the user cancels
|
| // so we need to reset the did_run signal so omaha does not count
|
| // this run as active usage.
|
| @@ -476,7 +493,7 @@ class ChromeDllLoader : public MainDllLoader {
|
|
|
| class ChromiumDllLoader : public MainDllLoader {
|
| public:
|
| - virtual std::wstring GetRegistryPath() {
|
| + virtual string16 GetRegistryPath() {
|
| BrowserDistribution* dist = BrowserDistribution::GetDistribution();
|
| return dist->GetVersionKey();
|
| }
|
|
|