Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(372)

Unified Diff: components/password_manager/core/browser/log_router.h

Issue 262583007: Password manager internals page service: introduction (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Add client registration, remove IsActive Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/password_manager/core/browser/log_router.h
diff --git a/components/password_manager/core/browser/log_router.h b/components/password_manager/core/browser/log_router.h
new file mode 100644
index 0000000000000000000000000000000000000000..3c7e5feab989d9fef9f56a7a9b0f1ed61d82ccaf
--- /dev/null
+++ b/components/password_manager/core/browser/log_router.h
@@ -0,0 +1,77 @@
+// Copyright 2014 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.
+
+#ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_LOG_ROUTER_H_
+#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_LOG_ROUTER_H_
+
+#include <set>
+#include <string>
+
+#include "base/macros.h"
+
+namespace password_manager {
+
+class PasswordManagerClient;
+class PasswordManagerLogger;
+
+// The router stands between PasswordManagerClient instances and log receivers.
+// During the process of saving a password, the password manager code generates
+// the log strings, and passes them to the router. The receivers are capable of
+// actually displaying them to the user; the receivers can register with and
+// unregister from the router. The router updates the registered receivers with
+// new logs. It also stores all logs until the moment when there are no
+// registered receivers. On registration, a receiver gets all the currently
+// stored logs.
Ilya Sherman 2014/05/02 23:38:38 Is this complexity worth it, vs. just making the i
vabr (Chromium) 2014/05/06 13:16:30 Having the internals page a singleton is only a ha
+// The clients must also register, to be notified about the router toggling its
+// activity state.
+// TODO(vabr): The receivers are objects of type PasswordManagerLogger. That
+// type should be renamed to LogReceiver instead.
+class LogRouter {
+ public:
+ // Depending on whether the router has any receivers registered or not, it is
+ // active or not. Logs passed to the router are forwarded during the active
+ // state, and dropped otherwise. The clients are notified about the state on
+ // its change, and on registration.
+ enum RouterActivityState { ROUTER_ACTIVE, ROUTER_NOT_ACTIVE };
Ilya Sherman 2014/05/02 23:38:38 nit: "NOT_ACTIVE" -> "INACTIVE"
vabr (Chromium) 2014/05/06 13:16:30 Actually, I dropped the enum. Instead of introduci
+
+ LogRouter();
+ virtual ~LogRouter();
+
+ // Call this to pass logs to the router. The router may display them or drop
+ // them, based on its activity state.
+ void ProcessLog(const std::string& text);
Ilya Sherman 2014/05/02 23:38:38 Perhaps it should be an error to call this method
vabr (Chromium) 2014/05/06 13:16:30 I'll give it a try, since I could not actually thi
+
+ // Registration methods for the PasswordManagerClient and for the receivers to
+ // call, both return true on success. Register*() fails for already registered
+ // objects. Unregister*() fails for not registered objects. Never pass a NULL
+ // pointer to these methods. Every registered client and receiver must
+ // unregister before being destroyed.
+ bool RegisterClient(PasswordManagerClient* client);
vabr (Chromium) 2014/05/02 15:33:10 TODO(vabr): Remove the failure reporting via retur
+ bool UnregisterClient(PasswordManagerClient* client);
+ bool RegisterReceiver(PasswordManagerLogger* receiver);
+ bool UnregisterReceiver(PasswordManagerLogger* receiver);
+
+ private:
+ typedef std::set<PasswordManagerClient*> ClientSet;
+ typedef std::set<PasswordManagerLogger*> ReceiverSet;
Ilya Sherman 2014/05/02 23:38:38 nit: Did you consider using an ObserverList?
vabr (Chromium) 2014/05/06 13:16:30 Thanks for pointing me to that. While I'm not sure
+
+ // Goes through all of the clients and sends them the current state.
+ void NotifyClients(RouterActivityState state);
+
+ // Clients send log strings to the router, and are notified by the router when
+ // logging activity changes.
+ ClientSet clients_;
+
+ // Receivers receive strings from the router.
+ ReceiverSet receivers_;
+
+ // Logs seen so far since the last time IsActive() changed from false to true.
+ std::string accumulated_logs_;
+
+ DISALLOW_COPY_AND_ASSIGN(LogRouter);
+};
+
+} // namespace password_manager
+
+#endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_LOG_ROUTER_H_

Powered by Google App Engine
This is Rietveld 408576698