diff options
Diffstat (limited to 'chrome/browser/autofill')
4 files changed, 149 insertions, 9 deletions
diff --git a/chrome/browser/autofill/autofill_dialog_controller_mac.h b/chrome/browser/autofill/autofill_dialog_controller_mac.h index 3b17c24..d311084 100644 --- a/chrome/browser/autofill/autofill_dialog_controller_mac.h +++ b/chrome/browser/autofill/autofill_dialog_controller_mac.h @@ -15,9 +15,11 @@ #include "chrome/browser/autofill/autofill_dialog.h" #include "chrome/browser/autofill/autofill_profile.h" #include "chrome/browser/autofill/credit_card.h" +#include "chrome/browser/pref_member.h" namespace AutoFillDialogControllerInternal { class PersonalDataManagerObserver; +class PrefObserver; } // AutoFillDialogControllerInternal @class AutoFillAddressSheetController; @@ -26,7 +28,7 @@ class PersonalDataManagerObserver; class Profile; @class WindowSizeAutosaver; -// A window controller for managing the autofill options dialog. +// A window controller for managing the AutoFill options dialog. // Application modally presents a dialog allowing the user to store // personal address and credit card information. @interface AutoFillDialogController : NSWindowController <NSTableViewDelegate> { @@ -62,9 +64,18 @@ class Profile; // Working list of input credit cards. std::vector<CreditCard> creditCards_; + // Tracks the AutoFill enabled preference. + BooleanPrefMember prefAutoFillEnabled_; + // State of checkbox for enabling AutoFill in general. BOOL autoFillEnabled_; + // Whether AutoFill is controlled by configuration management. + BOOL autoFillManaged_; + + // Whether AutoFill is managed and disabled. + BOOL autoFillManagedAndDisabled_; + // State of checkbox for enabling Mac Address Book integration. BOOL auxiliaryEnabled_; @@ -90,6 +101,9 @@ class Profile; // Manages PersonalDataManager loading. scoped_ptr<AutoFillDialogControllerInternal::PersonalDataManagerObserver> personalDataManagerObserver_; + + // Watches for changes to the AutoFill enabled preference. + scoped_ptr<AutoFillDialogControllerInternal::PrefObserver> prefObserver_; } // Property representing state of the AutoFill enabled preference. Checkbox is @@ -97,6 +111,15 @@ class Profile; // to this property. @property (nonatomic) BOOL autoFillEnabled; +// Property indicating whether AutoFill is under control of configuration +// management. The enabled state of the AutoFill enabled checkbox is bound to +// this property. +@property (nonatomic) BOOL autoFillManaged; + +// Property that is true iff AutoFill is managed and disabled. The save button's +// enabled state is bound to this property. +@property (nonatomic) BOOL autoFillManagedAndDisabled; + // Property representing state of Address Book "me" card usage. Checkbox is // bound to this in nib. @property (nonatomic) BOOL auxiliaryEnabled; diff --git a/chrome/browser/autofill/autofill_dialog_controller_mac.mm b/chrome/browser/autofill/autofill_dialog_controller_mac.mm index fe28c53..44405c0 100644 --- a/chrome/browser/autofill/autofill_dialog_controller_mac.mm +++ b/chrome/browser/autofill/autofill_dialog_controller_mac.mm @@ -18,6 +18,8 @@ #import "chrome/browser/cocoa/window_size_autosaver.h" #include "chrome/browser/pref_service.h" #include "chrome/browser/profile.h" +#include "chrome/common/notification_details.h" +#include "chrome/common/notification_observer.h" #include "chrome/common/pref_names.h" #include "grit/generated_resources.h" #include "grit/app_resources.h" @@ -85,6 +87,10 @@ void UpdateProfileLabels(std::vector<AutoFillProfile>* input) { - (void)onPersonalDataLoaded:(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)onPrefChanged:(const std::string&)prefName; + // Returns true if |row| is an index to a valid profile in |tableView_|, and // false otherwise. - (BOOL)isProfileRow:(NSInteger)row; @@ -184,11 +190,37 @@ void PersonalDataManagerObserver::OnPersonalDataLoaded() { creditCards:personal_data_manager_->credit_cards()]; } +// Bridges preference changed notifications to the dialog controller. +class PrefObserver : public NotificationObserver { + public: + explicit PrefObserver(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_ onPrefChanged:*pref]; + } + } + } + + private: + AutoFillDialogController* controller_; + + DISALLOW_COPY_AND_ASSIGN(PrefObserver); +}; + } // namespace AutoFillDialogControllerInternal @implementation AutoFillDialogController @synthesize autoFillEnabled = autoFillEnabled_; +@synthesize autoFillManaged = autoFillManaged_; +@synthesize autoFillManagedAndDisabled = autoFillManagedAndDisabled_; @synthesize auxiliaryEnabled = auxiliaryEnabled_; @synthesize itemIsSelected = itemIsSelected_; @synthesize multipleSelected = multipleSelected_; @@ -245,9 +277,10 @@ void PersonalDataManagerObserver::OnPersonalDataLoaded() { // Called when the user clicks the save button. - (IBAction)save:(id)sender { - // If we have an |observer_| then communicate the changes back. - if (observer_) { - profile_->GetPrefs()->SetBoolean(prefs::kAutoFillEnabled, autoFillEnabled_); + // If we have an |observer_| then communicate the changes back, unless + // AutoFill has been disabled through policy in the mean time. + if (observer_ && !autoFillManagedAndDisabled_) { + prefAutoFillEnabled_.SetValueIfNotManaged(autoFillEnabled_); profile_->GetPrefs()->SetBoolean(prefs::kAutoFillAuxiliaryProfilesEnabled, auxiliaryEnabled_); observer_->OnAutoFillDialogApply(&profiles_, &creditCards_); @@ -631,7 +664,7 @@ void PersonalDataManagerObserver::OnPersonalDataLoaded() { // This is the designated initializer for this class. -// |profiles| are non-retained immutable list of autofill profiles. +// |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 @@ -650,9 +683,15 @@ void PersonalDataManagerObserver::OnPersonalDataLoaded() { importedProfile_ = importedProfile; importedCreditCard_ = importedCreditCard; - // Use property here to trigger KVO binding. - [self setAutoFillEnabled:profile_->GetPrefs()->GetBoolean( - prefs::kAutoFillEnabled)]; + // Initialize the preference observer and watch kAutoFillEnabled. + prefObserver_.reset( + new AutoFillDialogControllerInternal::PrefObserver(self)); + prefAutoFillEnabled_.Init(prefs::kAutoFillEnabled, profile_->GetPrefs(), + prefObserver_.get()); + + // Call onPrefChanged in order to initialize UI state of the checkbox and + // save button. + [self onPrefChanged:prefs::kAutoFillEnabled]; // Use property here to trigger KVO binding. [self setAuxiliaryEnabled:profile_->GetPrefs()->GetBoolean( @@ -750,6 +789,17 @@ void PersonalDataManagerObserver::OnPersonalDataLoaded() { UpdateProfileLabels(&profiles_); } +- (void)onPrefChanged:(const std::string&)prefName { + if (prefName == prefs::kAutoFillEnabled) { + [self setAutoFillEnabled:prefAutoFillEnabled_.GetValue()]; + [self setAutoFillManaged:prefAutoFillEnabled_.IsManaged()]; + [self setAutoFillManagedAndDisabled: + prefAutoFillEnabled_.IsManaged() && !prefAutoFillEnabled_.GetValue()]; + } else { + NOTREACHED(); + } +} + - (BOOL)isProfileRow:(NSInteger)row { if (row > 0 && static_cast<size_t>(row) <= profiles_.size()) return YES; diff --git a/chrome/browser/autofill/autofill_dialog_controller_mac_unittest.mm b/chrome/browser/autofill/autofill_dialog_controller_mac_unittest.mm index 4509e68..6263102 100644 --- a/chrome/browser/autofill/autofill_dialog_controller_mac_unittest.mm +++ b/chrome/browser/autofill/autofill_dialog_controller_mac_unittest.mm @@ -4,6 +4,7 @@ #include "base/ref_counted.h" #include "base/utf_string_conversions.h" +#include "base/values.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" @@ -16,6 +17,7 @@ #include "chrome/browser/pref_service.h" #include "chrome/browser/profile.h" #include "chrome/common/pref_names.h" +#include "chrome/test/testing_pref_service.h" #include "testing/gtest/include/gtest/gtest.h" namespace { @@ -767,4 +769,67 @@ TEST_F(AutoFillDialogControllerTest, AutoFillEnabledChanged) { prefs::kAutoFillEnabled)); } +TEST_F(AutoFillDialogControllerTest, PolicyRefresh) { + LoadDialog(); + ASSERT_FALSE([controller_ autoFillManaged]); + + // Disable AutoFill through configuration policy. + helper_.profile()->GetTestingPrefService()->SetManagedPref( + prefs::kAutoFillEnabled, Value::CreateBooleanValue(false)); + ASSERT_TRUE([controller_ autoFillManaged]); + ASSERT_FALSE([controller_ autoFillEnabled]); + + // Enabling through policy should switch to enabled but not editable. + helper_.profile()->GetTestingPrefService()->SetManagedPref( + prefs::kAutoFillEnabled, Value::CreateBooleanValue(true)); + ASSERT_TRUE([controller_ autoFillManaged]); + ASSERT_TRUE([controller_ autoFillEnabled]); + + [controller_ cancel:nil]; +} + +TEST_F(AutoFillDialogControllerTest, PolicyDisabledAndSave) { + // Disable AutoFill through configuration policy. + helper_.profile()->GetTestingPrefService()->SetManagedPref( + prefs::kAutoFillEnabled, Value::CreateBooleanValue(false)); + helper_.profile()->GetPrefs()->SetBoolean( + prefs::kAutoFillAuxiliaryProfilesEnabled, false); + LoadDialog(); + + // Save should be disabled. + ASSERT_TRUE([controller_ autoFillManagedAndDisabled]); + + [controller_ setAuxiliaryEnabled:YES]; + [controller_ save:nil]; + + // Observer should not have been called. + ASSERT_FALSE(observer_.hit_); + + // Auxiliary profiles setting should be unchanged. + ASSERT_FALSE(helper_.profile()->GetPrefs()->GetBoolean( + prefs::kAutoFillAuxiliaryProfilesEnabled)); +} + +TEST_F(AutoFillDialogControllerTest, PolicyEnabledAndSave) { + // Enable AutoFill through configuration policy. + helper_.profile()->GetTestingPrefService()->SetManagedPref( + prefs::kAutoFillEnabled, Value::CreateBooleanValue(true)); + helper_.profile()->GetPrefs()->SetBoolean( + prefs::kAutoFillAuxiliaryProfilesEnabled, false); + LoadDialog(); + + // Save should be enabled. + ASSERT_FALSE([controller_ autoFillManagedAndDisabled]); + + [controller_ setAuxiliaryEnabled:YES]; + [controller_ save:nil]; + + // Observer should have been notified. + ASSERT_TRUE(observer_.hit_); + + // Auxiliary profiles setting should have been saved. + ASSERT_TRUE(helper_.profile()->GetPrefs()->GetBoolean( + prefs::kAutoFillAuxiliaryProfilesEnabled)); +} + } // namespace diff --git a/chrome/browser/autofill/autofill_dialog_gtk.cc b/chrome/browser/autofill/autofill_dialog_gtk.cc index cc383d8..624f36b 100644 --- a/chrome/browser/autofill/autofill_dialog_gtk.cc +++ b/chrome/browser/autofill/autofill_dialog_gtk.cc @@ -273,7 +273,7 @@ void AutoFillDialog::OnAutoFillCheckToggled(GtkWidget* widget) { UserMetrics::RecordAction(UserMetricsAction("Options_FormAutofill_Disable"), profile_); } - enable_form_autofill_.SetValue(enabled); + enable_form_autofill_.SetValueIfNotManaged(enabled); profile_->GetPrefs()->ScheduleSavePersistentPrefs(); UpdateWidgetState(); } @@ -546,6 +546,8 @@ void AutoFillDialog::InitializeWidgets() { } void AutoFillDialog::UpdateWidgetState() { + gtk_widget_set_sensitive(form_autofill_enable_check_, + !enable_form_autofill_.IsManaged()); if (!personal_data_->IsDataLoaded() || !enable_form_autofill_.GetValue()) { gtk_widget_set_sensitive(add_address_button_, FALSE); gtk_widget_set_sensitive(add_credit_card_button_, FALSE); |