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

Side by Side Diff: components/offline_pages/offline_page_model_query.cc

Issue 2415473003: Query API: Introduces an OfflinePageModelQuery object. (Closed)
Patch Set: Address comments, add more tests, rename enum. Created 4 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
(Empty)
1 // Copyright 2016 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/offline_pages/offline_page_model_query.h"
6
7 #include <algorithm>
8 #include <unordered_set>
9
10 #include "base/memory/ptr_util.h"
11
12 namespace offline_pages {
13
14 using Requirement = OfflinePageModelQuery::Requirement;
15
16 namespace {
17
18 void SubtractNamespaces(std::vector<std::string>* namespaces,
19 const std::vector<std::string>& to_remove) {
20 std::set<std::string> remove_set(to_remove.begin(), to_remove.end());
21 auto found = [remove_set](const std::string& name_space) {
22 return remove_set.count(name_space) > 0;
23 };
24 namespaces->erase(
25 std::remove_if(namespaces->begin(), namespaces->end(), found),
26 namespaces->end());
27 }
28
29 void IntersectNamespaces(std::vector<std::string>* namespaces,
30 const std::vector<std::string>& intersect_with) {
31 std::set<std::string> intersect_set(intersect_with.begin(),
32 intersect_with.end());
33 auto missing = [intersect_set](const std::string& name_space) {
34 return intersect_set.count(name_space) == 0;
35 };
36 namespaces->erase(
37 std::remove_if(namespaces->begin(), namespaces->end(), missing),
38 namespaces->end());
39 }
40
41 } // namespace
42
43 OfflinePageModelQueryBuilder::OfflinePageModelQueryBuilder()
44 : offline_ids_(std::make_pair(Requirement::UNSET, std::vector<int64_t>())) {
45 }
46
47 OfflinePageModelQueryBuilder::~OfflinePageModelQueryBuilder() = default;
48
49 OfflinePageModelQueryBuilder& OfflinePageModelQueryBuilder::SetOfflinePageIds(
50 Requirement requirement,
51 const std::vector<int64_t>& ids) {
52 offline_ids_ = std::make_pair(requirement, ids);
53 return *this;
54 }
55
56 OfflinePageModelQueryBuilder& OfflinePageModelQueryBuilder::SetClientIds(
57 Requirement requirement,
58 const std::vector<ClientId>& ids) {
59 client_ids_ = std::make_pair(requirement, ids);
60 return *this;
61 }
62
63 OfflinePageModelQueryBuilder& OfflinePageModelQueryBuilder::SetUrls(
64 Requirement requirement,
65 const std::vector<GURL>& urls) {
66 urls_ = std::make_pair(requirement, urls);
67 return *this;
68 }
69
70 OfflinePageModelQueryBuilder&
71 OfflinePageModelQueryBuilder::RequireSupportedByDownload(
72 Requirement supported_by_download) {
73 supported_by_download_ = supported_by_download;
74 return *this;
75 }
76
77 OfflinePageModelQueryBuilder&
78 OfflinePageModelQueryBuilder::RequireShownAsRecentlyVisitedSite(
79 Requirement recently_visited) {
80 shown_as_recently_visited_site_ = recently_visited;
81 return *this;
82 }
83
84 OfflinePageModelQueryBuilder&
85 OfflinePageModelQueryBuilder::RequireRestrictedToOriginalTab(
86 Requirement original_tab) {
87 restricted_to_original_tab_ = original_tab;
88 return *this;
89 }
90
91 OfflinePageModelQueryBuilder& OfflinePageModelQueryBuilder::AllowExpiredPages(
92 bool allow_expired) {
93 allow_expired_ = allow_expired;
94 return *this;
95 }
96
97 std::unique_ptr<OfflinePageModelQuery> OfflinePageModelQueryBuilder::Build(
98 ClientPolicyController* controller) {
fgorski 2016/10/26 18:05:42 dcheck controller
dewittj 2016/10/27 22:49:18 Done.
99 auto query = base::MakeUnique<OfflinePageModelQuery>();
100
101 query->allow_expired_ = allow_expired_;
102 query->urls_ = std::make_pair(
103 urls_.first, std::set<GURL>(urls_.second.begin(), urls_.second.end()));
104 urls_ = std::make_pair(Requirement::UNSET, std::vector<GURL>());
105 query->offline_ids_ = std::make_pair(
106 offline_ids_.first, std::set<int64_t>(offline_ids_.second.begin(),
107 offline_ids_.second.end()));
108 offline_ids_ = std::make_pair(Requirement::UNSET, std::vector<int64_t>());
109 query->client_ids_ = std::make_pair(
110 client_ids_.first,
111 std::set<ClientId>(client_ids_.second.begin(), client_ids_.second.end()));
112 client_ids_ = std::make_pair(Requirement::UNSET, std::vector<ClientId>());
113
114 std::vector<std::string> allowed_namespaces = controller->GetAllNamespaces();
fgorski 2016/10/26 18:05:42 this can wait until you know you have something in
dewittj 2016/10/27 22:49:18 Acknowledged.
115
116 std::vector<std::pair<Requirement, std::vector<std::string>>> op_list;
117 if (supported_by_download_ != Requirement::UNSET) {
118 op_list.emplace_back(
119 std::make_pair(supported_by_download_,
120 controller->GetNamespacesSupportedByDownload()));
121 }
122 if (shown_as_recently_visited_site_ != Requirement::UNSET) {
123 op_list.emplace_back(
124 std::make_pair(shown_as_recently_visited_site_,
125 controller->GetNamespacesShownAsRecentlyVisitedSite()));
126 }
127 if (restricted_to_original_tab_ != Requirement::UNSET) {
128 op_list.emplace_back(
129 std::make_pair(restricted_to_original_tab_,
130 controller->GetNamespacesRestrictedToOriginalTab()));
131 }
132
133 for (auto& requirement_namespace_pair : op_list) {
134 Requirement r = requirement_namespace_pair.first;
135 const std::vector<std::string>& namespaces =
136 requirement_namespace_pair.second;
137
138 switch (r) {
139 case Requirement::UNSET:
140 break;
141 case Requirement::INCLUDE_MATCHING:
fgorski 2016/10/26 18:46:02 suggestion split in 2 ifs. Please check if that pa
dewittj 2016/10/27 22:49:18 Done. I like that better, thanks!
142 IntersectNamespaces(&allowed_namespaces, namespaces);
143 break;
144 case Requirement::EXCLUDE_MATCHING:
145 SubtractNamespaces(&allowed_namespaces, namespaces);
146 break;
147 }
148 }
149
150 supported_by_download_ = Requirement::UNSET;
151 shown_as_recently_visited_site_ = Requirement::UNSET;
152 restricted_to_original_tab_ = Requirement::UNSET;
153
154 if (op_list.size() > 0) {
155 query->restricted_to_namespaces_ = base::MakeUnique<std::set<std::string>>(
156 allowed_namespaces.begin(), allowed_namespaces.end());
157 }
158
159 return query;
160 }
161
162 OfflinePageModelQuery::OfflinePageModelQuery() = default;
163 OfflinePageModelQuery::~OfflinePageModelQuery() = default;
164
165 bool OfflinePageModelQuery::GetRestrictedToNamespaces(
166 std::set<std::string>* namespaces_out) {
167 if (!restricted_to_namespaces_)
168 return false;
169
170 *namespaces_out = *restricted_to_namespaces_;
171 return true;
172 }
173
174 Requirement OfflinePageModelQuery::GetRestrictedToOfflineIds(
175 std::set<int64_t>* ids_out) {
176 if (offline_ids_.first == Requirement::UNSET)
177 return Requirement::UNSET;
178
179 *ids_out = offline_ids_.second;
180 return offline_ids_.first;
181 }
182
183 Requirement OfflinePageModelQuery::GetRestrictedToClientIds(
184 std::set<ClientId>* ids_out) {
185 if (client_ids_.first == Requirement::UNSET)
186 return Requirement::UNSET;
187
188 *ids_out = client_ids_.second;
189 return client_ids_.first;
190 }
191
192 Requirement OfflinePageModelQuery::GetRestrictedToUrls(
193 std::set<GURL>* urls_out) {
194 if (urls_.first == Requirement::UNSET)
195 return Requirement::UNSET;
196
197 *urls_out = urls_.second;
198 return urls_.first;
199 }
200
201 bool OfflinePageModelQuery::GetAllowExpired() {
202 return allow_expired_;
203 }
204
205 bool OfflinePageModelQuery::Matches(const OfflinePageItem& item) {
206 if (!allow_expired_ && item.IsExpired())
207 return false;
208
209 switch (offline_ids_.first) {
210 case Requirement::UNSET:
211 break;
212 case Requirement::INCLUDE_MATCHING:
213 if (offline_ids_.second.count(item.offline_id) == 0)
214 return false;
215 break;
216 case Requirement::EXCLUDE_MATCHING:
217 if (offline_ids_.second.count(item.offline_id) > 0)
218 return false;
219 break;
220 }
221
222 switch (urls_.first) {
223 case Requirement::UNSET:
224 break;
225 case Requirement::INCLUDE_MATCHING:
226 if (urls_.second.count(item.url) == 0)
227 return false;
228 break;
229 case Requirement::EXCLUDE_MATCHING:
230 if (urls_.second.count(item.url) > 0)
231 return false;
232 break;
233 }
234
235 const ClientId& client_id = item.client_id;
236 if (restricted_to_namespaces_ &&
237 restricted_to_namespaces_->count(client_id.name_space) == 0) {
238 return false;
239 }
240
241 switch (client_ids_.first) {
242 case Requirement::UNSET:
243 break;
244 case Requirement::INCLUDE_MATCHING:
245 if (client_ids_.second.count(client_id) == 0)
246 return false;
247 break;
248 case Requirement::EXCLUDE_MATCHING:
249 if (client_ids_.second.count(client_id) > 0)
250 return false;
251 break;
252 }
253
254 return true;
255 }
256
257 } // namespace offline_pages
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698