OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/ui/cocoa/browser_window_controller.h" | 5 #import "chrome/browser/ui/cocoa/browser_window_controller.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 #include <numeric> | 8 #include <numeric> |
9 | 9 |
10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
(...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
543 // The Browser object is in control of whether or not we're allowed to close. It | 543 // The Browser object is in control of whether or not we're allowed to close. It |
544 // may defer closing due to several states, such as onUnload handlers needing to | 544 // may defer closing due to several states, such as onUnload handlers needing to |
545 // be fired. If closing is deferred, the Browser will handle the processing | 545 // be fired. If closing is deferred, the Browser will handle the processing |
546 // required to get us to the closing state and (by watching for all the tabs | 546 // required to get us to the closing state and (by watching for all the tabs |
547 // going away) will again call to close the window when it's finally ready. | 547 // going away) will again call to close the window when it's finally ready. |
548 - (BOOL)windowShouldClose:(id)sender { | 548 - (BOOL)windowShouldClose:(id)sender { |
549 // Disable updates while closing all tabs to avoid flickering. | 549 // Disable updates while closing all tabs to avoid flickering. |
550 gfx::ScopedNSDisableScreenUpdates disabler; | 550 gfx::ScopedNSDisableScreenUpdates disabler; |
551 // Give beforeunload handlers the chance to cancel the close before we hide | 551 // Give beforeunload handlers the chance to cancel the close before we hide |
552 // the window below. | 552 // the window below. |
553 if (!browser_->ShouldCloseWindow()) | 553 if (!browser_->ShouldCloseWindow()) { |
| 554 if (browser_->tab_strip_model()->empty()) { |
| 555 // saveWindowPositionIfNeeded: only works if we are the last active |
| 556 // window, but orderOut: ends up activating another window, so we |
| 557 // have to save the window position before we call orderOut:. |
| 558 [self saveWindowPositionIfNeeded]; |
| 559 |
| 560 // The browser needs to finish running unload handlers. |
| 561 // Hide the window (so it appears to have closed immediately), and |
| 562 // the browser will call us back again when it is ready to close. |
| 563 [[self window] orderOut:self]; |
| 564 } |
554 return NO; | 565 return NO; |
| 566 } |
555 | 567 |
556 // saveWindowPositionIfNeeded: only works if we are the last active | 568 // saveWindowPositionIfNeeded: only works if we are the last active |
557 // window, but orderOut: ends up activating another window, so we | 569 // window, but orderOut: ends up activating another window, so we |
558 // have to save the window position before we call orderOut:. | 570 // have to save the window position before we call orderOut:. |
559 [self saveWindowPositionIfNeeded]; | 571 [self saveWindowPositionIfNeeded]; |
560 | 572 |
561 if (!browser_->tab_strip_model()->empty()) { | |
562 // Tab strip isn't empty. Hide the frame (so it appears to have closed | |
563 // immediately) and close all the tabs, allowing the renderers to shut | |
564 // down. When the tab strip is empty we'll be called back again. | |
565 [[self window] orderOut:self]; | |
566 browser_->OnWindowClosing(); | |
567 return NO; | |
568 } | |
569 | |
570 // the tab strip is empty, it's ok to close the window | 573 // the tab strip is empty, it's ok to close the window |
571 return YES; | 574 return YES; |
572 } | 575 } |
573 | 576 |
574 // Called right after our window became the main window. | 577 // Called right after our window became the main window. |
575 - (void)windowDidBecomeMain:(NSNotification*)notification { | 578 - (void)windowDidBecomeMain:(NSNotification*)notification { |
576 BrowserList::SetLastActive(browser_.get()); | 579 BrowserList::SetLastActive(browser_.get()); |
577 [self saveWindowPositionIfNeeded]; | 580 [self saveWindowPositionIfNeeded]; |
578 | 581 |
579 // TODO(dmaclach): Instead of redrawing the whole window, views that care | 582 // TODO(dmaclach): Instead of redrawing the whole window, views that care |
(...skipping 1594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2174 | 2177 |
2175 - (BOOL)supportsBookmarkBar { | 2178 - (BOOL)supportsBookmarkBar { |
2176 return [self supportsWindowFeature:Browser::FEATURE_BOOKMARKBAR]; | 2179 return [self supportsWindowFeature:Browser::FEATURE_BOOKMARKBAR]; |
2177 } | 2180 } |
2178 | 2181 |
2179 - (BOOL)isTabbedWindow { | 2182 - (BOOL)isTabbedWindow { |
2180 return browser_->is_type_tabbed(); | 2183 return browser_->is_type_tabbed(); |
2181 } | 2184 } |
2182 | 2185 |
2183 @end // @implementation BrowserWindowController(WindowType) | 2186 @end // @implementation BrowserWindowController(WindowType) |
OLD | NEW |