blob: a116478afdea9a369a3f9697d4aee416bc7b9146 [file] [log] [blame]
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/lifetime/application_lifetime.h"
#include <memory>
#include <set>
#include <string>
#include "base/logging.h"
#include "base/trace_event/trace_event.h"
#include "build/build_config.h"
#include "build/chromeos_buildflags.h"
#include "chrome/browser/browser_process.h"
#include "chrome/browser/browser_process_platform_part.h"
#include "chrome/browser/lifetime/browser_shutdown.h"
#include "chrome/browser/ui/profiles/profile_picker.h"
#include "chrome/common/buildflags.h"
#include "chrome/common/pref_names.h"
#include "components/language/core/browser/pref_names.h"
#include "components/language/core/common/locale_util.h"
#include "components/prefs/pref_service.h"
#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "ui/aura/env.h"
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
#if !BUILDFLAG(IS_ANDROID)
#include "chrome/browser/lifetime/application_lifetime_desktop.h"
#endif // !BUILDFLAG(IS_ANDROID)
namespace chrome {
namespace {
void AttemptExitInternal(bool try_to_quit_application) {
// On Mac, the platform-specific part handles setting this.
#if !BUILDFLAG(IS_MAC)
if (try_to_quit_application)
browser_shutdown::SetTryingToQuit(true);
#endif // !BUILDFLAG(IS_MAC)
#if !BUILDFLAG(IS_ANDROID)
OnClosingAllBrowsers(true);
#endif // !BUILDFLAG(IS_ANDROID)
g_browser_process->platform_part()->AttemptExit(try_to_quit_application);
}
} // namespace
// The ChromeOS implementations are in application_lifetime_chromeos.cc
#if !BUILDFLAG(IS_CHROMEOS_ASH)
void AttemptUserExit() {
// Reset the restart bit that might have been set in cancelled restart
// request.
#if !BUILDFLAG(IS_ANDROID)
ProfilePicker::Hide();
#endif // !BUILDFLAG(IS_ANDROID)
PrefService* pref_service = g_browser_process->local_state();
pref_service->SetBoolean(prefs::kRestartLastSessionOnShutdown, false);
AttemptExitInternal(false);
}
void AttemptRelaunch() {
AttemptRestart();
}
void AttemptExit() {
// If we know that all browsers can be closed without blocking,
// don't notify users of crashes beyond this point.
// Note that MarkAsCleanShutdown() does not set UMA's exit cleanly bit
// so crashes during shutdown are still reported in UMA.
#if !BUILDFLAG(IS_ANDROID)
// Android doesn't use Browser.
if (AreAllBrowsersCloseable())
MarkAsCleanShutdown();
#endif // !BUILDFLAG(IS_ANDROID)
AttemptExitInternal(true);
}
#endif // !BUILDFLAG(IS_CHROMEOS_ASH)
void ExitIgnoreUnloadHandlers() {
VLOG(1) << "ExitIgnoreUnloadHandlers";
#if !BUILDFLAG(IS_ANDROID)
// We always mark exit cleanly.
MarkAsCleanShutdown();
#if BUILDFLAG(IS_CHROMEOS_ASH)
// Disable window occlusion tracking on exit before closing all browser
// windows to make shutdown faster. Note that the occlusion tracking is
// paused indefinitely. It is okay do so on Chrome OS because there is
// no way to abort shutdown and go back to user sessions at this point.
DCHECK(aura::Env::HasInstance());
aura::Env::GetInstance()->PauseWindowOcclusionTracking();
// On ChromeOS ExitIgnoreUnloadHandlers() is used to handle SIGTERM.
// In this case, AreAllBrowsersCloseable()
// can be false in following cases. a) power-off b) signout from
// screen locker.
browser_shutdown::OnShutdownStarting(
AreAllBrowsersCloseable() ? browser_shutdown::ShutdownType::kBrowserExit
: browser_shutdown::ShutdownType::kEndSession);
#else // !BUILDFLAG(IS_CHROMEOS_ASH)
// For desktop browsers, always perform a silent exit.
browser_shutdown::OnShutdownStarting(
browser_shutdown::ShutdownType::kSilentExit);
#endif // BUILDFLAG(IS_CHROMEOS_ASH)
#endif // !BUILDFLAG(IS_ANDROID)
AttemptExitInternal(true);
}
} // namespace chrome