Chromium Code Reviews| Index: chrome/browser/lifetime/keep_alive_registry.cc |
| diff --git a/chrome/browser/lifetime/keep_alive_registry.cc b/chrome/browser/lifetime/keep_alive_registry.cc |
| index 08c6c78e146c5b980e94bb2e7299252a6985fbd4..061f074db4a5a05a7d02e51f017be59236b296df 100644 |
| --- a/chrome/browser/lifetime/keep_alive_registry.cc |
| +++ b/chrome/browser/lifetime/keep_alive_registry.cc |
| @@ -5,6 +5,7 @@ |
| #include "chrome/browser/lifetime/keep_alive_registry.h" |
| #include "chrome/browser/lifetime/application_lifetime.h" |
| +#include "chrome/browser/lifetime/keep_alive_state_observer.h" |
| #include "chrome/browser/lifetime/keep_alive_types.h" |
| //////////////////////////////////////////////////////////////////////////////// |
| @@ -15,29 +16,62 @@ KeepAliveRegistry* KeepAliveRegistry::GetInstance() { |
| return base::Singleton<KeepAliveRegistry>::get(); |
| } |
| -bool KeepAliveRegistry::WillKeepAlive() const { |
| +bool KeepAliveRegistry::IsKeepingAlive() const { |
| return registered_count_ > 0; |
| } |
| +bool KeepAliveRegistry::IsRestartAllowed() const { |
| + return registered_count_ == restart_allowed_count_; |
| +} |
| + |
| +void KeepAliveRegistry::AddObserver(KeepAliveStateObserver* observer) { |
| + observers_.AddObserver(observer); |
| +} |
| + |
| +void KeepAliveRegistry::RemoveObserver(KeepAliveStateObserver* observer) { |
| + observers_.RemoveObserver(observer); |
| +} |
| + |
| //////////////////////////////////////////////////////////////////////////////// |
| // Private methods |
| -KeepAliveRegistry::KeepAliveRegistry() : registered_count_(0) {} |
| +KeepAliveRegistry::KeepAliveRegistry() |
| + : registered_count_(0), restart_allowed_count_(0) {} |
| KeepAliveRegistry::~KeepAliveRegistry() { |
| DCHECK_EQ(0, registered_count_); |
| DCHECK_EQ(0u, registered_keep_alives_.size()); |
| + DCHECK_EQ(0, restart_allowed_count_); |
| } |
| -void KeepAliveRegistry::Register(KeepAliveOrigin origin) { |
| - if (!WillKeepAlive()) |
| - chrome::IncrementKeepAliveCount(); |
| +void KeepAliveRegistry::Register(KeepAliveOrigin origin, |
| + KeepAliveRestartOption restart) { |
| + bool old_keeping_alive = IsKeepingAlive(); |
|
sky
2016/02/26 22:13:25
49-50 and 58-65 are duplicated in UnRegister. How
dgn
2016/03/07 17:17:14
I considered something similar before (see up to p
sky
2016/03/09 18:29:35
Ok. Keep what you have here.
dgn
2016/03/09 18:37:04
Acknowledged.
|
| + bool old_restart_allowed = IsRestartAllowed(); |
| ++registered_keep_alives_[origin]; |
| ++registered_count_; |
| + |
| + if (restart == KeepAliveRestartOption::ENABLED) |
| + ++restart_allowed_count_; |
| + |
| + bool new_keeping_alive = IsKeepingAlive(); |
| + bool new_restart_allowed = IsRestartAllowed(); |
| + |
| + if (new_keeping_alive != old_keeping_alive) |
| + OnKeepingAliveChanged(new_keeping_alive); |
| + |
| + if (new_restart_allowed != old_restart_allowed) |
| + OnRestartAllowedChanged(new_restart_allowed); |
| + |
| + DVLOG(1) << "New state of the KeepAliveRegistry: " << *this; |
| } |
| -void KeepAliveRegistry::Unregister(KeepAliveOrigin origin) { |
| +void KeepAliveRegistry::Unregister(KeepAliveOrigin origin, |
| + KeepAliveRestartOption restart) { |
| + bool old_keeping_alive = IsKeepingAlive(); |
| + bool old_restart_allowed = IsRestartAllowed(); |
| + |
| --registered_count_; |
| DCHECK_GE(registered_count_, 0); |
| @@ -46,6 +80,52 @@ void KeepAliveRegistry::Unregister(KeepAliveOrigin origin) { |
| if (new_count == 0) |
| registered_keep_alives_.erase(origin); |
| - if (!WillKeepAlive()) |
| + if (restart == KeepAliveRestartOption::ENABLED) |
| + --restart_allowed_count_; |
| + |
| + bool new_keeping_alive = IsKeepingAlive(); |
| + bool new_restart_allowed = IsRestartAllowed(); |
| + |
| + if (new_restart_allowed != old_restart_allowed) |
| + OnRestartAllowedChanged(new_restart_allowed); |
| + |
| + if (new_keeping_alive != old_keeping_alive) |
| + OnKeepingAliveChanged(new_keeping_alive); |
| + |
| + DVLOG(1) << "New state of the KeepAliveRegistry: " << *this; |
| +} |
| + |
| + |
| +void KeepAliveRegistry::OnKeepingAliveChanged(bool new_keeping_alive) { |
| + if (new_keeping_alive) { |
| + DVLOG(1) << "KeepAliveRegistry is now keeping the browser alive."; |
| + chrome::IncrementKeepAliveCount(); |
| + } else { |
| + DVLOG(1) << "KeepAliveRegistry stopped keeping the browser alive."; |
| chrome::DecrementKeepAliveCount(); |
| + } |
| +} |
| +void KeepAliveRegistry::OnRestartAllowedChanged(bool new_restart_allowed) { |
| + if (new_restart_allowed) { |
| + DVLOG(1) << "Notifying KeepAliveStateObservers: Restart Allowed"; |
| + FOR_EACH_OBSERVER(KeepAliveStateObserver, observers_, OnRestartAllowed()); |
| + } else { |
| + DVLOG(1) << "Notifying KeepAliveStateObservers: Restart Forbidden"; |
| + FOR_EACH_OBSERVER(KeepAliveStateObserver, observers_, OnRestartForbidden()); |
| + } |
| +} |
| + |
| +#ifndef NDEBUG |
| +std::ostream& operator<<(std::ostream& out, const KeepAliveRegistry& registry) { |
| + out << "{KeepingAlive=" << registry.IsKeepingAlive() << ", RestartAllowed=" |
| + << registry.IsRestartAllowed() << ", KeepAlives=["; |
| + for (auto counts_per_origin_it : registry.registered_keep_alives_) { |
| + if (counts_per_origin_it != *registry.registered_keep_alives_.begin()) |
| + out << ", "; |
| + out << counts_per_origin_it.first << " (" << counts_per_origin_it.second |
| + << ")"; |
| + } |
| + out << "]}"; |
| + return out; |
| } |
| +#endif // ndef NDEBUG |