Index: ios/clean/chrome/browser/ui/dialogs/java_script_dialogs/java_script_dialog_mediator.mm |
diff --git a/ios/clean/chrome/browser/ui/dialogs/java_script_dialogs/java_script_dialog_mediator.mm b/ios/clean/chrome/browser/ui/dialogs/java_script_dialogs/java_script_dialog_mediator.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b5a0f96a7e05840942071fa1d598a6b740583630 |
--- /dev/null |
+++ b/ios/clean/chrome/browser/ui/dialogs/java_script_dialogs/java_script_dialog_mediator.mm |
@@ -0,0 +1,143 @@ |
+// Copyright 2017 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#import "ios/clean/chrome/browser/ui/dialogs/java_script_dialogs/java_script_dialog_mediator.h" |
+ |
+#include "base/logging.h" |
+#include "components/strings/grit/components_strings.h" |
+#import "ios/clean/chrome/browser/ui/commands/java_script_dialog_commands.h" |
+#import "ios/clean/chrome/browser/ui/dialogs/dialog_button_item.h" |
+#import "ios/clean/chrome/browser/ui/dialogs/dialog_mediator+internal.h" |
+#import "ios/clean/chrome/browser/ui/dialogs/dialog_text_field_item.h" |
+#import "ios/clean/chrome/browser/ui/dialogs/java_script_dialogs/java_script_dialog_state.h" |
+#import "ios/shared/chrome/browser/ui/commands/command_dispatcher.h" |
+#include "ui/base/l10n/l10n_util.h" |
+ |
+#if !defined(__has_feature) || !__has_feature(objc_arc) |
+#error "This file requires ARC support." |
+#endif |
+ |
+namespace { |
+// Button tags. |
+NSString* const kOKButtonTag = @"OK"; |
+NSString* const kCancelButtonTag = @"Cancel"; |
+} |
+ |
+@interface JavaScriptDialogMediator ()<DialogDismissalCommands> |
+ |
+// The dispatcher to use for JavaScriptdialogDismissalCommands. |
+@property(nonatomic, readonly) id<JavaScriptDialogDismissalCommands> |
+ dismissalDispatcher; |
+// The state passed on initializaton. |
+@property(nonatomic, readonly, strong) JavaScriptDialogState* state; |
+ |
+// Called when buttons are tapped to dispatch JavaScriptDialogDismissalCommands. |
+- (void)OKButtonWasTappedWithInputStrings:(NSArray<NSString*>*)inputStrings; |
+- (void)cancelButtonWasTapped; |
+ |
+@end |
+ |
+@implementation JavaScriptDialogMediator |
+ |
+@synthesize state = _state; |
+ |
+- (instancetype)initWithDispatcher:(CommandDispatcher*)dispatcher |
+ state:(JavaScriptDialogState*)state { |
+ DCHECK(state); |
+ if ((self = [super initWithDispatcher:dispatcher])) { |
+ _state = state; |
+ } |
+ return self; |
+} |
+ |
+#pragma mark - Accessors |
+ |
+- (id<JavaScriptDialogDismissalCommands>)dismissalDispatcher { |
+ return static_cast<id<JavaScriptDialogDismissalCommands>>(self.dispatcher); |
+} |
+ |
+#pragma mark - |
+ |
+- (void)OKButtonWasTappedWithInputStrings:(NSArray<NSString*>*)inputStrings { |
+ switch (self.state.type) { |
+ case web::JAVASCRIPT_DIALOG_TYPE_ALERT: |
+ [self.dismissalDispatcher dismissJavaScriptAlert]; |
+ break; |
+ case web::JAVASCRIPT_DIALOG_TYPE_CONFIRM: |
+ [self.dismissalDispatcher dimsissJavaScriptConfirmationWithSuccess:YES]; |
+ break; |
+ case web::JAVASCRIPT_DIALOG_TYPE_PROMPT: |
+ DCHECK_EQ(inputStrings.count, 1U); |
+ [self.dismissalDispatcher |
+ dismissJavaScriptPromptWithResult:inputStrings[0]]; |
+ break; |
+ } |
+} |
+ |
+- (void)cancelButtonWasTapped { |
+ switch (self.state.type) { |
+ case web::JAVASCRIPT_DIALOG_TYPE_ALERT: |
+ NOTREACHED() << "Alerts do not have cancel buttons."; |
+ break; |
+ case web::JAVASCRIPT_DIALOG_TYPE_CONFIRM: |
+ [self.dismissalDispatcher dimsissJavaScriptConfirmationWithSuccess:NO]; |
+ break; |
+ case web::JAVASCRIPT_DIALOG_TYPE_PROMPT: |
+ [self.dismissalDispatcher dismissJavaScriptPromptWithResult:nil]; |
+ break; |
+ } |
+} |
+ |
+@end |
+ |
+@implementation JavaScriptDialogMediator (Internal) |
+ |
+- (NSString*)dialogTitle { |
+ return self.state.title; |
+} |
+ |
+- (NSString*)dialogMessage { |
+ return self.state.message; |
+} |
+ |
+- (NSArray<DialogButtonItem*>*)buttonItems { |
+ NSMutableArray<DialogButtonItem*>* items = [[NSMutableArray alloc] init]; |
+ // All JavaScript dialogs have an OK button. |
+ [items addObject:[DialogButtonItem itemWithText:l10n_util::GetNSString(IDS_OK) |
+ style:DialogButtonStyle::DEFAULT |
+ tag:kOKButtonTag]]; |
+ // Only confirmations and prompts get cancel buttons. |
+ if (self.state.type != web::JAVASCRIPT_DIALOG_TYPE_ALERT) { |
+ NSString* cancelText = l10n_util::GetNSString(IDS_CANCEL); |
+ [items addObject:[DialogButtonItem itemWithText:cancelText |
+ style:DialogButtonStyle::CANCEL |
+ tag:kCancelButtonTag]]; |
+ } |
+ return items; |
+} |
+ |
+- (NSArray<DialogTextFieldItem*>*)textFieldItems { |
+ // Only prompts have text fields. |
+ if (self.state.type != web::JAVASCRIPT_DIALOG_TYPE_PROMPT) |
+ return nil; |
+ return |
+ @[ [DialogTextFieldItem itemWithDefaultText:self.state.defaultPromptText |
+ placeholderText:nil |
+ secure:NO] ]; |
+} |
+ |
+#pragma mark - DialogDismissalCommands |
+ |
+- (void)dismissDialogWithButtonTag:(id)buttonTag |
+ userInputStrings:(NSArray<NSString*>*)inputStrings { |
+ if (buttonTag == kOKButtonTag) { |
+ [self OKButtonWasTappedWithInputStrings:inputStrings]; |
+ } else if (buttonTag == kCancelButtonTag) { |
+ [self cancelButtonWasTapped]; |
+ } else { |
+ NOTREACHED() << "Received dialog dismissal for unknown button tag."; |
+ } |
+} |
+ |
+@end |