OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/first_run/upgrade_util.h" | 5 #include "chrome/browser/first_run/upgrade_util.h" |
6 | 6 |
7 #include <windows.h> | 7 #include <windows.h> |
8 #include <psapi.h> | 8 #include <psapi.h> |
9 #include <shellapi.h> | 9 #include <shellapi.h> |
10 | 10 |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
110 RelaunchMode RelaunchModeStringToEnum(const std::string& relaunch_mode) { | 110 RelaunchMode RelaunchModeStringToEnum(const std::string& relaunch_mode) { |
111 if (relaunch_mode == kRelaunchModeMetro) | 111 if (relaunch_mode == kRelaunchModeMetro) |
112 return RELAUNCH_MODE_METRO; | 112 return RELAUNCH_MODE_METRO; |
113 | 113 |
114 if (relaunch_mode == kRelaunchModeDesktop) | 114 if (relaunch_mode == kRelaunchModeDesktop) |
115 return RELAUNCH_MODE_DESKTOP; | 115 return RELAUNCH_MODE_DESKTOP; |
116 | 116 |
117 // On Windows 7 if the current browser is in Chrome OS mode, then restart | 117 // On Windows 7 if the current browser is in Chrome OS mode, then restart |
118 // into Chrome OS mode. | 118 // into Chrome OS mode. |
119 if ((base::win::GetVersion() == base::win::VERSION_WIN7) && | 119 if ((base::win::GetVersion() == base::win::VERSION_WIN7) && |
120 CommandLine::ForCurrentProcess()->HasSwitch(switches::kViewerConnect) && | 120 base::CommandLine::ForCurrentProcess()->HasSwitch( |
121 !g_browser_process->local_state()->HasPrefPath(prefs::kRelaunchMode)) { | 121 switches::kViewerConnect) && |
| 122 !g_browser_process->local_state()->HasPrefPath(prefs::kRelaunchMode)) { |
122 // TODO(ananta) | 123 // TODO(ananta) |
123 // On Windows 8, the delegate execute process looks up the previously | 124 // On Windows 8, the delegate execute process looks up the previously |
124 // launched mode from the registry and relaunches into that mode. We need | 125 // launched mode from the registry and relaunches into that mode. We need |
125 // something similar on Windows 7. For now, set the pref to ensure that | 126 // something similar on Windows 7. For now, set the pref to ensure that |
126 // we get relaunched into Chrome OS mode. | 127 // we get relaunched into Chrome OS mode. |
127 g_browser_process->local_state()->SetString( | 128 g_browser_process->local_state()->SetString( |
128 prefs::kRelaunchMode, upgrade_util::kRelaunchModeMetro); | 129 prefs::kRelaunchMode, upgrade_util::kRelaunchModeMetro); |
129 return RELAUNCH_MODE_METRO; | 130 return RELAUNCH_MODE_METRO; |
130 } | 131 } |
131 | 132 |
132 return RELAUNCH_MODE_DEFAULT; | 133 return RELAUNCH_MODE_DEFAULT; |
133 } | 134 } |
134 | 135 |
135 bool RelaunchChromeHelper(const CommandLine& command_line, | 136 bool RelaunchChromeHelper(const base::CommandLine& command_line, |
136 const RelaunchMode& relaunch_mode) { | 137 const RelaunchMode& relaunch_mode) { |
137 scoped_ptr<base::Environment> env(base::Environment::Create()); | 138 scoped_ptr<base::Environment> env(base::Environment::Create()); |
138 std::string version_str; | 139 std::string version_str; |
139 | 140 |
140 // Get the version variable and remove it from the environment. | 141 // Get the version variable and remove it from the environment. |
141 if (env->GetVar(chrome::kChromeVersionEnvVar, &version_str)) | 142 if (env->GetVar(chrome::kChromeVersionEnvVar, &version_str)) |
142 env->UnSetVar(chrome::kChromeVersionEnvVar); | 143 env->UnSetVar(chrome::kChromeVersionEnvVar); |
143 else | 144 else |
144 version_str.clear(); | 145 version_str.clear(); |
145 | 146 |
146 base::FilePath chrome_exe; | 147 base::FilePath chrome_exe; |
147 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) { | 148 if (!PathService::Get(base::FILE_EXE, &chrome_exe)) { |
148 NOTREACHED(); | 149 NOTREACHED(); |
149 return false; | 150 return false; |
150 } | 151 } |
151 | 152 |
152 // Explicitly make sure to relaunch chrome.exe rather than old_chrome.exe. | 153 // Explicitly make sure to relaunch chrome.exe rather than old_chrome.exe. |
153 // This can happen when old_chrome.exe is launched by a user. | 154 // This can happen when old_chrome.exe is launched by a user. |
154 CommandLine chrome_exe_command_line = command_line; | 155 base::CommandLine chrome_exe_command_line = command_line; |
155 chrome_exe_command_line.SetProgram( | 156 chrome_exe_command_line.SetProgram( |
156 chrome_exe.DirName().Append(installer::kChromeExe)); | 157 chrome_exe.DirName().Append(installer::kChromeExe)); |
157 | 158 |
158 if (base::win::GetVersion() < base::win::VERSION_WIN8 && | 159 if (base::win::GetVersion() < base::win::VERSION_WIN8 && |
159 relaunch_mode != RELAUNCH_MODE_METRO && | 160 relaunch_mode != RELAUNCH_MODE_METRO && |
160 relaunch_mode != RELAUNCH_MODE_DESKTOP) | 161 relaunch_mode != RELAUNCH_MODE_DESKTOP) |
161 return base::LaunchProcess(chrome_exe_command_line, | 162 return base::LaunchProcess(chrome_exe_command_line, |
162 base::LaunchOptions()).IsValid(); | 163 base::LaunchOptions()).IsValid(); |
163 | 164 |
164 // On Windows 8 we always use the delegate_execute for re-launching chrome. | 165 // On Windows 8 we always use the delegate_execute for re-launching chrome. |
(...skipping 13 matching lines...) Expand all Loading... |
178 // The |mutex| handle needs to be leaked. See comment above. | 179 // The |mutex| handle needs to be leaked. See comment above. |
179 if (!mutex) { | 180 if (!mutex) { |
180 NOTREACHED(); | 181 NOTREACHED(); |
181 return false; | 182 return false; |
182 } | 183 } |
183 if (::GetLastError() == ERROR_ALREADY_EXISTS) { | 184 if (::GetLastError() == ERROR_ALREADY_EXISTS) { |
184 NOTREACHED() << "Relaunch mutex already exists"; | 185 NOTREACHED() << "Relaunch mutex already exists"; |
185 return false; | 186 return false; |
186 } | 187 } |
187 | 188 |
188 CommandLine relaunch_cmd(CommandLine::NO_PROGRAM); | 189 base::CommandLine relaunch_cmd(base::CommandLine::NO_PROGRAM); |
189 relaunch_cmd.AppendSwitchPath(switches::kRelaunchShortcut, | 190 relaunch_cmd.AppendSwitchPath(switches::kRelaunchShortcut, |
190 ShellIntegration::GetStartMenuShortcut(chrome_exe)); | 191 ShellIntegration::GetStartMenuShortcut(chrome_exe)); |
191 relaunch_cmd.AppendSwitchNative(switches::kWaitForMutex, mutex_name); | 192 relaunch_cmd.AppendSwitchNative(switches::kWaitForMutex, mutex_name); |
192 | 193 |
193 if (relaunch_mode != RELAUNCH_MODE_DEFAULT) { | 194 if (relaunch_mode != RELAUNCH_MODE_DEFAULT) { |
194 relaunch_cmd.AppendSwitch(relaunch_mode == RELAUNCH_MODE_METRO? | 195 relaunch_cmd.AppendSwitch(relaunch_mode == RELAUNCH_MODE_METRO? |
195 switches::kForceImmersive : switches::kForceDesktop); | 196 switches::kForceImmersive : switches::kForceDesktop); |
196 } | 197 } |
197 | 198 |
198 base::string16 params(relaunch_cmd.GetCommandLineString()); | 199 base::string16 params(relaunch_cmd.GetCommandLineString()); |
(...skipping 14 matching lines...) Expand all Loading... |
213 if (!pid) | 214 if (!pid) |
214 return false; | 215 return false; |
215 // The next call appears to be needed if we are relaunching from desktop into | 216 // The next call appears to be needed if we are relaunching from desktop into |
216 // metro mode. The observed effect if not done is that chrome starts in metro | 217 // metro mode. The observed effect if not done is that chrome starts in metro |
217 // mode but it is not given focus and it gets killed by windows after a few | 218 // mode but it is not given focus and it gets killed by windows after a few |
218 // seconds. | 219 // seconds. |
219 ::AllowSetForegroundWindow(pid); | 220 ::AllowSetForegroundWindow(pid); |
220 return true; | 221 return true; |
221 } | 222 } |
222 | 223 |
223 bool RelaunchChromeBrowser(const CommandLine& command_line) { | 224 bool RelaunchChromeBrowser(const base::CommandLine& command_line) { |
224 return RelaunchChromeHelper(command_line, RELAUNCH_MODE_DEFAULT); | 225 return RelaunchChromeHelper(command_line, RELAUNCH_MODE_DEFAULT); |
225 } | 226 } |
226 | 227 |
227 bool RelaunchChromeWithMode(const CommandLine& command_line, | 228 bool RelaunchChromeWithMode(const base::CommandLine& command_line, |
228 const RelaunchMode& relaunch_mode) { | 229 const RelaunchMode& relaunch_mode) { |
229 return RelaunchChromeHelper(command_line, relaunch_mode); | 230 return RelaunchChromeHelper(command_line, relaunch_mode); |
230 } | 231 } |
231 | 232 |
232 bool IsUpdatePendingRestart() { | 233 bool IsUpdatePendingRestart() { |
233 base::FilePath new_chrome_exe; | 234 base::FilePath new_chrome_exe; |
234 if (!GetNewerChromeFile(&new_chrome_exe)) | 235 if (!GetNewerChromeFile(&new_chrome_exe)) |
235 return false; | 236 return false; |
236 return base::PathExists(new_chrome_exe); | 237 return base::PathExists(new_chrome_exe); |
237 } | 238 } |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
286 mapped_file_name, | 287 mapped_file_name, |
287 arraysize(mapped_file_name))) { | 288 arraysize(mapped_file_name))) { |
288 return false; | 289 return false; |
289 } | 290 } |
290 | 291 |
291 base::FilePath file_name(base::FilePath(mapped_file_name).BaseName()); | 292 base::FilePath file_name(base::FilePath(mapped_file_name).BaseName()); |
292 return base::FilePath::CompareEqualIgnoreCase(file_name.value(), | 293 return base::FilePath::CompareEqualIgnoreCase(file_name.value(), |
293 installer::kChromeOldExe); | 294 installer::kChromeOldExe); |
294 } | 295 } |
295 | 296 |
296 bool DoUpgradeTasks(const CommandLine& command_line) { | 297 bool DoUpgradeTasks(const base::CommandLine& command_line) { |
297 // The DelegateExecute verb handler finalizes pending in-use updates for | 298 // The DelegateExecute verb handler finalizes pending in-use updates for |
298 // metro mode launches, as Chrome cannot be gracefully relaunched when | 299 // metro mode launches, as Chrome cannot be gracefully relaunched when |
299 // running in this mode. | 300 // running in this mode. |
300 if (base::win::IsMetroProcess()) | 301 if (base::win::IsMetroProcess()) |
301 return false; | 302 return false; |
302 if (!SwapNewChromeExeIfPresent() && !IsRunningOldChrome()) | 303 if (!SwapNewChromeExeIfPresent() && !IsRunningOldChrome()) |
303 return false; | 304 return false; |
304 // At this point the chrome.exe has been swapped with the new one. | 305 // At this point the chrome.exe has been swapped with the new one. |
305 if (!RelaunchChromeBrowser(command_line)) { | 306 if (!RelaunchChromeBrowser(command_line)) { |
306 // The re-launch fails. Feel free to panic now. | 307 // The re-launch fails. Feel free to panic now. |
307 NOTREACHED(); | 308 NOTREACHED(); |
308 } | 309 } |
309 return true; | 310 return true; |
310 } | 311 } |
311 | 312 |
312 } // namespace upgrade_util | 313 } // namespace upgrade_util |
OLD | NEW |