diff options
author | pinkerton@chromium.org <pinkerton@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-30 19:23:58 +0000 |
---|---|---|
committer | pinkerton@chromium.org <pinkerton@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-04-30 19:23:58 +0000 |
commit | 767543dfe21880d26ea805ab6eaf4147ac4c2351 (patch) | |
tree | da880cc189e8cca09cb89e0f5c0329f462f5d85a /chrome/browser | |
parent | 1aba390ce0ae355c82a3eb0e468926ad29e27484 (diff) | |
download | chromium_src-767543dfe21880d26ea805ab6eaf4147ac4c2351.zip chromium_src-767543dfe21880d26ea805ab6eaf4147ac4c2351.tar.gz chromium_src-767543dfe21880d26ea805ab6eaf4147ac4c2351.tar.bz2 |
Add notification (and unit test) for closing prefs window so it can be cleaned up properly in the app controller. Make the prefs window controller the window's delegate so it gets close notifications.
Review URL: http://codereview.chromium.org/99238
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@14967 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
4 files changed, 51 insertions, 5 deletions
diff --git a/chrome/browser/app_controller_mac.mm b/chrome/browser/app_controller_mac.mm index 082d0f5..a75c0e5 100644 --- a/chrome/browser/app_controller_mac.mm +++ b/chrome/browser/app_controller_mac.mm @@ -232,6 +232,13 @@ void OpenURLs(const std::vector<GURL>& urls) { OpenURLs(gurlVector); } +// Called when the preferences window is closed. We use this to release the +// window controller. +- (void)prefsWindowClosed:(NSNotification*)notify { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + prefsController_.reset(NULL); +} + // Show the preferences window, or bring it to the front if it's already // visible. - (IBAction)showPreferences:(id)sender { @@ -239,6 +246,13 @@ void OpenURLs(const std::vector<GURL>& urls) { PrefService* prefs = [self defaultProfile]->GetPrefs(); prefsController_.reset([[PreferencesWindowController alloc] initWithPrefs:prefs]); + // Watch for a notification of when it goes away so that we can destroy + // the controller. + [[NSNotificationCenter defaultCenter] + addObserver:self + selector:@selector(prefsWindowClosed:) + name:kUserDoneEditingPrefsNotification + object:prefsController_.get()]; } [prefsController_ showPreferences:sender]; } diff --git a/chrome/browser/cocoa/preferences_window_controller.h b/chrome/browser/cocoa/preferences_window_controller.h index f1bf625..1b1fd28 100644 --- a/chrome/browser/cocoa/preferences_window_controller.h +++ b/chrome/browser/cocoa/preferences_window_controller.h @@ -19,3 +19,6 @@ class PrefService; - (IBAction)showPreferences:(id)sender; @end + +// NSNotification sent when the prefs window is closed. +extern NSString* const kUserDoneEditingPrefsNotification; diff --git a/chrome/browser/cocoa/preferences_window_controller.mm b/chrome/browser/cocoa/preferences_window_controller.mm index 941d6b3..632e9cc 100644 --- a/chrome/browser/cocoa/preferences_window_controller.mm +++ b/chrome/browser/cocoa/preferences_window_controller.mm @@ -7,7 +7,8 @@ #include "base/mac_util.h" #include "chrome/common/pref_service.h" -PreferencesWindowController* gPrefWindowSingleton = nil; +NSString* const kUserDoneEditingPrefsNotification = + @"kUserDoneEditingPrefsNotification"; @implementation PreferencesWindowController @@ -42,8 +43,9 @@ PreferencesWindowController* gPrefWindowSingleton = nil; // Called when the window is being closed. Send out a notification that the // user is done editing preferences. - (void)windowWillClose:(NSNotification *)notification { - // TODO(pinkerton): send notification. Write unit test that makes sure - // we receive it. + [[NSNotificationCenter defaultCenter] + postNotificationName:kUserDoneEditingPrefsNotification + object:self]; } @end diff --git a/chrome/browser/cocoa/preferences_window_controller_unittest.mm b/chrome/browser/cocoa/preferences_window_controller_unittest.mm index 85018b0..a53b9cb 100644 --- a/chrome/browser/cocoa/preferences_window_controller_unittest.mm +++ b/chrome/browser/cocoa/preferences_window_controller_unittest.mm @@ -11,6 +11,21 @@ #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h" +// Helper Objective-C object that sets a BOOL when we get a particular +// callback from the prefs window. +@interface PrefsClosedObserver : NSObject { + @public + BOOL gotNotification_; +} +- (void)prefsWindowClosed:(NSNotification*)notify; +@end + +@implementation PrefsClosedObserver +- (void)prefsWindowClosed:(NSNotification*)notify { + gotNotification_ = YES; +} +@end + namespace { class PrefsControllerTest : public PlatformTest { @@ -27,10 +42,22 @@ class PrefsControllerTest : public PlatformTest { scoped_nsobject<PreferencesWindowController> pref_controller_; }; -// Test showing the preferences window and making sure it's visible -TEST_F(PrefsControllerTest, Show) { +// Test showing the preferences window and making sure it's visible, then +// making sure we get the notification when it's closed. +TEST_F(PrefsControllerTest, ShowAndClose) { [pref_controller_ showPreferences:nil]; EXPECT_TRUE([[pref_controller_ window] isVisible]); + + scoped_nsobject<PrefsClosedObserver> observer( + [[PrefsClosedObserver alloc] init]); + [[NSNotificationCenter defaultCenter] + addObserver:observer.get() + selector:@selector(prefsWindowClosed:) + name:kUserDoneEditingPrefsNotification + object:pref_controller_.get()]; + [[pref_controller_ window] performClose:observer]; + EXPECT_TRUE(observer.get()->gotNotification_); + [[NSNotificationCenter defaultCenter] removeObserver:observer.get()]; } } // namespace |