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