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

Unified Diff: chrome/browser/search_engines/util.cc

Issue 10021008: Reland r131019: Move most TemplateURL data members to a new struct, TemplateURLData. This allows us… (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 8 years, 8 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/search_engines/util.cc
===================================================================
--- chrome/browser/search_engines/util.cc (revision 131175)
+++ chrome/browser/search_engines/util.cc (working copy)
@@ -53,7 +53,7 @@
if (prepopulate_id) {
if (ids.find(prepopulate_id) != ids.end()) {
if (service)
- service->RemoveKeyword(**i);
+ service->RemoveKeyword((*i)->id());
delete *i;
i = template_urls->erase(i);
} else {
@@ -91,7 +91,8 @@
DCHECK(template_urls);
DCHECK(default_search_provider);
- // Build a map from prepopulate id to TemplateURL of existing urls.
+ // Create a map to hold all provided |template_urls| that originally came from
+ // prepopulate data (i.e. have a non-zero prepopulate_id()).
typedef std::map<int, TemplateURL*> IDMap;
IDMap id_to_turl;
for (std::vector<TemplateURL*>::iterator i(template_urls->begin());
@@ -101,66 +102,71 @@
id_to_turl[prepopulate_id] = *i;
}
+ // Get the current set of prepopulatd URLs.
std::vector<TemplateURL*> prepopulated_urls;
size_t default_search_index;
TemplateURLPrepopulateData::GetPrepopulatedEngines(prefs,
- &prepopulated_urls,
- &default_search_index);
+ &prepopulated_urls, &default_search_index);
- std::set<int> updated_ids;
+ // For each current prepopulated URL, check whether |template_urls| contained
+ // a matching prepopulated URL. If so, update the passed-in URL to match the
+ // current data. (If the passed-in URL was user-edited, we persist the user's
+ // name and keyword.) If not, add the prepopulated URL to |template_urls|.
+ // Along the way, point |default_search_provider| at the default prepopulated
+ // URL, if the user hasn't already set another URL as default.
for (size_t i = 0; i < prepopulated_urls.size(); ++i) {
// We take ownership of |prepopulated_urls[i]|.
scoped_ptr<TemplateURL> prepopulated_url(prepopulated_urls[i]);
const int prepopulated_id = prepopulated_url->prepopulate_id();
- if (!prepopulated_id || updated_ids.count(prepopulated_id)) {
- // Prepopulate engines need a unique id.
- NOTREACHED();
- continue;
- }
+ DCHECK_NE(0, prepopulated_id);
- TemplateURL* existing_url = NULL;
+ TemplateURL* url_in_vector = NULL;
IDMap::iterator existing_url_iter(id_to_turl.find(prepopulated_id));
if (existing_url_iter != id_to_turl.end()) {
- existing_url = existing_url_iter->second;
+ // Update the data store with the new prepopulated data. Preserve user
+ // edits to the name and keyword.
+ TemplateURLData data(prepopulated_url->data());
+ scoped_ptr<TemplateURL> existing_url(existing_url_iter->second);
+ id_to_turl.erase(existing_url_iter);
if (!existing_url->safe_for_autoreplace()) {
- // User edited the entry, preserve the keyword and description.
- prepopulated_url->set_safe_for_autoreplace(false);
- prepopulated_url->set_keyword(existing_url->keyword());
- prepopulated_url->set_autogenerate_keyword(
- existing_url->autogenerate_keyword());
- prepopulated_url->set_short_name(existing_url->short_name());
+ data.safe_for_autoreplace = false;
+ data.SetKeyword(existing_url->keyword());
+ data.SetAutogenerateKeyword(existing_url->autogenerate_keyword());
+ data.short_name = existing_url->short_name();
}
- prepopulated_url->set_id(existing_url->id());
+ data.id = existing_url->id();
+ url_in_vector = new TemplateURL(data);
+ if (service)
+ service->UpdateKeyword(*url_in_vector);
- *existing_url = *prepopulated_url;
- if (service) {
- service->UpdateKeyword(*existing_url);
- }
- id_to_turl.erase(existing_url_iter);
+ // Replace the entry in |template_urls| with the updated one.
+ std::vector<TemplateURL*>::iterator j = std::find(template_urls->begin(),
+ template_urls->end(), existing_url.get());
+ *j = url_in_vector;
+ if (*default_search_provider == existing_url.get())
+ *default_search_provider = url_in_vector;
} else {
- existing_url = prepopulated_url.get();
template_urls->push_back(prepopulated_url.release());
+ url_in_vector = template_urls->back();
}
- DCHECK(existing_url);
+ DCHECK(url_in_vector);
if (i == default_search_index && !*default_search_provider)
- *default_search_provider = existing_url;
-
- updated_ids.insert(prepopulated_id);
+ *default_search_provider = url_in_vector;
}
- // Remove any prepopulated engines which are no longer in the master list, as
- // long as the user hasn't modified them or made them the default engine.
+ // The block above removed all the URLs from the |id_to_turl| map that were
+ // found in the prepopulate data. Any remaining URLs that haven't been
+ // user-edited or made default can be removed from the data store.
for (IDMap::iterator i(id_to_turl.begin()); i != id_to_turl.end(); ++i) {
const TemplateURL* template_url = i->second;
if ((template_url->safe_for_autoreplace()) &&
(template_url != *default_search_provider)) {
- std::vector<TemplateURL*>::iterator i = std::find(template_urls->begin(),
- template_urls->end(),
- template_url);
- DCHECK(i != template_urls->end());
- template_urls->erase(i);
+ std::vector<TemplateURL*>::iterator j =
+ std::find(template_urls->begin(), template_urls->end(), template_url);
+ DCHECK(j != template_urls->end());
+ template_urls->erase(j);
if (service)
- service->RemoveKeyword(*template_url);
+ service->RemoveKeyword(template_url->id());
delete template_url;
}
}
@@ -185,7 +191,10 @@
WDKeywordsResult keyword_result = reinterpret_cast<
const WDResult<WDKeywordsResult>*>(&result)->GetValue();
- template_urls->swap(keyword_result.keywords);
+ for (KeywordTable::Keywords::const_iterator i(
+ keyword_result.keywords.begin()); i != keyword_result.keywords.end();
+ ++i)
+ template_urls->push_back(new TemplateURL(*i));
const int resource_keyword_version =
TemplateURLPrepopulateData::GetDataVersion(prefs);
@@ -222,8 +231,10 @@
if (!keyword_result.did_default_search_provider_change)
return false;
- backup_default_search_provider->reset(
- keyword_result.default_search_provider_backup);
+ if (keyword_result.backup_valid) {
+ backup_default_search_provider->reset(new TemplateURL(
+ keyword_result.default_search_provider_backup));
+ }
return true;
}
« no previous file with comments | « chrome/browser/search_engines/template_url_unittest.cc ('k') | chrome/browser/sync/test/integration/search_engines_helper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698