blob: ea924ad88d7180206c1a46ba9040d1f973573a84 [file] [log] [blame]
// Copyright 2018 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/apps/platform_apps/app_termination_observer.h"
#include "apps/browser_context_keyed_service_factories.h"
#include "chrome/browser/lifetime/termination_notification.h"
#include "content/public/browser/browser_context.h"
namespace chrome_apps {
AppTerminationObserver::AppTerminationObserver(
content::BrowserContext* browser_context)
: browser_context_(browser_context) {
// base::Unretained(this) is safe here as this object owns |subscription_| and
// the callback won't be invoked after the subscription is destroyed.
subscription_ = browser_shutdown::AddAppTerminatingCallback(base::BindOnce(
&AppTerminationObserver::OnAppTerminating, base::Unretained(this)));
}
AppTerminationObserver::~AppTerminationObserver() = default;
void AppTerminationObserver::Shutdown() {
// The associated `browser_context_` is shutting down, so it's no longer safe
// to use (any attempt to access a KeyedService will crash after this point,
// since the context is marked as dead). Reset the subscription. See
// https://crbug.com/352003806.
// See also the note in `OnAppTerminating()`.
subscription_.reset();
}
void AppTerminationObserver::OnAppTerminating() {
// NOTE: This fires on application termination, but passes in an associated
// BrowserContext. If a BrowserContext is actually destroyed *before*
// application termination, we won't call NotifyApplicationTerminating() for
// that context. We could instead monitor BrowserContext destruction if this
// is an issue.
apps::NotifyApplicationTerminating(browser_context_);
}
} // namespace chrome_apps