Upstream version 7.36.149.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / search_engines / util.cc
index e63eb90..5378b3b 100644 (file)
@@ -56,7 +56,7 @@ GURL GetDefaultSearchURLForSearchTerms(Profile* profile,
 
 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) {
@@ -64,11 +64,13 @@ void RemoveDuplicatePrepopulateIDs(
   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;
@@ -96,8 +98,16 @@ void RemoveDuplicatePrepopulateIDs(
     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;
       }
@@ -107,7 +117,7 @@ void RemoveDuplicatePrepopulateIDs(
       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()) {
@@ -161,8 +171,8 @@ TemplateURL* FindURLByPrepopulateID(
   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;
@@ -186,20 +196,17 @@ ActionsFromPrepopulateData::~ActionsFromPrepopulateData() {}
 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();
@@ -208,7 +215,8 @@ void MergeEnginesFromPrepopulateData(
     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());
@@ -229,24 +237,19 @@ void MergeEnginesFromPrepopulateData(
     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
@@ -267,25 +270,25 @@ ActionsFromPrepopulateData CreateActionsFromCurrentPrepopulateData(
   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.
@@ -296,10 +299,16 @@ ActionsFromPrepopulateData CreateActionsFromCurrentPrepopulateData(
   // 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);
   }
 
@@ -311,14 +320,12 @@ void GetSearchProvidersUsingKeywordResult(
     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);
 
@@ -341,12 +348,6 @@ void GetSearchProvidersUsingKeywordResult(
     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,
@@ -358,25 +359,23 @@ void GetSearchProvidersUsingLoadedEngines(
     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,