void RemoveDuplicatePrepopulateIDs(
WebDataService* service,
- const ScopedVector<TemplateURL>& prepopulated_urls,
+ const ScopedVector<TemplateURLData>& prepopulated_urls,
TemplateURL* default_search_provider,
TemplateURLService::TemplateURLVector* template_urls,
std::set<std::string>* removed_keyword_guids) {
DCHECK(template_urls);
// For convenience construct an ID->TemplateURL* map from |prepopulated_urls|.
- typedef std::map<int, TemplateURL*> PrepopulatedURLMap;
+ typedef std::map<int, TemplateURLData*> PrepopulatedURLMap;
PrepopulatedURLMap prepopulated_url_map;
- for (std::vector<TemplateURL*>::const_iterator i(prepopulated_urls.begin());
- i != prepopulated_urls.end(); ++i)
- prepopulated_url_map[(*i)->prepopulate_id()] = *i;
+ for (std::vector<TemplateURLData*>::const_iterator i(
+ prepopulated_urls.begin());
+ i != prepopulated_urls.end();
+ ++i)
+ prepopulated_url_map[(*i)->prepopulate_id] = *i;
// Separate |template_urls| into prepopulated and non-prepopulated groups.
typedef std::multimap<int, TemplateURL*> UncheckedURLMap;
UncheckedURLMap::iterator best = unchecked_urls.begin();
bool matched_keyword = false;
for (UncheckedURLMap::iterator i = unchecked_urls.begin(); i != end; ++i) {
- // A URL is automatically the best if it's the default search engine.
- if (i->second == default_search_provider) {
+ // If the user-selected DSE is a prepopulated engine its properties will
+ // either come from the prepopulation origin or from the user preferences
+ // file (see DefaultSearchManager). Those properties will end up
+ // overwriting whatever we load now anyway. If we are eliminating
+ // duplicates, then, we err on the side of keeping the thing that looks
+ // more like the value we will end up with in the end.
+ if (default_search_provider &&
+ (default_search_provider->prepopulate_id() ==
+ i->second->prepopulate_id()) &&
+ default_search_provider->HasSameKeywordAs(i->second->data())) {
best = i;
break;
}
if (matched_keyword)
continue;
if ((prepopulated_url != prepopulated_url_map.end()) &&
- i->second->HasSameKeywordAs(*prepopulated_url->second)) {
+ i->second->HasSameKeywordAs(*prepopulated_url->second)) {
best = i;
matched_keyword = true;
} else if (i->second->id() < best->second->id()) {
return NULL;
}
-void MergeIntoPrepopulatedEngineData(TemplateURLData* prepopulated_url,
- const TemplateURL* original_turl) {
+void MergeIntoPrepopulatedEngineData(const TemplateURL* original_turl,
+ TemplateURLData* prepopulated_url) {
DCHECK_EQ(original_turl->prepopulate_id(), prepopulated_url->prepopulate_id);
if (!original_turl->safe_for_autoreplace()) {
prepopulated_url->safe_for_autoreplace = false;
void MergeEnginesFromPrepopulateData(
Profile* profile,
WebDataService* service,
- ScopedVector<TemplateURL>* prepopulated_urls,
+ ScopedVector<TemplateURLData>* prepopulated_urls,
size_t default_search_index,
TemplateURLService::TemplateURLVector* template_urls,
- TemplateURL** default_search_provider,
+ TemplateURL* default_search_provider,
std::set<std::string>* removed_keyword_guids) {
DCHECK(service == NULL || BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(prepopulated_urls);
DCHECK(template_urls);
- DCHECK(default_search_provider);
- int default_prepopulated_id =
- (*prepopulated_urls)[default_search_index]->prepopulate_id();
ActionsFromPrepopulateData actions(CreateActionsFromCurrentPrepopulateData(
- prepopulated_urls, *template_urls, *default_search_provider));
+ prepopulated_urls, *template_urls, default_search_provider));
// Remove items.
for (std::vector<TemplateURL*>::iterator i = actions.removed_engines.begin();
TemplateURLService::TemplateURLVector::iterator j =
std::find(template_urls->begin(), template_urls->end(), template_url);
DCHECK(j != template_urls->end());
- DCHECK(*j != *default_search_provider);
+ DCHECK(!default_search_provider ||
+ (*j)->prepopulate_id() != default_search_provider->prepopulate_id());
template_urls->erase(j);
if (service) {
service->RemoveKeyword(template_url->id());
TemplateURLService::TemplateURLVector::iterator j = std::find(
template_urls->begin(), template_urls->end(), existing_url.get());
*j = new TemplateURL(profile, data);
- if (*default_search_provider == existing_url.get())
- *default_search_provider = *j;
}
// Add items.
- template_urls->insert(template_urls->end(), actions.added_engines.begin(),
- actions.added_engines.end());
-
- if (!*default_search_provider) {
- // The user had no existing default search provider, so set the
- // default to the default prepopulated engine.
- *default_search_provider = FindURLByPrepopulateID(*template_urls,
- default_prepopulated_id);
+ for (std::vector<TemplateURLData>::const_iterator it =
+ actions.added_engines.begin();
+ it != actions.added_engines.end();
+ ++it) {
+ template_urls->push_back(new TemplateURL(profile, *it));
}
}
ActionsFromPrepopulateData CreateActionsFromCurrentPrepopulateData(
- ScopedVector<TemplateURL>* prepopulated_urls,
+ ScopedVector<TemplateURLData>* prepopulated_urls,
const TemplateURLService::TemplateURLVector& existing_urls,
const TemplateURL* default_search_provider) {
// Create a map to hold all provided |template_urls| that originally came from
ActionsFromPrepopulateData actions;
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();
+ scoped_ptr<TemplateURLData> prepopulated_url((*prepopulated_urls)[i]);
+ const int prepopulated_id = prepopulated_url->prepopulate_id;
DCHECK_NE(0, prepopulated_id);
IDMap::iterator existing_url_iter(id_to_turl.find(prepopulated_id));
if (existing_url_iter != id_to_turl.end()) {
// Update the data store with the new prepopulated data. Preserve user
// edits to the name and keyword.
- TemplateURLData data(prepopulated_url->data());
TemplateURL* existing_url(existing_url_iter->second);
id_to_turl.erase(existing_url_iter);
- MergeIntoPrepopulatedEngineData(&data, existing_url);
+ MergeIntoPrepopulatedEngineData(existing_url, prepopulated_url.get());
// Update last_modified to ensure that if this entry is later merged with
// entries from Sync, the conflict resolution logic knows that this was
// updated and propagates the new values to the server.
- data.last_modified = base::Time::Now();
- actions.edited_engines.push_back(std::make_pair(existing_url, data));
+ prepopulated_url->last_modified = base::Time::Now();
+ actions.edited_engines.push_back(
+ std::make_pair(existing_url, *prepopulated_url));
} else {
- actions.added_engines.push_back(prepopulated_url.release());
+ actions.added_engines.push_back(*prepopulated_url);
}
}
// The above loop takes ownership of all the contents of prepopulated_urls.
// 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.
+ // We assume that this entry is equivalent to the DSE if its prepopulate ID
+ // and keyword both match. If the prepopulate ID _does_ match all properties
+ // will be replaced with those from |default_search_provider| anyway.
for (IDMap::iterator i(id_to_turl.begin()); i != id_to_turl.end(); ++i) {
TemplateURL* template_url = i->second;
if ((template_url->safe_for_autoreplace()) &&
- (template_url != default_search_provider))
+ (!default_search_provider ||
+ (template_url->prepopulate_id() !=
+ default_search_provider->prepopulate_id()) ||
+ (template_url->keyword() != default_search_provider->keyword())))
actions.removed_engines.push_back(template_url);
}
WebDataService* service,
Profile* profile,
TemplateURLService::TemplateURLVector* template_urls,
- TemplateURL** default_search_provider,
+ TemplateURL* default_search_provider,
int* new_resource_keyword_version,
std::set<std::string>* removed_keyword_guids) {
DCHECK(service == NULL || BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(template_urls);
DCHECK(template_urls->empty());
- DCHECK(default_search_provider);
- DCHECK(*default_search_provider == NULL);
DCHECK_EQ(KEYWORDS_RESULT, result.GetType());
DCHECK(new_resource_keyword_version);
template_urls->push_back(new TemplateURL(profile, *i));
}
- int64 default_search_provider_id = keyword_result.default_search_provider_id;
- if (default_search_provider_id) {
- *default_search_provider =
- GetTemplateURLByID(*template_urls, default_search_provider_id);
- }
-
*new_resource_keyword_version = keyword_result.builtin_keyword_version;
GetSearchProvidersUsingLoadedEngines(service, profile, template_urls,
default_search_provider,
WebDataService* service,
Profile* profile,
TemplateURLService::TemplateURLVector* template_urls,
- TemplateURL** default_search_provider,
+ TemplateURL* default_search_provider,
int* resource_keyword_version,
std::set<std::string>* removed_keyword_guids) {
DCHECK(service == NULL || BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(template_urls);
- DCHECK(default_search_provider);
DCHECK(resource_keyword_version);
-
+ PrefService* prefs = profile ? profile->GetPrefs() : NULL;
size_t default_search_index;
- ScopedVector<TemplateURL> prepopulated_urls =
- TemplateURLPrepopulateData::GetPrepopulatedEngines(profile,
+ ScopedVector<TemplateURLData> prepopulated_urls =
+ TemplateURLPrepopulateData::GetPrepopulatedEngines(prefs,
&default_search_index);
RemoveDuplicatePrepopulateIDs(service, prepopulated_urls,
- *default_search_provider, template_urls,
+ default_search_provider, template_urls,
removed_keyword_guids);
const int prepopulate_resource_keyword_version =
- TemplateURLPrepopulateData::GetDataVersion(
- profile ? profile->GetPrefs() : NULL);
+ TemplateURLPrepopulateData::GetDataVersion(prefs);
if (*resource_keyword_version < prepopulate_resource_keyword_version) {
MergeEnginesFromPrepopulateData(profile, service, &prepopulated_urls,
default_search_index, template_urls, default_search_provider,