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

Unified Diff: chrome/browser/autofill/autofill_dialog_controller_mac.mm

Issue 6621076: [Mac] Remove native/Cocoa preferences. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase switch removal Created 9 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: chrome/browser/autofill/autofill_dialog_controller_mac.mm
diff --git a/chrome/browser/autofill/autofill_dialog_controller_mac.mm b/chrome/browser/autofill/autofill_dialog_controller_mac.mm
deleted file mode 100644
index 483f93685286208044c27ea096a47680769e1981..0000000000000000000000000000000000000000
--- a/chrome/browser/autofill/autofill_dialog_controller_mac.mm
+++ /dev/null
@@ -1,942 +0,0 @@
-// Copyright (c) 2011 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 "base/lazy_instance.h"
-#include "base/mac/mac_util.h"
-#include "base/sys_string_conversions.h"
-#import "chrome/browser/autofill/autofill-inl.h"
-#import "chrome/browser/autofill/autofill_address_model_mac.h"
-#import "chrome/browser/autofill/autofill_address_sheet_controller_mac.h"
-#import "chrome/browser/autofill/autofill_credit_card_model_mac.h"
-#import "chrome/browser/autofill/autofill_credit_card_sheet_controller_mac.h"
-#import "chrome/browser/autofill/autofill_dialog_controller_mac.h"
-#import "chrome/browser/autofill/personal_data_manager.h"
-#include "chrome/browser/browser_process.h"
-#include "chrome/browser/prefs/pref_service.h"
-#include "chrome/browser/profiles/profile.h"
-#include "chrome/browser/ui/browser.h"
-#include "chrome/browser/ui/browser_list.h"
-#import "chrome/browser/ui/cocoa/window_size_autosaver.h"
-#include "chrome/common/pref_names.h"
-#include "content/common/notification_details.h"
-#include "content/common/notification_observer.h"
-#include "grit/app_resources.h"
-#include "grit/generated_resources.h"
-#include "grit/theme_resources.h"
-#include "ui/base/l10n/l10n_util.h"
-#include "ui/base/resource/resource_bundle.h"
-#include "ui/gfx/image.h"
-
-namespace {
-
-// Type for singleton object that contains the instance of the visible
-// dialog.
-typedef std::map<Profile*, AutoFillDialogController*> ProfileControllerMap;
-
-static base::LazyInstance<ProfileControllerMap> g_profile_controller_map(
- base::LINKER_INITIALIZED);
-
-} // namespace
-
-// Delegate protocol that needs to be in place for the AutoFillTableView's
-// handling of delete and backspace keys.
-@protocol DeleteKeyDelegate
-- (IBAction)deleteSelection:(id)sender;
-@end
-
-// A subclass of NSTableView that allows for deleting selected elements using
-// the delete or backspace keys.
-@interface AutoFillTableView : NSTableView {
-}
-@end
-
-@implementation AutoFillTableView
-
-// We override the keyDown method to dispatch the |deleteSelection:| action
-// when the user presses the delete or backspace keys. Note a delegate must
-// be present that conforms to the DeleteKeyDelegate protocol.
-- (void)keyDown:(NSEvent *)event {
- id object = [self delegate];
- unichar c = [[event characters] characterAtIndex: 0];
-
- // If the user pressed delete and the delegate supports deleteSelection:
- if ((c == NSDeleteFunctionKey ||
- c == NSDeleteCharFunctionKey ||
- c == NSDeleteCharacter) &&
- [object respondsToSelector:@selector(deleteSelection:)]) {
- id <DeleteKeyDelegate> delegate = (id <DeleteKeyDelegate>) object;
-
- [delegate deleteSelection:self];
- } else {
- [super keyDown:event];
- }
-}
-
-@end
-
-// Private interface.
-@interface AutoFillDialogController (PrivateMethods)
-// Save profiles and credit card information after user modification.
-- (void)save;
-
-// Asyncronous handler for when PersonalDataManager data loads. The
-// personal data manager notifies the dialog with this method when the
-// data loading is complete and ready to be used.
-- (void)onPersonalDataLoaded:(const std::vector<AutoFillProfile*>&)profiles
- creditCards:(const std::vector<CreditCard*>&)creditCards;
-
-// Asyncronous handler for when PersonalDataManager data changes. The
-// personal data manager notifies the dialog with this method when the
-// data has changed.
-- (void)onPersonalDataChanged:(const std::vector<AutoFillProfile*>&)profiles
- creditCards:(const std::vector<CreditCard*>&)creditCards;
-
-// Called upon changes to AutoFill preferences that should be reflected in the
-// UI.
-- (void)preferenceDidChange:(const std::string&)preferenceName;
-
-// Adjust the selected index when underlying data changes.
-// Selects the previous row if possible, else current row, else deselect all.
-- (void) adjustSelectionOnDelete:(NSInteger)selectedRow;
-
-// Adjust the selected index when underlying data changes.
-// Selects the current row if possible, else previous row, else deselect all.
-- (void) adjustSelectionOnReload:(NSInteger)selectedRow;
-
-// Returns true if |row| is an index to a valid profile in |tableView_|, and
-// false otherwise.
-- (BOOL)isProfileRow:(NSInteger)row;
-
-// Returns true if |row| is an index to the profile group row in |tableView_|,
-// and false otherwise.
-- (BOOL)isProfileGroupRow:(NSInteger)row;
-
-// Returns true if |row| is an index to a valid credit card in |tableView_|, and
-// false otherwise.
-- (BOOL)isCreditCardRow:(NSInteger)row;
-
-// Returns true if |row| is the index to the credit card group row in
-// |tableView_|, and false otherwise.
-- (BOOL)isCreditCardGroupRow:(NSInteger)row;
-
-// Returns the index to |profiles_| of the corresponding |row| in |tableView_|.
-- (size_t)profileIndexFromRow:(NSInteger)row;
-
-// Returns the index to |creditCards_| of the corresponding |row| in
-// |tableView_|.
-- (size_t)creditCardIndexFromRow:(NSInteger)row;
-
-// Returns the |row| in |tableView_| that corresponds to the index |i| into
-// |profiles_|.
-- (NSInteger)rowFromProfileIndex:(size_t)i;
-
-// Returns the |row| in |tableView_| that corresponds to the index |i| into
-// |creditCards_|.
-- (NSInteger)rowFromCreditCardIndex:(size_t)row;
-
-@end
-
-namespace AutoFillDialogControllerInternal {
-
-// PersonalDataManagerObserver facilitates asynchronous loading of
-// PersonalDataManager data before showing the AutoFill settings data to the
-// user. It acts as a C++-based delegate for the |AutoFillDialogController|.
-class PersonalDataManagerObserver : public PersonalDataManager::Observer {
- public:
- explicit PersonalDataManagerObserver(
- AutoFillDialogController* controller,
- PersonalDataManager* personal_data_manager,
- Profile* profile)
- : controller_(controller),
- personal_data_manager_(personal_data_manager),
- profile_(profile) {
- }
-
- virtual ~PersonalDataManagerObserver();
-
- // Notifies the observer that the PersonalDataManager has finished loading.
- virtual void OnPersonalDataLoaded();
-
- // Notifies the observer that the PersonalDataManager data has changed.
- virtual void OnPersonalDataChanged();
-
- private:
- // Utility method to remove |this| from |personal_data_manager_| as an
- // observer.
- void RemoveObserver();
-
- // The dialog controller to be notified when the data loading completes.
- // Weak reference.
- AutoFillDialogController* controller_;
-
- // The object in which we are registered as an observer. We hold on to
- // it to facilitate un-registering ourself in the destructor and in the
- // |OnPersonalDataLoaded| method. This may be NULL.
- // Weak reference.
- PersonalDataManager* personal_data_manager_;
-
- // Profile of caller. Held as weak reference. May not be NULL.
- Profile* profile_;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(PersonalDataManagerObserver);
-};
-
-// During destruction ensure that we are removed from the
-// |personal_data_manager_| as an observer.
-PersonalDataManagerObserver::~PersonalDataManagerObserver() {
- RemoveObserver();
-}
-
-void PersonalDataManagerObserver::RemoveObserver() {
- if (personal_data_manager_) {
- personal_data_manager_->RemoveObserver(this);
- }
-}
-
-// The data has been loaded, notify the controller.
-void PersonalDataManagerObserver::OnPersonalDataLoaded() {
- [controller_ onPersonalDataLoaded:personal_data_manager_->web_profiles()
- creditCards:personal_data_manager_->credit_cards()];
-}
-
-// The data has changed, notify the controller.
-void PersonalDataManagerObserver::OnPersonalDataChanged() {
- [controller_ onPersonalDataChanged:personal_data_manager_->web_profiles()
- creditCards:personal_data_manager_->credit_cards()];
-}
-
-// Bridges preference changed notifications to the dialog controller.
-class PreferenceObserver : public NotificationObserver {
- public:
- explicit PreferenceObserver(AutoFillDialogController* controller)
- : controller_(controller) {}
-
- // Overridden from NotificationObserver:
- virtual void Observe(NotificationType type,
- const NotificationSource& source,
- const NotificationDetails& details) {
- if (type == NotificationType::PREF_CHANGED) {
- const std::string* pref = Details<std::string>(details).ptr();
- if (pref) {
- [controller_ preferenceDidChange:*pref];
- }
- }
- }
-
- private:
- AutoFillDialogController* controller_;
-
- DISALLOW_COPY_AND_ASSIGN(PreferenceObserver);
-};
-
-} // namespace AutoFillDialogControllerInternal
-
-@implementation AutoFillDialogController
-
-@synthesize autoFillManaged = autoFillManaged_;
-@synthesize autoFillManagedAndDisabled = autoFillManagedAndDisabled_;
-@synthesize itemIsSelected = itemIsSelected_;
-@synthesize multipleSelected = multipleSelected_;
-
-+ (void)showAutoFillDialogWithObserver:(AutoFillDialogObserver*)observer
- profile:(Profile*)profile {
- AutoFillDialogController* controller =
- [AutoFillDialogController controllerWithObserver:observer
- profile:profile];
- [controller runModelessDialog];
-}
-
-- (void)awakeFromNib {
- PersonalDataManager* personal_data_manager =
- profile_->GetPersonalDataManager();
- DCHECK(personal_data_manager);
-
- if (personal_data_manager->IsDataLoaded()) {
- // |personalDataManager| data is loaded, we can proceed with the contents.
- [self onPersonalDataLoaded:personal_data_manager->web_profiles()
- creditCards:personal_data_manager->credit_cards()];
- }
-
- // Register as listener to listen to subsequent data change notifications.
- personalDataManagerObserver_.reset(
- new AutoFillDialogControllerInternal::PersonalDataManagerObserver(
- self, personal_data_manager, profile_));
- personal_data_manager->SetObserver(personalDataManagerObserver_.get());
-
- // Explicitly load the data in the table before window displays to avoid
- // nasty flicker as tables update.
- [tableView_ reloadData];
-
- // Set up edit when double-clicking on a table row.
- [tableView_ setDoubleAction:@selector(editSelection:)];
-}
-
-// NSWindow Delegate callback. When the window closes the controller can
-// be released.
-- (void)windowWillClose:(NSNotification *)notification {
- [tableView_ setDataSource:nil];
- [tableView_ setDelegate:nil];
- [self autorelease];
-
- // Remove ourself from the map.
- ProfileControllerMap* map = g_profile_controller_map.Pointer();
- ProfileControllerMap::iterator it = map->find(profile_);
- if (it != map->end()) {
- map->erase(it);
- }
-}
-
-// Invokes the "Add" sheet for address information. If user saves then the new
-// information is added to |profiles_| in |addressAddDidEnd:| method.
-- (IBAction)addNewAddress:(id)sender {
- DCHECK(!addressSheetController.get());
-
- // Create a new default address.
- AutoFillProfile newAddress;
-
- // Create a new address sheet controller in "Add" mode.
- addressSheetController.reset(
- [[AutoFillAddressSheetController alloc]
- initWithProfile:newAddress
- mode:kAutoFillAddressAddMode]);
-
- // Show the sheet.
- [NSApp beginSheet:[addressSheetController window]
- modalForWindow:[self window]
- modalDelegate:self
- didEndSelector:@selector(addressAddDidEnd:returnCode:contextInfo:)
- contextInfo:NULL];
-}
-
-// Invokes the "Add" sheet for credit card information. If user saves then the
-// new information is added to |creditCards_| in |creditCardAddDidEnd:| method.
-- (IBAction)addNewCreditCard:(id)sender {
- DCHECK(!creditCardSheetController.get());
-
- // Create a new default credit card.
- CreditCard newCreditCard;
-
- // Create a new address sheet controller in "Add" mode.
- creditCardSheetController.reset(
- [[AutoFillCreditCardSheetController alloc]
- initWithCreditCard:newCreditCard
- mode:kAutoFillCreditCardAddMode]);
-
- // Show the sheet.
- [NSApp beginSheet:[creditCardSheetController window]
- modalForWindow:[self window]
- modalDelegate:self
- didEndSelector:@selector(creditCardAddDidEnd:returnCode:contextInfo:)
- contextInfo:NULL];
-}
-
-// Add address sheet was dismissed. Non-zero |returnCode| indicates a save.
-- (void)addressAddDidEnd:(NSWindow*)sheet
- returnCode:(int)returnCode
- contextInfo:(void*)contextInfo {
- DCHECK(!contextInfo);
-
- if (returnCode) {
- // Create a new address and save it to the |profiles_| list.
- AutoFillProfile newAddress;
- [addressSheetController copyModelToProfile:&newAddress];
- if (!newAddress.IsEmpty() && !FindByContents(profiles_, newAddress)) {
- profiles_.push_back(newAddress);
-
- // Saving will save to the PDM and the table will refresh when PDM sends
- // notification that the underlying model has changed.
- [self save];
-
- // Update the selection to the newly added item.
- NSInteger row = [self rowFromProfileIndex:profiles_.size() - 1];
- [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:row]
- byExtendingSelection:NO];
- }
- }
- [sheet orderOut:self];
- addressSheetController.reset(nil);
-}
-
-// Add credit card sheet was dismissed. Non-zero |returnCode| indicates a save.
-- (void)creditCardAddDidEnd:(NSWindow*)sheet
- returnCode:(int)returnCode
- contextInfo:(void*)contextInfo {
- DCHECK(!contextInfo);
-
- if (returnCode) {
- // Create a new credit card and save it to the |creditCards_| list.
- CreditCard newCreditCard;
- [creditCardSheetController copyModelToCreditCard:&newCreditCard];
- if (!newCreditCard.IsEmpty() &&
- !FindByContents(creditCards_, newCreditCard)) {
- creditCards_.push_back(newCreditCard);
-
- // Saving will save to the PDM and the table will refresh when PDM sends
- // notification that the underlying model has changed.
- [self save];
-
- // Update the selection to the newly added item.
- NSInteger row = [self rowFromCreditCardIndex:creditCards_.size() - 1];
- [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:row]
- byExtendingSelection:NO];
- }
- }
- [sheet orderOut:self];
- creditCardSheetController.reset(nil);
-}
-
-// Deletes selected items; either addresses, credit cards, or a mixture of the
-// two depending on the items selected.
-- (IBAction)deleteSelection:(id)sender {
- NSIndexSet* selection = [tableView_ selectedRowIndexes];
- NSInteger selectedRow = [tableView_ selectedRow];
-
- // Loop through from last to first deleting selected items as we go.
- for (NSUInteger i = [selection lastIndex];
- i != NSNotFound;
- i = [selection indexLessThanIndex:i]) {
- // We keep track of the "top most" selection in the list so we know where
- // to set new selection below.
- selectedRow = i;
-
- if ([self isProfileRow:i]) {
- profiles_.erase(
- profiles_.begin() + [self profileIndexFromRow:i]);
- } else if ([self isCreditCardRow:i]) {
- creditCards_.erase(
- creditCards_.begin() + [self creditCardIndexFromRow:i]);
- }
- }
-
- // Select the previous row if possible, else current row, else deselect all.
- [self adjustSelectionOnDelete:selectedRow];
-
- // Saving will save to the PDM and the table will refresh when PDM sends
- // notification that the underlying model has changed.
- [self save];
-}
-
-// Edits the selected item, either address or credit card depending on the item
-// selected.
-- (IBAction)editSelection:(id)sender {
- NSInteger selectedRow = [tableView_ selectedRow];
- if ([self isProfileRow:selectedRow]) {
- if (!addressSheetController.get()) {
- int i = [self profileIndexFromRow:selectedRow];
-
- // Create a new address sheet controller in "Edit" mode.
- addressSheetController.reset(
- [[AutoFillAddressSheetController alloc]
- initWithProfile:profiles_[i]
- mode:kAutoFillAddressEditMode]);
-
- // Show the sheet.
- [NSApp beginSheet:[addressSheetController window]
- modalForWindow:[self window]
- modalDelegate:self
- didEndSelector:@selector(addressEditDidEnd:returnCode:contextInfo:)
- contextInfo:&profiles_[i]];
- }
- } else if ([self isCreditCardRow:selectedRow]) {
- if (!creditCardSheetController.get()) {
- int i = [self creditCardIndexFromRow:selectedRow];
-
- // Create a new credit card sheet controller in "Edit" mode.
- creditCardSheetController.reset(
- [[AutoFillCreditCardSheetController alloc]
- initWithCreditCard:creditCards_[i]
- mode:kAutoFillCreditCardEditMode]);
-
- // Show the sheet.
- [NSApp beginSheet:[creditCardSheetController window]
- modalForWindow:[self window]
- modalDelegate:self
- didEndSelector:@selector(creditCardEditDidEnd:returnCode:contextInfo:)
- contextInfo:&creditCards_[i]];
- }
- }
-}
-
-// Navigates to the AutoFill help url.
-- (IBAction)openHelp:(id)sender {
- Browser* browser = BrowserList::GetLastActive();
-
- if (!browser || !browser->GetSelectedTabContents())
- browser = Browser::Create(profile_);
- browser->OpenAutoFillHelpTabAndActivate();
-}
-
-// Edit address sheet was dismissed. Non-zero |returnCode| indicates a save.
-- (void)addressEditDidEnd:(NSWindow *)sheet
- returnCode:(int)returnCode
- contextInfo:(void *)contextInfo {
- DCHECK(contextInfo != NULL);
- if (returnCode) {
- AutoFillProfile* profile = static_cast<AutoFillProfile*>(contextInfo);
- [addressSheetController copyModelToProfile:profile];
-
- if (profile->IsEmpty())
- [tableView_ deselectAll:self];
- profiles_.erase(
- std::remove_if(profiles_.begin(), profiles_.end(),
- std::mem_fun_ref(&AutoFillProfile::IsEmpty)),
- profiles_.end());
-
- // Saving will save to the PDM and the table will refresh when PDM sends
- // notification that the underlying model has changed.
- [self save];
- }
- [sheet orderOut:self];
- addressSheetController.reset(nil);
-}
-
-// Edit credit card sheet was dismissed. Non-zero |returnCode| indicates a
-// save.
-- (void)creditCardEditDidEnd:(NSWindow *)sheet
- returnCode:(int)returnCode
- contextInfo:(void *)contextInfo {
- DCHECK(contextInfo != NULL);
- if (returnCode) {
- CreditCard* creditCard = static_cast<CreditCard*>(contextInfo);
- [creditCardSheetController copyModelToCreditCard:creditCard];
-
- if (creditCard->IsEmpty())
- [tableView_ deselectAll:self];
- creditCards_.erase(
- std::remove_if(
- creditCards_.begin(), creditCards_.end(),
- std::mem_fun_ref(&CreditCard::IsEmpty)),
- creditCards_.end());
-
- // Saving will save to the PDM and the table will refresh when PDM sends
- // notification that the underlying model has changed.
- [self save];
- }
- [sheet orderOut:self];
- creditCardSheetController.reset(nil);
-}
-
-// NSTableView Delegate method.
-- (BOOL)tableView:(NSTableView *)tableView isGroupRow:(NSInteger)row {
- if ([self isProfileGroupRow:row] || [self isCreditCardGroupRow:row])
- return YES;
- return NO;
-}
-
-// NSTableView Delegate method.
-- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(NSInteger)row {
- return [self isProfileRow:row] || [self isCreditCardRow:row];
-}
-
-// NSTableView Delegate method.
-- (id)tableView:(NSTableView *)tableView
- objectValueForTableColumn:(NSTableColumn *)tableColumn
- row:(NSInteger)row {
- if ([[tableColumn identifier] isEqualToString:@"Spacer"])
- return @"";
-
- // Check that we're initialized before supplying data.
- if (tableView != tableView_)
- return @"";
-
- // Section label.
- if ([self isProfileGroupRow:row]) {
- if ([[tableColumn identifier] isEqualToString:@"Summary"])
- return l10n_util::GetNSString(IDS_AUTOFILL_ADDRESSES_GROUP_NAME);
- else
- return @"";
- }
-
- if (row < 0)
- return @"";
-
- // Data row.
- if ([self isProfileRow:row]) {
- if ([[tableColumn identifier] isEqualToString:@"Summary"]) {
- return SysUTF16ToNSString(
- profiles_[[self profileIndexFromRow:row]].Label());
- }
-
- return @"";
- }
-
- // Section label.
- if ([self isCreditCardGroupRow:row]) {
- if ([[tableColumn identifier] isEqualToString:@"Summary"])
- return l10n_util::GetNSString(IDS_AUTOFILL_CREDITCARDS_GROUP_NAME);
- else
- return @"";
- }
-
- // Data row.
- if ([self isCreditCardRow:row]) {
- if ([[tableColumn identifier] isEqualToString:@"Summary"]) {
- return SysUTF16ToNSString(
- creditCards_[
- [self creditCardIndexFromRow:row]].PreviewSummary());
- }
-
- return @"";
- }
-
- return @"";
-}
-
-// We implement this delegate method to update our |itemIsSelected| and
-// |multipleSelected| properties.
-// The "Edit..." and "Remove" buttons' enabled state depends on having a
-// valid selection in the table. The "Edit..." button depends on having
-// exactly one item selected.
-- (void)tableViewSelectionDidChange:(NSNotification *)aNotification {
- if ([tableView_ selectedRow] >= 0)
- [self setItemIsSelected:YES];
- else
- [self setItemIsSelected:NO];
-
- [self setMultipleSelected:([[tableView_ selectedRowIndexes] count] > 1UL)];
-}
-
-- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
- if (tableView == tableView_) {
- // 1 section header, the profiles, 1 section header, the credit cards.
- return 1 + profiles_.size() + 1 + creditCards_.size();
- }
-
- return 0;
-}
-
-// Accessor for |autoFillEnabled| preference state. Note: a checkbox in Nib
-// is bound to this via KVO.
-- (BOOL)autoFillEnabled {
- return autoFillEnabled_.GetValue();
-}
-
-// Setter for |autoFillEnabled| preference state.
-- (void)setAutoFillEnabled:(BOOL)value {
- autoFillEnabled_.SetValueIfNotManaged(value ? true : false);
-}
-
-// Accessor for |auxiliaryEnabled| preference state. Note: a checkbox in Nib
-// is bound to this via KVO.
-- (BOOL)auxiliaryEnabled {
- return auxiliaryEnabled_.GetValue();
-}
-
-// Setter for |auxiliaryEnabled| preference state.
-- (void)setAuxiliaryEnabled:(BOOL)value {
- if ([self autoFillEnabled])
- auxiliaryEnabled_.SetValueIfNotManaged(value ? true : false);
-}
-
-@end
-
-@implementation AutoFillDialogController (ExposedForUnitTests)
-
-+ (AutoFillDialogController*)
- controllerWithObserver:(AutoFillDialogObserver*)observer
- profile:(Profile*)profile {
- profile = profile->GetOriginalProfile();
-
- ProfileControllerMap* map = g_profile_controller_map.Pointer();
- DCHECK(map != NULL);
- ProfileControllerMap::iterator it = map->find(profile);
- if (it == map->end()) {
- // We should have exactly 1 or 0 entry in the map, no more. That is,
- // only one profile can have the AutoFill dialog up at a time.
- DCHECK_EQ(map->size(), 0U);
-
- // Deallocation is done upon window close. See |windowWillClose:|.
- AutoFillDialogController* controller =
- [[self alloc] initWithObserver:observer profile:profile];
- it = map->insert(std::make_pair(profile, controller)).first;
- }
-
- return it->second;
-}
-
-
-// This is the designated initializer for this class.
-// |profiles| are non-retained immutable list of AutoFill profiles.
-// |creditCards| are non-retained immutable list of credit card info.
-- (id)initWithObserver:(AutoFillDialogObserver*)observer
- profile:(Profile*)profile {
- DCHECK(profile);
- // Use initWithWindowNibPath: instead of initWithWindowNibName: so we
- // can override it in a unit test.
- NSString* nibpath = [base::mac::MainAppBundle()
- pathForResource:@"AutoFillDialog"
- ofType:@"nib"];
- if ((self = [super initWithWindowNibPath:nibpath owner:self])) {
- // Initialize member variables based on input.
- observer_ = observer;
- profile_ = profile;
-
- // Initialize the preference observer and watch kAutoFillEnabled.
- preferenceObserver_.reset(
- new AutoFillDialogControllerInternal::PreferenceObserver(self));
- autoFillEnabled_.Init(prefs::kAutoFillEnabled, profile_->GetPrefs(),
- preferenceObserver_.get());
-
- // Call |preferenceDidChange| in order to initialize UI state of the
- // checkbox.
- [self preferenceDidChange:prefs::kAutoFillEnabled];
-
- // Initialize the preference observer and watch
- // kAutoFillAuxiliaryProfilesEnabled.
- auxiliaryEnabled_.Init(prefs::kAutoFillAuxiliaryProfilesEnabled,
- profile_->GetPrefs(),
- preferenceObserver_.get());
-
- // Call |preferenceDidChange| in order to initialize UI state of the
- // checkbox.
- [self preferenceDidChange:prefs::kAutoFillAuxiliaryProfilesEnabled];
-
- // Do not use [NSMutableArray array] here; we need predictable destruction
- // which will be prevented by having a reference held by an autorelease
- // pool.
- }
- return self;
-}
-
-// Run modeless.
-- (void)runModelessDialog {
- // Use stored window geometry if it exists.
- if (g_browser_process && g_browser_process->local_state()) {
- sizeSaver_.reset([[WindowSizeAutosaver alloc]
- initWithWindow:[self window]
- prefService:g_browser_process->local_state()
- path:prefs::kAutoFillDialogPlacement]);
- }
-
- [self showWindow:nil];
-}
-
-// Close the dialog.
-- (void)closeDialog {
- [[self window] performClose:self];
-}
-
-- (AutoFillAddressSheetController*)addressSheetController {
- return addressSheetController.get();
-}
-
-- (AutoFillCreditCardSheetController*)creditCardSheetController {
- return creditCardSheetController.get();
-}
-
-- (void)selectAddressAtIndex:(size_t)i {
- [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:
- [self rowFromProfileIndex:i]]
- byExtendingSelection:NO];
-}
-
-- (void)selectCreditCardAtIndex:(size_t)i {
- [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:
- [self rowFromCreditCardIndex:i]]
- byExtendingSelection:NO];
-}
-
-- (void)addSelectedAddressAtIndex:(size_t)i {
- [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:
- [self rowFromProfileIndex:i]]
- byExtendingSelection:YES];
-}
-
-- (void)addSelectedCreditCardAtIndex:(size_t)i {
- [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:
- [self rowFromCreditCardIndex:i]]
- byExtendingSelection:YES];
-}
-
-- (BOOL)editButtonEnabled {
- return [editButton_ isEnabled];
-}
-
-- (std::vector<AutoFillProfile>&)profiles {
- return profiles_;
-}
-
-- (std::vector<CreditCard>&)creditCards {
- return creditCards_;
-}
-
-@end
-
-@implementation AutoFillDialogController (PrivateMethods)
-
-// Called when the user modifies the profiles or credit card information.
-- (void)save {
- // If we have an |observer_| then communicate the changes back, unless
- // AutoFill has been disabled through policy in the mean time.
- if (observer_ && !autoFillManagedAndDisabled_) {
- // Make a working copy of profiles. |OnAutoFillDialogApply| can mutate
- // |profiles_|.
- std::vector<AutoFillProfile> profiles = profiles_;
-
- // Make a working copy of credit cards. |OnAutoFillDialogApply| can mutate
- // |creditCards_|.
- std::vector<CreditCard> creditCards = creditCards_;
-
- observer_->OnAutoFillDialogApply(&profiles, &creditCards);
- }
-}
-
-- (void)onPersonalDataLoaded:(const std::vector<AutoFillProfile*>&)profiles
- creditCards:(const std::vector<CreditCard*>&)creditCards {
- [self onPersonalDataChanged:profiles creditCards:creditCards];
-}
-
-- (void)onPersonalDataChanged:(const std::vector<AutoFillProfile*>&)profiles
- creditCards:(const std::vector<CreditCard*>&)creditCards {
- // Make local copy of |profiles|.
- profiles_.clear();
- for (std::vector<AutoFillProfile*>::const_iterator iter = profiles.begin();
- iter != profiles.end(); ++iter)
- profiles_.push_back(**iter);
-
- // Make local copy of |creditCards|.
- creditCards_.clear();
- for (std::vector<CreditCard*>::const_iterator iter = creditCards.begin();
- iter != creditCards.end(); ++iter)
- creditCards_.push_back(**iter);
-
- [self adjustSelectionOnReload:[tableView_ selectedRow]];
- [tableView_ reloadData];
-}
-
-- (void)preferenceDidChange:(const std::string&)preferenceName {
- if (preferenceName == prefs::kAutoFillEnabled) {
- [self setAutoFillEnabled:autoFillEnabled_.GetValue()];
- [self setAutoFillManaged:autoFillEnabled_.IsManaged()];
- [self setAutoFillManagedAndDisabled:
- autoFillEnabled_.IsManaged() && !autoFillEnabled_.GetValue()];
- } else if (preferenceName == prefs::kAutoFillAuxiliaryProfilesEnabled) {
- [self setAuxiliaryEnabled:auxiliaryEnabled_.GetValue()];
- } else {
- NOTREACHED();
- }
-}
-
-- (void) adjustSelectionOnDelete:(NSInteger)selectedRow {
- if ([self tableView:tableView_ shouldSelectRow:selectedRow-1]) {
- [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:selectedRow-1]
- byExtendingSelection:NO];
- } else if ([self tableView:tableView_ shouldSelectRow:selectedRow]) {
- [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:selectedRow]
- byExtendingSelection:NO];
- } else {
- [tableView_ deselectAll:self];
- }
-}
-
-- (void) adjustSelectionOnReload:(NSInteger)selectedRow {
- if ([self tableView:tableView_ shouldSelectRow:selectedRow]) {
- [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:selectedRow]
- byExtendingSelection:NO];
- } else if ([self tableView:tableView_ shouldSelectRow:selectedRow-1]) {
- [tableView_ selectRowIndexes:[NSIndexSet indexSetWithIndex:selectedRow-1]
- byExtendingSelection:NO];
- } else {
- [tableView_ deselectAll:self];
- }
-}
-
-- (BOOL)isProfileRow:(NSInteger)row {
- if (row > 0 && static_cast<size_t>(row) <= profiles_.size())
- return YES;
- return NO;
-}
-
-- (BOOL)isProfileGroupRow:(NSInteger)row {
- if (row == 0)
- return YES;
- return NO;
-}
-
-- (BOOL)isCreditCardRow:(NSInteger)row {
- if (row > 0 &&
- static_cast<size_t>(row) >= profiles_.size() + 2 &&
- static_cast<size_t>(row) <= profiles_.size() + creditCards_.size() + 1)
- return YES;
- return NO;
-}
-
-- (BOOL)isCreditCardGroupRow:(NSInteger)row {
- if (row > 0 && static_cast<size_t>(row) == profiles_.size() + 1)
- return YES;
- return NO;
-}
-
-- (size_t)profileIndexFromRow:(NSInteger)row {
- DCHECK([self isProfileRow:row]);
- return static_cast<size_t>(row) - 1;
-}
-
-- (size_t)creditCardIndexFromRow:(NSInteger)row {
- DCHECK([self isCreditCardRow:row]);
- return static_cast<size_t>(row) - (profiles_.size() + 2);
-}
-
-- (NSInteger)rowFromProfileIndex:(size_t)i {
- return 1 + i;
-}
-
-- (NSInteger)rowFromCreditCardIndex:(size_t)i {
- return 1 + profiles_.size() + 1 + i;
-}
-
-@end
-
-// An NSValueTransformer subclass for use in validation of phone number
-// fields. Transforms an invalid phone number string into a warning image.
-// This data transformer is used in the credit card sheet for invalid phone and
-// fax numbers.
-@interface InvalidPhoneTransformer : NSValueTransformer {
-}
-@end
-
-@implementation InvalidPhoneTransformer
-+ (Class)transformedValueClass {
- return [NSImage class];
-}
-
-+ (BOOL)allowsReverseTransformation {
- return NO;
-}
-
-- (id)transformedValue:(id)string {
- NSImage* image = nil;
- ResourceBundle& rb = ResourceBundle::GetSharedInstance();
-
- // We display no validation icon when input has not yet been entered.
- if (string == nil || [string length] == 0)
- return nil;
-
- // If we have input then display alert icon if we have an invalid number.
- if (string != nil && [string length] != 0) {
- // TODO(dhollowa): Using SetInfo() call to validate phone number. Should
- // have explicit validation method. More robust validation is needed as
- // well eventually.
- AutoFillProfile profile;
- profile.SetInfo(AutofillType(PHONE_HOME_WHOLE_NUMBER),
- base::SysNSStringToUTF16(string));
- if (profile.GetFieldText(AutofillType(PHONE_HOME_WHOLE_NUMBER)).empty()) {
- image = rb.GetNativeImageNamed(IDR_INPUT_ALERT);
- DCHECK(image);
- return image;
- }
- }
-
- // No alert icon, so must be valid input.
- if (!image) {
- image = rb.GetNativeImageNamed(IDR_INPUT_GOOD);
- DCHECK(image);
- return image;
- }
-
- return nil;
-}
-
-@end

Powered by Google App Engine
This is Rietveld 408576698