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

Side by Side Diff: components/search_engines/util.cc

Issue 2307663002: Remove ScopedVector from search_engines. (Closed)
Patch Set: devlin Created 4 years, 3 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
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/search_engines/util.h" 5 #include "components/search_engines/util.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
11 #include <map> 11 #include <map>
12 #include <set> 12 #include <set>
13 #include <string> 13 #include <string>
14 #include <vector> 14 #include <vector>
15 15
16 #include "base/logging.h" 16 #include "base/logging.h"
17 #include "base/memory/ptr_util.h" 17 #include "base/memory/ptr_util.h"
18 #include "base/memory/scoped_vector.h"
19 #include "base/time/time.h" 18 #include "base/time/time.h"
20 #include "components/prefs/pref_service.h" 19 #include "components/prefs/pref_service.h"
21 #include "components/search_engines/template_url.h" 20 #include "components/search_engines/template_url.h"
22 #include "components/search_engines/template_url_prepopulate_data.h" 21 #include "components/search_engines/template_url_prepopulate_data.h"
23 #include "components/search_engines/template_url_service.h" 22 #include "components/search_engines/template_url_service.h"
24 23
25 base::string16 GetDefaultSearchEngineName(TemplateURLService* service) { 24 base::string16 GetDefaultSearchEngineName(TemplateURLService* service) {
26 DCHECK(service); 25 DCHECK(service);
27 const TemplateURL* const default_provider = 26 const TemplateURL* const default_provider =
28 service->GetDefaultSearchProvider(); 27 service->GetDefaultSearchProvider();
(...skipping 15 matching lines...) Expand all
44 const TemplateURLRef& search_url = default_provider->url_ref(); 43 const TemplateURLRef& search_url = default_provider->url_ref();
45 DCHECK(search_url.SupportsReplacement(service->search_terms_data())); 44 DCHECK(search_url.SupportsReplacement(service->search_terms_data()));
46 TemplateURLRef::SearchTermsArgs search_terms_args(terms); 45 TemplateURLRef::SearchTermsArgs search_terms_args(terms);
47 search_terms_args.append_extra_query_params = true; 46 search_terms_args.append_extra_query_params = true;
48 return GURL(search_url.ReplaceSearchTerms(search_terms_args, 47 return GURL(search_url.ReplaceSearchTerms(search_terms_args,
49 service->search_terms_data())); 48 service->search_terms_data()));
50 } 49 }
51 50
52 void RemoveDuplicatePrepopulateIDs( 51 void RemoveDuplicatePrepopulateIDs(
53 KeywordWebDataService* service, 52 KeywordWebDataService* service,
54 const ScopedVector<TemplateURLData>& prepopulated_urls, 53 const std::vector<std::unique_ptr<TemplateURLData>>& prepopulated_urls,
55 TemplateURL* default_search_provider, 54 TemplateURL* default_search_provider,
56 TemplateURLService::OwnedTemplateURLVector* template_urls, 55 TemplateURLService::OwnedTemplateURLVector* template_urls,
57 const SearchTermsData& search_terms_data, 56 const SearchTermsData& search_terms_data,
58 std::set<std::string>* removed_keyword_guids) { 57 std::set<std::string>* removed_keyword_guids) {
59 DCHECK(template_urls); 58 DCHECK(template_urls);
60 59
61 // For convenience construct an ID->TemplateURL* map from |prepopulated_urls|. 60 // For convenience construct an ID->TemplateURL* map from |prepopulated_urls|.
62 std::map<int, TemplateURLData*> prepopulated_url_map; 61 std::map<int, TemplateURLData*> prepopulated_url_map;
63 for (std::vector<TemplateURLData*>::const_iterator i( 62 for (const auto& url : prepopulated_urls)
64 prepopulated_urls.begin()); 63 prepopulated_url_map[url->prepopulate_id] = url.get();
65 i != prepopulated_urls.end();
66 ++i)
67 prepopulated_url_map[(*i)->prepopulate_id] = *i;
68 64
69 // Separate |template_urls| into prepopulated and non-prepopulated groups. 65 // Separate |template_urls| into prepopulated and non-prepopulated groups.
70 std::multimap<int, std::unique_ptr<TemplateURL>> unchecked_urls; 66 std::multimap<int, std::unique_ptr<TemplateURL>> unchecked_urls;
71 TemplateURLService::OwnedTemplateURLVector checked_urls; 67 TemplateURLService::OwnedTemplateURLVector checked_urls;
72 for (auto& turl : *template_urls) { 68 for (auto& turl : *template_urls) {
73 int prepopulate_id = turl->prepopulate_id(); 69 int prepopulate_id = turl->prepopulate_id();
74 if (prepopulate_id) 70 if (prepopulate_id)
75 unchecked_urls.insert(std::make_pair(prepopulate_id, std::move(turl))); 71 unchecked_urls.insert(std::make_pair(prepopulate_id, std::move(turl)));
76 else 72 else
77 checked_urls.push_back(std::move(turl)); 73 checked_urls.push_back(std::move(turl));
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 const ActionsFromPrepopulateData& other) = default; 178 const ActionsFromPrepopulateData& other) = default;
183 179
184 ActionsFromPrepopulateData::~ActionsFromPrepopulateData() {} 180 ActionsFromPrepopulateData::~ActionsFromPrepopulateData() {}
185 181
186 // This is invoked when the version of the prepopulate data changes. 182 // This is invoked when the version of the prepopulate data changes.
187 // If |removed_keyword_guids| is not NULL, the Sync GUID of each item removed 183 // If |removed_keyword_guids| is not NULL, the Sync GUID of each item removed
188 // from the DB will be added to it. Note that this function will take 184 // from the DB will be added to it. Note that this function will take
189 // ownership of |prepopulated_urls| and will clear the vector. 185 // ownership of |prepopulated_urls| and will clear the vector.
190 void MergeEnginesFromPrepopulateData( 186 void MergeEnginesFromPrepopulateData(
191 KeywordWebDataService* service, 187 KeywordWebDataService* service,
192 ScopedVector<TemplateURLData>* prepopulated_urls, 188 std::vector<std::unique_ptr<TemplateURLData>>* prepopulated_urls,
193 size_t default_search_index, 189 size_t default_search_index,
194 TemplateURLService::OwnedTemplateURLVector* template_urls, 190 TemplateURLService::OwnedTemplateURLVector* template_urls,
195 TemplateURL* default_search_provider, 191 TemplateURL* default_search_provider,
196 std::set<std::string>* removed_keyword_guids) { 192 std::set<std::string>* removed_keyword_guids) {
197 DCHECK(prepopulated_urls); 193 DCHECK(prepopulated_urls);
198 DCHECK(template_urls); 194 DCHECK(template_urls);
199 195
200 ActionsFromPrepopulateData actions(CreateActionsFromCurrentPrepopulateData( 196 ActionsFromPrepopulateData actions(CreateActionsFromCurrentPrepopulateData(
201 prepopulated_urls, *template_urls, default_search_provider)); 197 prepopulated_urls, *template_urls, default_search_provider));
202 198
(...skipping 22 matching lines...) Expand all
225 auto j = FindTemplateURL(template_urls, edited_engine.first); 221 auto j = FindTemplateURL(template_urls, edited_engine.first);
226 *j = base::MakeUnique<TemplateURL>(data); 222 *j = base::MakeUnique<TemplateURL>(data);
227 } 223 }
228 224
229 // Add items. 225 // Add items.
230 for (const auto& added_engine : actions.added_engines) 226 for (const auto& added_engine : actions.added_engines)
231 template_urls->push_back(base::MakeUnique<TemplateURL>(added_engine)); 227 template_urls->push_back(base::MakeUnique<TemplateURL>(added_engine));
232 } 228 }
233 229
234 ActionsFromPrepopulateData CreateActionsFromCurrentPrepopulateData( 230 ActionsFromPrepopulateData CreateActionsFromCurrentPrepopulateData(
235 ScopedVector<TemplateURLData>* prepopulated_urls, 231 std::vector<std::unique_ptr<TemplateURLData>>* prepopulated_urls,
236 const TemplateURLService::OwnedTemplateURLVector& existing_urls, 232 const TemplateURLService::OwnedTemplateURLVector& existing_urls,
237 const TemplateURL* default_search_provider) { 233 const TemplateURL* default_search_provider) {
238 // Create a map to hold all provided |template_urls| that originally came from 234 // Create a map to hold all provided |template_urls| that originally came from
239 // prepopulate data (i.e. have a non-zero prepopulate_id()). 235 // prepopulate data (i.e. have a non-zero prepopulate_id()).
240 typedef std::map<int, TemplateURL*> IDMap; 236 std::map<int, TemplateURL*> id_to_turl;
241 IDMap id_to_turl;
242 for (auto& turl : existing_urls) { 237 for (auto& turl : existing_urls) {
243 int prepopulate_id = turl->prepopulate_id(); 238 int prepopulate_id = turl->prepopulate_id();
244 if (prepopulate_id > 0) 239 if (prepopulate_id > 0)
245 id_to_turl[prepopulate_id] = turl.get(); 240 id_to_turl[prepopulate_id] = turl.get();
246 } 241 }
247 242
248 // For each current prepopulated URL, check whether |template_urls| contained 243 // For each current prepopulated URL, check whether |template_urls| contained
249 // a matching prepopulated URL. If so, update the passed-in URL to match the 244 // a matching prepopulated URL. If so, update the passed-in URL to match the
250 // current data. (If the passed-in URL was user-edited, we persist the user's 245 // current data. (If the passed-in URL was user-edited, we persist the user's
251 // name and keyword.) If not, add the prepopulated URL. 246 // name and keyword.) If not, add the prepopulated URL.
252 ActionsFromPrepopulateData actions; 247 ActionsFromPrepopulateData actions;
253 for (size_t i = 0; i < prepopulated_urls->size(); ++i) { 248 for (auto& prepopulated_url : *prepopulated_urls) {
254 // We take ownership of |prepopulated_urls[i]|.
255 std::unique_ptr<TemplateURLData> prepopulated_url((*prepopulated_urls)[i]);
256 const int prepopulated_id = prepopulated_url->prepopulate_id; 249 const int prepopulated_id = prepopulated_url->prepopulate_id;
257 DCHECK_NE(0, prepopulated_id); 250 DCHECK_NE(0, prepopulated_id);
258 251
259 IDMap::iterator existing_url_iter(id_to_turl.find(prepopulated_id)); 252 auto existing_url_iter = id_to_turl.find(prepopulated_id);
260 if (existing_url_iter != id_to_turl.end()) { 253 if (existing_url_iter != id_to_turl.end()) {
261 // Update the data store with the new prepopulated data. Preserve user 254 // Update the data store with the new prepopulated data. Preserve user
262 // edits to the name and keyword. 255 // edits to the name and keyword.
263 TemplateURL* existing_url(existing_url_iter->second); 256 TemplateURL* existing_url(existing_url_iter->second);
264 id_to_turl.erase(existing_url_iter); 257 id_to_turl.erase(existing_url_iter);
265 MergeIntoPrepopulatedEngineData(existing_url, prepopulated_url.get()); 258 MergeIntoPrepopulatedEngineData(existing_url, prepopulated_url.get());
266 // Update last_modified to ensure that if this entry is later merged with 259 // Update last_modified to ensure that if this entry is later merged with
267 // entries from Sync, the conflict resolution logic knows that this was 260 // entries from Sync, the conflict resolution logic knows that this was
268 // updated and propagates the new values to the server. 261 // updated and propagates the new values to the server.
269 prepopulated_url->last_modified = base::Time::Now(); 262 prepopulated_url->last_modified = base::Time::Now();
270 actions.edited_engines.push_back( 263 actions.edited_engines.push_back(
271 std::make_pair(existing_url, *prepopulated_url)); 264 std::make_pair(existing_url, *prepopulated_url));
272 } else { 265 } else {
273 actions.added_engines.push_back(*prepopulated_url); 266 actions.added_engines.push_back(*prepopulated_url);
274 } 267 }
275 } 268 }
276 // The above loop takes ownership of all the contents of prepopulated_urls.
277 // Clear the pointers.
278 prepopulated_urls->weak_erase(prepopulated_urls->begin(),
279 prepopulated_urls->end());
280 269
281 // The block above removed all the URLs from the |id_to_turl| map that were 270 // The block above removed all the URLs from the |id_to_turl| map that were
282 // found in the prepopulate data. Any remaining URLs that haven't been 271 // found in the prepopulate data. Any remaining URLs that haven't been
283 // user-edited or made default can be removed from the data store. 272 // user-edited or made default can be removed from the data store.
284 // We assume that this entry is equivalent to the DSE if its prepopulate ID 273 // We assume that this entry is equivalent to the DSE if its prepopulate ID
285 // and keyword both match. If the prepopulate ID _does_ match all properties 274 // and keyword both match. If the prepopulate ID _does_ match all properties
286 // will be replaced with those from |default_search_provider| anyway. 275 // will be replaced with those from |default_search_provider| anyway.
287 for (IDMap::iterator i(id_to_turl.begin()); i != id_to_turl.end(); ++i) { 276 for (auto i = id_to_turl.begin(); i != id_to_turl.end(); ++i) {
288 TemplateURL* template_url = i->second; 277 TemplateURL* template_url = i->second;
289 if ((template_url->safe_for_autoreplace()) && 278 if ((template_url->safe_for_autoreplace()) &&
290 (!default_search_provider || 279 (!default_search_provider ||
291 (template_url->prepopulate_id() != 280 (template_url->prepopulate_id() !=
292 default_search_provider->prepopulate_id()) || 281 default_search_provider->prepopulate_id()) ||
293 (template_url->keyword() != default_search_provider->keyword()))) 282 (template_url->keyword() != default_search_provider->keyword())))
294 actions.removed_engines.push_back(template_url); 283 actions.removed_engines.push_back(template_url);
295 } 284 }
296 285
297 return actions; 286 return actions;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 KeywordWebDataService* service, 330 KeywordWebDataService* service,
342 PrefService* prefs, 331 PrefService* prefs,
343 TemplateURLService::OwnedTemplateURLVector* template_urls, 332 TemplateURLService::OwnedTemplateURLVector* template_urls,
344 TemplateURL* default_search_provider, 333 TemplateURL* default_search_provider,
345 const SearchTermsData& search_terms_data, 334 const SearchTermsData& search_terms_data,
346 int* resource_keyword_version, 335 int* resource_keyword_version,
347 std::set<std::string>* removed_keyword_guids) { 336 std::set<std::string>* removed_keyword_guids) {
348 DCHECK(template_urls); 337 DCHECK(template_urls);
349 DCHECK(resource_keyword_version); 338 DCHECK(resource_keyword_version);
350 size_t default_search_index; 339 size_t default_search_index;
351 ScopedVector<TemplateURLData> prepopulated_urls = 340 std::vector<std::unique_ptr<TemplateURLData>> prepopulated_urls =
352 TemplateURLPrepopulateData::GetPrepopulatedEngines(prefs, 341 TemplateURLPrepopulateData::GetPrepopulatedEngines(prefs,
353 &default_search_index); 342 &default_search_index);
354 RemoveDuplicatePrepopulateIDs(service, prepopulated_urls, 343 RemoveDuplicatePrepopulateIDs(service, prepopulated_urls,
355 default_search_provider, template_urls, 344 default_search_provider, template_urls,
356 search_terms_data, removed_keyword_guids); 345 search_terms_data, removed_keyword_guids);
357 346
358 const int prepopulate_resource_keyword_version = 347 const int prepopulate_resource_keyword_version =
359 TemplateURLPrepopulateData::GetDataVersion(prefs); 348 TemplateURLPrepopulateData::GetDataVersion(prefs);
360 if (*resource_keyword_version < prepopulate_resource_keyword_version) { 349 if (*resource_keyword_version < prepopulate_resource_keyword_version) {
361 MergeEnginesFromPrepopulateData( 350 MergeEnginesFromPrepopulateData(
(...skipping 18 matching lines...) Expand all
380 } 369 }
381 370
382 TemplateURLService::OwnedTemplateURLVector::iterator FindTemplateURL( 371 TemplateURLService::OwnedTemplateURLVector::iterator FindTemplateURL(
383 TemplateURLService::OwnedTemplateURLVector* urls, 372 TemplateURLService::OwnedTemplateURLVector* urls,
384 const TemplateURL* url) { 373 const TemplateURL* url) {
385 return std::find_if(urls->begin(), urls->end(), 374 return std::find_if(urls->begin(), urls->end(),
386 [url](const std::unique_ptr<TemplateURL>& ptr) { 375 [url](const std::unique_ptr<TemplateURL>& ptr) {
387 return ptr.get() == url; 376 return ptr.get() == url;
388 }); 377 });
389 } 378 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698