summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorthakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-24 05:10:34 +0000
committerthakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-02-24 05:10:34 +0000
commitd615a7a8efa0699aaccf39f8adcbe120b735b626 (patch)
tree981ac0e401191fc9ac9515278de84e252a2c7a91
parent54371feaa7f5719180eaeb7e22a460b570f10b30 (diff)
downloadchromium_src-d615a7a8efa0699aaccf39f8adcbe120b735b626.zip
chromium_src-d615a7a8efa0699aaccf39f8adcbe120b735b626.tar.gz
chromium_src-d615a7a8efa0699aaccf39f8adcbe120b735b626.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. Committed: http://src.chromium.org/viewvc/chrome?view=rev&revision=39756 Review URL: http://codereview.chromium.org/650206 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@39867 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/cookie_modal_dialog.cc1
-rw-r--r--chrome/browser/cookie_modal_dialog.h3
-rw-r--r--chrome/browser/cookie_modal_dialog_mac.mm144
-rw-r--r--chrome/browser/js_modal_dialog_mac.mm2
-rw-r--r--chrome/browser/message_box_handler.cc9
-rwxr-xr-xchrome/chrome_browser.gypi2
6 files changed, 153 insertions, 8 deletions
diff --git a/chrome/browser/cookie_modal_dialog.cc b/chrome/browser/cookie_modal_dialog.cc
index a744fdf..e655d3a 100644
--- a/chrome/browser/cookie_modal_dialog.cc
+++ b/chrome/browser/cookie_modal_dialog.cc
@@ -8,7 +8,6 @@
#include "chrome/browser/pref_service.h"
#include "chrome/browser/profile.h"
#include "chrome/browser/tab_contents/tab_contents.h"
-#include "chrome/browser/views/cookie_prompt_view.h"
#include "chrome/common/pref_names.h"
// Cookies
diff --git a/chrome/browser/cookie_modal_dialog.h b/chrome/browser/cookie_modal_dialog.h
index 04fedae..11b35a1 100644
--- a/chrome/browser/cookie_modal_dialog.h
+++ b/chrome/browser/cookie_modal_dialog.h
@@ -50,6 +50,9 @@ class CookiePromptModalDialog : public AppModalDialog {
static void RegisterPrefs(PrefService* prefs);
// AppModalDialog overrides.
+#if defined(OS_LINUX) || defined(OS_MACOSX)
+ virtual void CreateAndShowDialog();
+#endif
virtual int GetDialogButtons();
virtual void AcceptWindow();
virtual void CancelWindow();
diff --git a/chrome/browser/cookie_modal_dialog_mac.mm b/chrome/browser/cookie_modal_dialog_mac.mm
new file mode 100644
index 0000000..29ca336
--- /dev/null
+++ b/chrome/browser/cookie_modal_dialog_mac.mm
@@ -0,0 +1,144 @@
+// 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
+ 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 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;
+}
diff --git a/chrome/browser/js_modal_dialog_mac.mm b/chrome/browser/js_modal_dialog_mac.mm
index 8519433..9ab04d8 100644
--- a/chrome/browser/js_modal_dialog_mac.mm
+++ b/chrome/browser/js_modal_dialog_mac.mm
@@ -151,6 +151,7 @@ void JavaScriptAppModalDialog::CreateAndShowDialog() {
[[alert window] makeFirstResponder:field];
}
+// The functions below are used by the automation framework.
int JavaScriptAppModalDialog::GetDialogButtons() {
NOTIMPLEMENTED();
return 0;
@@ -164,6 +165,7 @@ void JavaScriptAppModalDialog::CancelWindow() {
NOTIMPLEMENTED();
}
+// This is only used by the app-modal dialog machinery on windows.
NativeDialog JavaScriptAppModalDialog::CreateNativeDialog() {
NOTIMPLEMENTED();
return nil;
diff --git a/chrome/browser/message_box_handler.cc b/chrome/browser/message_box_handler.cc
index 3c249d2..a92bbf7 100644
--- a/chrome/browser/message_box_handler.cc
+++ b/chrome/browser/message_box_handler.cc
@@ -63,13 +63,12 @@ void RunCookiePrompt(TabContents* tab_contents,
const GURL& origin,
const std::string& cookie_line,
CookiePromptModalDialogDelegate* delegate) {
-#if defined(OS_WIN)
+#if defined(OS_WIN) || defined(OS_MACOSX)
Singleton<AppModalDialogQueue>()->AddDialog(
new CookiePromptModalDialog(tab_contents, host_content_settings_map,
origin, cookie_line, delegate));
#else
// Linux: http://crbug.com/35178
- // Mac: http://crbug.com/34894
NOTIMPLEMENTED();
delegate->BlockSiteData();
#endif
@@ -82,13 +81,12 @@ void RunLocalStoragePrompt(
const string16& key,
const string16& value,
CookiePromptModalDialogDelegate* delegate) {
-#if defined(OS_WIN)
+#if defined(OS_WIN) || defined(OS_MACOSX)
Singleton<AppModalDialogQueue>()->AddDialog(
new CookiePromptModalDialog(tab_contents, host_content_settings_map,
origin, key, value, delegate));
#else
// Linux: http://crbug.com/35178
- // Mac: http://crbug.com/34894
NOTIMPLEMENTED();
delegate->BlockSiteData();
#endif
@@ -100,13 +98,12 @@ void RunDatabasePrompt(
const GURL& origin,
const string16& database_name,
CookiePromptModalDialogDelegate* delegate) {
-#if defined(OS_WIN)
+#if defined(OS_WIN) || defined(OS_MACOSX)
Singleton<AppModalDialogQueue>()->AddDialog(
new CookiePromptModalDialog(tab_contents, host_content_settings_map,
origin, database_name, delegate));
#else
// Linux: http://crbug.com/35178
- // Mac: http://crbug.com/34894
NOTIMPLEMENTED();
delegate->BlockSiteData();
#endif
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index 6d21f79..61bb1eb 100755
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -713,6 +713,7 @@
'browser/content_exceptions_table_model.h',
'browser/cookie_modal_dialog.cc',
'browser/cookie_modal_dialog.h',
+ 'browser/cookie_modal_dialog_mac.mm',
'browser/cookie_modal_dialog_views.cc',
'browser/cookie_prompt_modal_dialog_delegate.h',
'browser/cookies_tree_model.cc',
@@ -2262,7 +2263,6 @@
'browser/automation/automation_provider_list_generic.cc',
'browser/bookmarks/bookmark_context_menu.cc',
'browser/bookmarks/bookmark_drop_info.cc',
- 'browser/cookie_modal_dialog.cc',
'browser/dock_info.cc',
'browser/jankometer.cc',
'browser/password_manager/password_store_gnome.h',