| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "chrome/browser/cocoa/preferences_window_controller.h" | 5 #import "chrome/browser/cocoa/preferences_window_controller.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "app/l10n_util.h" | 9 #include "app/l10n_util.h" |
| 10 #include "app/l10n_util_mac.h" | 10 #include "app/l10n_util_mac.h" |
| (...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 368 | 368 |
| 369 // Overridden from ProfileSyncServiceObserver. | 369 // Overridden from ProfileSyncServiceObserver. |
| 370 virtual void OnStateChanged() { | 370 virtual void OnStateChanged() { |
| 371 [controller_ syncStateChanged]; | 371 [controller_ syncStateChanged]; |
| 372 } | 372 } |
| 373 | 373 |
| 374 private: | 374 private: |
| 375 PreferencesWindowController* controller_; // weak, owns us | 375 PreferencesWindowController* controller_; // weak, owns us |
| 376 }; | 376 }; |
| 377 | 377 |
| 378 // PersonalDataManagerObserver facilitates asynchronous loading of | |
| 379 // PersonalDataManager data before showing the auto fill settings dialog to the | |
| 380 // user. It acts as a C++-based delegate for the |PreferencesWindowController|. | |
| 381 class PersonalDataManagerObserver : public PersonalDataManager::Observer { | |
| 382 public: | |
| 383 explicit PersonalDataManagerObserver( | |
| 384 PersonalDataManager* personal_data_manager, | |
| 385 Profile* profile) | |
| 386 : personal_data_manager_(personal_data_manager), | |
| 387 profile_(profile) { | |
| 388 } | |
| 389 | |
| 390 virtual ~PersonalDataManagerObserver(); | |
| 391 | |
| 392 // Notifies the observer that the PersonalDataManager has finished loading. | |
| 393 virtual void OnPersonalDataLoaded(); | |
| 394 | |
| 395 // Static method to dispatch to |ShowAutoFillDialog| method in autofill | |
| 396 // module. This is public to facilitate direct external call when the | |
| 397 // data manager has already loaded its data. | |
| 398 static void ShowAutoFillDialog(PersonalDataManager* personal_data_manager, | |
| 399 Profile* profile); | |
| 400 | |
| 401 private: | |
| 402 // Utility method to remove |this| from |personal_data_manager_| as an | |
| 403 // observer. | |
| 404 void RemoveObserver(); | |
| 405 | |
| 406 // The object in which we are registered as an observer. We hold on to | |
| 407 // it to facilitate un-registering ourself in the destructor and in the | |
| 408 // |OnPersonalDataLoaded| method. This may be NULL. | |
| 409 // Weak reference. | |
| 410 PersonalDataManager* personal_data_manager_; | |
| 411 | |
| 412 // Profile of caller. Held as weak reference. May not be NULL. | |
| 413 Profile* profile_; | |
| 414 | |
| 415 private: | |
| 416 DISALLOW_COPY_AND_ASSIGN(PersonalDataManagerObserver); | |
| 417 }; | |
| 418 | |
| 419 // During destruction ensure that we are removed from the | |
| 420 // |personal_data_manager_| as an observer. | |
| 421 PersonalDataManagerObserver::~PersonalDataManagerObserver() { | |
| 422 RemoveObserver(); | |
| 423 } | |
| 424 | |
| 425 void PersonalDataManagerObserver::RemoveObserver() { | |
| 426 if (personal_data_manager_) { | |
| 427 personal_data_manager_->RemoveObserver(this); | |
| 428 } | |
| 429 } | |
| 430 | |
| 431 // The data is ready so display our dialog. Recursively call | |
| 432 // |showAutoFillSettings:| to try again now knowing that the | |
| 433 // |PersonalDataManager| is ready. Once done we clear the observer | |
| 434 // (deleting |this| in the process). | |
| 435 void PersonalDataManagerObserver::OnPersonalDataLoaded() { | |
| 436 RemoveObserver(); | |
| 437 PersonalDataManagerObserver::ShowAutoFillDialog(personal_data_manager_, | |
| 438 profile_); | |
| 439 } | |
| 440 | |
| 441 // Dispatches request to show the autofill dialog. If there are no profiles | |
| 442 // in the |personal_data_manager| the we create a new one here. Similary with | |
| 443 // credit card info. | |
| 444 void PersonalDataManagerObserver::ShowAutoFillDialog( | |
| 445 PersonalDataManager* personal_data_manager, Profile* profile) { | |
| 446 DCHECK(profile); | |
| 447 if (!personal_data_manager) | |
| 448 return; | |
| 449 | |
| 450 std::vector<AutoFillProfile*> profiles = | |
| 451 personal_data_manager->web_profiles(); | |
| 452 AutoFillProfile autofill_profile(ASCIIToUTF16(""), 0); | |
| 453 if (profiles.size() == 0) { | |
| 454 string16 new_profile_name = | |
| 455 l10n_util::GetStringUTF16(IDS_AUTOFILL_NEW_ADDRESS); | |
| 456 autofill_profile.set_label(new_profile_name); | |
| 457 profiles.push_back(&autofill_profile); | |
| 458 } | |
| 459 | |
| 460 std::vector<CreditCard*> credit_cards = personal_data_manager->credit_cards(); | |
| 461 CreditCard credit_card(ASCIIToUTF16(""), 0); | |
| 462 if (credit_cards.size() == 0) { | |
| 463 string16 new_credit_card_name = | |
| 464 l10n_util::GetStringUTF16(IDS_AUTOFILL_NEW_CREDITCARD); | |
| 465 credit_card.set_label(new_credit_card_name); | |
| 466 credit_cards.push_back(&credit_card); | |
| 467 } | |
| 468 | |
| 469 ::ShowAutoFillDialog(personal_data_manager, profiles, credit_cards, profile); | |
| 470 } | |
| 471 | |
| 472 } // namespace PreferencesWindowControllerInternal | 378 } // namespace PreferencesWindowControllerInternal |
| 473 | 379 |
| 474 @implementation PreferencesWindowController | 380 @implementation PreferencesWindowController |
| 475 | 381 |
| 476 - (id)initWithProfile:(Profile*)profile initialPage:(OptionsPage)initialPage { | 382 - (id)initWithProfile:(Profile*)profile initialPage:(OptionsPage)initialPage { |
| 477 DCHECK(profile); | 383 DCHECK(profile); |
| 478 // Use initWithWindowNibPath:: instead of initWithWindowNibName: so we | 384 // Use initWithWindowNibPath:: instead of initWithWindowNibName: so we |
| 479 // can override it in a unit test. | 385 // can override it in a unit test. |
| 480 NSString* nibPath = [mac_util::MainAppBundle() | 386 NSString* nibPath = [mac_util::MainAppBundle() |
| 481 pathForResource:@"Preferences" | 387 pathForResource:@"Preferences" |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 744 [[self window] center]; | 650 [[self window] center]; |
| 745 } | 651 } |
| 746 | 652 |
| 747 - (void)dealloc { | 653 - (void)dealloc { |
| 748 if (syncService_) { | 654 if (syncService_) { |
| 749 syncService_->RemoveObserver(observer_.get()); | 655 syncService_->RemoveObserver(observer_.get()); |
| 750 } | 656 } |
| 751 [customPagesSource_ removeObserver:self forKeyPath:@"customHomePages"]; | 657 [customPagesSource_ removeObserver:self forKeyPath:@"customHomePages"]; |
| 752 [[NSNotificationCenter defaultCenter] removeObserver:self]; | 658 [[NSNotificationCenter defaultCenter] removeObserver:self]; |
| 753 [self unregisterPrefObservers]; | 659 [self unregisterPrefObservers]; |
| 754 personalDataManagerObserver_.reset(); | |
| 755 [super dealloc]; | 660 [super dealloc]; |
| 756 } | 661 } |
| 757 | 662 |
| 758 // Xcode 3.1.x version of Interface Builder doesn't do a lot for editing | 663 // Xcode 3.1.x version of Interface Builder doesn't do a lot for editing |
| 759 // toolbars in XIB. So the toolbar's delegate is set to the controller so it | 664 // toolbars in XIB. So the toolbar's delegate is set to the controller so it |
| 760 // can tell the toolbar what items are selectable. | 665 // can tell the toolbar what items are selectable. |
| 761 - (NSArray*)toolbarSelectableItemIdentifiers:(NSToolbar*)toolbar { | 666 - (NSArray*)toolbarSelectableItemIdentifiers:(NSToolbar*)toolbar { |
| 762 DCHECK(toolbar == toolbar_); | 667 DCHECK(toolbar == toolbar_); |
| 763 return [[toolbar_ items] valueForKey:@"itemIdentifier"]; | 668 return [[toolbar_ items] valueForKey:@"itemIdentifier"]; |
| 764 } | 669 } |
| (...skipping 480 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1245 [self recordUserAction:UserMetricsAction("Options_ShowAutoFillSettings")]; | 1150 [self recordUserAction:UserMetricsAction("Options_ShowAutoFillSettings")]; |
| 1246 | 1151 |
| 1247 PersonalDataManager* personalDataManager = profile_->GetPersonalDataManager(); | 1152 PersonalDataManager* personalDataManager = profile_->GetPersonalDataManager(); |
| 1248 if (!personalDataManager) { | 1153 if (!personalDataManager) { |
| 1249 // Should not reach here because button is disabled when | 1154 // Should not reach here because button is disabled when |
| 1250 // |personalDataManager| is NULL. | 1155 // |personalDataManager| is NULL. |
| 1251 NOTREACHED(); | 1156 NOTREACHED(); |
| 1252 return; | 1157 return; |
| 1253 } | 1158 } |
| 1254 | 1159 |
| 1255 if (personalDataManager->IsDataLoaded()) { | 1160 ShowAutoFillDialog(NULL, personalDataManager, profile_, NULL, NULL); |
| 1256 // |personalDataManager| data is loaded, we can proceed with the dialog. | |
| 1257 PreferencesWindowControllerInternal:: | |
| 1258 PersonalDataManagerObserver::ShowAutoFillDialog(personalDataManager, | |
| 1259 profile_); | |
| 1260 } else { | |
| 1261 // |personalDataManager| data is NOT loaded, so we load it here, installing | |
| 1262 // our observer. | |
| 1263 personalDataManagerObserver_.reset( | |
| 1264 new PreferencesWindowControllerInternal::PersonalDataManagerObserver( | |
| 1265 personalDataManager, profile_)); | |
| 1266 personalDataManager->SetObserver(personalDataManagerObserver_.get()); | |
| 1267 } | |
| 1268 } | 1161 } |
| 1269 | 1162 |
| 1270 // Called to import data from other browsers (Safari, Firefox, etc). | 1163 // Called to import data from other browsers (Safari, Firefox, etc). |
| 1271 - (IBAction)importData:(id)sender { | 1164 - (IBAction)importData:(id)sender { |
| 1272 UserMetrics::RecordAction(UserMetricsAction("Import_ShowDlg"), profile_); | 1165 UserMetrics::RecordAction(UserMetricsAction("Import_ShowDlg"), profile_); |
| 1273 [ImportSettingsDialogController showImportSettingsDialogForProfile:profile_]; | 1166 [ImportSettingsDialogController showImportSettingsDialogForProfile:profile_]; |
| 1274 } | 1167 } |
| 1275 | 1168 |
| 1276 - (IBAction)resetThemeToDefault:(id)sender { | 1169 - (IBAction)resetThemeToDefault:(id)sender { |
| 1277 [self recordUserAction:UserMetricsAction("Options_ThemesReset")]; | 1170 [self recordUserAction:UserMetricsAction("Options_ThemesReset")]; |
| (...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1961 case OPTIONS_PAGE_ADVANCED: | 1854 case OPTIONS_PAGE_ADVANCED: |
| 1962 return underTheHoodView_; | 1855 return underTheHoodView_; |
| 1963 case OPTIONS_PAGE_DEFAULT: | 1856 case OPTIONS_PAGE_DEFAULT: |
| 1964 case OPTIONS_PAGE_COUNT: | 1857 case OPTIONS_PAGE_COUNT: |
| 1965 LOG(DFATAL) << "Invalid page value " << page; | 1858 LOG(DFATAL) << "Invalid page value " << page; |
| 1966 } | 1859 } |
| 1967 return basicsView_; | 1860 return basicsView_; |
| 1968 } | 1861 } |
| 1969 | 1862 |
| 1970 @end | 1863 @end |
| OLD | NEW |