Index: chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller_unittest.mm |
diff --git a/chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller_unittest.mm b/chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller_unittest.mm |
index b337b2bf63f652f752976ef543eb8306f890190c..4648ac5b0f0c2043b966014155b4fb55b187831f 100644 |
--- a/chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller_unittest.mm |
+++ b/chrome/browser/ui/cocoa/wrench_menu/wrench_menu_controller_unittest.mm |
@@ -4,11 +4,14 @@ |
#include "base/command_line.h" |
#include "base/mac/scoped_nsobject.h" |
+#include "base/run_loop.h" |
#include "base/strings/sys_string_conversions.h" |
#include "base/strings/utf_string_conversions.h" |
#include "chrome/app/chrome_command_ids.h" |
#include "chrome/browser/sync/profile_sync_service_factory.h" |
#include "chrome/browser/sync/sessions/sessions_sync_manager.h" |
+#include "chrome/browser/ui/browser_list.h" |
+#include "chrome/browser/ui/browser_list_observer.h" |
#include "chrome/browser/ui/cocoa/cocoa_profile_test.h" |
#include "chrome/browser/ui/cocoa/run_loop_testing.h" |
#import "chrome/browser/ui/cocoa/toolbar/toolbar_controller.h" |
@@ -239,4 +242,30 @@ TEST_F(WrenchMenuControllerTest, RecentTabDeleteOrder) { |
// If the delete order is wrong then the test will crash on exit. |
} |
+class BrowserRemovedObserver : public chrome::BrowserListObserver { |
+ public: |
+ BrowserRemovedObserver() { BrowserList::AddObserver(this); } |
+ ~BrowserRemovedObserver() override { BrowserList::RemoveObserver(this); } |
+ void WaitUntilBrowserRemoved() { run_loop_.Run(); } |
+ void OnBrowserRemoved(Browser* browser) override { run_loop_.Quit(); } |
+ |
+ private: |
+ base::RunLoop run_loop_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(BrowserRemovedObserver); |
+}; |
+ |
+// Test that WrenchMenuController can be destroyed after the Browser. |
+// This can happen because the WrenchMenuController's owner (ToolbarController) |
+// can outlive the Browser. |
+TEST_F(WrenchMenuControllerTest, DestroyedAfterBrowser) { |
+ BrowserRemovedObserver observer; |
+ // This is normally called by ToolbarController, but since |controller_| is |
+ // not owned by one, call it here. |
+ [controller_ browserWillBeDestroyed]; |
+ CloseBrowserWindow(); |
+ observer.WaitUntilBrowserRemoved(); |
+ // |controller_| is released in TearDown(). |
+} |
+ |
} // namespace |