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

Unified Diff: chrome/browser/cocoa/preferences_window_controller.mm

Issue 1902003: Revert 46424 - AutoFill profile shouldn't be saved when cancelled during init... (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 10 years, 8 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/cocoa/preferences_window_controller.mm
===================================================================
--- chrome/browser/cocoa/preferences_window_controller.mm (revision 46425)
+++ chrome/browser/cocoa/preferences_window_controller.mm (working copy)
@@ -375,6 +375,100 @@
PreferencesWindowController* controller_; // weak, owns us
};
+// PersonalDataManagerObserver facilitates asynchronous loading of
+// PersonalDataManager data before showing the auto fill settings dialog to the
+// user. It acts as a C++-based delegate for the |PreferencesWindowController|.
+class PersonalDataManagerObserver : public PersonalDataManager::Observer {
+ public:
+ explicit PersonalDataManagerObserver(
+ PersonalDataManager* personal_data_manager,
+ Profile* profile)
+ : personal_data_manager_(personal_data_manager),
+ profile_(profile) {
+ }
+
+ virtual ~PersonalDataManagerObserver();
+
+ // Notifies the observer that the PersonalDataManager has finished loading.
+ virtual void OnPersonalDataLoaded();
+
+ // Static method to dispatch to |ShowAutoFillDialog| method in autofill
+ // module. This is public to facilitate direct external call when the
+ // data manager has already loaded its data.
+ static void ShowAutoFillDialog(PersonalDataManager* personal_data_manager,
+ Profile* profile);
+
+ private:
+ // Utility method to remove |this| from |personal_data_manager_| as an
+ // observer.
+ void RemoveObserver();
+
+ // 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 is ready so display our dialog. Recursively call
+// |showAutoFillSettings:| to try again now knowing that the
+// |PersonalDataManager| is ready. Once done we clear the observer
+// (deleting |this| in the process).
+void PersonalDataManagerObserver::OnPersonalDataLoaded() {
+ RemoveObserver();
+ PersonalDataManagerObserver::ShowAutoFillDialog(personal_data_manager_,
+ profile_);
+}
+
+// Dispatches request to show the autofill dialog. If there are no profiles
+// in the |personal_data_manager| the we create a new one here. Similary with
+// credit card info.
+void PersonalDataManagerObserver::ShowAutoFillDialog(
+ PersonalDataManager* personal_data_manager, Profile* profile) {
+ DCHECK(profile);
+ if (!personal_data_manager)
+ return;
+
+ std::vector<AutoFillProfile*> profiles =
+ personal_data_manager->web_profiles();
+ AutoFillProfile autofill_profile(ASCIIToUTF16(""), 0);
+ if (profiles.size() == 0) {
+ string16 new_profile_name =
+ l10n_util::GetStringUTF16(IDS_AUTOFILL_NEW_ADDRESS);
+ autofill_profile.set_label(new_profile_name);
+ profiles.push_back(&autofill_profile);
+ }
+
+ std::vector<CreditCard*> credit_cards = personal_data_manager->credit_cards();
+ CreditCard credit_card(ASCIIToUTF16(""), 0);
+ if (credit_cards.size() == 0) {
+ string16 new_credit_card_name =
+ l10n_util::GetStringUTF16(IDS_AUTOFILL_NEW_CREDITCARD);
+ credit_card.set_label(new_credit_card_name);
+ credit_cards.push_back(&credit_card);
+ }
+
+ ::ShowAutoFillDialog(personal_data_manager, profiles, credit_cards, profile);
+}
+
} // namespace PreferencesWindowControllerInternal
@implementation PreferencesWindowController
@@ -657,6 +751,7 @@
[customPagesSource_ removeObserver:self forKeyPath:@"customHomePages"];
[[NSNotificationCenter defaultCenter] removeObserver:self];
[self unregisterPrefObservers];
+ personalDataManagerObserver_.reset();
[super dealloc];
}
@@ -1157,7 +1252,19 @@
return;
}
- ShowAutoFillDialog(NULL, personalDataManager, profile_, NULL, NULL);
+ if (personalDataManager->IsDataLoaded()) {
+ // |personalDataManager| data is loaded, we can proceed with the dialog.
+ PreferencesWindowControllerInternal::
+ PersonalDataManagerObserver::ShowAutoFillDialog(personalDataManager,
+ profile_);
+ } else {
+ // |personalDataManager| data is NOT loaded, so we load it here, installing
+ // our observer.
+ personalDataManagerObserver_.reset(
+ new PreferencesWindowControllerInternal::PersonalDataManagerObserver(
+ personalDataManager, profile_));
+ personalDataManager->SetObserver(personalDataManagerObserver_.get());
+ }
}
// Called to import data from other browsers (Safari, Firefox, etc).
« no previous file with comments | « chrome/browser/cocoa/preferences_window_controller.h ('k') | chrome/browser/gtk/options/content_page_gtk.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698