Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(101)

Side by Side Diff: ios/chrome/browser/ui/dialogs/dialog_presenter.mm

Issue 2822933004: [ObjC ARC] Converts ios/chrome/browser/ui/dialogs:dialogs_internal to ARC. (Closed)
Patch Set: Remove presentedDialogWebState ivar Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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/dialogs/dialog_presenter.h" 5 #import "ios/chrome/browser/ui/dialogs/dialog_presenter.h"
6 6
7 #include <deque> 7 #include <deque>
8 #include <map> 8 #include <map>
9 9
10 #import "base/ios/block_types.h" 10 #import "base/ios/block_types.h"
11 #import "base/ios/weak_nsobject.h"
12 #include "base/logging.h" 11 #include "base/logging.h"
13 #import "base/mac/scoped_nsobject.h" 12 #import "base/mac/scoped_nsobject.h"
14 #include "base/strings/sys_string_conversions.h" 13 #include "base/strings/sys_string_conversions.h"
15 #include "components/strings/grit/components_strings.h" 14 #include "components/strings/grit/components_strings.h"
16 #import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h" 15 #import "ios/chrome/browser/ui/alert_coordinator/action_sheet_coordinator.h"
17 #import "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h" 16 #import "ios/chrome/browser/ui/alert_coordinator/alert_coordinator.h"
18 #import "ios/chrome/browser/ui/alert_coordinator/input_alert_coordinator.h" 17 #import "ios/chrome/browser/ui/alert_coordinator/input_alert_coordinator.h"
19 #import "ios/chrome/browser/ui/dialogs/javascript_dialog_blocking_util.h" 18 #import "ios/chrome/browser/ui/dialogs/javascript_dialog_blocking_util.h"
20 #import "ios/chrome/browser/ui/dialogs/nsurl_protection_space_util.h" 19 #import "ios/chrome/browser/ui/dialogs/nsurl_protection_space_util.h"
21 #include "ios/chrome/browser/ui/ui_util.h" 20 #include "ios/chrome/browser/ui/ui_util.h"
22 #include "ios/chrome/grit/ios_strings.h" 21 #include "ios/chrome/grit/ios_strings.h"
23 #include "ios/web/public/web_state/web_state.h" 22 #include "ios/web/public/web_state/web_state.h"
24 #include "ui/base/l10n/l10n_util.h" 23 #include "ui/base/l10n/l10n_util.h"
25 #include "url/gurl.h" 24 #include "url/gurl.h"
26 25
26 #if !defined(__has_feature) || !__has_feature(objc_arc)
27 #error "This file requires ARC support."
28 #endif
29
27 // Externed accessibility identifier. 30 // Externed accessibility identifier.
28 NSString* const kJavaScriptDialogTextFieldAccessibiltyIdentifier = 31 NSString* const kJavaScriptDialogTextFieldAccessibiltyIdentifier =
29 @"JavaScriptDialogTextFieldAccessibiltyIdentifier"; 32 @"JavaScriptDialogTextFieldAccessibiltyIdentifier";
30 33
31 namespace { 34 namespace {
32 // The hostname to use for JavaScript alerts when there is no valid hostname in 35 // The hostname to use for JavaScript alerts when there is no valid hostname in
33 // the URL passed to |+localizedTitleForJavaScriptAlertFromPage:type:|. 36 // the URL passed to |+localizedTitleForJavaScriptAlertFromPage:type:|.
34 const char kAboutNullHostname[] = "about:null"; 37 const char kAboutNullHostname[] = "about:null";
35 } // namespace 38 } // namespace
36 39
37 @interface DialogPresenter () { 40 @interface DialogPresenter () {
38 // Backing objects for properties of the same name.
39 base::WeakNSProtocol<id<DialogPresenterDelegate>> _delegate;
40 base::WeakNSObject<UIViewController> _viewController;
41 // Queue of WebStates which correspond to the keys in 41 // Queue of WebStates which correspond to the keys in
42 // |_dialogCoordinatorsForWebStates|. 42 // |_dialogCoordinatorsForWebStates|.
43 std::deque<web::WebState*> _queuedWebStates; 43 std::deque<web::WebState*> _queuedWebStates;
44 // A map associating queued webStates with their coordinators. 44 // A map associating queued webStates with their coordinators.
45 std::map<web::WebState*, base::scoped_nsobject<AlertCoordinator>> 45 std::map<web::WebState*, base::scoped_nsobject<AlertCoordinator>>
46 _dialogCoordinatorsForWebStates; 46 _dialogCoordinatorsForWebStates;
47 web::WebState* _presentedDialogWebState;
48 base::scoped_nsobject<AlertCoordinator> _presentedDialogCoordinator;
49 base::scoped_nsobject<ActionSheetCoordinator>
50 _blockingConfirmationCoordinator;
51 } 47 }
52 48
53 // The delegate passed on initialization. 49 // The delegate passed on initialization.
54 @property(nonatomic, readonly) id<DialogPresenterDelegate> delegate; 50 @property(weak, nonatomic, readonly) id<DialogPresenterDelegate> delegate;
55 51
56 // The presenting view controller passed on initialization. 52 // The presenting view controller passed on initialization.
57 @property(nonatomic, readonly) UIViewController* viewController; 53 @property(weak, nonatomic, readonly) UIViewController* viewController;
58 54
59 // Whether a modal dialog is currently being shown. 55 // Whether a modal dialog is currently being shown.
60 @property(nonatomic, readonly, getter=isShowingDialog) BOOL showingDialog; 56 @property(nonatomic, readonly, getter=isShowingDialog) BOOL showingDialog;
61 57
62 // The webState for |presentedDialog|. 58 // The webState for |presentedDialog|.
63 @property(nonatomic) web::WebState* presentedDialogWebState; 59 @property(nonatomic) web::WebState* presentedDialogWebState;
64 60
65 // The dialog that's currently being shown, if any. 61 // The dialog that's currently being shown, if any.
66 @property(nonatomic, retain) AlertCoordinator* presentedDialogCoordinator; 62 @property(nonatomic, strong) AlertCoordinator* presentedDialogCoordinator;
67 63
68 // The JavaScript dialog blocking confirmation action sheet being shown, if any. 64 // The JavaScript dialog blocking confirmation action sheet being shown, if any.
69 @property(nonatomic, retain) AlertCoordinator* blockingConfirmationCoordinator; 65 @property(nonatomic, strong) AlertCoordinator* blockingConfirmationCoordinator;
70 66
71 // Adds |context| and |coordinator| to the queue. If a dialog is not already 67 // Adds |context| and |coordinator| to the queue. If a dialog is not already
72 // being shown, |coordinator| will be presented. Otherwise, |coordinator| will 68 // being shown, |coordinator| will be presented. Otherwise, |coordinator| will
73 // be displayed once the previously shown dialog is dismissed. 69 // be displayed once the previously shown dialog is dismissed.
74 - (void)addDialogCoordinator:(AlertCoordinator*)coordinator 70 - (void)addDialogCoordinator:(AlertCoordinator*)coordinator
75 forWebState:(web::WebState*)webState; 71 forWebState:(web::WebState*)webState;
76 72
77 // Shows the dialog associated with the next context in |contextQueue|. 73 // Shows the dialog associated with the next context in |contextQueue|.
78 - (void)showNextDialog; 74 - (void)showNextDialog;
79 75
(...skipping 19 matching lines...) Expand all
99 webState:(web::WebState*)webState; 95 webState:(web::WebState*)webState;
100 96
101 // The block to use for the JavaScript dialog blocking option for |coordinator|. 97 // The block to use for the JavaScript dialog blocking option for |coordinator|.
102 - (ProceduralBlock)blockingActionForCoordinator:(AlertCoordinator*)coordinator; 98 - (ProceduralBlock)blockingActionForCoordinator:(AlertCoordinator*)coordinator;
103 99
104 @end 100 @end
105 101
106 @implementation DialogPresenter 102 @implementation DialogPresenter
107 103
108 @synthesize active = _active; 104 @synthesize active = _active;
105 @synthesize delegate = _delegate;
106 @synthesize viewController = _viewController;
107 @synthesize presentedDialogCoordinator = _presentedDialogCoordinator;
108 @synthesize blockingConfirmationCoordinator = _blockingConfirmationCoordinator;
109 @synthesize presentedDialogWebState = _presentedDialogWebState;
109 110
110 - (instancetype)initWithDelegate:(id<DialogPresenterDelegate>)delegate 111 - (instancetype)initWithDelegate:(id<DialogPresenterDelegate>)delegate
111 presentingViewController:(UIViewController*)viewController { 112 presentingViewController:(UIViewController*)viewController {
112 if ((self = [super init])) { 113 if ((self = [super init])) {
113 DCHECK(delegate); 114 DCHECK(delegate);
114 DCHECK(viewController); 115 DCHECK(viewController);
115 _delegate.reset(delegate); 116 _delegate = delegate;
116 _viewController.reset(viewController); 117 _viewController = viewController;
117 } 118 }
118 return self; 119 return self;
119 } 120 }
120 121
121 #pragma mark - Accessors 122 #pragma mark - Accessors
122 123
123 - (void)setActive:(BOOL)active { 124 - (void)setActive:(BOOL)active {
124 if (_active != active) { 125 if (_active != active) {
125 _active = active; 126 _active = active;
126 [self tryToPresent]; 127 [self tryToPresent];
127 } 128 }
128 } 129 }
129 130
130 - (id<DialogPresenterDelegate>)delegate {
131 return _delegate;
132 }
133
134 - (UIViewController*)viewController {
135 return _viewController;
136 }
137
138 - (BOOL)isShowingDialog { 131 - (BOOL)isShowingDialog {
139 DCHECK_EQ(self.presentedDialogWebState != nullptr, 132 DCHECK_EQ(self.presentedDialogWebState != nullptr,
140 self.presentedDialogCoordinator != nil); 133 self.presentedDialogCoordinator != nil);
141 return self.presentedDialogCoordinator != nil; 134 return self.presentedDialogCoordinator != nil;
142 } 135 }
143 136
144 - (web::WebState*)presentedDialogWebState {
145 return _presentedDialogWebState;
146 }
147
148 - (void)setPresentedDialogWebState:(web::WebState*)presentedDialogWebState {
149 _presentedDialogWebState = presentedDialogWebState;
150 }
151
152 - (AlertCoordinator*)presentedDialogCoordinator {
153 return _presentedDialogCoordinator;
154 }
155
156 - (void)setPresentedDialogCoordinator:
157 (AlertCoordinator*)presentedDialogCoordinator {
158 _presentedDialogCoordinator.reset([presentedDialogCoordinator retain]);
159 }
160
161 - (ActionSheetCoordinator*)blockingConfirmationCoordinator {
162 return _blockingConfirmationCoordinator;
163 }
164
165 - (void)setBlockingConfirmationCoordinator:
166 (ActionSheetCoordinator*)blockingConfirmationActionSheetCoordinator {
167 _blockingConfirmationCoordinator.reset(
168 [blockingConfirmationActionSheetCoordinator retain]);
169 }
170
171 #pragma mark - Public 137 #pragma mark - Public
172 138
173 - (void)runJavaScriptAlertPanelWithMessage:(NSString*)message 139 - (void)runJavaScriptAlertPanelWithMessage:(NSString*)message
174 requestURL:(const GURL&)requestURL 140 requestURL:(const GURL&)requestURL
175 webState:(web::WebState*)webState 141 webState:(web::WebState*)webState
176 completionHandler:(void (^)(void))completionHandler { 142 completionHandler:(void (^)(void))completionHandler {
177 NSString* title = 143 NSString* title =
178 [DialogPresenter localizedTitleForJavaScriptAlertFromPage:requestURL]; 144 [DialogPresenter localizedTitleForJavaScriptAlertFromPage:requestURL];
179 AlertCoordinator* alertCoordinator = [[[AlertCoordinator alloc] 145 AlertCoordinator* alertCoordinator =
180 initWithBaseViewController:self.viewController 146 [[AlertCoordinator alloc] initWithBaseViewController:self.viewController
181 title:title 147 title:title
182 message:message] autorelease]; 148 message:message];
183 149
184 // Handler. 150 // Handler.
185 base::WeakNSObject<DialogPresenter> weakSelf(self); 151 __weak DialogPresenter* weakSelf = self;
186 base::WeakNSObject<AlertCoordinator> weakCoordinator(alertCoordinator); 152 __weak AlertCoordinator* weakCoordinator = alertCoordinator;
187 ProceduralBlock OKHandler = ^{ 153 ProceduralBlock OKHandler = ^{
188 if (completionHandler) 154 if (completionHandler)
189 completionHandler(); 155 completionHandler();
190 [weakSelf buttonWasTappedForCoordinator:weakCoordinator]; 156 [weakSelf buttonWasTappedForCoordinator:weakCoordinator];
191 }; 157 };
192 158
193 // Add button. 159 // Add button.
194 [alertCoordinator addItemWithTitle:l10n_util::GetNSString(IDS_OK) 160 [alertCoordinator addItemWithTitle:l10n_util::GetNSString(IDS_OK)
195 action:OKHandler 161 action:OKHandler
196 style:UIAlertActionStyleDefault]; 162 style:UIAlertActionStyleDefault];
197 163
198 // Add cancel handler. 164 // Add cancel handler.
199 alertCoordinator.cancelAction = completionHandler; 165 alertCoordinator.cancelAction = completionHandler;
200 alertCoordinator.noInteractionAction = completionHandler; 166 alertCoordinator.noInteractionAction = completionHandler;
201 167
202 // Blocking option setup. 168 // Blocking option setup.
203 [self setUpBlockingOptionForCoordinator:alertCoordinator webState:webState]; 169 [self setUpBlockingOptionForCoordinator:alertCoordinator webState:webState];
204 170
205 [self addDialogCoordinator:alertCoordinator forWebState:webState]; 171 [self addDialogCoordinator:alertCoordinator forWebState:webState];
206 } 172 }
207 173
208 - (void)runJavaScriptConfirmPanelWithMessage:(NSString*)message 174 - (void)runJavaScriptConfirmPanelWithMessage:(NSString*)message
209 requestURL:(const GURL&)requestURL 175 requestURL:(const GURL&)requestURL
210 webState:(web::WebState*)webState 176 webState:(web::WebState*)webState
211 completionHandler: 177 completionHandler:
212 (void (^)(BOOL isConfirmed))completionHandler { 178 (void (^)(BOOL isConfirmed))completionHandler {
213 NSString* title = 179 NSString* title =
214 [DialogPresenter localizedTitleForJavaScriptAlertFromPage:requestURL]; 180 [DialogPresenter localizedTitleForJavaScriptAlertFromPage:requestURL];
215 AlertCoordinator* alertCoordinator = [[[AlertCoordinator alloc] 181 AlertCoordinator* alertCoordinator =
216 initWithBaseViewController:self.viewController 182 [[AlertCoordinator alloc] initWithBaseViewController:self.viewController
217 title:title 183 title:title
218 message:message] autorelease]; 184 message:message];
219 185
220 // Actions. 186 // Actions.
221 ProceduralBlock confirmAction = ^{ 187 ProceduralBlock confirmAction = ^{
222 if (completionHandler) 188 if (completionHandler)
223 completionHandler(YES); 189 completionHandler(YES);
224 }; 190 };
225 191
226 ProceduralBlock cancelAction = ^{ 192 ProceduralBlock cancelAction = ^{
227 if (completionHandler) 193 if (completionHandler)
228 completionHandler(NO); 194 completionHandler(NO);
(...skipping 13 matching lines...) Expand all
242 } 208 }
243 209
244 - (void)runJavaScriptTextInputPanelWithPrompt:(NSString*)message 210 - (void)runJavaScriptTextInputPanelWithPrompt:(NSString*)message
245 defaultText:(NSString*)defaultText 211 defaultText:(NSString*)defaultText
246 requestURL:(const GURL&)requestURL 212 requestURL:(const GURL&)requestURL
247 webState:(web::WebState*)webState 213 webState:(web::WebState*)webState
248 completionHandler: 214 completionHandler:
249 (void (^)(NSString* input))completionHandler { 215 (void (^)(NSString* input))completionHandler {
250 NSString* title = 216 NSString* title =
251 [DialogPresenter localizedTitleForJavaScriptAlertFromPage:requestURL]; 217 [DialogPresenter localizedTitleForJavaScriptAlertFromPage:requestURL];
252 InputAlertCoordinator* alertCoordinator = [[[InputAlertCoordinator alloc] 218 InputAlertCoordinator* alertCoordinator = [[InputAlertCoordinator alloc]
253 initWithBaseViewController:self.viewController 219 initWithBaseViewController:self.viewController
254 title:title 220 title:title
255 message:message] autorelease]; 221 message:message];
256 222
257 // Actions. 223 // Actions.
258 base::WeakNSObject<InputAlertCoordinator> weakCoordinator(alertCoordinator); 224 __weak InputAlertCoordinator* weakCoordinator = alertCoordinator;
259 ProceduralBlock confirmAction = ^{ 225 ProceduralBlock confirmAction = ^{
260 if (completionHandler) { 226 if (completionHandler) {
261 NSString* textInput = [weakCoordinator textFields].firstObject.text; 227 NSString* textInput = [weakCoordinator textFields].firstObject.text;
262 completionHandler(textInput ? textInput : @""); 228 completionHandler(textInput ? textInput : @"");
263 } 229 }
264 }; 230 };
265 231
266 ProceduralBlock cancelAction = ^{ 232 ProceduralBlock cancelAction = ^{
267 if (completionHandler) 233 if (completionHandler)
268 completionHandler(nil); 234 completionHandler(nil);
(...skipping 23 matching lines...) Expand all
292 - (void)runAuthDialogForProtectionSpace:(NSURLProtectionSpace*)protectionSpace 258 - (void)runAuthDialogForProtectionSpace:(NSURLProtectionSpace*)protectionSpace
293 proposedCredential:(NSURLCredential*)credential 259 proposedCredential:(NSURLCredential*)credential
294 webState:(web::WebState*)webState 260 webState:(web::WebState*)webState
295 completionHandler:(void (^)(NSString* user, 261 completionHandler:(void (^)(NSString* user,
296 NSString* password))handler { 262 NSString* password))handler {
297 NSString* title = l10n_util::GetNSStringWithFixup(IDS_LOGIN_DIALOG_TITLE); 263 NSString* title = l10n_util::GetNSStringWithFixup(IDS_LOGIN_DIALOG_TITLE);
298 NSString* message = 264 NSString* message =
299 ios_internal::nsurlprotectionspace_util::MessageForHTTPAuth( 265 ios_internal::nsurlprotectionspace_util::MessageForHTTPAuth(
300 protectionSpace); 266 protectionSpace);
301 267
302 InputAlertCoordinator* alertCoordinator = [[[InputAlertCoordinator alloc] 268 InputAlertCoordinator* alertCoordinator = [[InputAlertCoordinator alloc]
303 initWithBaseViewController:self.viewController 269 initWithBaseViewController:self.viewController
304 title:title 270 title:title
305 message:message] autorelease]; 271 message:message];
306 272
307 // Actions. 273 // Actions.
308 base::WeakNSObject<InputAlertCoordinator> weakCoordinator(alertCoordinator); 274 __weak InputAlertCoordinator* weakCoordinator = alertCoordinator;
309 ProceduralBlock confirmAction = ^{ 275 ProceduralBlock confirmAction = ^{
310 if (handler) { 276 if (handler) {
311 NSString* username = [[weakCoordinator textFields] objectAtIndex:0].text; 277 NSString* username = [[weakCoordinator textFields] objectAtIndex:0].text;
312 NSString* password = [[weakCoordinator textFields] objectAtIndex:1].text; 278 NSString* password = [[weakCoordinator textFields] objectAtIndex:1].text;
313 handler(username, password); 279 handler(username, password);
314 } 280 }
315 }; 281 };
316 282
317 ProceduralBlock cancelAction = ^{ 283 ProceduralBlock cancelAction = ^{
318 if (handler) 284 if (handler)
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
391 #pragma mark - Private methods. 357 #pragma mark - Private methods.
392 358
393 - (void)addDialogCoordinator:(AlertCoordinator*)coordinator 359 - (void)addDialogCoordinator:(AlertCoordinator*)coordinator
394 forWebState:(web::WebState*)webState { 360 forWebState:(web::WebState*)webState {
395 DCHECK(coordinator); 361 DCHECK(coordinator);
396 DCHECK(webState); 362 DCHECK(webState);
397 DCHECK_NE(webState, self.presentedDialogWebState); 363 DCHECK_NE(webState, self.presentedDialogWebState);
398 DCHECK(!_dialogCoordinatorsForWebStates[webState]); 364 DCHECK(!_dialogCoordinatorsForWebStates[webState]);
399 _queuedWebStates.push_back(webState); 365 _queuedWebStates.push_back(webState);
400 _dialogCoordinatorsForWebStates[webState] = 366 _dialogCoordinatorsForWebStates[webState] =
401 base::scoped_nsobject<AlertCoordinator>([coordinator retain]); 367 base::scoped_nsobject<AlertCoordinator>(coordinator);
402 368
403 if (self.active && !self.showingDialog && !self.delegate.presenting) 369 if (self.active && !self.showingDialog && !self.delegate.presenting)
404 [self showNextDialog]; 370 [self showNextDialog];
405 } 371 }
406 372
407 - (void)showNextDialog { 373 - (void)showNextDialog {
408 DCHECK(self.active); 374 DCHECK(self.active);
409 DCHECK(!self.showingDialog); 375 DCHECK(!self.showingDialog);
410 DCHECK(!_queuedWebStates.empty()); 376 DCHECK(!_queuedWebStates.empty());
411 // Update properties and remove context and the dialog from queue. 377 // Update properties and remove context and the dialog from queue.
(...skipping 16 matching lines...) Expand all
428 self.blockingConfirmationCoordinator = nil; 394 self.blockingConfirmationCoordinator = nil;
429 if (!_queuedWebStates.empty() && !self.delegate.presenting) 395 if (!_queuedWebStates.empty() && !self.delegate.presenting)
430 [self showNextDialog]; 396 [self showNextDialog];
431 } 397 }
432 398
433 - (void)setUpAlertCoordinator:(AlertCoordinator*)alertCoordinator 399 - (void)setUpAlertCoordinator:(AlertCoordinator*)alertCoordinator
434 confirmAction:(ProceduralBlock)confirmAction 400 confirmAction:(ProceduralBlock)confirmAction
435 cancelAction:(ProceduralBlock)cancelAction 401 cancelAction:(ProceduralBlock)cancelAction
436 OKLabel:(NSString*)label { 402 OKLabel:(NSString*)label {
437 // Handlers. 403 // Handlers.
438 base::WeakNSObject<DialogPresenter> weakSelf(self); 404 __weak DialogPresenter* weakSelf = self;
439 base::WeakNSObject<AlertCoordinator> weakCoordinator(alertCoordinator); 405 __weak AlertCoordinator* weakCoordinator = alertCoordinator;
440 406
441 ProceduralBlock confirmHandler = ^{ 407 ProceduralBlock confirmHandler = ^{
442 if (confirmAction) 408 if (confirmAction)
443 confirmAction(); 409 confirmAction();
444 [weakSelf buttonWasTappedForCoordinator:weakCoordinator]; 410 [weakSelf buttonWasTappedForCoordinator:weakCoordinator];
445 }; 411 };
446 412
447 ProceduralBlock cancelHandler = ^{ 413 ProceduralBlock cancelHandler = ^{
448 if (cancelAction) 414 if (cancelAction)
449 cancelAction(); 415 cancelAction();
(...skipping 12 matching lines...) Expand all
462 alertCoordinator.cancelAction = cancelAction; 428 alertCoordinator.cancelAction = cancelAction;
463 alertCoordinator.noInteractionAction = cancelAction; 429 alertCoordinator.noInteractionAction = cancelAction;
464 } 430 }
465 431
466 - (void)setUpBlockingOptionForCoordinator:(AlertCoordinator*)alertCoordinator 432 - (void)setUpBlockingOptionForCoordinator:(AlertCoordinator*)alertCoordinator
467 webState:(web::WebState*)webState { 433 webState:(web::WebState*)webState {
468 DCHECK(alertCoordinator); 434 DCHECK(alertCoordinator);
469 DCHECK(webState); 435 DCHECK(webState);
470 436
471 // Set up the start action. 437 // Set up the start action.
472 base::WeakNSObject<DialogPresenter> weakSelf(self);
473 base::WeakNSObject<AlertCoordinator> weakCoordinator(alertCoordinator);
474 ProceduralBlock originalStartAction = alertCoordinator.startAction; 438 ProceduralBlock originalStartAction = alertCoordinator.startAction;
475 alertCoordinator.startAction = ^{ 439 alertCoordinator.startAction = ^{
476 if (originalStartAction) 440 if (originalStartAction)
477 originalStartAction(); 441 originalStartAction();
478 JavaScriptDialogWasShown(webState); 442 JavaScriptDialogWasShown(webState);
479 }; 443 };
480 444
481 // Early return if a blocking option should not be added. 445 // Early return if a blocking option should not be added.
482 if (!ShouldShowDialogBlockingOption(webState)) 446 if (!ShouldShowDialogBlockingOption(webState))
483 return; 447 return;
484 448
485 ProceduralBlock blockingAction = 449 ProceduralBlock blockingAction =
486 [self blockingActionForCoordinator:alertCoordinator]; 450 [self blockingActionForCoordinator:alertCoordinator];
487 NSString* blockingOptionTitle = 451 NSString* blockingOptionTitle =
488 l10n_util::GetNSString(IDS_IOS_JAVA_SCRIPT_DIALOG_BLOCKING_BUTTON_TEXT); 452 l10n_util::GetNSString(IDS_IOS_JAVA_SCRIPT_DIALOG_BLOCKING_BUTTON_TEXT);
489 [alertCoordinator addItemWithTitle:blockingOptionTitle 453 [alertCoordinator addItemWithTitle:blockingOptionTitle
490 action:blockingAction 454 action:blockingAction
491 style:UIAlertActionStyleDefault]; 455 style:UIAlertActionStyleDefault];
492 } 456 }
493 457
494 - (ProceduralBlock)blockingActionForCoordinator:(AlertCoordinator*)coordinator { 458 - (ProceduralBlock)blockingActionForCoordinator:(AlertCoordinator*)coordinator {
495 base::WeakNSObject<DialogPresenter> weakSelf(self); 459 __weak DialogPresenter* weakSelf = self;
496 base::WeakNSObject<AlertCoordinator> weakCoordinator(coordinator); 460 __weak AlertCoordinator* weakCoordinator = coordinator;
497 base::WeakNSObject<UIViewController> weakBaseViewController( 461 __weak UIViewController* weakBaseViewController =
498 coordinator.baseViewController); 462 coordinator.baseViewController;
499 ProceduralBlock cancelAction = coordinator.cancelAction; 463 ProceduralBlock cancelAction = coordinator.cancelAction;
500 return [[^{ 464 return [^{
501 // Create the confirmation coordinator. Use an action sheet on iPhone and 465 // Create the confirmation coordinator. Use an action sheet on iPhone and
502 // an alert on iPhone. 466 // an alert on iPhone.
503 NSString* confirmMessage = 467 NSString* confirmMessage =
504 l10n_util::GetNSString(IDS_JAVASCRIPT_MESSAGEBOX_SUPPRESS_OPTION); 468 l10n_util::GetNSString(IDS_JAVASCRIPT_MESSAGEBOX_SUPPRESS_OPTION);
505 AlertCoordinator* confirmationCoordinator = 469 AlertCoordinator* confirmationCoordinator =
506 IsIPadIdiom() 470 IsIPadIdiom() ? [[AlertCoordinator alloc]
507 ? [[[AlertCoordinator alloc] 471 initWithBaseViewController:weakBaseViewController
508 initWithBaseViewController:weakBaseViewController 472 title:nil
509 title:nil 473 message:confirmMessage]
510 message:confirmMessage] autorelease] 474 : [[ActionSheetCoordinator alloc]
511 : [[[ActionSheetCoordinator alloc] 475 initWithBaseViewController:weakBaseViewController
512 initWithBaseViewController:weakBaseViewController 476 title:nil
513 title:nil 477 message:confirmMessage
514 message:confirmMessage 478 rect:CGRectZero
515 rect:CGRectZero 479 view:nil];
516 view:nil] autorelease];
517 // Set up button actions. 480 // Set up button actions.
518 ProceduralBlock confirmHandler = ^{ 481 ProceduralBlock confirmHandler = ^{
519 if (cancelAction) 482 if (cancelAction)
520 cancelAction(); 483 cancelAction();
521 base::scoped_nsobject<DialogPresenter> strongSelf([weakSelf retain]); 484 DialogPresenter* strongSelf = weakSelf;
522 if (!strongSelf) 485 if (!strongSelf)
523 return; 486 return;
524 DialogBlockingOptionSelected([strongSelf presentedDialogWebState]); 487 DialogBlockingOptionSelected([strongSelf presentedDialogWebState]);
525 [strongSelf buttonWasTappedForCoordinator:weakCoordinator]; 488 [strongSelf buttonWasTappedForCoordinator:weakCoordinator];
526 }; 489 };
527 ProceduralBlock cancelHandler = ^{ 490 ProceduralBlock cancelHandler = ^{
528 if (cancelAction) 491 if (cancelAction)
529 cancelAction(); 492 cancelAction();
530 [weakSelf buttonWasTappedForCoordinator:weakCoordinator]; 493 [weakSelf buttonWasTappedForCoordinator:weakCoordinator];
531 }; 494 };
532 NSString* blockingOptionTitle = 495 NSString* blockingOptionTitle =
533 l10n_util::GetNSString(IDS_IOS_JAVA_SCRIPT_DIALOG_BLOCKING_BUTTON_TEXT); 496 l10n_util::GetNSString(IDS_IOS_JAVA_SCRIPT_DIALOG_BLOCKING_BUTTON_TEXT);
534 [confirmationCoordinator addItemWithTitle:blockingOptionTitle 497 [confirmationCoordinator addItemWithTitle:blockingOptionTitle
535 action:confirmHandler 498 action:confirmHandler
536 style:UIAlertActionStyleDestructive]; 499 style:UIAlertActionStyleDestructive];
537 [confirmationCoordinator addItemWithTitle:l10n_util::GetNSString(IDS_CANCEL) 500 [confirmationCoordinator addItemWithTitle:l10n_util::GetNSString(IDS_CANCEL)
538 action:cancelHandler 501 action:cancelHandler
539 style:UIAlertActionStyleCancel]; 502 style:UIAlertActionStyleCancel];
540 [weakSelf setBlockingConfirmationCoordinator:confirmationCoordinator]; 503 [weakSelf setBlockingConfirmationCoordinator:confirmationCoordinator];
541 [[weakSelf blockingConfirmationCoordinator] start]; 504 [[weakSelf blockingConfirmationCoordinator] start];
542 } copy] autorelease]; 505 } copy];
543 } 506 }
544 507
545 @end 508 @end
OLDNEW
« no previous file with comments | « ios/chrome/browser/ui/dialogs/BUILD.gn ('k') | ios/chrome/browser/ui/dialogs/java_script_dialog_presenter_impl.mm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698