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

Side by Side Diff: components/password_manager/core/browser/log_router.cc

Issue 1415533013: Fix password manager internals renderer reporting (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix failing test Created 5 years, 1 month 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/password_manager/core/browser/log_router.h" 5 #include "components/password_manager/core/browser/log_router.h"
6 6
7 #include "base/stl_util.h" 7 #include "base/stl_util.h"
8 #include "components/password_manager/core/browser/log_manager.h"
8 #include "components/password_manager/core/browser/log_receiver.h" 9 #include "components/password_manager/core/browser/log_receiver.h"
9 #include "components/password_manager/core/browser/password_manager_client.h"
10 10
11 namespace password_manager { 11 namespace password_manager {
12 12
13 LogRouter::LogRouter() { 13 LogRouter::LogRouter() = default;
14 }
15 14
16 LogRouter::~LogRouter() { 15 LogRouter::~LogRouter() = default;
17 }
18 16
19 void LogRouter::ProcessLog(const std::string& text) { 17 void LogRouter::ProcessLog(const std::string& text) {
20 // This may not be called when there are no receivers (i.e., the router is 18 // 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. 19 // inactive), because in that case the logs cannot be displayed.
22 DCHECK(receivers_.might_have_observers()); 20 DCHECK(receivers_.might_have_observers());
23 accumulated_logs_.append(text); 21 accumulated_logs_.append(text);
24 FOR_EACH_OBSERVER(LogReceiver, receivers_, LogSavePasswordProgress(text)); 22 FOR_EACH_OBSERVER(LogReceiver, receivers_, LogSavePasswordProgress(text));
25 } 23 }
26 24
27 bool LogRouter::RegisterClient(PasswordManagerClient* client) { 25 bool LogRouter::RegisterManager(LogManager* manager) {
28 DCHECK(client); 26 DCHECK(manager);
29 clients_.AddObserver(client); 27 managers_.AddObserver(manager);
30 return receivers_.might_have_observers(); 28 return receivers_.might_have_observers();
31 } 29 }
32 30
33 void LogRouter::UnregisterClient(PasswordManagerClient* client) { 31 void LogRouter::UnregisterManager(LogManager* manager) {
34 DCHECK(clients_.HasObserver(client)); 32 DCHECK(managers_.HasObserver(manager));
35 clients_.RemoveObserver(client); 33 managers_.RemoveObserver(manager);
36 } 34 }
37 35
38 std::string LogRouter::RegisterReceiver(LogReceiver* receiver) { 36 std::string LogRouter::RegisterReceiver(LogReceiver* receiver) {
39 DCHECK(receiver); 37 DCHECK(receiver);
40 DCHECK(accumulated_logs_.empty() || receivers_.might_have_observers()); 38 DCHECK(accumulated_logs_.empty() || receivers_.might_have_observers());
41 39
42 if (!receivers_.might_have_observers()) { 40 if (!receivers_.might_have_observers()) {
43 FOR_EACH_OBSERVER( 41 FOR_EACH_OBSERVER(LogManager, managers_,
44 PasswordManagerClient, clients_, OnLogRouterAvailabilityChanged(true)); 42 OnLogRouterAvailabilityChanged(true));
45 } 43 }
46 receivers_.AddObserver(receiver); 44 receivers_.AddObserver(receiver);
47 return accumulated_logs_; 45 return accumulated_logs_;
48 } 46 }
49 47
50 void LogRouter::UnregisterReceiver(LogReceiver* receiver) { 48 void LogRouter::UnregisterReceiver(LogReceiver* receiver) {
51 DCHECK(receivers_.HasObserver(receiver)); 49 DCHECK(receivers_.HasObserver(receiver));
52 receivers_.RemoveObserver(receiver); 50 receivers_.RemoveObserver(receiver);
53 if (!receivers_.might_have_observers()) { 51 if (!receivers_.might_have_observers()) {
54 accumulated_logs_.clear(); 52 // |accumulated_logs_| can become very long; use the swap instead of clear()
55 FOR_EACH_OBSERVER( 53 // to ensure that the memory is freed.
56 PasswordManagerClient, clients_, OnLogRouterAvailabilityChanged(false)); 54 std::string().swap(accumulated_logs_);
55 FOR_EACH_OBSERVER(LogManager, managers_,
56 OnLogRouterAvailabilityChanged(false));
57 } 57 }
58 } 58 }
59 59
60 } // namespace password_manager 60 } // namespace password_manager
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698