// Copyright 2013 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 "apps/app_keep_alive_service.h" #include "apps/app_lifetime_monitor.h" #include "apps/app_lifetime_monitor_factory.h" #include "base/message_loop/message_loop.h" #include "chrome/browser/lifetime/application_lifetime.h" #include "chrome/browser/profiles/profile.h" namespace apps { AppKeepAliveService::AppKeepAliveService(content::BrowserContext* context) : context_(context), shut_down_(false) { AppLifetimeMonitor* app_lifetime_monitor = AppLifetimeMonitorFactory::GetForProfile(static_cast(context)); app_lifetime_monitor->AddObserver(this); } AppKeepAliveService::~AppKeepAliveService() {} void AppKeepAliveService::Shutdown() { AppLifetimeMonitor* app_lifetime_monitor = AppLifetimeMonitorFactory::GetForProfile(static_cast(context_)); app_lifetime_monitor->RemoveObserver(this); OnChromeTerminating(); } void AppKeepAliveService::OnAppStart(Profile* profile, const std::string& app_id) { if (profile != context_ || shut_down_) return; if (running_apps_.insert(app_id).second) chrome::StartKeepAlive(); } void AppKeepAliveService::OnAppStop(Profile* profile, const std::string& app_id) { if (profile != context_) return; if (running_apps_.erase(app_id)) chrome::EndKeepAlive(); } void AppKeepAliveService::OnAppActivated(Profile* profile, const std::string& app_id) {} void AppKeepAliveService::OnAppDeactivated(Profile* profile, const std::string& app_id) {} void AppKeepAliveService::OnChromeTerminating() { shut_down_ = true; size_t keep_alives = running_apps_.size(); running_apps_.clear(); // In some tests, the message loop isn't running during shutdown and ending // the last keep alive in that case CHECKs. if (!base::MessageLoop::current() || base::MessageLoop::current()->is_running()) { while (keep_alives--) chrome::EndKeepAlive(); } } } // namespace apps