Index: chrome/browser/ui/panels/panel_window_controller_cocoa.mm |
diff --git a/chrome/browser/ui/panels/panel_window_controller_cocoa.mm b/chrome/browser/ui/panels/panel_window_controller_cocoa.mm |
index ea69ad186a6fb6667f7c1b68b467763e1083c482..d48f204f791c34606f217a459d1b3d728ee1b427 100644 |
--- a/chrome/browser/ui/panels/panel_window_controller_cocoa.mm |
+++ b/chrome/browser/ui/panels/panel_window_controller_cocoa.mm |
@@ -9,6 +9,7 @@ |
#include "base/logging.h" |
#include "base/mac/mac_util.h" |
#include "chrome/app/chrome_command_ids.h" // IDC_* |
+#include "chrome/browser/tabs/tab_strip_model.h" |
#include "chrome/browser/ui/browser.h" |
#import "chrome/browser/ui/cocoa/event_utils.h" |
#import "chrome/browser/ui/cocoa/find_bar/find_bar_bridge.h" |
@@ -99,14 +100,6 @@ const int kMinimumWindowSize = 1; |
[findBarCocoaController positionFindBarViewAtMaxY:maxY maxWidth:maxWidth]; |
} |
-- (void)closePanel { |
- windowShim_->panel()->Close(); |
-} |
- |
-- (void)windowWillClose:(NSNotification*)notification { |
- [self autorelease]; |
-} |
- |
- (NSView*)tabContentsView { |
TabContents* contents = windowShim_->browser()->GetSelectedTabContents(); |
CHECK(contents); |
@@ -176,4 +169,47 @@ const int kMinimumWindowSize = 1; |
windowShim_->browser()->ExecuteCommandWithDisposition( |
[sender tag], disposition); |
} |
+ |
+// Handler for the custom Close button. |
+- (void)closePanel { |
+ windowShim_->panel()->Close(); |
+} |
+ |
+// Called when the user wants to close the panel or from the shutdown process. |
+// The Browser object is in control of whether or not we're allowed to close. It |
+// may defer closing due to several states, such as onbeforeUnload handlers |
+// needing to be fired. If closing is deferred, the Browser will handle the |
+// processing required to get us to the closing state and (by watching for |
+// all the tabs going away) will again call to close the window when it's |
+// finally ready. |
+// This callback is only called if the standard Close button is enabled in XIB. |
+- (BOOL)windowShouldClose:(id)sender { |
+ Browser* browser = windowShim_->browser(); |
+ // Give beforeunload handlers the chance to cancel the close before we hide |
+ // the window below. |
+ if (!browser->ShouldCloseWindow()) |
+ return NO; |
+ |
+ if (!browser->tabstrip_model()->empty()) { |
+ // Tab strip isn't empty. Make browser to close all the tabs, allowing the |
+ // renderer to shut down and call us back again. |
+ // The tab strip of Panel is not visible and contains only one tab but |
+ // it still has to be closed. |
+ browser->OnWindowClosing(); |
+ return NO; |
+ } |
+ |
+ // the tab strip is empty, it's ok to close the window |
+ return YES; |
+} |
+ |
+// When windowShouldClose returns YES (or if controller receives direct 'close' |
+// signal), window will be unconditionally closed. Clean up. |
+- (void)windowWillClose:(NSNotification*)notification { |
+ DCHECK(windowShim_->browser()->tabstrip_model()->empty()); |
+ |
+ windowShim_->didCloseNativeWindow(); |
+ [self autorelease]; |
+} |
+ |
@end |