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

Side by Side Diff: net/reporting/reporting_cache.cc

Issue 2708503002: Reporting: Implement cache. (Closed)
Patch Set: Make requested changes. Created 3 years, 9 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 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 "net/reporting/reporting_cache.h"
6
7 #include <map>
8 #include <memory>
9 #include <set>
10 #include <string>
11 #include <vector>
12
13 #include "base/memory/ptr_util.h"
14 #include "base/stl_util.h"
15 #include "base/time/time.h"
16 #include "net/reporting/reporting_client.h"
17 #include "net/reporting/reporting_report.h"
18 #include "url/gurl.h"
19
20 namespace net {
21
22 ReportingCache::ReportingCache() {}
23
24 ReportingCache::~ReportingCache() {}
25
26 void ReportingCache::AddReport(const GURL& url,
27 const std::string& group,
28 const std::string& type,
29 std::unique_ptr<const base::Value> body,
30 base::TimeTicks queued,
31 int attempts) {
32 auto report = base::MakeUnique<ReportingReport>(
33 url, group, type, std::move(body), queued, attempts);
34
35 auto inserted =
36 reports_.insert(std::make_pair(report.get(), std::move(report)));
37 DCHECK(inserted.second);
38 }
39
40 void ReportingCache::GetReports(
41 std::vector<const ReportingReport*>* reports_out) const {
42 reports_out->clear();
43 for (const auto& it : reports_) {
44 if (!base::ContainsKey(doomed_reports_, it.first))
45 reports_out->push_back(it.second.get());
46 }
47 }
48
49 void ReportingCache::SetReportsPending(
50 const std::vector<const ReportingReport*>& reports) {
51 for (const ReportingReport* report : reports) {
52 auto inserted = pending_reports_.insert(report);
53 DCHECK(inserted.second);
54 }
55 }
56
57 void ReportingCache::ClearReportsPending(
58 const std::vector<const ReportingReport*>& reports) {
59 std::vector<const ReportingReport*> reports_to_remove;
60
61 for (const ReportingReport* report : reports) {
62 size_t erased = pending_reports_.erase(report);
63 DCHECK_EQ(1u, erased);
64 if (base::ContainsKey(doomed_reports_, report)) {
65 reports_to_remove.push_back(report);
66 doomed_reports_.erase(report);
67 }
68 }
69
70 RemoveReports(reports_to_remove);
71 }
72
73 void ReportingCache::IncrementReportsAttempts(
74 const std::vector<const ReportingReport*>& reports) {
75 for (const ReportingReport* report : reports) {
76 DCHECK(base::ContainsKey(reports_, report));
77 reports_[report]->attempts++;
78 }
79 }
80
81 void ReportingCache::RemoveReports(
82 const std::vector<const ReportingReport*>& reports) {
83 for (const ReportingReport* report : reports) {
84 DCHECK(base::ContainsKey(reports_, report));
85 if (base::ContainsKey(pending_reports_, report))
86 doomed_reports_.insert(report);
87 else {
88 DCHECK(!base::ContainsKey(doomed_reports_, report));
89 reports_.erase(report);
90 }
91 }
92 }
93
94 void ReportingCache::RemoveAllReports() {
95 std::vector<std::unordered_map<const ReportingReport*,
96 std::unique_ptr<ReportingReport>>::iterator>
97 reports_to_remove;
98 for (auto it = reports_.begin(); it != reports_.end(); ++it) {
99 ReportingReport* report = it->second.get();
100 if (!base::ContainsKey(pending_reports_, report))
101 reports_to_remove.push_back(it);
102 else
103 doomed_reports_.insert(report);
104 }
105
106 for (auto& it : reports_to_remove)
107 reports_.erase(it);
108 }
109
110 void ReportingCache::GetClients(
111 std::vector<const ReportingClient*>* clients_out) const {
112 clients_out->clear();
113 for (const auto& it : clients_)
114 for (const auto& endpoint_and_client : it.second)
115 clients_out->push_back(endpoint_and_client.second.get());
116 }
117
118 void ReportingCache::GetClientsForOriginAndGroup(
119 const url::Origin& origin,
120 const std::string& group,
121 std::vector<const ReportingClient*>* clients_out) const {
122 clients_out->clear();
123
124 const auto it = clients_.find(origin);
125 if (it == clients_.end())
126 return;
127
128 for (const auto& endpoint_and_client : it->second) {
129 if (endpoint_and_client.second->group == group)
130 clients_out->push_back(endpoint_and_client.second.get());
131 }
132 }
133
134 void ReportingCache::SetClient(const url::Origin& origin,
135 const GURL& endpoint,
136 ReportingClient::Subdomains subdomains,
137 const std::string& group,
138 base::TimeTicks expires) {
139 DCHECK(endpoint.SchemeIsCryptographic());
140
141 clients_[origin][endpoint] = base::MakeUnique<ReportingClient>(
142 origin, endpoint, subdomains, group, expires);
143 }
144
145 void ReportingCache::RemoveClients(
146 const std::vector<const ReportingClient*>& clients_to_remove) {
147 for (const ReportingClient* client : clients_to_remove) {
148 DCHECK(base::ContainsKey(clients_[client->origin], client->endpoint));
149 DCHECK(clients_[client->origin][client->endpoint].get() == client);
150 clients_[client->origin].erase(client->endpoint);
151 }
152 }
153
154 void ReportingCache::RemoveClientForOriginAndEndpoint(const url::Origin& origin,
155 const GURL& endpoint) {
156 DCHECK(base::ContainsKey(clients_, origin));
157 DCHECK(base::ContainsKey(clients_[origin], endpoint));
158 clients_[origin].erase(endpoint);
159 }
160
161 void ReportingCache::RemoveClientsForEndpoint(const GURL& endpoint) {
162 for (auto& it : clients_)
163 it.second.erase(endpoint);
164 }
165
166 void ReportingCache::RemoveAllClients() {
167 clients_.clear();
168 }
169
170 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698