OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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 "app/l10n_util_mac.h" | 5 #include "app/l10n_util_mac.h" |
6 #include "app/resource_bundle.h" | 6 #include "app/resource_bundle.h" |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/mac_util.h" | 8 #include "base/mac_util.h" |
9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
10 #include "base/sys_string_conversions.h" | 10 #include "base/sys_string_conversions.h" |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 object:nil]; | 89 object:nil]; |
90 } | 90 } |
91 return self; | 91 return self; |
92 } | 92 } |
93 | 93 |
94 - (void)dealloc { | 94 - (void)dealloc { |
95 [[NSNotificationCenter defaultCenter] removeObserver:self]; | 95 [[NSNotificationCenter defaultCenter] removeObserver:self]; |
96 [super dealloc]; | 96 [super dealloc]; |
97 } | 97 } |
98 | 98 |
| 99 // YES when an About box is currently showing the kAutoupdateInstallFailed |
| 100 // status, or if no About box is visible, if the most recent About box to be |
| 101 // closed was closed while showing this status. When an About box opens, if |
| 102 // the recent status is kAutoupdateInstallFailed and |
| 103 // recentShownInstallFailedStatus is NO, the failure needs to be shown instead |
| 104 // of launching a new update check. recentShownInstallFailedStatus is |
| 105 // maintained by -updateStatus:. |
| 106 static BOOL recentShownInstallFailedStatus = NO; |
| 107 |
99 - (void)awakeFromNib { | 108 - (void)awakeFromNib { |
100 NSBundle* bundle = mac_util::MainAppBundle(); | 109 NSBundle* bundle = mac_util::MainAppBundle(); |
101 NSString* chromeVersion = | 110 NSString* chromeVersion = |
102 [bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; | 111 [bundle objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; |
103 | 112 |
104 #if defined(GOOGLE_CHROME_BUILD) | 113 #if defined(GOOGLE_CHROME_BUILD) |
105 NSString* version = chromeVersion; | 114 NSString* version = chromeVersion; |
106 #else // GOOGLE_CHROME_BUILD | 115 #else // GOOGLE_CHROME_BUILD |
107 // The format string is not localized, but this is how the displayed version | 116 // The format string is not localized, but this is how the displayed version |
108 // is built on Windows too. | 117 // is built on Windows too. |
(...skipping 26 matching lines...) Expand all Loading... |
135 [legalText_ sizeToFit]; | 144 [legalText_ sizeToFit]; |
136 NSRect newRect = oldLegalRect; | 145 NSRect newRect = oldLegalRect; |
137 newRect.size.height = [legalText_ frame].size.height; | 146 newRect.size.height = [legalText_ frame].size.height; |
138 [legalBlock_ setFrame:newRect]; | 147 [legalBlock_ setFrame:newRect]; |
139 CGFloat legalShift = newRect.size.height - oldLegalRect.size.height; | 148 CGFloat legalShift = newRect.size.height - oldLegalRect.size.height; |
140 | 149 |
141 KeystoneGlue* keystoneGlue = [KeystoneGlue defaultKeystoneGlue]; | 150 KeystoneGlue* keystoneGlue = [KeystoneGlue defaultKeystoneGlue]; |
142 CGFloat updateShift; | 151 CGFloat updateShift; |
143 if (keystoneGlue) { | 152 if (keystoneGlue) { |
144 if ([keystoneGlue asyncOperationPending] || | 153 if ([keystoneGlue asyncOperationPending] || |
145 [keystoneGlue recentStatus] == kAutoupdateInstallFailed) { | 154 ([keystoneGlue recentStatus] == kAutoupdateInstallFailed && |
| 155 !recentShownInstallFailedStatus)) { |
146 // If an asynchronous update operation is currently pending, such as a | 156 // If an asynchronous update operation is currently pending, such as a |
147 // check for updates or an update installation attempt, set the status | 157 // check for updates or an update installation attempt, set the status |
148 // up correspondingly without launching a new update check. | 158 // up correspondingly without launching a new update check. |
149 // | 159 // |
150 // If a previous update attempt was unsuccessful but no About box was | 160 // If a previous update attempt was unsuccessful but no About box was |
151 // around to report the error, show it now, and allow another chance to | 161 // around to report the error, show it now, and allow another chance to |
152 // install the update. | 162 // install the update. |
153 [self updateStatus:[keystoneGlue recentNotification]]; | 163 [self updateStatus:[keystoneGlue recentNotification]]; |
154 } else { | 164 } else { |
155 // Launch a new update check, even if one was already completed, because | 165 // Launch a new update check, even if one was already completed, because |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
228 | 238 |
229 // Immediately, kAutoupdateStatusNotification will be posted, and | 239 // Immediately, kAutoupdateStatusNotification will be posted, and |
230 // -updateStatus: will be called with status kAutoupdateInstalling. | 240 // -updateStatus: will be called with status kAutoupdateInstalling. |
231 // | 241 // |
232 // Upon completion, kAutoupdateStatusNotification will be posted, and | 242 // Upon completion, kAutoupdateStatusNotification will be posted, and |
233 // -updateStatus: will be called with a status indicating the result of the | 243 // -updateStatus: will be called with a status indicating the result of the |
234 // installation attempt. | 244 // installation attempt. |
235 } | 245 } |
236 | 246 |
237 - (void)updateStatus:(NSNotification*)notification { | 247 - (void)updateStatus:(NSNotification*)notification { |
| 248 recentShownInstallFailedStatus = NO; |
| 249 |
238 NSDictionary* dictionary = [notification userInfo]; | 250 NSDictionary* dictionary = [notification userInfo]; |
239 AutoupdateStatus status = static_cast<AutoupdateStatus>( | 251 AutoupdateStatus status = static_cast<AutoupdateStatus>( |
240 [[dictionary objectForKey:kAutoupdateStatusStatus] intValue]); | 252 [[dictionary objectForKey:kAutoupdateStatusStatus] intValue]); |
241 | 253 |
242 // Don't assume |version| is a real string. It may be nil. | 254 // Don't assume |version| is a real string. It may be nil. |
243 NSString* version = [dictionary objectForKey:kAutoupdateStatusVersion]; | 255 NSString* version = [dictionary objectForKey:kAutoupdateStatusVersion]; |
244 | 256 |
245 bool throbber = false; | 257 bool throbber = false; |
246 int imageID = 0; | 258 int imageID = 0; |
247 NSString* message; | 259 NSString* message; |
(...skipping 16 matching lines...) Expand all Loading... |
264 | 276 |
265 case kAutoupdateAvailable: | 277 case kAutoupdateAvailable: |
266 imageID = IDR_UPDATE_AVAILABLE; | 278 imageID = IDR_UPDATE_AVAILABLE; |
267 message = l10n_util::GetNSStringFWithFixup( | 279 message = l10n_util::GetNSStringFWithFixup( |
268 IDS_UPGRADE_AVAILABLE, l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)); | 280 IDS_UPGRADE_AVAILABLE, l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)); |
269 [updateNowButton_ setEnabled:YES]; | 281 [updateNowButton_ setEnabled:YES]; |
270 | 282 |
271 break; | 283 break; |
272 | 284 |
273 case kAutoupdateInstalling: | 285 case kAutoupdateInstalling: |
274 // Don't let someone click "Update Now" twice. | 286 // Don't let anyone click "Update Now" twice. |
275 [updateNowButton_ setEnabled:NO]; | 287 [updateNowButton_ setEnabled:NO]; |
276 | 288 |
277 throbber = true; | 289 throbber = true; |
278 message = l10n_util::GetNSStringWithFixup(IDS_UPGRADE_STARTED); | 290 message = l10n_util::GetNSStringWithFixup(IDS_UPGRADE_STARTED); |
279 | 291 |
280 break; | 292 break; |
281 | 293 |
282 case kAutoupdateInstalled: | 294 case kAutoupdateInstalled: |
283 { | 295 { |
284 imageID = IDR_UPDATE_UPTODATE; | 296 imageID = IDR_UPDATE_UPTODATE; |
(...skipping 11 matching lines...) Expand all Loading... |
296 // TODO(mark): Turn the button in the dialog into a restart button | 308 // TODO(mark): Turn the button in the dialog into a restart button |
297 // instead of springing this sheet or dialog. | 309 // instead of springing this sheet or dialog. |
298 NSWindow* window = [self window]; | 310 NSWindow* window = [self window]; |
299 NSWindow* restartDialogParent = [window isVisible] ? window : nil; | 311 NSWindow* restartDialogParent = [window isVisible] ? window : nil; |
300 restart_browser::RequestRestart(restartDialogParent); | 312 restart_browser::RequestRestart(restartDialogParent); |
301 } | 313 } |
302 | 314 |
303 break; | 315 break; |
304 | 316 |
305 case kAutoupdateInstallFailed: | 317 case kAutoupdateInstallFailed: |
306 // Since the installation failure will now be displayed in an About box, | 318 recentShownInstallFailedStatus = YES; |
307 // the saved state can be cleared. If the About box is closed and then | |
308 // reopened, this will let it start out with a clean slate and not be | |
309 // affected by past failures. | |
310 [[KeystoneGlue defaultKeystoneGlue] clearRecentNotification]; | |
311 | 319 |
312 // Allow another chance. | 320 // Allow another chance. |
313 [updateNowButton_ setEnabled:YES]; | 321 [updateNowButton_ setEnabled:YES]; |
314 | 322 |
315 // Fall through. | 323 // Fall through. |
316 | 324 |
317 case kAutoupdateCheckFailed: | 325 case kAutoupdateCheckFailed: |
318 // TODO(mark): Keystone doesn't currently indicate when a check for | 326 // TODO(mark): Keystone doesn't currently indicate when a check for |
319 // updates failed. Fix that. | 327 // updates failed. Fix that. |
320 imageID = IDR_UPDATE_FAIL; | 328 imageID = IDR_UPDATE_FAIL; |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
474 NSRange string_range = NSMakeRange(0, [legal_block length]); | 482 NSRange string_range = NSMakeRange(0, [legal_block length]); |
475 [legal_block addAttribute:NSFontAttributeName | 483 [legal_block addAttribute:NSFontAttributeName |
476 value:[NSFont labelFontOfSize:11] | 484 value:[NSFont labelFontOfSize:11] |
477 range:string_range]; | 485 range:string_range]; |
478 | 486 |
479 [legal_block endEditing]; | 487 [legal_block endEditing]; |
480 return legal_block; | 488 return legal_block; |
481 } | 489 } |
482 | 490 |
483 @end // @implementation AboutWindowController | 491 @end // @implementation AboutWindowController |
OLD | NEW |