OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "chrome/browser/search_engines/template_url_service.h" | 5 #include "chrome/browser/search_engines/template_url_service.h" |
6 | 6 |
7 #include "base/auto_reset.h" | 7 #include "base/auto_reset.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/environment.h" | 9 #include "base/environment.h" |
10 #include "base/guid.h" | 10 #include "base/guid.h" |
(...skipping 914 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
925 FindNonExtensionTemplateURLForKeyword(turl->keyword()); | 925 FindNonExtensionTemplateURLForKeyword(turl->keyword()); |
926 if (iter->change_type() == syncer::SyncChange::ACTION_DELETE) { | 926 if (iter->change_type() == syncer::SyncChange::ACTION_DELETE) { |
927 if (!existing_turl) { | 927 if (!existing_turl) { |
928 NOTREACHED() << "Unexpected sync change state."; | 928 NOTREACHED() << "Unexpected sync change state."; |
929 error = sync_error_factory_->CreateAndUploadError( | 929 error = sync_error_factory_->CreateAndUploadError( |
930 FROM_HERE, | 930 FROM_HERE, |
931 "ProcessSyncChanges failed on ChangeType ACTION_DELETE"); | 931 "ProcessSyncChanges failed on ChangeType ACTION_DELETE"); |
932 LOG(ERROR) << "Trying to delete a non-existent TemplateURL."; | 932 LOG(ERROR) << "Trying to delete a non-existent TemplateURL."; |
933 continue; | 933 continue; |
934 } | 934 } |
935 bool delete_default = (existing_turl == GetDefaultSearchProvider()); | 935 if (existing_turl == GetDefaultSearchProvider()) { |
936 // The only way Sync can attempt to delete the default search provider | |
937 // is if we had changed the kSyncedDefaultSearchProviderGUID | |
938 // preference, but perhaps it has not yet been received. To avoid | |
939 // situations where this has come in erroneously, we will un-delete | |
940 // the current default search from the Sync data. If the pref really | |
941 // does arrive later, then default search will change to the correct | |
942 // entry, but we'll have this extra entry sitting around. The result is | |
943 // not ideal, but it prevents a far more severe bug where the default is | |
944 // unexpected swapped to something else. The user can safely delete the | |
Nicolas Zea
2012/07/10 17:07:47
unexpected -> unexpectedly
SteveT
2012/07/10 17:58:35
Done.
| |
945 // extra entry again later, if they choose. Most users who do not look | |
946 // at the search engines UI will not notice this. | |
947 // Note that we append a special character to the end of the keyword in | |
948 // an attempt to avoid a ping-poinging situation where receiving clients | |
949 // may try to continually delete the resurrected entry. | |
950 string16 updated_keyword = UniquifyKeyword(*existing_turl, true); | |
951 TemplateURLData data(existing_turl->data()); | |
952 data.SetKeyword(updated_keyword); | |
953 TemplateURL new_turl(existing_turl->profile(), data); | |
954 UIThreadSearchTermsData search_terms_data(existing_turl->profile()); | |
955 if (UpdateNoNotify(existing_turl, new_turl, search_terms_data)) | |
956 NotifyObservers(); | |
936 | 957 |
937 if (delete_default && is_default_search_managed_) { | 958 syncer::SyncData sync_data = CreateSyncDataFromTemplateURL(new_turl); |
938 NOTREACHED() << "Tried to delete managed default search provider"; | 959 new_changes.push_back( |
939 } else { | 960 syncer::SyncChange(syncer::SyncChange::ACTION_ADD, sync_data)); |
940 if (delete_default) | 961 // Ignore the delete attempt. This means we never end up reseting the |
941 default_search_provider_ = NULL; | 962 // default search provider due to an ACTION_DELETE from sync. |
963 continue; | |
964 } | |
942 | 965 |
943 Remove(existing_turl); | 966 Remove(existing_turl); |
944 | |
945 if (delete_default) { | |
946 AutoReset<DefaultSearchChangeOrigin> change_origin( | |
947 &dsp_change_origin_, DSP_CHANGE_SYNC_DELETE); | |
948 SetDefaultSearchProvider(FindNewDefaultSearchProvider()); | |
949 } | |
950 } | |
951 } else if (iter->change_type() == syncer::SyncChange::ACTION_ADD) { | 967 } else if (iter->change_type() == syncer::SyncChange::ACTION_ADD) { |
952 if (existing_turl) { | 968 if (existing_turl) { |
953 NOTREACHED() << "Unexpected sync change state."; | 969 NOTREACHED() << "Unexpected sync change state."; |
954 error = sync_error_factory_->CreateAndUploadError( | 970 error = sync_error_factory_->CreateAndUploadError( |
955 FROM_HERE, | 971 FROM_HERE, |
956 "ProcessSyncChanges failed on ChangeType ACTION_ADD"); | 972 "ProcessSyncChanges failed on ChangeType ACTION_ADD"); |
957 LOG(ERROR) << "Trying to add an existing TemplateURL."; | 973 LOG(ERROR) << "Trying to add an existing TemplateURL."; |
958 continue; | 974 continue; |
959 } | 975 } |
960 std::string guid = turl->sync_guid(); | 976 std::string guid = turl->sync_guid(); |
(...skipping 1120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2081 TemplateURL* existing_keyword_turl = | 2097 TemplateURL* existing_keyword_turl = |
2082 FindNonExtensionTemplateURLForKeyword(template_url->keyword()); | 2098 FindNonExtensionTemplateURLForKeyword(template_url->keyword()); |
2083 if (existing_keyword_turl != NULL) { | 2099 if (existing_keyword_turl != NULL) { |
2084 DCHECK_NE(existing_keyword_turl, template_url); | 2100 DCHECK_NE(existing_keyword_turl, template_url); |
2085 if (CanReplace(existing_keyword_turl)) { | 2101 if (CanReplace(existing_keyword_turl)) { |
2086 RemoveNoNotify(existing_keyword_turl); | 2102 RemoveNoNotify(existing_keyword_turl); |
2087 } else if (CanReplace(template_url)) { | 2103 } else if (CanReplace(template_url)) { |
2088 delete template_url; | 2104 delete template_url; |
2089 return false; | 2105 return false; |
2090 } else { | 2106 } else { |
2091 string16 new_keyword = UniquifyKeyword(*existing_keyword_turl); | 2107 string16 new_keyword = UniquifyKeyword(*existing_keyword_turl, false); |
2092 ResetTemplateURL(existing_keyword_turl, | 2108 ResetTemplateURL(existing_keyword_turl, |
2093 existing_keyword_turl->short_name(), new_keyword, | 2109 existing_keyword_turl->short_name(), new_keyword, |
2094 existing_keyword_turl->url()); | 2110 existing_keyword_turl->url()); |
2095 } | 2111 } |
2096 } | 2112 } |
2097 } | 2113 } |
2098 template_urls_.push_back(template_url); | 2114 template_urls_.push_back(template_url); |
2099 AddToMaps(template_url); | 2115 AddToMaps(template_url); |
2100 | 2116 |
2101 if (newly_adding) { | 2117 if (newly_adding) { |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2216 DCHECK(loaded_); | 2232 DCHECK(loaded_); |
2217 DCHECK(!guid.empty()); | 2233 DCHECK(!guid.empty()); |
2218 | 2234 |
2219 TemplateURLData data(url->data()); | 2235 TemplateURLData data(url->data()); |
2220 data.sync_guid = guid; | 2236 data.sync_guid = guid; |
2221 TemplateURL new_url(url->profile(), data); | 2237 TemplateURL new_url(url->profile(), data); |
2222 UIThreadSearchTermsData search_terms_data(url->profile()); | 2238 UIThreadSearchTermsData search_terms_data(url->profile()); |
2223 UpdateNoNotify(url, new_url, search_terms_data); | 2239 UpdateNoNotify(url, new_url, search_terms_data); |
2224 } | 2240 } |
2225 | 2241 |
2226 string16 TemplateURLService::UniquifyKeyword(const TemplateURL& turl) { | 2242 string16 TemplateURLService::UniquifyKeyword(const TemplateURL& turl, |
2227 // Already unique. | 2243 bool force) { |
2228 if (!GetTemplateURLForKeyword(turl.keyword())) | 2244 if (!force) { |
2229 return turl.keyword(); | 2245 // Already unique. |
2246 if (!GetTemplateURLForKeyword(turl.keyword())) | |
2247 return turl.keyword(); | |
2230 | 2248 |
2231 // First, try to return the generated keyword for the TemplateURL. | 2249 // First, try to return the generated keyword for the TemplateURL. |
2232 GURL gurl(turl.url()); | 2250 GURL gurl(turl.url()); |
2233 if (gurl.is_valid()) { | 2251 if (gurl.is_valid()) { |
2234 string16 keyword_candidate = GenerateKeyword(gurl); | 2252 string16 keyword_candidate = GenerateKeyword(gurl); |
2235 if (!GetTemplateURLForKeyword(keyword_candidate)) | 2253 if (!GetTemplateURLForKeyword(keyword_candidate)) |
2236 return keyword_candidate; | 2254 return keyword_candidate; |
2255 } | |
2237 } | 2256 } |
2238 | 2257 |
2239 // We try to uniquify the keyword by appending a special character to the end. | 2258 // We try to uniquify the keyword by appending a special character to the end. |
2240 // This is a best-effort approach where we try to preserve the original | 2259 // This is a best-effort approach where we try to preserve the original |
2241 // keyword and let the user do what they will after our attempt. | 2260 // keyword and let the user do what they will after our attempt. |
2242 string16 keyword_candidate(turl.keyword()); | 2261 string16 keyword_candidate(turl.keyword()); |
2243 do { | 2262 do { |
2244 keyword_candidate.append(ASCIIToUTF16("_")); | 2263 keyword_candidate.append(ASCIIToUTF16("_")); |
2245 } while (GetTemplateURLForKeyword(keyword_candidate)); | 2264 } while (GetTemplateURLForKeyword(keyword_candidate)); |
2246 | 2265 |
(...skipping 28 matching lines...) Expand all Loading... | |
2275 // with us. Note that if we're being called from | 2294 // with us. Note that if we're being called from |
2276 // MergeDataAndStartSyncing(), and this TemplateURL was pre-existing rather | 2295 // MergeDataAndStartSyncing(), and this TemplateURL was pre-existing rather |
2277 // than having just been brought down, then this is wrong, because the | 2296 // than having just been brought down, then this is wrong, because the |
2278 // server doesn't yet know about this entity; but in this case, | 2297 // server doesn't yet know about this entity; but in this case, |
2279 // PruneSyncChanges() will prune out the ACTION_DELETE we create here. | 2298 // PruneSyncChanges() will prune out the ACTION_DELETE we create here. |
2280 syncer::SyncData sync_data = CreateSyncDataFromTemplateURL(*local_turl); | 2299 syncer::SyncData sync_data = CreateSyncDataFromTemplateURL(*local_turl); |
2281 change_list->push_back( | 2300 change_list->push_back( |
2282 syncer::SyncChange(syncer::SyncChange::ACTION_DELETE, sync_data)); | 2301 syncer::SyncChange(syncer::SyncChange::ACTION_DELETE, sync_data)); |
2283 Remove(local_turl); | 2302 Remove(local_turl); |
2284 } else if (local_is_better) { | 2303 } else if (local_is_better) { |
2285 string16 new_keyword = UniquifyKeyword(*sync_turl); | 2304 string16 new_keyword = UniquifyKeyword(*sync_turl, false); |
2286 DCHECK(!GetTemplateURLForKeyword(new_keyword)); | 2305 DCHECK(!GetTemplateURLForKeyword(new_keyword)); |
2287 sync_turl->data_.SetKeyword(new_keyword); | 2306 sync_turl->data_.SetKeyword(new_keyword); |
2288 // If we update the cloud TURL, we need to push an update back to sync | 2307 // If we update the cloud TURL, we need to push an update back to sync |
2289 // informing it that something has changed. | 2308 // informing it that something has changed. |
2290 syncer::SyncData sync_data = CreateSyncDataFromTemplateURL(*sync_turl); | 2309 syncer::SyncData sync_data = CreateSyncDataFromTemplateURL(*sync_turl); |
2291 change_list->push_back( | 2310 change_list->push_back( |
2292 syncer::SyncChange(syncer::SyncChange::ACTION_UPDATE, sync_data)); | 2311 syncer::SyncChange(syncer::SyncChange::ACTION_UPDATE, sync_data)); |
2293 } else { | 2312 } else { |
2294 string16 new_keyword = UniquifyKeyword(*local_turl); | 2313 string16 new_keyword = UniquifyKeyword(*local_turl, false); |
2295 TemplateURLData data(local_turl->data()); | 2314 TemplateURLData data(local_turl->data()); |
2296 data.SetKeyword(new_keyword); | 2315 data.SetKeyword(new_keyword); |
2297 TemplateURL new_turl(local_turl->profile(), data); | 2316 TemplateURL new_turl(local_turl->profile(), data); |
2298 UIThreadSearchTermsData search_terms_data(local_turl->profile()); | 2317 UIThreadSearchTermsData search_terms_data(local_turl->profile()); |
2299 if (UpdateNoNotify(local_turl, new_turl, search_terms_data)) | 2318 if (UpdateNoNotify(local_turl, new_turl, search_terms_data)) |
2300 NotifyObservers(); | 2319 NotifyObservers(); |
2301 // Since we're processing sync changes, the UpdateNoNotify() above didn't | 2320 // Since we're processing sync changes, the UpdateNoNotify() above didn't |
2302 // generate an ACTION_UPDATE. We need to do it manually to keep the server | 2321 // generate an ACTION_UPDATE. We need to do it manually to keep the server |
2303 // in sync with us. Note that if we're being called from | 2322 // in sync with us. Note that if we're being called from |
2304 // MergeDataAndStartSyncing(), and this TemplateURL was pre-existing rather | 2323 // MergeDataAndStartSyncing(), and this TemplateURL was pre-existing rather |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2405 // TODO(mpcomplete): If we allow editing extension keywords, then those | 2424 // TODO(mpcomplete): If we allow editing extension keywords, then those |
2406 // should be persisted to disk and synced. | 2425 // should be persisted to disk and synced. |
2407 if (template_url->sync_guid().empty() && | 2426 if (template_url->sync_guid().empty() && |
2408 !template_url->IsExtensionKeyword()) { | 2427 !template_url->IsExtensionKeyword()) { |
2409 template_url->data_.sync_guid = base::GenerateGUID(); | 2428 template_url->data_.sync_guid = base::GenerateGUID(); |
2410 if (service_.get()) | 2429 if (service_.get()) |
2411 service_->UpdateKeyword(template_url->data()); | 2430 service_->UpdateKeyword(template_url->data()); |
2412 } | 2431 } |
2413 } | 2432 } |
2414 } | 2433 } |
OLD | NEW |