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

Unified Diff: content/shell/shell_js_dialog_mac.mm

Issue 9836127: Content shell: Javascript dialogs, first pass, just Mac for now. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 9 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 side-by-side diff with in-line comments
Download patch
Index: content/shell/shell_js_dialog_mac.mm
diff --git a/content/shell/shell_js_dialog_mac.mm b/content/shell/shell_js_dialog_mac.mm
new file mode 100644
index 0000000000000000000000000000000000000000..e2dc86c3d8a9f539523442e4d761451f05d7213f
--- /dev/null
+++ b/content/shell/shell_js_dialog_mac.mm
@@ -0,0 +1,140 @@
+// Copyright (c) 2012 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.
+
+#include "content/shell/shell_js_dialog.h"
+
+#import <Cocoa/Cocoa.h>
+
+#import "base/mac/cocoa_protocols.h"
+#import "base/memory/scoped_nsobject.h"
+#include "base/sys_string_conversions.h"
+#include "content/shell/shell_js_dialog_creator.h"
+
+// Helper object that receives the notification that the dialog/sheet is
+// going away. Is responsible for cleaning itself up.
+@interface ShellJavaScriptDialogHelper : NSObject<NSAlertDelegate> {
+ @private
+ scoped_nsobject<NSAlert> alert_;
+ NSTextField* textField_; // WEAK; owned by alert_
+
+ // Copies of the fields in ShellJavaScriptDialog because they're private.
+ content::ShellJavaScriptDialogCreator* creator_;
+ content::JavaScriptDialogCreator::DialogClosedCallback callback_;
+}
+
+- (id)initHelperWithCreator:(content::ShellJavaScriptDialogCreator*)creator
+ andCallback:(content::JavaScriptDialogCreator::DialogClosedCallback)callback;
+- (NSAlert*)alert;
+- (NSTextField*)textField;
+- (void)alertDidEnd:(NSAlert*)alert
+ returnCode:(int)returnCode
+ contextInfo:(void*)contextInfo;
+- (void)cancel;
+
+@end
+
+@implementation ShellJavaScriptDialogHelper
+
+- (id)initHelperWithCreator:(content::ShellJavaScriptDialogCreator*)creator
+ andCallback:(content::JavaScriptDialogCreator::DialogClosedCallback)callback {
+ if (self = [super init]) {
+ creator_ = creator;
+ callback_ = callback;
+ }
+
+ return self;
+}
+
+- (NSAlert*)alert {
+ alert_.reset([[NSAlert alloc] init]);
+ return alert_;
+}
+
+- (NSTextField*)textField {
+ textField_ = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 300, 22)];
+ [[textField_ cell] setLineBreakMode:NSLineBreakByTruncatingTail];
+ [alert_ setAccessoryView:textField_];
+ [textField_ release];
+
+ return textField_;
+}
+
+- (void)alertDidEnd:(NSAlert*)alert
+ returnCode:(int)returnCode
+ contextInfo:(void*)contextInfo {
+ if (returnCode == NSRunStoppedResponse)
+ return;
+
+ bool success = returnCode == NSAlertFirstButtonReturn;
+ string16 input;
+ if (textField_)
+ input = base::SysNSStringToUTF16([textField_ stringValue]);
+
+ content::ShellJavaScriptDialog* native_dialog =
+ reinterpret_cast<content::ShellJavaScriptDialog*>(contextInfo);
+ callback_.Run(success, input);
+ creator_->DialogClosed(native_dialog);
+}
+
+- (void)cancel {
+ [NSApp endSheet:[alert_ window]];
+ alert_.reset();
+}
+
+@end
+
+namespace content {
+
+ShellJavaScriptDialog::ShellJavaScriptDialog(
+ ShellJavaScriptDialogCreator* creator,
+ ui::JavascriptMessageType javascript_message_type,
+ const string16& message_text,
+ const string16& default_prompt_text,
+ const JavaScriptDialogCreator::DialogClosedCallback& callback)
+ : creator_(creator),
+ callback_(callback) {
+ bool text_field =
+ javascript_message_type == ui::JAVASCRIPT_MESSAGE_TYPE_PROMPT;
+ bool one_button =
+ javascript_message_type == ui::JAVASCRIPT_MESSAGE_TYPE_ALERT;
+
+ helper_ =
+ [[ShellJavaScriptDialogHelper alloc] initHelperWithCreator:creator
+ andCallback:callback];
+
+ // Show the modal dialog.
+ alert_ = [helper_ alert];
+ NSTextField* field = nil;
+ if (text_field) {
+ field = [helper_ textField];
+ [field setStringValue:base::SysUTF16ToNSString(default_prompt_text)];
+ }
+ [alert_ setDelegate:helper_];
+ [alert_ setInformativeText:base::SysUTF16ToNSString(message_text)];
+ [alert_ setMessageText:@"Javascript alert"];
+ [alert_ addButtonWithTitle:@"OK"];
+ if (!one_button) {
+ NSButton* other = [alert_ addButtonWithTitle:@"Cancel"];
+ [other setKeyEquivalent:@"\e"];
+ }
+
+ [alert_
+ beginSheetModalForWindow:nil // nil here makes it app-modal
+ modalDelegate:helper_
+ didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:)
+ contextInfo:this];
+
+ if ([alert_ accessoryView])
+ [[alert_ window] makeFirstResponder:[alert_ accessoryView]];
+}
+
+ShellJavaScriptDialog::~ShellJavaScriptDialog() {
+ [helper_ release];
+}
+
+void ShellJavaScriptDialog::Cancel() {
+ [helper_ cancel];
+}
+
+} // namespace content
« content/shell/shell_js_dialog.h ('K') | « content/shell/shell_js_dialog_creator.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698