| Index: chrome/browser/js_modal_dialog_mac.mm
|
| ===================================================================
|
| --- chrome/browser/js_modal_dialog_mac.mm (revision 0)
|
| +++ chrome/browser/js_modal_dialog_mac.mm (revision 0)
|
| @@ -0,0 +1,170 @@
|
| +// Copyright (c) 2010 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 "chrome/browser/js_modal_dialog.h"
|
| +
|
| +#import <Cocoa/Cocoa.h>
|
| +
|
| +#include "app/l10n_util_mac.h"
|
| +#include "app/message_box_flags.h"
|
| +#import "base/cocoa_protocols_mac.h"
|
| +#include "base/sys_string_conversions.h"
|
| +#include "grit/app_strings.h"
|
| +#include "grit/generated_resources.h"
|
| +
|
| +// Helper object that receives the notification that the dialog/sheet is
|
| +// going away. Is responsible for cleaning itself up.
|
| +@interface JavaScriptAppModalDialogHelper : NSObject<NSAlertDelegate> {
|
| + @private
|
| + NSAlert* alert_;
|
| + NSTextField* textField_; // WEAK; owned by alert_
|
| +}
|
| +
|
| +- (NSAlert*)alert;
|
| +- (NSTextField*)textField;
|
| +- (void)alertDidEnd:(NSAlert *)alert
|
| + returnCode:(int)returnCode
|
| + contextInfo:(void*)contextInfo;
|
| +
|
| +@end
|
| +
|
| +@implementation JavaScriptAppModalDialogHelper
|
| +
|
| +- (NSAlert*)alert {
|
| + alert_ = [[NSAlert alloc] init];
|
| + return alert_;
|
| +}
|
| +
|
| +- (NSTextField*)textField {
|
| + textField_ = [[NSTextField alloc] initWithFrame:NSMakeRect(0, 0, 300, 22)];
|
| + [alert_ setAccessoryView:textField_];
|
| + [textField_ release];
|
| +
|
| + return textField_;
|
| +}
|
| +
|
| +- (void)dealloc {
|
| + [alert_ release];
|
| + [super dealloc];
|
| +}
|
| +
|
| +// |contextInfo| is the bridge back to the C++ JavaScriptAppModalDialog. When
|
| +// complete, autorelease to clean ourselves up.
|
| +- (void)alertDidEnd:(NSAlert*)alert
|
| + returnCode:(int)returnCode
|
| + contextInfo:(void*)contextInfo {
|
| + JavaScriptAppModalDialog* bridge =
|
| + reinterpret_cast<JavaScriptAppModalDialog*>(contextInfo);
|
| + std::wstring input;
|
| + if (textField_)
|
| + input = base::SysNSStringToWide([textField_ stringValue]);
|
| + switch (returnCode) {
|
| + case NSAlertFirstButtonReturn: { // OK
|
| + bool shouldSuppress = false;
|
| + if ([alert showsSuppressionButton])
|
| + shouldSuppress = [[alert suppressionButton] state] == NSOnState;
|
| + bridge->OnAccept(input, shouldSuppress);
|
| + break;
|
| + }
|
| + case NSAlertSecondButtonReturn: { // Cancel
|
| + bridge->OnCancel();
|
| + break;
|
| + }
|
| + case NSRunStoppedResponse: { // Window was closed underneath us
|
| + // Need to call OnCancel() because there is some cleanup that needs
|
| + // to be done. It won't call back to the javascript since the
|
| + // JavaScriptAppModalDialog knows that the TabContents was destroyed.
|
| + bridge->OnCancel();
|
| + break;
|
| + }
|
| + default: {
|
| + NOTREACHED();
|
| + }
|
| + }
|
| + [self autorelease];
|
| + delete bridge; // Done with the dialog, it needs be destroyed.
|
| +}
|
| +@end
|
| +
|
| +void JavaScriptAppModalDialog::CreateAndShowDialog() {
|
| + // Determine the names of the dialog buttons based on the flags. "Default"
|
| + // is the OK button. "Other" is the cancel button. We don't use the
|
| + // "Alternate" button in NSRunAlertPanel.
|
| + NSString* default_button = l10n_util::GetNSStringWithFixup(IDS_APP_OK);
|
| + NSString* other_button = l10n_util::GetNSStringWithFixup(IDS_APP_CANCEL);
|
| + bool text_field = false;
|
| + bool one_button = false;
|
| + switch (dialog_flags_) {
|
| + case MessageBoxFlags::kIsJavascriptAlert:
|
| + one_button = true;
|
| + break;
|
| + case MessageBoxFlags::kIsJavascriptConfirm:
|
| + if (is_before_unload_dialog_) {
|
| + default_button = l10n_util::GetNSStringWithFixup(
|
| + IDS_BEFOREUNLOAD_MESSAGEBOX_OK_BUTTON_LABEL);
|
| + other_button = l10n_util::GetNSStringWithFixup(
|
| + IDS_BEFOREUNLOAD_MESSAGEBOX_CANCEL_BUTTON_LABEL);
|
| + }
|
| + break;
|
| + case MessageBoxFlags::kIsJavascriptPrompt:
|
| + text_field = true;
|
| + break;
|
| +
|
| + default:
|
| + NOTREACHED();
|
| + }
|
| +
|
| + // Create a helper which will receive the sheet ended selector. It will
|
| + // delete itself when done. It doesn't need anything passed to its init
|
| + // as it will get a contextInfo parameter.
|
| + JavaScriptAppModalDialogHelper* helper =
|
| + [[JavaScriptAppModalDialogHelper alloc] init];
|
| +
|
| + // Show the modal dialog.
|
| + NSAlert* alert = [helper alert];
|
| + dialog_ = alert;
|
| + NSTextField* field = nil;
|
| + if (text_field) {
|
| + field = [helper textField];
|
| + [field setStringValue:base::SysWideToNSString(default_prompt_text_)];
|
| + }
|
| + [alert setDelegate:helper];
|
| + [alert setInformativeText:base::SysWideToNSString(message_text_)];
|
| + [alert setMessageText:base::SysWideToNSString(title_)];
|
| + [alert addButtonWithTitle:default_button];
|
| + if (!one_button)
|
| + [alert addButtonWithTitle:other_button];
|
| + if (display_suppress_checkbox_) {
|
| + [alert setShowsSuppressionButton:YES];
|
| + NSString* suppression_title = l10n_util::GetNSStringWithFixup(
|
| + IDS_JAVASCRIPT_MESSAGEBOX_SUPPRESS_OPTION);
|
| + [[alert suppressionButton] setTitle:suppression_title];
|
| + }
|
| +
|
| + [alert beginSheetModalForWindow:nil // nil here makes it app-modal
|
| + modalDelegate:helper
|
| + didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:)
|
| + contextInfo:this];
|
| +
|
| + if (field)
|
| + [[alert window] makeFirstResponder:field];
|
| +}
|
| +
|
| +int JavaScriptAppModalDialog::GetDialogButtons() {
|
| + NOTIMPLEMENTED();
|
| + return 0;
|
| +}
|
| +
|
| +void JavaScriptAppModalDialog::AcceptWindow() {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +void JavaScriptAppModalDialog::CancelWindow() {
|
| + NOTIMPLEMENTED();
|
| +}
|
| +
|
| +NativeDialog JavaScriptAppModalDialog::CreateNativeDialog() {
|
| + NOTIMPLEMENTED();
|
| + return nil;
|
| +}
|
|
|
| Property changes on: chrome/browser/js_modal_dialog_mac.mm
|
| ___________________________________________________________________
|
| Name: svn:eol-style
|
| + LF
|
|
|
|
|