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 <algorithm> | |
6 | |
5 #include "base/memory/ref_counted.h" | 7 #include "base/memory/ref_counted.h" |
6 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
7 #include "base/memory/weak_ptr.h" | 9 #include "base/memory/weak_ptr.h" |
8 #include "base/strings/string16.h" | 10 #include "base/strings/string16.h" |
9 #include "base/version.h" | 11 #include "base/version.h" |
10 #include "base/win/win_util.h" | 12 #include "base/win/win_util.h" |
11 #include "base/win/windows_version.h" | 13 #include "base/win/windows_version.h" |
14 #include "chrome/browser/browser_process.h" | |
12 #include "chrome/browser/google/google_update_win.h" | 15 #include "chrome/browser/google/google_update_win.h" |
13 #include "chrome/browser/lifetime/application_lifetime.h" | 16 #include "chrome/browser/lifetime/application_lifetime.h" |
14 #include "chrome/browser/ui/browser.h" | 17 #include "chrome/browser/ui/browser.h" |
15 #include "chrome/browser/ui/webui/help/version_updater.h" | 18 #include "chrome/browser/ui/webui/help/version_updater.h" |
16 #include "chrome/common/chrome_version_info.h" | 19 #include "chrome/common/chrome_version_info.h" |
17 #include "chrome/grit/chromium_strings.h" | 20 #include "chrome/grit/chromium_strings.h" |
18 #include "chrome/grit/generated_resources.h" | 21 #include "chrome/grit/generated_resources.h" |
19 #include "chrome/installer/util/browser_distribution.h" | 22 #include "chrome/installer/util/browser_distribution.h" |
20 #include "chrome/installer/util/install_util.h" | 23 #include "chrome/installer/util/install_util.h" |
21 #include "content/public/browser/browser_thread.h" | 24 #include "content/public/browser/browser_thread.h" |
(...skipping 15 matching lines...) Expand all Loading... | |
37 // Clients must use VersionUpdater::Create(). | 40 // Clients must use VersionUpdater::Create(). |
38 VersionUpdaterWin(); | 41 VersionUpdaterWin(); |
39 ~VersionUpdaterWin() override; | 42 ~VersionUpdaterWin() override; |
40 | 43 |
41 // VersionUpdater implementation. | 44 // VersionUpdater implementation. |
42 void CheckForUpdate(const StatusCallback& callback) override; | 45 void CheckForUpdate(const StatusCallback& callback) override; |
43 void RelaunchBrowser() const override; | 46 void RelaunchBrowser() const override; |
44 | 47 |
45 // chrome::UpdateCheckCallback. | 48 // chrome::UpdateCheckCallback. |
46 void OnUpdateCheckResults(GoogleUpdateUpgradeResult result, | 49 void OnUpdateCheckResults(GoogleUpdateUpgradeResult result, |
50 double progress, | |
47 GoogleUpdateErrorCode error_code, | 51 GoogleUpdateErrorCode error_code, |
48 const base::string16& error_message, | 52 const base::string16& error_message, |
49 const base::string16& version); | 53 const base::string16& version); |
50 | 54 |
51 // Update the UI to show the status of the upgrade. | 55 // Update the UI to show the status of the upgrade. |
52 void UpdateStatus(GoogleUpdateUpgradeResult result, | 56 void UpdateStatus(GoogleUpdateUpgradeResult result, |
57 double update_progress, | |
53 GoogleUpdateErrorCode error_code, | 58 GoogleUpdateErrorCode error_code, |
54 const base::string16& error_message); | 59 const base::string16& error_message); |
55 | 60 |
56 // Got the intalled version so the handling of the UPGRADE_ALREADY_UP_TO_DATE | 61 // Got the intalled version so the handling of the UPGRADE_ALREADY_UP_TO_DATE |
57 // result case can now be completeb on the UI thread. | 62 // result case can now be completeb on the UI thread. |
58 void GotInstalledVersion(const Version& version); | 63 void GotInstalledVersion(const Version& version); |
59 | 64 |
60 // Returns a window that can be used for elevation. | 65 // Returns a window that can be used for elevation. |
61 gfx::AcceleratedWidget GetElevationParent(); | 66 gfx::AcceleratedWidget GetElevationParent(); |
62 | 67 |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
125 callback_ = callback; | 130 callback_ = callback; |
126 | 131 |
127 // On-demand updates for Chrome don't work in Vista RTM when UAC is turned | 132 // On-demand updates for Chrome don't work in Vista RTM when UAC is turned |
128 // off. So, in this case, the version updater must not mention | 133 // off. So, in this case, the version updater must not mention |
129 // on-demand updates. Silent updates (in the background) should still | 134 // on-demand updates. Silent updates (in the background) should still |
130 // work as before - enabling UAC or installing the latest service pack | 135 // work as before - enabling UAC or installing the latest service pack |
131 // for Vista is another option. | 136 // for Vista is another option. |
132 if (!(base::win::GetVersion() == base::win::VERSION_VISTA && | 137 if (!(base::win::GetVersion() == base::win::VERSION_VISTA && |
133 (base::win::OSInfo::GetInstance()->service_pack().major == 0) && | 138 (base::win::OSInfo::GetInstance()->service_pack().major == 0) && |
134 !base::win::UserAccountControlIsEnabled())) { | 139 !base::win::UserAccountControlIsEnabled())) { |
135 UpdateStatus(UPGRADE_CHECK_STARTED, GOOGLE_UPDATE_NO_ERROR, | 140 UpdateStatus(UPGRADE_CHECK_STARTED, 0.0, GOOGLE_UPDATE_NO_ERROR, |
136 base::string16()); | 141 base::string16()); |
137 // Specify false to not upgrade yet. | 142 // Specify false to not upgrade yet. |
138 BeginUpdateCheckOnFileThread(false); | 143 BeginUpdateCheckOnFileThread(false); |
139 } | 144 } |
140 } | 145 } |
141 | 146 |
142 void VersionUpdaterWin::RelaunchBrowser() const { | 147 void VersionUpdaterWin::RelaunchBrowser() const { |
143 chrome::AttemptRestart(); | 148 chrome::AttemptRestart(); |
144 } | 149 } |
145 | 150 |
146 void VersionUpdaterWin::OnUpdateCheckResults( | 151 void VersionUpdaterWin::OnUpdateCheckResults( |
147 GoogleUpdateUpgradeResult result, | 152 GoogleUpdateUpgradeResult result, |
153 double progress, | |
148 GoogleUpdateErrorCode error_code, | 154 GoogleUpdateErrorCode error_code, |
149 const base::string16& error_message, | 155 const base::string16& error_message, |
150 const base::string16& version) { | 156 const base::string16& version) { |
151 UpdateStatus(result, error_code, error_message); | 157 UpdateStatus(result, progress, error_code, error_message); |
152 } | 158 } |
153 | 159 |
154 void VersionUpdaterWin::UpdateStatus(GoogleUpdateUpgradeResult result, | 160 void VersionUpdaterWin::UpdateStatus(GoogleUpdateUpgradeResult result, |
161 double update_progress, | |
155 GoogleUpdateErrorCode error_code, | 162 GoogleUpdateErrorCode error_code, |
156 const base::string16& error_message) { | 163 const base::string16& error_message) { |
157 // For Chromium builds it would show an error message. | 164 // For Chromium builds it would show an error message. |
158 // But it looks weird because in fact there is no error, | 165 // But it looks weird because in fact there is no error, |
159 // just the update server is not available for non-official builds. | 166 // just the update server is not available for non-official builds. |
160 #if defined(GOOGLE_CHROME_BUILD) | 167 #if defined(GOOGLE_CHROME_BUILD) |
161 Status status = UPDATED; | 168 Status status = UPDATED; |
169 int progress = 0; | |
162 base::string16 message; | 170 base::string16 message; |
163 | 171 |
164 switch (result) { | 172 switch (result) { |
165 case UPGRADE_CHECK_STARTED: { | 173 case UPGRADE_CHECK_STARTED: { |
166 status = CHECKING; | 174 status = CHECKING; |
167 break; | 175 break; |
168 } | 176 } |
169 case UPGRADE_STARTED: { | 177 case UPGRADE_STARTED: { |
170 status = UPDATING; | 178 status = UPDATING; |
179 progress = static_cast<int>((update_progress * 100.0) + 0.5); | |
Peter Kasting
2015/05/07 01:12:28
Technically, things like this should probably use
grt (UTC plus 2)
2015/05/08 18:51:51
Awesome, I didn't know that was a thing.
| |
180 progress = std::min(progress, 100); | |
171 break; | 181 break; |
172 } | 182 } |
173 case UPGRADE_IS_AVAILABLE: { | 183 case UPGRADE_IS_AVAILABLE: { |
174 UpdateStatus(UPGRADE_STARTED, GOOGLE_UPDATE_NO_ERROR, base::string16()); | 184 UpdateStatus(UPGRADE_STARTED, 0.0, GOOGLE_UPDATE_NO_ERROR, |
185 base::string16()); | |
175 // Specify true to upgrade now. | 186 // Specify true to upgrade now. |
176 BeginUpdateCheckOnFileThread(true); | 187 BeginUpdateCheckOnFileThread(true); |
177 return; | 188 return; |
178 } | 189 } |
179 case UPGRADE_ALREADY_UP_TO_DATE: { | 190 case UPGRADE_ALREADY_UP_TO_DATE: { |
180 // Google Update reported that Chrome is up-to-date. | 191 // Google Update reported that Chrome is up-to-date. |
181 // To confirm the updated version is running, the reading | 192 // To confirm the updated version is running, the reading |
182 // must be done on the file thread. The rest of this case | 193 // must be done on the file thread. The rest of this case |
183 // will be handled within GotInstalledVersion. | 194 // will be handled within GotInstalledVersion. |
184 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, base::Bind( | 195 BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, base::Bind( |
185 &VersionReader::GetVersionFromFileThread, | 196 &VersionReader::GetVersionFromFileThread, |
186 new VersionReader(weak_factory_.GetWeakPtr()))); | 197 new VersionReader(weak_factory_.GetWeakPtr()))); |
187 return; | 198 return; |
188 } | 199 } |
189 case UPGRADE_SUCCESSFUL: { | 200 case UPGRADE_SUCCESSFUL: { |
190 status = NEARLY_UPDATED; | 201 status = NEARLY_UPDATED; |
191 break; | 202 break; |
192 } | 203 } |
193 case UPGRADE_ERROR: { | 204 case UPGRADE_ERROR: { |
194 status = FAILED; | 205 status = FAILED; |
195 if (error_code == GOOGLE_UPDATE_DISABLED_BY_POLICY) { | 206 // Google Update provides a nice message for the policy case. Use this |
196 message = | 207 // generic error for the policy case only if no message from Google Update |
197 l10n_util::GetStringUTF16(IDS_UPGRADE_DISABLED_BY_POLICY); | 208 // is missing. |
Peter Kasting
2015/05/07 01:12:28
"if no message is missing"? Is there a double neg
grt (UTC plus 2)
2015/05/08 18:51:51
Done.
| |
198 } else if (error_code == GOOGLE_UPDATE_DISABLED_BY_POLICY_AUTO_ONLY) { | 209 if (error_code != GOOGLE_UPDATE_DISABLED_BY_POLICY || |
199 message = | 210 error_message.empty()) { |
200 l10n_util::GetStringUTF16(IDS_UPGRADE_DISABLED_BY_POLICY_MANUAL); | |
201 } else { | |
202 message = | 211 message = |
203 l10n_util::GetStringFUTF16Int(IDS_UPGRADE_ERROR, error_code); | 212 l10n_util::GetStringFUTF16Int(IDS_UPGRADE_ERROR, error_code); |
204 } | 213 } |
205 | 214 |
206 if (!error_message.empty()) { | 215 if (!error_message.empty()) { |
207 message += | 216 message += |
208 l10n_util::GetStringFUTF16(IDS_ABOUT_BOX_ERROR_DURING_UPDATE_CHECK, | 217 l10n_util::GetStringFUTF16(IDS_ABOUT_BOX_ERROR_DURING_UPDATE_CHECK, |
209 error_message); | 218 error_message); |
210 } | 219 } |
211 break; | 220 break; |
212 } | 221 } |
213 } | 222 } |
214 | 223 |
215 // TODO(mad): Get proper progress value instead of passing 0. | 224 callback_.Run(status, progress, message); |
216 // http://crbug.com/136117 | |
217 callback_.Run(status, 0, message); | |
218 #endif // defined(GOOGLE_CHROME_BUILD) | 225 #endif // defined(GOOGLE_CHROME_BUILD) |
219 } | 226 } |
220 | 227 |
221 void VersionUpdaterWin::GotInstalledVersion(const Version& version) { | 228 void VersionUpdaterWin::GotInstalledVersion(const Version& version) { |
222 // This must be called on the UI thread so that callback_ can be called. | 229 // This must be called on the UI thread so that callback_ can be called. |
223 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 230 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
224 | 231 |
225 // Make sure that the latest version is running and if not, | 232 // Make sure that the latest version is running and if not, |
226 // notify the user by setting the status to NEARLY_UPDATED. | 233 // notify the user by setting the status to NEARLY_UPDATED. |
227 // | 234 // |
(...skipping 25 matching lines...) Expand all Loading... | |
253 EnumThreadWindows(GetCurrentThreadId(), | 260 EnumThreadWindows(GetCurrentThreadId(), |
254 WindowEnumeration, | 261 WindowEnumeration, |
255 reinterpret_cast<LPARAM>(&window)); | 262 reinterpret_cast<LPARAM>(&window)); |
256 return window; | 263 return window; |
257 } | 264 } |
258 | 265 |
259 void VersionUpdaterWin::BeginUpdateCheckOnFileThread(bool install_if_newer) { | 266 void VersionUpdaterWin::BeginUpdateCheckOnFileThread(bool install_if_newer) { |
260 scoped_refptr<base::TaskRunner> task_runner( | 267 scoped_refptr<base::TaskRunner> task_runner( |
261 content::BrowserThread::GetMessageLoopProxyForThread( | 268 content::BrowserThread::GetMessageLoopProxyForThread( |
262 content::BrowserThread::FILE)); | 269 content::BrowserThread::FILE)); |
263 BeginUpdateCheck(task_runner, install_if_newer, GetElevationParent(), | 270 BeginUpdateCheck(task_runner, g_browser_process->GetApplicationLocale(), |
271 install_if_newer, GetElevationParent(), | |
264 base::Bind(&VersionUpdaterWin::OnUpdateCheckResults, | 272 base::Bind(&VersionUpdaterWin::OnUpdateCheckResults, |
265 weak_factory_.GetWeakPtr())); | 273 weak_factory_.GetWeakPtr())); |
266 } | 274 } |
267 | 275 |
268 } // namespace | 276 } // namespace |
269 | 277 |
270 VersionUpdater* VersionUpdater::Create(content::BrowserContext* /* context */) { | 278 VersionUpdater* VersionUpdater::Create(content::BrowserContext* /* context */) { |
271 return new VersionUpdaterWin; | 279 return new VersionUpdaterWin; |
272 } | 280 } |
OLD | NEW |