blob: e74800038360f409d0a8853ac80d6978e819dc85 [file] [log] [blame]
[email protected]de7d61ff2013-08-20 11:30:411// Copyright 2013 The Chromium Authors. All rights reserved.
[email protected]f2210022012-03-29 00:36:082// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
[email protected]de7d61ff2013-08-20 11:30:415#include "content/shell/browser/shell_javascript_dialog.h"
[email protected]f2210022012-03-29 00:36:086
7#import <Cocoa/Cocoa.h>
8
[email protected]a8522032013-06-24 22:51:469#import "base/mac/scoped_nsobject.h"
[email protected]40d11e02013-03-28 17:43:1410#include "base/strings/sys_string_conversions.h"
[email protected]de7d61ff2013-08-20 11:30:4111#include "content/shell/browser/shell_javascript_dialog_manager.h"
[email protected]f2210022012-03-29 00:36:0812
13// Helper object that receives the notification that the dialog/sheet is
14// going away. Is responsible for cleaning itself up.
15@interface ShellJavaScriptDialogHelper : NSObject<NSAlertDelegate> {
16 @private
[email protected]a8522032013-06-24 22:51:4617 base::scoped_nsobject<NSAlert> alert_;
[email protected]f2210022012-03-29 00:36:0818 NSTextField* textField_; // WEAK; owned by alert_
19
20 // Copies of the fields in ShellJavaScriptDialog because they're private.
[email protected]71a88bb2013-02-01 22:05:1521 content::ShellJavaScriptDialogManager* manager_;
22 content::JavaScriptDialogManager::DialogClosedCallback callback_;
[email protected]f2210022012-03-29 00:36:0823}
24
[email protected]71a88bb2013-02-01 22:05:1525- (id)initHelperWithManager:(content::ShellJavaScriptDialogManager*)manager
26 andCallback:(content::JavaScriptDialogManager::DialogClosedCallback)callback;
[email protected]f2210022012-03-29 00:36:0827- (NSAlert*)alert;
28- (NSTextField*)textField;
29- (void)alertDidEnd:(NSAlert*)alert
30 returnCode:(int)returnCode
31 contextInfo:(void*)contextInfo;
32- (void)cancel;
33
34@end
35
36@implementation ShellJavaScriptDialogHelper
37
[email protected]71a88bb2013-02-01 22:05:1538- (id)initHelperWithManager:(content::ShellJavaScriptDialogManager*)manager
39 andCallback:(content::JavaScriptDialogManager::DialogClosedCallback)callback {
[email protected]f2210022012-03-29 00:36:0840 if (self = [super init]) {
[email protected]71a88bb2013-02-01 22:05:1541 manager_ = manager;
[email protected]f2210022012-03-29 00:36:0842 callback_ = callback;
43 }
44
45 return self;
46}
47
48- (NSAlert*)alert {
49 alert_.reset([[NSAlert alloc] init]);
50 return alert_;
51}
52
53- (NSTextField*)textField {
54 textField_ = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 300, 22)];
55 [[textField_ cell] setLineBreakMode:NSLineBreakByTruncatingTail];
56 [alert_ setAccessoryView:textField_];
57 [textField_ release];
58
59 return textField_;
60}
61
62- (void)alertDidEnd:(NSAlert*)alert
63 returnCode:(int)returnCode
64 contextInfo:(void*)contextInfo {
65 if (returnCode == NSRunStoppedResponse)
66 return;
67
68 bool success = returnCode == NSAlertFirstButtonReturn;
[email protected]fcf75d42013-12-03 20:11:2669 base::string16 input;
[email protected]f2210022012-03-29 00:36:0870 if (textField_)
71 input = base::SysNSStringToUTF16([textField_ stringValue]);
72
73 content::ShellJavaScriptDialog* native_dialog =
74 reinterpret_cast<content::ShellJavaScriptDialog*>(contextInfo);
75 callback_.Run(success, input);
[email protected]71a88bb2013-02-01 22:05:1576 manager_->DialogClosed(native_dialog);
[email protected]f2210022012-03-29 00:36:0877}
78
79- (void)cancel {
80 [NSApp endSheet:[alert_ window]];
81 alert_.reset();
82}
83
84@end
85
86namespace content {
87
88ShellJavaScriptDialog::ShellJavaScriptDialog(
[email protected]71a88bb2013-02-01 22:05:1589 ShellJavaScriptDialogManager* manager,
[email protected]fc4f4dd42012-07-30 20:52:4890 gfx::NativeWindow parent_window,
[email protected]be2510c02012-05-28 14:52:1491 JavaScriptMessageType message_type,
[email protected]fcf75d42013-12-03 20:11:2692 const base::string16& message_text,
93 const base::string16& default_prompt_text,
[email protected]71a88bb2013-02-01 22:05:1594 const JavaScriptDialogManager::DialogClosedCallback& callback)
95 : manager_(manager),
[email protected]f2210022012-03-29 00:36:0896 callback_(callback) {
[email protected]be2510c02012-05-28 14:52:1497 bool text_field = message_type == JAVASCRIPT_MESSAGE_TYPE_PROMPT;
98 bool one_button = message_type == JAVASCRIPT_MESSAGE_TYPE_ALERT;
[email protected]f2210022012-03-29 00:36:0899
100 helper_ =
[email protected]71a88bb2013-02-01 22:05:15101 [[ShellJavaScriptDialogHelper alloc] initHelperWithManager:manager
[email protected]f2210022012-03-29 00:36:08102 andCallback:callback];
103
104 // Show the modal dialog.
[email protected]96720fa2012-04-04 20:26:15105 NSAlert* alert = [helper_ alert];
[email protected]f2210022012-03-29 00:36:08106 NSTextField* field = nil;
107 if (text_field) {
108 field = [helper_ textField];
109 [field setStringValue:base::SysUTF16ToNSString(default_prompt_text)];
110 }
[email protected]96720fa2012-04-04 20:26:15111 [alert setDelegate:helper_];
112 [alert setInformativeText:base::SysUTF16ToNSString(message_text)];
113 [alert setMessageText:@"Javascript alert"];
114 [alert addButtonWithTitle:@"OK"];
[email protected]f2210022012-03-29 00:36:08115 if (!one_button) {
[email protected]96720fa2012-04-04 20:26:15116 NSButton* other = [alert addButtonWithTitle:@"Cancel"];
[email protected]f2210022012-03-29 00:36:08117 [other setKeyEquivalent:@"\e"];
118 }
119
[email protected]96720fa2012-04-04 20:26:15120 [alert
[email protected]f2210022012-03-29 00:36:08121 beginSheetModalForWindow:nil // nil here makes it app-modal
122 modalDelegate:helper_
123 didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:)
124 contextInfo:this];
125
[email protected]96720fa2012-04-04 20:26:15126 if ([alert accessoryView])
127 [[alert window] makeFirstResponder:[alert accessoryView]];
[email protected]f2210022012-03-29 00:36:08128}
129
130ShellJavaScriptDialog::~ShellJavaScriptDialog() {
131 [helper_ release];
132}
133
134void ShellJavaScriptDialog::Cancel() {
135 [helper_ cancel];
136}
137
138} // namespace content