diff options
author | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-24 05:10:34 +0000 |
---|---|---|
committer | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-02-24 05:10:34 +0000 |
commit | d615a7a8efa0699aaccf39f8adcbe120b735b626 (patch) | |
tree | 981ac0e401191fc9ac9515278de84e252a2c7a91 | |
parent | 54371feaa7f5719180eaeb7e22a460b570f10b30 (diff) | |
download | chromium_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.cc | 1 | ||||
-rw-r--r-- | chrome/browser/cookie_modal_dialog.h | 3 | ||||
-rw-r--r-- | chrome/browser/cookie_modal_dialog_mac.mm | 144 | ||||
-rw-r--r-- | chrome/browser/js_modal_dialog_mac.mm | 2 | ||||
-rw-r--r-- | chrome/browser/message_box_handler.cc | 9 | ||||
-rwxr-xr-x | chrome/chrome_browser.gypi | 2 |
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', |