blob: 1fc1a38ccb6c21a6d5bc521696bf0c9499536ad1 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/views/frame/web_contents_close_handler.h"
#include "chrome/browser/ui/views/frame/web_contents_close_handler_delegate.h"
WebContentsCloseHandler::WebContentsCloseHandler(
WebContentsCloseHandlerDelegate* delegate)
: delegate_(delegate),
in_close_(false),
tab_changed_after_clone_(false) {
}
WebContentsCloseHandler::~WebContentsCloseHandler() {
}
void WebContentsCloseHandler::TabInserted() {
// Tests may end up reviving a TabStrip that is empty.
if (!in_close_)
return;
in_close_ = false;
delegate_->DestroyClonedLayer();
}
void WebContentsCloseHandler::ActiveTabChanged() {
if (in_close_)
tab_changed_after_clone_ = true;
else
delegate_->DestroyClonedLayer();
}
void WebContentsCloseHandler::WillCloseAllTabs() {
DCHECK(!in_close_);
in_close_ = true;
tab_changed_after_clone_ = false;
delegate_->CloneWebContentsLayer();
timer_.Stop();
}
void WebContentsCloseHandler::CloseAllTabsCanceled() {
DCHECK(in_close_);
in_close_ = false;
if (tab_changed_after_clone_) {
// If the tab changed, destroy immediately. That way we make sure we aren't
// showing the wrong thing.
delegate_->DestroyClonedLayer();
} else {
// The most common reason for a close to be canceled is a before unload
// handler. Often times the tab still ends up closing, but only after we get
// back a response from the renderer. Assume this is going to happen and
// keep around the cloned layer for a bit more time.
timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(500),
this, &WebContentsCloseHandler::OnStillHaventClosed);
}
}
void WebContentsCloseHandler::OnStillHaventClosed() {
delegate_->DestroyClonedLayer();
}