OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 #import "ios/chrome/browser/ui/authentication/authentication_flow_performer.h" | 5 #import "ios/chrome/browser/ui/authentication/authentication_flow_performer.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "base/ios/block_types.h" | 9 #include "base/ios/block_types.h" |
10 #include "base/ios/weak_nsobject.h" | |
11 #include "base/logging.h" | 10 #include "base/logging.h" |
12 #include "base/mac/bind_objc_block.h" | 11 #include "base/mac/bind_objc_block.h" |
13 #include "base/mac/scoped_nsobject.h" | |
14 #include "base/metrics/user_metrics.h" | 12 #include "base/metrics/user_metrics.h" |
15 #include "base/strings/sys_string_conversions.h" | 13 #include "base/strings/sys_string_conversions.h" |
16 #include "base/time/time.h" | 14 #include "base/time/time.h" |
17 #include "base/timer/timer.h" | 15 #include "base/timer/timer.h" |
18 #include "components/prefs/pref_service.h" | 16 #include "components/prefs/pref_service.h" |
19 #include "components/signin/core/browser/account_tracker_service.h" | 17 #include "components/signin/core/browser/account_tracker_service.h" |
20 #include "components/signin/core/browser/signin_manager.h" | 18 #include "components/signin/core/browser/signin_manager.h" |
21 #include "components/signin/core/common/signin_pref_names.h" | 19 #include "components/signin/core/common/signin_pref_names.h" |
22 #include "components/strings/grit/components_strings.h" | 20 #include "components/strings/grit/components_strings.h" |
23 #include "google_apis/gaia/gaia_auth_util.h" | 21 #include "google_apis/gaia/gaia_auth_util.h" |
(...skipping 10 matching lines...) Expand all Loading... |
34 #include "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h" | 32 #include "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h" |
35 #import "ios/chrome/browser/ui/authentication/authentication_ui_util.h" | 33 #import "ios/chrome/browser/ui/authentication/authentication_ui_util.h" |
36 #import "ios/chrome/browser/ui/settings/import_data_collection_view_controller.h
" | 34 #import "ios/chrome/browser/ui/settings/import_data_collection_view_controller.h
" |
37 #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h" | 35 #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h" |
38 #include "ios/chrome/grit/ios_chromium_strings.h" | 36 #include "ios/chrome/grit/ios_chromium_strings.h" |
39 #include "ios/chrome/grit/ios_strings.h" | 37 #include "ios/chrome/grit/ios_strings.h" |
40 #include "ios/public/provider/chrome/browser/chrome_browser_provider.h" | 38 #include "ios/public/provider/chrome/browser/chrome_browser_provider.h" |
41 #import "ios/public/provider/chrome/browser/signin/chrome_identity.h" | 39 #import "ios/public/provider/chrome/browser/signin/chrome_identity.h" |
42 #include "ui/base/l10n/l10n_util.h" | 40 #include "ui/base/l10n/l10n_util.h" |
43 | 41 |
| 42 #if !defined(__has_feature) || !__has_feature(objc_arc) |
| 43 #error "This file requires ARC support." |
| 44 #endif |
| 45 |
44 using signin_ui::CompletionCallback; | 46 using signin_ui::CompletionCallback; |
45 | 47 |
46 namespace { | 48 namespace { |
47 | 49 |
48 const int64_t kAuthenticationFlowTimeoutSeconds = 10; | 50 const int64_t kAuthenticationFlowTimeoutSeconds = 10; |
49 | 51 |
50 } // namespace | 52 } // namespace |
51 | 53 |
52 @interface AuthenticationFlowPerformer ()<ImportDataControllerDelegate, | 54 @interface AuthenticationFlowPerformer ()<ImportDataControllerDelegate, |
53 SettingsNavigationControllerDelegate> | 55 SettingsNavigationControllerDelegate> |
54 | 56 |
55 // Starts the watchdog timer with a timeout of | 57 // Starts the watchdog timer with a timeout of |
56 // |kAuthenticationFlowTimeoutSeconds| for the fetching managed status | 58 // |kAuthenticationFlowTimeoutSeconds| for the fetching managed status |
57 // operation. It will notify |_delegate| of the failure unless | 59 // operation. It will notify |_delegate| of the failure unless |
58 // |stopWatchdogTimer| is called before it times out. | 60 // |stopWatchdogTimer| is called before it times out. |
59 - (void)startWatchdogTimerForManagedStatus; | 61 - (void)startWatchdogTimerForManagedStatus; |
60 | 62 |
61 // Stops the watchdog timer, and doesn't call the |timeoutDelegateSelector|. | 63 // Stops the watchdog timer, and doesn't call the |timeoutDelegateSelector|. |
62 // Returns whether the watchdog was actually running. | 64 // Returns whether the watchdog was actually running. |
63 - (BOOL)stopWatchdogTimer; | 65 - (BOOL)stopWatchdogTimer; |
64 | 66 |
65 // Callback for when the alert is dismissed. | 67 // Callback for when the alert is dismissed. |
66 - (void)alertControllerDidDisappear:(AlertCoordinator*)alertCoordinator; | 68 - (void)alertControllerDidDisappear:(AlertCoordinator*)alertCoordinator; |
67 | 69 |
68 @end | 70 @end |
69 | 71 |
70 @implementation AuthenticationFlowPerformer { | 72 @implementation AuthenticationFlowPerformer { |
71 base::WeakNSProtocol<id<AuthenticationFlowPerformerDelegate>> _delegate; | 73 __weak id<AuthenticationFlowPerformerDelegate> _delegate; |
72 base::scoped_nsobject<AlertCoordinator> _alertCoordinator; | 74 AlertCoordinator* _alertCoordinator; |
73 base::scoped_nsobject<SettingsNavigationController> _navigationController; | 75 SettingsNavigationController* _navigationController; |
74 std::unique_ptr<base::Timer> _watchdogTimer; | 76 std::unique_ptr<base::Timer> _watchdogTimer; |
75 } | 77 } |
76 | 78 |
77 - (id<AuthenticationFlowPerformerDelegate>)delegate { | 79 - (id<AuthenticationFlowPerformerDelegate>)delegate { |
78 return _delegate.get(); | 80 return _delegate; |
79 } | 81 } |
80 | 82 |
81 - (instancetype)initWithDelegate: | 83 - (instancetype)initWithDelegate: |
82 (id<AuthenticationFlowPerformerDelegate>)delegate { | 84 (id<AuthenticationFlowPerformerDelegate>)delegate { |
83 self = [super init]; | 85 self = [super init]; |
84 if (self) | 86 if (self) |
85 _delegate.reset(delegate); | 87 _delegate = delegate; |
86 return self; | 88 return self; |
87 } | 89 } |
88 | 90 |
89 - (void)cancelAndDismiss { | 91 - (void)cancelAndDismiss { |
90 [_alertCoordinator executeCancelHandler]; | 92 [_alertCoordinator executeCancelHandler]; |
91 [_alertCoordinator stop]; | 93 [_alertCoordinator stop]; |
92 if (_navigationController) { | 94 if (_navigationController) { |
93 [_navigationController settingsWillBeDismissed]; | 95 [_navigationController settingsWillBeDismissed]; |
94 _navigationController.reset(); | 96 _navigationController = nil; |
95 [[_delegate presentingViewController] dismissViewControllerAnimated:NO | 97 [[_delegate presentingViewController] dismissViewControllerAnimated:NO |
96 completion:nil]; | 98 completion:nil]; |
97 } | 99 } |
98 [self stopWatchdogTimer]; | 100 [self stopWatchdogTimer]; |
99 } | 101 } |
100 | 102 |
101 - (void)commitSyncForBrowserState:(ios::ChromeBrowserState*)browserState { | 103 - (void)commitSyncForBrowserState:(ios::ChromeBrowserState*)browserState { |
102 SyncSetupServiceFactory::GetForBrowserState(browserState)->CommitChanges(); | 104 SyncSetupServiceFactory::GetForBrowserState(browserState)->CommitChanges(); |
103 } | 105 } |
104 | 106 |
105 - (void)startWatchdogTimerForManagedStatus { | 107 - (void)startWatchdogTimerForManagedStatus { |
106 base::WeakNSObject<AuthenticationFlowPerformer> weakSelf(self); | 108 __weak AuthenticationFlowPerformer* weakSelf = self; |
107 ProceduralBlock onTimeout = ^{ | 109 ProceduralBlock onTimeout = ^{ |
108 base::scoped_nsobject<AuthenticationFlowPerformer> strongSelf( | 110 AuthenticationFlowPerformer* strongSelf = weakSelf; |
109 [weakSelf retain]); | |
110 if (!strongSelf) | 111 if (!strongSelf) |
111 return; | 112 return; |
112 [strongSelf stopWatchdogTimer]; | 113 [strongSelf stopWatchdogTimer]; |
113 NSError* error = [NSError errorWithDomain:kAuthenticationErrorDomain | 114 NSError* error = [NSError errorWithDomain:kAuthenticationErrorDomain |
114 code:TIMED_OUT_FETCH_POLICY | 115 code:TIMED_OUT_FETCH_POLICY |
115 userInfo:nil]; | 116 userInfo:nil]; |
116 [strongSelf.get()->_delegate didFailFetchManagedStatus:error]; | 117 [strongSelf->_delegate didFailFetchManagedStatus:error]; |
117 }; | 118 }; |
118 _watchdogTimer.reset(new base::Timer(false, false)); | 119 _watchdogTimer.reset(new base::Timer(false, false)); |
119 _watchdogTimer->Start(FROM_HERE, base::TimeDelta::FromSeconds( | 120 _watchdogTimer->Start( |
120 kAuthenticationFlowTimeoutSeconds), | 121 FROM_HERE, |
121 base::BindBlock(onTimeout)); | 122 base::TimeDelta::FromSeconds(kAuthenticationFlowTimeoutSeconds), |
| 123 base::BindBlockArc(onTimeout)); |
122 } | 124 } |
123 | 125 |
124 - (BOOL)stopWatchdogTimer { | 126 - (BOOL)stopWatchdogTimer { |
125 if (_watchdogTimer) { | 127 if (_watchdogTimer) { |
126 _watchdogTimer->Stop(); | 128 _watchdogTimer->Stop(); |
127 _watchdogTimer.reset(); | 129 _watchdogTimer.reset(); |
128 return YES; | 130 return YES; |
129 } | 131 } |
130 return NO; | 132 return NO; |
131 } | 133 } |
132 | 134 |
133 - (void)fetchManagedStatus:(ios::ChromeBrowserState*)browserState | 135 - (void)fetchManagedStatus:(ios::ChromeBrowserState*)browserState |
134 forIdentity:(ChromeIdentity*)identity { | 136 forIdentity:(ChromeIdentity*)identity { |
135 if (!experimental_flags::IsMDMIntegrationEnabled()) { | 137 if (!experimental_flags::IsMDMIntegrationEnabled()) { |
136 [_delegate didFetchManagedStatus:nil]; | 138 [_delegate didFetchManagedStatus:nil]; |
137 return; | 139 return; |
138 } | 140 } |
139 if (gaia::ExtractDomainName(gaia::CanonicalizeEmail( | 141 if (gaia::ExtractDomainName(gaia::CanonicalizeEmail( |
140 base::SysNSStringToUTF8(identity.userEmail))) == "gmail.com") { | 142 base::SysNSStringToUTF8(identity.userEmail))) == "gmail.com") { |
141 // Do nothing for @gmail.com addresses as they can't have a hosted domain. | 143 // Do nothing for @gmail.com addresses as they can't have a hosted domain. |
142 // This avoids waiting for this step to complete (and a network call). | 144 // This avoids waiting for this step to complete (and a network call). |
143 [_delegate didFetchManagedStatus:nil]; | 145 [_delegate didFetchManagedStatus:nil]; |
144 return; | 146 return; |
145 } | 147 } |
146 | 148 |
147 [self startWatchdogTimerForManagedStatus]; | 149 [self startWatchdogTimerForManagedStatus]; |
148 base::WeakNSObject<AuthenticationFlowPerformer> weakSelf(self); | 150 __weak AuthenticationFlowPerformer* weakSelf = self; |
149 ios::GetChromeBrowserProvider() | 151 ios::GetChromeBrowserProvider() |
150 ->GetChromeIdentityService() | 152 ->GetChromeIdentityService() |
151 ->GetHostedDomainForIdentity( | 153 ->GetHostedDomainForIdentity( |
152 identity, ^(NSString* hosted_domain, NSError* error) { | 154 identity, ^(NSString* hosted_domain, NSError* error) { |
153 [weakSelf handleGetHostedDomain:hosted_domain | 155 [weakSelf handleGetHostedDomain:hosted_domain |
154 error:error | 156 error:error |
155 browserState:browserState]; | 157 browserState:browserState]; |
156 }); | 158 }); |
157 } | 159 } |
158 | 160 |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 DCHECK(!_alertCoordinator); | 199 DCHECK(!_alertCoordinator); |
198 NSString* title = l10n_util::GetNSString(IDS_IOS_MANAGED_SWITCH_TITLE); | 200 NSString* title = l10n_util::GetNSString(IDS_IOS_MANAGED_SWITCH_TITLE); |
199 NSString* subtitle = l10n_util::GetNSStringF( | 201 NSString* subtitle = l10n_util::GetNSStringF( |
200 IDS_IOS_MANAGED_SWITCH_SUBTITLE, base::SysNSStringToUTF16(managedEmail), | 202 IDS_IOS_MANAGED_SWITCH_SUBTITLE, base::SysNSStringToUTF16(managedEmail), |
201 base::SysNSStringToUTF16(toEmail), | 203 base::SysNSStringToUTF16(toEmail), |
202 base::SysNSStringToUTF16(hostedDomain)); | 204 base::SysNSStringToUTF16(hostedDomain)); |
203 NSString* acceptLabel = | 205 NSString* acceptLabel = |
204 l10n_util::GetNSString(IDS_IOS_MANAGED_SWITCH_ACCEPT_BUTTON); | 206 l10n_util::GetNSString(IDS_IOS_MANAGED_SWITCH_ACCEPT_BUTTON); |
205 NSString* cancelLabel = l10n_util::GetNSString(IDS_CANCEL); | 207 NSString* cancelLabel = l10n_util::GetNSString(IDS_CANCEL); |
206 | 208 |
207 _alertCoordinator.reset([[AlertCoordinator alloc] | 209 _alertCoordinator = |
208 initWithBaseViewController:viewController | 210 [[AlertCoordinator alloc] initWithBaseViewController:viewController |
209 title:title | 211 title:title |
210 message:subtitle]); | 212 message:subtitle]; |
211 | 213 |
212 base::WeakNSObject<AuthenticationFlowPerformer> weakSelf(self); | 214 __weak AuthenticationFlowPerformer* weakSelf = self; |
213 base::WeakNSObject<AlertCoordinator> weakAlert(_alertCoordinator); | 215 __weak AlertCoordinator* weakAlert = _alertCoordinator; |
214 ProceduralBlock acceptBlock = ^{ | 216 ProceduralBlock acceptBlock = ^{ |
215 base::scoped_nsobject<AuthenticationFlowPerformer> strongSelf( | 217 AuthenticationFlowPerformer* strongSelf = weakSelf; |
216 [weakSelf retain]); | |
217 if (!strongSelf) | 218 if (!strongSelf) |
218 return; | 219 return; |
219 [[strongSelf delegate] | 220 [[strongSelf delegate] |
220 didChooseClearDataPolicy:SHOULD_CLEAR_DATA_CLEAR_DATA]; | 221 didChooseClearDataPolicy:SHOULD_CLEAR_DATA_CLEAR_DATA]; |
221 [strongSelf alertControllerDidDisappear:weakAlert]; | 222 [strongSelf alertControllerDidDisappear:weakAlert]; |
222 }; | 223 }; |
223 ProceduralBlock cancelBlock = ^{ | 224 ProceduralBlock cancelBlock = ^{ |
224 base::scoped_nsobject<AuthenticationFlowPerformer> strongSelf( | 225 AuthenticationFlowPerformer* strongSelf = weakSelf; |
225 [weakSelf retain]); | |
226 if (!strongSelf) | 226 if (!strongSelf) |
227 return; | 227 return; |
228 [[strongSelf delegate] didChooseCancel]; | 228 [[strongSelf delegate] didChooseCancel]; |
229 [strongSelf alertControllerDidDisappear:weakAlert]; | 229 [strongSelf alertControllerDidDisappear:weakAlert]; |
230 }; | 230 }; |
231 | 231 |
232 [_alertCoordinator addItemWithTitle:cancelLabel | 232 [_alertCoordinator addItemWithTitle:cancelLabel |
233 action:cancelBlock | 233 action:cancelBlock |
234 style:UIAlertActionStyleCancel]; | 234 style:UIAlertActionStyleCancel]; |
235 [_alertCoordinator addItemWithTitle:acceptLabel | 235 [_alertCoordinator addItemWithTitle:acceptLabel |
(...skipping 22 matching lines...) Expand all Loading... |
258 NSString* hostedDomain = base::SysUTF8ToNSString( | 258 NSString* hostedDomain = base::SysUTF8ToNSString( |
259 ios::SigninManagerFactory::GetForBrowserState(browserState) | 259 ios::SigninManagerFactory::GetForBrowserState(browserState) |
260 ->GetAuthenticatedAccountInfo() | 260 ->GetAuthenticatedAccountInfo() |
261 .hosted_domain); | 261 .hosted_domain); |
262 [self promptSwitchFromManagedEmail:lastSignedInEmail | 262 [self promptSwitchFromManagedEmail:lastSignedInEmail |
263 withHostedDomain:hostedDomain | 263 withHostedDomain:hostedDomain |
264 toEmail:[identity userEmail] | 264 toEmail:[identity userEmail] |
265 viewController:viewController]; | 265 viewController:viewController]; |
266 return; | 266 return; |
267 } | 267 } |
268 _navigationController.reset([SettingsNavigationController | 268 _navigationController = |
269 newImportDataController:browserState | 269 [SettingsNavigationController newImportDataController:browserState |
270 delegate:self | 270 delegate:self |
271 importDataDelegate:self | 271 importDataDelegate:self |
272 fromEmail:lastSignedInEmail | 272 fromEmail:lastSignedInEmail |
273 toEmail:[identity userEmail] | 273 toEmail:[identity userEmail] |
274 isSignedIn:isSignedIn]); | 274 isSignedIn:isSignedIn]; |
275 [_navigationController setShouldCommitSyncChangesOnDismissal:NO]; | 275 [_navigationController setShouldCommitSyncChangesOnDismissal:NO]; |
276 [[_delegate presentingViewController] | 276 [[_delegate presentingViewController] |
277 presentViewController:_navigationController | 277 presentViewController:_navigationController |
278 animated:YES | 278 animated:YES |
279 completion:nil]; | 279 completion:nil]; |
280 } | 280 } |
281 | 281 |
282 - (void)clearData:(ios::ChromeBrowserState*)browserState { | 282 - (void)clearData:(ios::ChromeBrowserState*)browserState { |
283 DCHECK(!AuthenticationServiceFactory::GetForBrowserState(browserState) | 283 DCHECK(!AuthenticationServiceFactory::GetForBrowserState(browserState) |
284 ->GetAuthenticatedUserEmail()); | 284 ->GetAuthenticatedUserEmail()); |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
317 viewController: | 317 viewController: |
318 (UIViewController*)viewController { | 318 (UIViewController*)viewController { |
319 DCHECK(!_alertCoordinator); | 319 DCHECK(!_alertCoordinator); |
320 NSString* title = l10n_util::GetNSString(IDS_IOS_MANAGED_SIGNIN_TITLE); | 320 NSString* title = l10n_util::GetNSString(IDS_IOS_MANAGED_SIGNIN_TITLE); |
321 NSString* subtitle = l10n_util::GetNSStringF( | 321 NSString* subtitle = l10n_util::GetNSStringF( |
322 IDS_IOS_MANAGED_SIGNIN_SUBTITLE, base::SysNSStringToUTF16(hostedDomain)); | 322 IDS_IOS_MANAGED_SIGNIN_SUBTITLE, base::SysNSStringToUTF16(hostedDomain)); |
323 NSString* acceptLabel = | 323 NSString* acceptLabel = |
324 l10n_util::GetNSString(IDS_IOS_MANAGED_SIGNIN_ACCEPT_BUTTON); | 324 l10n_util::GetNSString(IDS_IOS_MANAGED_SIGNIN_ACCEPT_BUTTON); |
325 NSString* cancelLabel = l10n_util::GetNSString(IDS_CANCEL); | 325 NSString* cancelLabel = l10n_util::GetNSString(IDS_CANCEL); |
326 | 326 |
327 _alertCoordinator.reset([[AlertCoordinator alloc] | 327 _alertCoordinator = |
328 initWithBaseViewController:viewController | 328 [[AlertCoordinator alloc] initWithBaseViewController:viewController |
329 title:title | 329 title:title |
330 message:subtitle]); | 330 message:subtitle]; |
331 | 331 |
332 base::WeakNSObject<AuthenticationFlowPerformer> weakSelf(self); | 332 __weak AuthenticationFlowPerformer* weakSelf = self; |
333 base::WeakNSObject<AlertCoordinator> weakAlert(_alertCoordinator); | 333 __weak AlertCoordinator* weakAlert = _alertCoordinator; |
334 ProceduralBlock acceptBlock = ^{ | 334 ProceduralBlock acceptBlock = ^{ |
335 base::scoped_nsobject<AuthenticationFlowPerformer> strongSelf( | 335 AuthenticationFlowPerformer* strongSelf = weakSelf; |
336 [weakSelf retain]); | |
337 if (!strongSelf) | 336 if (!strongSelf) |
338 return; | 337 return; |
339 [[strongSelf delegate] didAcceptManagedConfirmation]; | 338 [[strongSelf delegate] didAcceptManagedConfirmation]; |
340 [strongSelf alertControllerDidDisappear:weakAlert]; | 339 [strongSelf alertControllerDidDisappear:weakAlert]; |
341 }; | 340 }; |
342 ProceduralBlock cancelBlock = ^{ | 341 ProceduralBlock cancelBlock = ^{ |
343 base::scoped_nsobject<AuthenticationFlowPerformer> strongSelf( | 342 AuthenticationFlowPerformer* strongSelf = weakSelf; |
344 [weakSelf retain]); | |
345 if (!strongSelf) | 343 if (!strongSelf) |
346 return; | 344 return; |
347 [[strongSelf delegate] didCancelManagedConfirmation]; | 345 [[strongSelf delegate] didCancelManagedConfirmation]; |
348 [strongSelf alertControllerDidDisappear:weakAlert]; | 346 [strongSelf alertControllerDidDisappear:weakAlert]; |
349 }; | 347 }; |
350 | 348 |
351 [_alertCoordinator addItemWithTitle:cancelLabel | 349 [_alertCoordinator addItemWithTitle:cancelLabel |
352 action:cancelBlock | 350 action:cancelBlock |
353 style:UIAlertActionStyleCancel]; | 351 style:UIAlertActionStyleCancel]; |
354 [_alertCoordinator addItemWithTitle:acceptLabel | 352 [_alertCoordinator addItemWithTitle:acceptLabel |
355 action:acceptBlock | 353 action:acceptBlock |
356 style:UIAlertActionStyleDefault]; | 354 style:UIAlertActionStyleDefault]; |
357 [_alertCoordinator setCancelAction:cancelBlock]; | 355 [_alertCoordinator setCancelAction:cancelBlock]; |
358 [_alertCoordinator start]; | 356 [_alertCoordinator start]; |
359 } | 357 } |
360 | 358 |
361 - (void)showAuthenticationError:(NSError*)error | 359 - (void)showAuthenticationError:(NSError*)error |
362 withCompletion:(ProceduralBlock)callback | 360 withCompletion:(ProceduralBlock)callback |
363 viewController:(UIViewController*)viewController { | 361 viewController:(UIViewController*)viewController { |
364 DCHECK(!_alertCoordinator); | 362 DCHECK(!_alertCoordinator); |
365 | 363 |
366 _alertCoordinator.reset( | 364 _alertCoordinator = |
367 [ios_internal::ErrorCoordinatorNoItem(error, viewController) retain]); | 365 ios_internal::ErrorCoordinatorNoItem(error, viewController); |
368 | 366 |
369 base::WeakNSObject<AuthenticationFlowPerformer> weakSelf(self); | 367 __weak AuthenticationFlowPerformer* weakSelf = self; |
370 base::WeakNSObject<AlertCoordinator> weakAlert(_alertCoordinator); | 368 __weak AlertCoordinator* weakAlert = _alertCoordinator; |
371 ProceduralBlock dismissAction = ^{ | 369 ProceduralBlock dismissAction = ^{ |
372 if (callback) | 370 if (callback) |
373 callback(); | 371 callback(); |
374 [weakSelf alertControllerDidDisappear:weakAlert]; | 372 [weakSelf alertControllerDidDisappear:weakAlert]; |
375 }; | 373 }; |
376 | 374 |
377 NSString* okButtonLabel = l10n_util::GetNSString(IDS_OK); | 375 NSString* okButtonLabel = l10n_util::GetNSString(IDS_OK); |
378 [_alertCoordinator addItemWithTitle:okButtonLabel | 376 [_alertCoordinator addItemWithTitle:okButtonLabel |
379 action:dismissAction | 377 action:dismissAction |
380 style:UIAlertActionStyleDefault]; | 378 style:UIAlertActionStyleDefault]; |
381 | 379 |
382 [_alertCoordinator setCancelAction:dismissAction]; | 380 [_alertCoordinator setCancelAction:dismissAction]; |
383 | 381 |
384 [_alertCoordinator start]; | 382 [_alertCoordinator start]; |
385 } | 383 } |
386 | 384 |
387 - (void)alertControllerDidDisappear:(AlertCoordinator*)alertCoordinator { | 385 - (void)alertControllerDidDisappear:(AlertCoordinator*)alertCoordinator { |
388 if (_alertCoordinator.get() != alertCoordinator) { | 386 if (_alertCoordinator != alertCoordinator) { |
389 // Do not reset the |_alertCoordinator| if it has changed. This typically | 387 // Do not reset the |_alertCoordinator| if it has changed. This typically |
390 // happens when the user taps on any of the actions on "Clear Data Before | 388 // happens when the user taps on any of the actions on "Clear Data Before |
391 // Syncing?" dialog, as the sign-in confirmation dialog is created before | 389 // Syncing?" dialog, as the sign-in confirmation dialog is created before |
392 // the "Clear Data Before Syncing?" dialog is dismissed. | 390 // the "Clear Data Before Syncing?" dialog is dismissed. |
393 return; | 391 return; |
394 } | 392 } |
395 _alertCoordinator.reset(); | 393 _alertCoordinator = nil; |
396 } | 394 } |
397 | 395 |
398 #pragma mark - ImportDataControllerDelegate | 396 #pragma mark - ImportDataControllerDelegate |
399 | 397 |
400 - (void)didChooseClearDataPolicy:(ImportDataCollectionViewController*)controller | 398 - (void)didChooseClearDataPolicy:(ImportDataCollectionViewController*)controller |
401 shouldClearData:(ShouldClearData)shouldClearData { | 399 shouldClearData:(ShouldClearData)shouldClearData { |
402 DCHECK_NE(SHOULD_CLEAR_DATA_USER_CHOICE, shouldClearData); | 400 DCHECK_NE(SHOULD_CLEAR_DATA_USER_CHOICE, shouldClearData); |
403 if (shouldClearData == SHOULD_CLEAR_DATA_CLEAR_DATA) { | 401 if (shouldClearData == SHOULD_CLEAR_DATA_CLEAR_DATA) { |
404 base::RecordAction( | 402 base::RecordAction( |
405 base::UserMetricsAction("Signin_ImportDataPrompt_DontImport")); | 403 base::UserMetricsAction("Signin_ImportDataPrompt_DontImport")); |
406 } else { | 404 } else { |
407 base::RecordAction( | 405 base::RecordAction( |
408 base::UserMetricsAction("Signin_ImportDataPrompt_ImportData")); | 406 base::UserMetricsAction("Signin_ImportDataPrompt_ImportData")); |
409 } | 407 } |
410 | 408 |
411 base::WeakNSObject<AuthenticationFlowPerformer> weakSelf(self); | 409 __weak AuthenticationFlowPerformer* weakSelf = self; |
412 ProceduralBlock block = ^{ | 410 ProceduralBlock block = ^{ |
413 base::scoped_nsobject<AuthenticationFlowPerformer> strongSelf( | 411 AuthenticationFlowPerformer* strongSelf = weakSelf; |
414 [weakSelf retain]); | |
415 if (!strongSelf) | 412 if (!strongSelf) |
416 return; | 413 return; |
417 strongSelf.get()->_navigationController.reset(); | 414 strongSelf->_navigationController = nil; |
418 [[strongSelf delegate] didChooseClearDataPolicy:shouldClearData]; | 415 [[strongSelf delegate] didChooseClearDataPolicy:shouldClearData]; |
419 }; | 416 }; |
420 [_navigationController settingsWillBeDismissed]; | 417 [_navigationController settingsWillBeDismissed]; |
421 [[_delegate presentingViewController] dismissViewControllerAnimated:YES | 418 [[_delegate presentingViewController] dismissViewControllerAnimated:YES |
422 completion:block]; | 419 completion:block]; |
423 } | 420 } |
424 | 421 |
425 #pragma mark - SettingsNavigationControllerDelegate | 422 #pragma mark - SettingsNavigationControllerDelegate |
426 | 423 |
427 - (void)closeSettings { | 424 - (void)closeSettings { |
428 base::RecordAction(base::UserMetricsAction("Signin_ImportDataPrompt_Cancel")); | 425 base::RecordAction(base::UserMetricsAction("Signin_ImportDataPrompt_Cancel")); |
429 | 426 |
430 base::WeakNSObject<AuthenticationFlowPerformer> weakSelf(self); | 427 __weak AuthenticationFlowPerformer* weakSelf = self; |
431 ProceduralBlock block = ^{ | 428 ProceduralBlock block = ^{ |
432 base::scoped_nsobject<AuthenticationFlowPerformer> strongSelf( | 429 AuthenticationFlowPerformer* strongSelf = weakSelf; |
433 [weakSelf retain]); | |
434 if (!strongSelf) | 430 if (!strongSelf) |
435 return; | 431 return; |
436 strongSelf.get()->_navigationController.reset(); | 432 strongSelf->_navigationController = nil; |
437 [[strongSelf delegate] didChooseCancel]; | 433 [[strongSelf delegate] didChooseCancel]; |
438 }; | 434 }; |
439 [_navigationController settingsWillBeDismissed]; | 435 [_navigationController settingsWillBeDismissed]; |
440 [[_delegate presentingViewController] dismissViewControllerAnimated:YES | 436 [[_delegate presentingViewController] dismissViewControllerAnimated:YES |
441 completion:block]; | 437 completion:block]; |
442 } | 438 } |
443 | 439 |
444 - (void)closeSettingsAndOpenNewIncognitoTab { | 440 - (void)closeSettingsAndOpenNewIncognitoTab { |
445 NOTREACHED(); | 441 NOTREACHED(); |
446 } | 442 } |
447 | 443 |
448 - (void)closeSettingsAndOpenUrl:(OpenUrlCommand*)command { | 444 - (void)closeSettingsAndOpenUrl:(OpenUrlCommand*)command { |
449 NOTREACHED(); | 445 NOTREACHED(); |
450 } | 446 } |
451 | 447 |
452 @end | 448 @end |
OLD | NEW |