summaryrefslogtreecommitdiffstats
path: root/chrome/browser
diff options
context:
space:
mode:
authorpinkerton@chromium.org <pinkerton@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-30 19:23:58 +0000
committerpinkerton@chromium.org <pinkerton@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-04-30 19:23:58 +0000
commit767543dfe21880d26ea805ab6eaf4147ac4c2351 (patch)
treeda880cc189e8cca09cb89e0f5c0329f462f5d85a /chrome/browser
parent1aba390ce0ae355c82a3eb0e468926ad29e27484 (diff)
downloadchromium_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')
-rw-r--r--chrome/browser/app_controller_mac.mm14
-rw-r--r--chrome/browser/cocoa/preferences_window_controller.h3
-rw-r--r--chrome/browser/cocoa/preferences_window_controller.mm8
-rw-r--r--chrome/browser/cocoa/preferences_window_controller_unittest.mm31
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