1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/password_manager/core/browser/log_router.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/stl_util.h"
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/password_manager/core/browser/log_receiver.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/password_manager/core/browser/password_manager_client.h"
10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace password_manager {
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)LogRouter::LogRouter() {
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)LogRouter::~LogRouter() {
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void LogRouter::ProcessLog(const std::string& text) {
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This may not be called when there are no receivers (i.e., the router is
21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // inactive), because in that case the logs cannot be displayed.
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(receivers_.might_have_observers());
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  accumulated_logs_.append(text);
24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  FOR_EACH_OBSERVER(
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      LogReceiver, receivers_, LogSavePasswordProgress(text));
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool LogRouter::RegisterClient(PasswordManagerClient* client) {
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(client);
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  clients_.AddObserver(client);
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return receivers_.might_have_observers();
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void LogRouter::UnregisterClient(PasswordManagerClient* client) {
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(clients_.HasObserver(client));
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  clients_.RemoveObserver(client);
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)std::string LogRouter::RegisterReceiver(LogReceiver* receiver) {
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(receiver);
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(accumulated_logs_.empty() || receivers_.might_have_observers());
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!receivers_.might_have_observers()) {
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    FOR_EACH_OBSERVER(
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        PasswordManagerClient, clients_, OnLogRouterAvailabilityChanged(true));
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  receivers_.AddObserver(receiver);
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return accumulated_logs_;
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void LogRouter::UnregisterReceiver(LogReceiver* receiver) {
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK(receivers_.HasObserver(receiver));
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  receivers_.RemoveObserver(receiver);
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!receivers_.might_have_observers()) {
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    accumulated_logs_.clear();
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    FOR_EACH_OBSERVER(
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        PasswordManagerClient, clients_, OnLogRouterAvailabilityChanged(false));
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace password_manager
62