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 670954535468a866105cdd12abcee8a44d2188f8..e0c07cccf076d4d4fab6858b6fe2b9ac2552c5e6 100644 |
--- a/chrome/browser/lifetime/keep_alive_registry.cc |
+++ b/chrome/browser/lifetime/keep_alive_registry.cc |
@@ -7,6 +7,7 @@ |
#include "chrome/browser/browser_process.h" |
#include "chrome/browser/lifetime/application_lifetime.h" |
#include "chrome/browser/lifetime/keep_alive_options.h" |
+#include "chrome/browser/lifetime/keep_alive_state_observer.h" |
namespace { |
@@ -28,30 +29,100 @@ KeepAliveRegistry* KeepAliveRegistry::GetInstance() { |
return base::Singleton<KeepAliveRegistry>::get(); |
} |
+void KeepAliveRegistry::SetObserver(KeepAliveStateObserver* observer) { |
dgn
2016/02/23 16:58:46
having add/remove observer and an ObserverList wou
dgn
2016/02/24 13:03:55
Done.
|
+ DCHECK(!observer_ || !observer); |
+ observer_ = observer; |
+ |
+ KeepAliveOptions all_disabled_state = {nullptr, |
+ KeepAliveOptionRestart::DISABLED}; |
+ |
+ NotifyOfStateDifferences(all_disabled_state); |
+} |
+ |
//////////////////////////////////////////////////////////////////////////////// |
// Private methods |
-KeepAliveRegistry::KeepAliveRegistry() {} |
+KeepAliveRegistry::KeepAliveRegistry() : observer_(nullptr) {} |
KeepAliveRegistry::~KeepAliveRegistry() { |
DCHECK_EQ(0u, registered_keep_alives_.size()); |
+ DCHECK_EQ(0u, restart_allowed_keep_alives_.size()); |
+} |
+ |
+KeepAliveOptions KeepAliveRegistry::ComputeCurrentState() const { |
dgn
2016/02/23 16:58:46
Might be better to have a different struct instead
dgn
2016/02/24 13:03:55
Done.
|
+ bool keeping_alive = registered_keep_alives_.size() > 0; |
+ bool restart_allowed = |
+ registered_keep_alives_.size() == restart_allowed_keep_alives_.size() && |
+ keeping_alive; |
+ KeepAliveOptions current_state = { |
+ nullptr, restart_allowed ? KeepAliveOptionRestart::ENABLED |
+ : KeepAliveOptionRestart::DISABLED}; |
+ return current_state; |
+} |
+ |
+void KeepAliveRegistry::NotifyOfStateDifferences( |
+ const KeepAliveOptions& previous_state) const { |
+ if (!observer_) |
+ return; |
+ |
+ KeepAliveOptions current_state = ComputeCurrentState(); |
+ |
+ if (previous_state.restart != current_state.restart) { |
+ if (current_state.restart == KeepAliveOptionRestart::ENABLED) |
+ observer_->OnRestartAllowed(); |
+ else |
+ observer_->OnRestartForbidden(); |
+ } |
} |
void KeepAliveRegistry::Register(const KeepAliveOptions* option) { |
+ // Check the state before adding the new KeepAlive |
+ KeepAliveOptions before_state = ComputeCurrentState(); |
dgn
2016/02/23 16:58:46
Should I store it in a member instead of recomputi
dgn
2016/02/24 13:03:55
Done.
|
+ |
registered_keep_alives_.insert(option); |
// TODO(dgn): We currently use the plain KeepAliveCount. We will integrate |
// that in this class progressively as mechanisms are merged. |
if (registered_keep_alives_.size() == 1) |
chrome::IncrementKeepAliveCount(); |
+ |
+ if (option->restart == KeepAliveOptionRestart::ENABLED) { |
+ restart_allowed_keep_alives_.insert(option); |
+ } |
+ |
+ NotifyOfStateDifferences(before_state); |
+ DumpCurrentState(); |
} |
void KeepAliveRegistry::Unregister(const KeepAliveOptions* option) { |
- RemoveOne(option, registered_keep_alives_); |
+ DCHECK(option); |
+ |
+ // Check the state before adding the new KeepAlive |
+ KeepAliveOptions before_state = ComputeCurrentState(); |
+ RemoveOne(option, registered_keep_alives_); |
// TODO(dgn): We currently use the plain KeepAliveCount. We will integrate |
// that in this class progressively as mechanisms are merged. |
if (registered_keep_alives_.size() == 0) |
chrome::DecrementKeepAliveCount(); |
+ |
+ if (option->restart == KeepAliveOptionRestart::ENABLED) { |
+ RemoveOne(option, restart_allowed_keep_alives_); |
+ } |
+ |
+ NotifyOfStateDifferences(before_state); |
+ DumpCurrentState(); |
+} |
+ |
+void KeepAliveRegistry::DumpCurrentState() const { |
+#if !defined(NDEBUG) |
+ std::string msg = " - Registered: "; |
+ for (const KeepAliveOptions* registered : registered_keep_alives_) |
+ msg += std::string(registered->label) + " "; |
dgn
2016/02/23 16:58:46
seems that we use std::string::append and base::St
dgn
2016/02/24 13:03:55
Just logged directly with streams
|
+ msg += "\n - RestartAllowed: "; |
+ for (const KeepAliveOptions* registered : registered_keep_alives_) |
+ msg += std::string(registered->label) + " "; |
+ DLOG(INFO) << "Dumping current KeepAlive state:\n" << msg; |
+#endif // !defined(NDEBUG) |
} |