summaryrefslogtreecommitdiffstats
path: root/chrome/browser/chromeos/tab_closeable_state_watcher.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/chromeos/tab_closeable_state_watcher.cc')
-rw-r--r--chrome/browser/chromeos/tab_closeable_state_watcher.cc31
1 files changed, 22 insertions, 9 deletions
diff --git a/chrome/browser/chromeos/tab_closeable_state_watcher.cc b/chrome/browser/chromeos/tab_closeable_state_watcher.cc
index 6ba5ba8..07254a7 100644
--- a/chrome/browser/chromeos/tab_closeable_state_watcher.cc
+++ b/chrome/browser/chromeos/tab_closeable_state_watcher.cc
@@ -67,7 +67,8 @@ TabCloseableStateWatcher::TabCloseableStateWatcher()
signing_off_(false),
guest_session_(
CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kGuestSession)) {
+ switches::kGuestSession)),
+ waiting_for_browser_(false) {
BrowserList::AddObserver(this);
notification_registrar_.Add(this, NotificationType::APP_EXITING,
NotificationService::AllSources());
@@ -80,7 +81,8 @@ TabCloseableStateWatcher::~TabCloseableStateWatcher() {
}
bool TabCloseableStateWatcher::CanCloseTab(const Browser* browser) const {
- return browser->type() != Browser::TYPE_NORMAL ? true : can_close_tab_;
+ return browser->type() != Browser::TYPE_NORMAL ? true :
+ (can_close_tab_ || waiting_for_browser_);
}
bool TabCloseableStateWatcher::CanCloseBrowser(Browser* browser) {
@@ -109,6 +111,8 @@ void TabCloseableStateWatcher::OnWindowCloseCanceled(Browser* browser) {
// TabCloseableStateWatcher, BrowserList::Observer implementation:
void TabCloseableStateWatcher::OnBrowserAdded(const Browser* browser) {
+ waiting_for_browser_ = false;
+
// Only normal browsers may affect closeable state.
if (browser->type() != Browser::TYPE_NORMAL)
return;
@@ -156,6 +160,9 @@ void TabCloseableStateWatcher::Observe(NotificationType type,
void TabCloseableStateWatcher::OnTabStripChanged(const Browser* browser,
bool closing_last_tab) {
+ if (waiting_for_browser_)
+ return;
+
if (!closing_last_tab) {
CheckAndUpdateState(browser);
return;
@@ -175,9 +182,7 @@ void TabCloseableStateWatcher::OnTabStripChanged(const Browser* browser,
void TabCloseableStateWatcher::CheckAndUpdateState(
const Browser* browser_to_check) {
- // We shouldn't update state if we're signing off, or there's no normal
- // browser, or browser is always closeable.
- if (signing_off_ || tabstrip_watchers_.empty() ||
+ if (waiting_for_browser_ || signing_off_ || tabstrip_watchers_.empty() ||
(browser_to_check && browser_to_check->type() != Browser::TYPE_NORMAL))
return;
@@ -218,10 +223,15 @@ void TabCloseableStateWatcher::SetCloseableState(bool closeable) {
Details<bool>(&can_close_tab_));
}
-bool TabCloseableStateWatcher::CanCloseBrowserImpl(const Browser* browser,
- BrowserActionType* action_type) const {
+bool TabCloseableStateWatcher::CanCloseBrowserImpl(
+ const Browser* browser,
+ BrowserActionType* action_type) {
*action_type = NONE;
+ // If we're waiting for a new browser allow the close.
+ if (waiting_for_browser_)
+ return true;
+
// Browser is always closeable when signing off.
if (signing_off_)
return true;
@@ -234,10 +244,13 @@ bool TabCloseableStateWatcher::CanCloseBrowserImpl(const Browser* browser,
if (tabstrip_watchers_.size() > 1)
return true;
- // If last normal browser is incognito, open a non-incognito window,
- // and allow closing of incognito one (if not guest).
+ // If last normal browser is incognito, open a non-incognito window, and allow
+ // closing of incognito one (if not guest). When this happens we need to wait
+ // for the new browser before doing any other actions as the new browser may
+ // be created by way of session restore, which is async.
if (browser->profile()->IsOffTheRecord() && !guest_session_) {
*action_type = OPEN_WINDOW;
+ waiting_for_browser_ = true;
return true;
}