| Index: ios/chrome/browser/ui/dialogs/dialog_presenter.mm
|
| diff --git a/ios/chrome/browser/ui/dialogs/dialog_presenter.mm b/ios/chrome/browser/ui/dialogs/dialog_presenter.mm
|
| index 552826677beb7442a653a12a7ccbe3d29e17e0a4..5be1336d79c6197da14be2bf9134ffb2e13f5a03 100644
|
| --- a/ios/chrome/browser/ui/dialogs/dialog_presenter.mm
|
| +++ b/ios/chrome/browser/ui/dialogs/dialog_presenter.mm
|
| @@ -8,7 +8,6 @@
|
| #include <map>
|
|
|
| #import "base/ios/block_types.h"
|
| -#import "base/ios/weak_nsobject.h"
|
| #include "base/logging.h"
|
| #import "base/mac/scoped_nsobject.h"
|
| #include "base/strings/sys_string_conversions.h"
|
| @@ -24,6 +23,10 @@
|
| #include "ui/base/l10n/l10n_util.h"
|
| #include "url/gurl.h"
|
|
|
| +#if !defined(__has_feature) || !__has_feature(objc_arc)
|
| +#error "This file requires ARC support."
|
| +#endif
|
| +
|
| // Externed accessibility identifier.
|
| NSString* const kJavaScriptDialogTextFieldAccessibiltyIdentifier =
|
| @"JavaScriptDialogTextFieldAccessibiltyIdentifier";
|
| @@ -35,26 +38,19 @@ const char kAboutNullHostname[] = "about:null";
|
| } // namespace
|
|
|
| @interface DialogPresenter () {
|
| - // Backing objects for properties of the same name.
|
| - base::WeakNSProtocol<id<DialogPresenterDelegate>> _delegate;
|
| - base::WeakNSObject<UIViewController> _viewController;
|
| // Queue of WebStates which correspond to the keys in
|
| // |_dialogCoordinatorsForWebStates|.
|
| std::deque<web::WebState*> _queuedWebStates;
|
| // A map associating queued webStates with their coordinators.
|
| std::map<web::WebState*, base::scoped_nsobject<AlertCoordinator>>
|
| _dialogCoordinatorsForWebStates;
|
| - web::WebState* _presentedDialogWebState;
|
| - base::scoped_nsobject<AlertCoordinator> _presentedDialogCoordinator;
|
| - base::scoped_nsobject<ActionSheetCoordinator>
|
| - _blockingConfirmationCoordinator;
|
| }
|
|
|
| // The delegate passed on initialization.
|
| -@property(nonatomic, readonly) id<DialogPresenterDelegate> delegate;
|
| +@property(weak, nonatomic, readonly) id<DialogPresenterDelegate> delegate;
|
|
|
| // The presenting view controller passed on initialization.
|
| -@property(nonatomic, readonly) UIViewController* viewController;
|
| +@property(weak, nonatomic, readonly) UIViewController* viewController;
|
|
|
| // Whether a modal dialog is currently being shown.
|
| @property(nonatomic, readonly, getter=isShowingDialog) BOOL showingDialog;
|
| @@ -63,10 +59,10 @@ const char kAboutNullHostname[] = "about:null";
|
| @property(nonatomic) web::WebState* presentedDialogWebState;
|
|
|
| // The dialog that's currently being shown, if any.
|
| -@property(nonatomic, retain) AlertCoordinator* presentedDialogCoordinator;
|
| +@property(nonatomic, strong) AlertCoordinator* presentedDialogCoordinator;
|
|
|
| // The JavaScript dialog blocking confirmation action sheet being shown, if any.
|
| -@property(nonatomic, retain) AlertCoordinator* blockingConfirmationCoordinator;
|
| +@property(nonatomic, strong) AlertCoordinator* blockingConfirmationCoordinator;
|
|
|
| // Adds |context| and |coordinator| to the queue. If a dialog is not already
|
| // being shown, |coordinator| will be presented. Otherwise, |coordinator| will
|
| @@ -106,14 +102,19 @@ const char kAboutNullHostname[] = "about:null";
|
| @implementation DialogPresenter
|
|
|
| @synthesize active = _active;
|
| +@synthesize delegate = _delegate;
|
| +@synthesize viewController = _viewController;
|
| +@synthesize presentedDialogCoordinator = _presentedDialogCoordinator;
|
| +@synthesize blockingConfirmationCoordinator = _blockingConfirmationCoordinator;
|
| +@synthesize presentedDialogWebState = _presentedDialogWebState;
|
|
|
| - (instancetype)initWithDelegate:(id<DialogPresenterDelegate>)delegate
|
| presentingViewController:(UIViewController*)viewController {
|
| if ((self = [super init])) {
|
| DCHECK(delegate);
|
| DCHECK(viewController);
|
| - _delegate.reset(delegate);
|
| - _viewController.reset(viewController);
|
| + _delegate = delegate;
|
| + _viewController = viewController;
|
| }
|
| return self;
|
| }
|
| @@ -127,47 +128,12 @@ const char kAboutNullHostname[] = "about:null";
|
| }
|
| }
|
|
|
| -- (id<DialogPresenterDelegate>)delegate {
|
| - return _delegate;
|
| -}
|
| -
|
| -- (UIViewController*)viewController {
|
| - return _viewController;
|
| -}
|
| -
|
| - (BOOL)isShowingDialog {
|
| DCHECK_EQ(self.presentedDialogWebState != nullptr,
|
| self.presentedDialogCoordinator != nil);
|
| return self.presentedDialogCoordinator != nil;
|
| }
|
|
|
| -- (web::WebState*)presentedDialogWebState {
|
| - return _presentedDialogWebState;
|
| -}
|
| -
|
| -- (void)setPresentedDialogWebState:(web::WebState*)presentedDialogWebState {
|
| - _presentedDialogWebState = presentedDialogWebState;
|
| -}
|
| -
|
| -- (AlertCoordinator*)presentedDialogCoordinator {
|
| - return _presentedDialogCoordinator;
|
| -}
|
| -
|
| -- (void)setPresentedDialogCoordinator:
|
| - (AlertCoordinator*)presentedDialogCoordinator {
|
| - _presentedDialogCoordinator.reset([presentedDialogCoordinator retain]);
|
| -}
|
| -
|
| -- (ActionSheetCoordinator*)blockingConfirmationCoordinator {
|
| - return _blockingConfirmationCoordinator;
|
| -}
|
| -
|
| -- (void)setBlockingConfirmationCoordinator:
|
| - (ActionSheetCoordinator*)blockingConfirmationActionSheetCoordinator {
|
| - _blockingConfirmationCoordinator.reset(
|
| - [blockingConfirmationActionSheetCoordinator retain]);
|
| -}
|
| -
|
| #pragma mark - Public
|
|
|
| - (void)runJavaScriptAlertPanelWithMessage:(NSString*)message
|
| @@ -176,14 +142,14 @@ const char kAboutNullHostname[] = "about:null";
|
| completionHandler:(void (^)(void))completionHandler {
|
| NSString* title =
|
| [DialogPresenter localizedTitleForJavaScriptAlertFromPage:requestURL];
|
| - AlertCoordinator* alertCoordinator = [[[AlertCoordinator alloc]
|
| - initWithBaseViewController:self.viewController
|
| - title:title
|
| - message:message] autorelease];
|
| + AlertCoordinator* alertCoordinator =
|
| + [[AlertCoordinator alloc] initWithBaseViewController:self.viewController
|
| + title:title
|
| + message:message];
|
|
|
| // Handler.
|
| - base::WeakNSObject<DialogPresenter> weakSelf(self);
|
| - base::WeakNSObject<AlertCoordinator> weakCoordinator(alertCoordinator);
|
| + __weak DialogPresenter* weakSelf = self;
|
| + __weak AlertCoordinator* weakCoordinator = alertCoordinator;
|
| ProceduralBlock OKHandler = ^{
|
| if (completionHandler)
|
| completionHandler();
|
| @@ -212,10 +178,10 @@ const char kAboutNullHostname[] = "about:null";
|
| (void (^)(BOOL isConfirmed))completionHandler {
|
| NSString* title =
|
| [DialogPresenter localizedTitleForJavaScriptAlertFromPage:requestURL];
|
| - AlertCoordinator* alertCoordinator = [[[AlertCoordinator alloc]
|
| - initWithBaseViewController:self.viewController
|
| - title:title
|
| - message:message] autorelease];
|
| + AlertCoordinator* alertCoordinator =
|
| + [[AlertCoordinator alloc] initWithBaseViewController:self.viewController
|
| + title:title
|
| + message:message];
|
|
|
| // Actions.
|
| ProceduralBlock confirmAction = ^{
|
| @@ -249,13 +215,13 @@ const char kAboutNullHostname[] = "about:null";
|
| (void (^)(NSString* input))completionHandler {
|
| NSString* title =
|
| [DialogPresenter localizedTitleForJavaScriptAlertFromPage:requestURL];
|
| - InputAlertCoordinator* alertCoordinator = [[[InputAlertCoordinator alloc]
|
| + InputAlertCoordinator* alertCoordinator = [[InputAlertCoordinator alloc]
|
| initWithBaseViewController:self.viewController
|
| title:title
|
| - message:message] autorelease];
|
| + message:message];
|
|
|
| // Actions.
|
| - base::WeakNSObject<InputAlertCoordinator> weakCoordinator(alertCoordinator);
|
| + __weak InputAlertCoordinator* weakCoordinator = alertCoordinator;
|
| ProceduralBlock confirmAction = ^{
|
| if (completionHandler) {
|
| NSString* textInput = [weakCoordinator textFields].firstObject.text;
|
| @@ -299,13 +265,13 @@ const char kAboutNullHostname[] = "about:null";
|
| ios_internal::nsurlprotectionspace_util::MessageForHTTPAuth(
|
| protectionSpace);
|
|
|
| - InputAlertCoordinator* alertCoordinator = [[[InputAlertCoordinator alloc]
|
| + InputAlertCoordinator* alertCoordinator = [[InputAlertCoordinator alloc]
|
| initWithBaseViewController:self.viewController
|
| title:title
|
| - message:message] autorelease];
|
| + message:message];
|
|
|
| // Actions.
|
| - base::WeakNSObject<InputAlertCoordinator> weakCoordinator(alertCoordinator);
|
| + __weak InputAlertCoordinator* weakCoordinator = alertCoordinator;
|
| ProceduralBlock confirmAction = ^{
|
| if (handler) {
|
| NSString* username = [[weakCoordinator textFields] objectAtIndex:0].text;
|
| @@ -398,7 +364,7 @@ const char kAboutNullHostname[] = "about:null";
|
| DCHECK(!_dialogCoordinatorsForWebStates[webState]);
|
| _queuedWebStates.push_back(webState);
|
| _dialogCoordinatorsForWebStates[webState] =
|
| - base::scoped_nsobject<AlertCoordinator>([coordinator retain]);
|
| + base::scoped_nsobject<AlertCoordinator>(coordinator);
|
|
|
| if (self.active && !self.showingDialog && !self.delegate.presenting)
|
| [self showNextDialog];
|
| @@ -435,8 +401,8 @@ const char kAboutNullHostname[] = "about:null";
|
| cancelAction:(ProceduralBlock)cancelAction
|
| OKLabel:(NSString*)label {
|
| // Handlers.
|
| - base::WeakNSObject<DialogPresenter> weakSelf(self);
|
| - base::WeakNSObject<AlertCoordinator> weakCoordinator(alertCoordinator);
|
| + __weak DialogPresenter* weakSelf = self;
|
| + __weak AlertCoordinator* weakCoordinator = alertCoordinator;
|
|
|
| ProceduralBlock confirmHandler = ^{
|
| if (confirmAction)
|
| @@ -469,8 +435,6 @@ const char kAboutNullHostname[] = "about:null";
|
| DCHECK(webState);
|
|
|
| // Set up the start action.
|
| - base::WeakNSObject<DialogPresenter> weakSelf(self);
|
| - base::WeakNSObject<AlertCoordinator> weakCoordinator(alertCoordinator);
|
| ProceduralBlock originalStartAction = alertCoordinator.startAction;
|
| alertCoordinator.startAction = ^{
|
| if (originalStartAction)
|
| @@ -492,33 +456,32 @@ const char kAboutNullHostname[] = "about:null";
|
| }
|
|
|
| - (ProceduralBlock)blockingActionForCoordinator:(AlertCoordinator*)coordinator {
|
| - base::WeakNSObject<DialogPresenter> weakSelf(self);
|
| - base::WeakNSObject<AlertCoordinator> weakCoordinator(coordinator);
|
| - base::WeakNSObject<UIViewController> weakBaseViewController(
|
| - coordinator.baseViewController);
|
| + __weak DialogPresenter* weakSelf = self;
|
| + __weak AlertCoordinator* weakCoordinator = coordinator;
|
| + __weak UIViewController* weakBaseViewController =
|
| + coordinator.baseViewController;
|
| ProceduralBlock cancelAction = coordinator.cancelAction;
|
| - return [[^{
|
| + return [^{
|
| // Create the confirmation coordinator. Use an action sheet on iPhone and
|
| // an alert on iPhone.
|
| NSString* confirmMessage =
|
| l10n_util::GetNSString(IDS_JAVASCRIPT_MESSAGEBOX_SUPPRESS_OPTION);
|
| AlertCoordinator* confirmationCoordinator =
|
| - IsIPadIdiom()
|
| - ? [[[AlertCoordinator alloc]
|
| - initWithBaseViewController:weakBaseViewController
|
| - title:nil
|
| - message:confirmMessage] autorelease]
|
| - : [[[ActionSheetCoordinator alloc]
|
| - initWithBaseViewController:weakBaseViewController
|
| - title:nil
|
| - message:confirmMessage
|
| - rect:CGRectZero
|
| - view:nil] autorelease];
|
| + IsIPadIdiom() ? [[AlertCoordinator alloc]
|
| + initWithBaseViewController:weakBaseViewController
|
| + title:nil
|
| + message:confirmMessage]
|
| + : [[ActionSheetCoordinator alloc]
|
| + initWithBaseViewController:weakBaseViewController
|
| + title:nil
|
| + message:confirmMessage
|
| + rect:CGRectZero
|
| + view:nil];
|
| // Set up button actions.
|
| ProceduralBlock confirmHandler = ^{
|
| if (cancelAction)
|
| cancelAction();
|
| - base::scoped_nsobject<DialogPresenter> strongSelf([weakSelf retain]);
|
| + DialogPresenter* strongSelf = weakSelf;
|
| if (!strongSelf)
|
| return;
|
| DialogBlockingOptionSelected([strongSelf presentedDialogWebState]);
|
| @@ -539,7 +502,7 @@ const char kAboutNullHostname[] = "about:null";
|
| style:UIAlertActionStyleCancel];
|
| [weakSelf setBlockingConfirmationCoordinator:confirmationCoordinator];
|
| [[weakSelf blockingConfirmationCoordinator] start];
|
| - } copy] autorelease];
|
| + } copy];
|
| }
|
|
|
| @end
|
|
|