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