summaryrefslogtreecommitdiffstats
path: root/chrome/browser/cookie_modal_dialog_mac.mm
diff options
context:
space:
mode:
authorthakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-23 19:35:09 +0000
committerthakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-23 19:35:09 +0000
commitbcace2312fa983e395424605f1929859279ed9d3 (patch)
tree1a3534c77628688729c5efe740c3f889530d6cee /chrome/browser/cookie_modal_dialog_mac.mm
parent4334bcb2fafca26d8d7c7ffeed436f44a94568e5 (diff)
downloadchromium_src-bcace2312fa983e395424605f1929859279ed9d3.zip
chromium_src-bcace2312fa983e395424605f1929859279ed9d3.tar.gz
chromium_src-bcace2312fa983e395424605f1929859279ed9d3.tar.bz2
Mac: Cookie confirmation dialog.
This is not the final UI (the "more info" disclosure triangle is missing), but it's pretty close and, more importantly, functional. BUG=34894 TEST=Go to Preferences->under the hood->content settings->cookies and select "ask me every time". Then browser around and note that a message box pops up all the time. All the buttons on the message box should do what they claim. Review URL: http://codereview.chromium.org/650206 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@39756 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cookie_modal_dialog_mac.mm')
-rw-r--r--chrome/browser/cookie_modal_dialog_mac.mm145
1 files changed, 145 insertions, 0 deletions
diff --git a/chrome/browser/cookie_modal_dialog_mac.mm b/chrome/browser/cookie_modal_dialog_mac.mm
new file mode 100644
index 0000000..b41437c
--- /dev/null
+++ b/chrome/browser/cookie_modal_dialog_mac.mm
@@ -0,0 +1,145 @@
+// 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/cookie_modal_dialog.h"
+
+#import <Cocoa/Cocoa.h>
+
+#include "app/l10n_util_mac.h"
+#import "base/cocoa_protocols_mac.h"
+#include "base/scoped_nsobject.h"
+#include "base/logging.h"
+#include "chrome/browser/tab_contents/tab_contents.h"
+#include "grit/generated_resources.h"
+
+// Helper object that will become a real NSWindowController in the future.
+@interface CookiePromptModalDialogHelper : NSObject<NSAlertDelegate> {
+ @private
+ scoped_nsobject<NSAlert> alert_;
+ scoped_nsobject<NSMatrix> matrix_;
+}
+
+- (id)initWithBridge:(CookiePromptModalDialog*)bridge;
+- (NSAlert*)alert;
+- (void)alertDidEnd:(NSAlert*)alert
+ returnCode:(int)returnCode
+ contextInfo:(void*)contextInfo;
+@end
+
+@implementation CookiePromptModalDialogHelper
+
+- (id)initWithBridge:(CookiePromptModalDialog*)bridge {
+ // The cookie confirmation dialog needs both a radio group and a disclosure
+ // triangle, so it's too complex to be shown as an NSAlert -- a custom window
+ // is required. However, that requires small modifications to the parent class
+ // AppModalDialog, so I'll do that in another CL.
+ if ((self = [super init])) {
+ alert_.reset([[NSAlert alloc] init]);
+
+ string16 displayHost = UTF8ToUTF16(bridge->origin().host());
+ int descriptionStringId =
+ bridge->dialog_type() == CookiePromptModalDialog::DIALOG_TYPE_COOKIE ?
+ IDS_COOKIE_ALERT_LABEL : IDS_DATA_ALERT_LABEL;
+ NSString* description =
+ l10n_util::GetNSStringF(descriptionStringId, displayHost);
+ NSString* allow =
+ l10n_util::GetNSStringWithFixup(IDS_COOKIE_ALERT_ALLOW_BUTTON);
+ NSString* block =
+ l10n_util::GetNSStringWithFixup(IDS_COOKIE_ALERT_BLOCK_BUTTON);
+
+ NSString* remember =
+ l10n_util::GetNSStringF(IDS_COOKIE_ALERT_REMEMBER_RADIO, displayHost);
+ NSString* ask = l10n_util::GetNSStringWithFixup(IDS_COOKIE_ALERT_ASK_RADIO);
+
+ scoped_nsobject<NSButtonCell> prototype([[NSButtonCell alloc] init]);
+ [prototype.get() setButtonType:NSRadioButton];
+ matrix_.reset(
+ [[NSMatrix alloc] initWithFrame:NSZeroRect
+ mode:NSRadioModeMatrix
+ prototype:prototype
+ numberOfRows:2
+ numberOfColumns:1]);
+ NSArray *cellArray = [matrix_.get() cells];
+ [[cellArray objectAtIndex:0] setTitle:remember];
+ [[cellArray objectAtIndex:1] setTitle:ask];
+ [matrix_.get() sizeToFit];
+ [alert_.get() setAccessoryView:matrix_.get()];
+
+ [alert_.get() setMessageText:description];
+ [alert_.get() addButtonWithTitle:allow];
+ [alert_.get() addButtonWithTitle:block];
+ }
+ return self;
+}
+
+- (NSAlert*)alert {
+ return alert_.get();
+}
+
+// |contextInfo| is the bridge back to the C++ CookiePromptModalDialog.
+- (void)alertDidEnd:(NSAlert*)alert
+ returnCode:(int)returnCode
+ contextInfo:(void*)contextInfo {
+ CookiePromptModalDialog* bridge =
+ reinterpret_cast<CookiePromptModalDialog*>(contextInfo);
+ bool remember = [matrix_.get() selectedRow] == 0;
+ switch (returnCode) {
+ case NSAlertFirstButtonReturn: { // OK
+ bool sessionExpire = false;
+ bridge->AllowSiteData(remember, sessionExpire);
+ break;
+ }
+ case NSAlertSecondButtonReturn: { // Cancel
+ bridge->BlockSiteData(remember);
+ break;
+ }
+ case NSRunStoppedResponse: { // Window was closed underneath us
+ remember = false;
+ bridge->BlockSiteData(remember);
+ break;
+ }
+ default: {
+ NOTREACHED();
+ remember = false;
+ bridge->BlockSiteData(remember);
+ }
+ }
+}
+@end
+
+void CookiePromptModalDialog::CreateAndShowDialog() {
+ scoped_nsobject<CookiePromptModalDialogHelper> helper(
+ [[CookiePromptModalDialogHelper alloc] initWithBridge:this]);
+ NSAlert* alert = [helper alert];
+ DCHECK(alert);
+
+ NSInteger result = [alert runModal];
+ [helper.get() alertDidEnd:alert returnCode:result contextInfo:this];
+
+ // Other than JavaScriptAppModalDialog, the cross-platform part of this class
+ // does not call |CompleteDialog()|, an explicit call is required.
+ CompleteDialog();
+ Cleanup();
+ delete this;
+}
+
+// The functions below are used by the (windows-only) automation framework.
+int CookiePromptModalDialog::GetDialogButtons() {
+ NOTIMPLEMENTED();
+ return 0;
+}
+
+void CookiePromptModalDialog::AcceptWindow() {
+ NOTIMPLEMENTED();
+}
+
+void CookiePromptModalDialog::CancelWindow() {
+ NOTIMPLEMENTED();
+}
+
+// This is only used by the app-modal dialog machinery on windows.
+NativeDialog CookiePromptModalDialog::CreateNativeDialog() {
+ NOTIMPLEMENTED();
+ return nil;
+}