OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/i18n/case_conversion.h" | 10 #include "base/i18n/case_conversion.h" |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 : profile_(profile), | 106 : profile_(profile), |
107 loaded_(false), | 107 loaded_(false), |
108 load_failed_(false), | 108 load_failed_(false), |
109 load_handle_(0), | 109 load_handle_(0), |
110 default_search_provider_(NULL), | 110 default_search_provider_(NULL), |
111 is_default_search_managed_(false), | 111 is_default_search_managed_(false), |
112 next_id_(1), | 112 next_id_(1), |
113 time_provider_(&base::Time::Now), | 113 time_provider_(&base::Time::Now), |
114 models_associated_(false), | 114 models_associated_(false), |
115 processing_syncer_changes_(false), | 115 processing_syncer_changes_(false), |
116 sync_processor_(NULL) { | 116 sync_processor_(NULL), |
| 117 pending_synced_default_search_(false) { |
117 DCHECK(profile_); | 118 DCHECK(profile_); |
118 Init(NULL, 0); | 119 Init(NULL, 0); |
119 } | 120 } |
120 | 121 |
121 TemplateURLService::TemplateURLService(const Initializer* initializers, | 122 TemplateURLService::TemplateURLService(const Initializer* initializers, |
122 const int count) | 123 const int count) |
123 : profile_(NULL), | 124 : profile_(NULL), |
124 loaded_(false), | 125 loaded_(false), |
125 load_failed_(false), | 126 load_failed_(false), |
126 load_handle_(0), | 127 load_handle_(0), |
127 service_(NULL), | 128 service_(NULL), |
128 default_search_provider_(NULL), | 129 default_search_provider_(NULL), |
129 is_default_search_managed_(false), | 130 is_default_search_managed_(false), |
130 next_id_(1), | 131 next_id_(1), |
131 time_provider_(&base::Time::Now), | 132 time_provider_(&base::Time::Now), |
132 models_associated_(false), | 133 models_associated_(false), |
133 processing_syncer_changes_(false), | 134 processing_syncer_changes_(false), |
134 sync_processor_(NULL) { | 135 sync_processor_(NULL), |
| 136 pending_synced_default_search_(false) { |
135 Init(initializers, count); | 137 Init(initializers, count); |
136 } | 138 } |
137 | 139 |
138 TemplateURLService::~TemplateURLService() { | 140 TemplateURLService::~TemplateURLService() { |
139 if (load_handle_) { | 141 if (load_handle_) { |
140 DCHECK(service_.get()); | 142 DCHECK(service_.get()); |
141 service_->CancelRequest(load_handle_); | 143 service_->CancelRequest(load_handle_); |
142 } | 144 } |
143 | 145 |
144 STLDeleteElements(&template_urls_); | 146 STLDeleteElements(&template_urls_); |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
450 | 452 |
451 // We're not loaded, rely on the default search provider stored in prefs. | 453 // We're not loaded, rely on the default search provider stored in prefs. |
452 return initial_default_search_provider_.get(); | 454 return initial_default_search_provider_.get(); |
453 } | 455 } |
454 | 456 |
455 const TemplateURL* TemplateURLService::FindNewDefaultSearchProvider() { | 457 const TemplateURL* TemplateURLService::FindNewDefaultSearchProvider() { |
456 // See if the prepoluated default still exists. | 458 // See if the prepoluated default still exists. |
457 scoped_ptr<TemplateURL> prepopulated_default( | 459 scoped_ptr<TemplateURL> prepopulated_default( |
458 TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(GetPrefs())); | 460 TemplateURLPrepopulateData::GetPrepopulatedDefaultSearch(GetPrefs())); |
459 for (TemplateURLVector::iterator i = template_urls_.begin(); | 461 for (TemplateURLVector::iterator i = template_urls_.begin(); |
460 i != template_urls_.end(); ) { | 462 i != template_urls_.end(); ++i) { |
461 if ((*i)->prepopulate_id() == prepopulated_default->prepopulate_id()) | 463 if ((*i)->prepopulate_id() == prepopulated_default->prepopulate_id()) |
462 return *i; | 464 return *i; |
463 } | 465 } |
464 // If not, use the first of the templates. | 466 // If not, use the first of the templates. |
465 return template_urls_.empty() ? NULL : template_urls_[0]; | 467 return template_urls_.empty() ? NULL : template_urls_[0]; |
466 } | 468 } |
467 | 469 |
468 void TemplateURLService::AddObserver(TemplateURLServiceObserver* observer) { | 470 void TemplateURLService::AddObserver(TemplateURLServiceObserver* observer) { |
469 model_observers_.AddObserver(observer); | 471 model_observers_.AddObserver(observer); |
470 } | 472 } |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
572 if (managed_default) { | 574 if (managed_default) { |
573 managed_default->set_created_by_policy(true); | 575 managed_default->set_created_by_policy(true); |
574 managed_default->set_id(0); | 576 managed_default->set_id(0); |
575 AddNoNotify(managed_default); | 577 AddNoNotify(managed_default); |
576 } | 578 } |
577 default_search_provider = managed_default; | 579 default_search_provider = managed_default; |
578 } | 580 } |
579 // Note that this saves the default search provider to prefs. | 581 // Note that this saves the default search provider to prefs. |
580 SetDefaultSearchProviderNoNotify(default_search_provider); | 582 SetDefaultSearchProviderNoNotify(default_search_provider); |
581 } else { | 583 } else { |
582 // If we had a managed default, replace it with the first provider of | 584 // If we had a managed default, replace it with the synced default if |
583 // the list. | 585 // applicable, or the first provider of the list. |
584 if (database_specified_a_default && | 586 const TemplateURL* synced_default = GetPendingSyncedDefaultSearchProvider(); |
585 NULL == default_search_provider && | 587 if (synced_default) { |
586 !template_urls.empty()) | 588 default_search_provider = synced_default; |
| 589 pending_synced_default_search_ = false; |
| 590 } else if (database_specified_a_default && |
| 591 NULL == default_search_provider && |
| 592 !template_urls.empty()) { |
587 default_search_provider = template_urls[0]; | 593 default_search_provider = template_urls[0]; |
| 594 } |
588 | 595 |
589 // If the default search provider existed previously, then just | 596 // If the default search provider existed previously, then just |
590 // set the member variable. Otherwise, we'll set it using the method | 597 // set the member variable. Otherwise, we'll set it using the method |
591 // to ensure that it is saved properly after its id is set. | 598 // to ensure that it is saved properly after its id is set. |
592 if (default_search_provider && default_search_provider->id() != 0) { | 599 if (default_search_provider && default_search_provider->id() != 0) { |
593 default_search_provider_ = default_search_provider; | 600 default_search_provider_ = default_search_provider; |
594 default_search_provider = NULL; | 601 default_search_provider = NULL; |
595 } | 602 } |
596 SetTemplateURLs(template_urls); | 603 SetTemplateURLs(template_urls); |
597 | 604 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
644 if (!loaded()) | 651 if (!loaded()) |
645 visits_to_add_.push_back(*visit_details.ptr()); | 652 visits_to_add_.push_back(*visit_details.ptr()); |
646 else | 653 else |
647 UpdateKeywordSearchTermsForURL(*visit_details.ptr()); | 654 UpdateKeywordSearchTermsForURL(*visit_details.ptr()); |
648 } else if (type == chrome::NOTIFICATION_GOOGLE_URL_UPDATED) { | 655 } else if (type == chrome::NOTIFICATION_GOOGLE_URL_UPDATED) { |
649 if (loaded_) | 656 if (loaded_) |
650 GoogleBaseURLChanged(); | 657 GoogleBaseURLChanged(); |
651 } else if (type == chrome::NOTIFICATION_PREF_CHANGED) { | 658 } else if (type == chrome::NOTIFICATION_PREF_CHANGED) { |
652 const std::string* pref_name = content::Details<std::string>(details).ptr(); | 659 const std::string* pref_name = content::Details<std::string>(details).ptr(); |
653 if (!pref_name || default_search_prefs_->IsObserved(*pref_name)) { | 660 if (!pref_name || default_search_prefs_->IsObserved(*pref_name)) { |
| 661 // Listen for changes to the default search from Sync. If it is |
| 662 // specifically the synced default search provider GUID that changed, we |
| 663 // have to set it (or wait for it). |
| 664 PrefService* prefs = GetPrefs(); |
| 665 if (pref_name && *pref_name == prefs::kSyncedDefaultSearchProviderGUID && |
| 666 prefs) { |
| 667 const TemplateURL* new_default_search = GetTemplateURLForGUID( |
| 668 prefs->GetString(prefs::kSyncedDefaultSearchProviderGUID)); |
| 669 if (new_default_search && !is_default_search_managed_) { |
| 670 if (new_default_search != GetDefaultSearchProvider()) { |
| 671 SetDefaultSearchProvider(new_default_search); |
| 672 pending_synced_default_search_ = false; |
| 673 } |
| 674 } else { |
| 675 // If it's not there, or if default search is currently managed, set a |
| 676 // flag to indicate that we waiting on the search engine entry to come |
| 677 // in through Sync. |
| 678 pending_synced_default_search_ = true; |
| 679 } |
| 680 } |
| 681 |
654 // A preference related to default search engine has changed. | 682 // A preference related to default search engine has changed. |
655 // Update the model if needed. | 683 // Update the model if needed. |
656 UpdateDefaultSearch(); | 684 UpdateDefaultSearch(); |
657 } | 685 } |
658 } else { | 686 } else { |
659 NOTREACHED(); | 687 NOTREACHED(); |
660 } | 688 } |
661 } | 689 } |
662 | 690 |
663 SyncDataList TemplateURLService::GetAllSyncData( | 691 SyncDataList TemplateURLService::GetAllSyncData( |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
701 if (!turl.get()) { | 729 if (!turl.get()) { |
702 NOTREACHED() << "Failed to read search engine."; | 730 NOTREACHED() << "Failed to read search engine."; |
703 continue; | 731 continue; |
704 } | 732 } |
705 | 733 |
706 const TemplateURL* existing_turl = GetTemplateURLForGUID(turl->sync_guid()); | 734 const TemplateURL* existing_turl = GetTemplateURLForGUID(turl->sync_guid()); |
707 const TemplateURL* existing_keyword_turl = | 735 const TemplateURL* existing_keyword_turl = |
708 GetTemplateURLForKeyword(turl->keyword()); | 736 GetTemplateURLForKeyword(turl->keyword()); |
709 | 737 |
710 if (iter->change_type() == SyncChange::ACTION_DELETE && existing_turl) { | 738 if (iter->change_type() == SyncChange::ACTION_DELETE && existing_turl) { |
711 Remove(existing_turl); | 739 bool delete_default = (existing_turl == GetDefaultSearchProvider()); |
| 740 |
| 741 if (delete_default && is_default_search_managed_) { |
| 742 NOTREACHED() << "Tried to delete managed default search provider"; |
| 743 } else { |
| 744 if (delete_default) |
| 745 default_search_provider_ = NULL; |
| 746 |
| 747 Remove(existing_turl); |
| 748 |
| 749 if (delete_default) |
| 750 SetDefaultSearchProvider(FindNewDefaultSearchProvider()); |
| 751 } |
712 } else if (iter->change_type() == SyncChange::ACTION_ADD && | 752 } else if (iter->change_type() == SyncChange::ACTION_ADD && |
713 !existing_turl) { | 753 !existing_turl) { |
| 754 std::string guid = turl->sync_guid(); |
714 if (existing_keyword_turl) | 755 if (existing_keyword_turl) |
715 ResolveSyncKeywordConflict(turl.get(), &new_changes); | 756 ResolveSyncKeywordConflict(turl.get(), &new_changes); |
716 // Force the local ID to 0 so we can add it. | 757 // Force the local ID to 0 so we can add it. |
717 turl->set_id(0); | 758 turl->set_id(0); |
718 Add(turl.release()); | 759 Add(turl.release()); |
| 760 |
| 761 // Possibly set the newly added |turl| as the default search provider. |
| 762 SetDefaultSearchProviderIfNewlySynced(guid); |
719 } else if (iter->change_type() == SyncChange::ACTION_UPDATE && | 763 } else if (iter->change_type() == SyncChange::ACTION_UPDATE && |
720 existing_turl) { | 764 existing_turl) { |
721 if (existing_keyword_turl) | 765 // Possibly resolve a keyword conflict if they have the same keywords but |
| 766 // are not the same entry. |
| 767 if (existing_keyword_turl && existing_keyword_turl != existing_turl) |
722 ResolveSyncKeywordConflict(turl.get(), &new_changes); | 768 ResolveSyncKeywordConflict(turl.get(), &new_changes); |
723 ResetTemplateURL(existing_turl, turl->short_name(), turl->keyword(), | 769 ResetTemplateURL(existing_turl, turl->short_name(), turl->keyword(), |
724 turl->url() ? turl->url()->url() : std::string()); | 770 turl->url() ? turl->url()->url() : std::string()); |
725 } else { | 771 } else { |
726 // Something really unexpected happened. Either we received an | 772 // Something really unexpected happened. Either we received an |
727 // ACTION_INVALID, or Sync is in a crazy state: | 773 // ACTION_INVALID, or Sync is in a crazy state: |
728 // . Trying to DELETE or UPDATE a non-existent search engine. | 774 // . Trying to DELETE or UPDATE a non-existent search engine. |
729 // . Trying to ADD a search engine that already exists. | 775 // . Trying to ADD a search engine that already exists. |
730 NOTREACHED() << "Unexpected sync change state."; | 776 NOTREACHED() << "Unexpected sync change state."; |
731 error = SyncError(FROM_HERE, "ProcessSyncChanges failed on ChangeType " + | 777 error = SyncError(FROM_HERE, "ProcessSyncChanges failed on ChangeType " + |
(...skipping 14 matching lines...) Expand all Loading... |
746 | 792 |
747 SyncError TemplateURLService::MergeDataAndStartSyncing( | 793 SyncError TemplateURLService::MergeDataAndStartSyncing( |
748 syncable::ModelType type, | 794 syncable::ModelType type, |
749 const SyncDataList& initial_sync_data, | 795 const SyncDataList& initial_sync_data, |
750 SyncChangeProcessor* sync_processor) { | 796 SyncChangeProcessor* sync_processor) { |
751 DCHECK(loaded()); | 797 DCHECK(loaded()); |
752 DCHECK_EQ(type, syncable::SEARCH_ENGINES); | 798 DCHECK_EQ(type, syncable::SEARCH_ENGINES); |
753 DCHECK(!sync_processor_); | 799 DCHECK(!sync_processor_); |
754 sync_processor_ = sync_processor; | 800 sync_processor_ = sync_processor; |
755 | 801 |
| 802 // We just started syncing, so set our wait-for-default flag if we are |
| 803 // expecting a default from Sync. |
| 804 if (GetPrefs()) { |
| 805 std::string default_guid = GetPrefs()->GetString( |
| 806 prefs::kSyncedDefaultSearchProviderGUID); |
| 807 const TemplateURL* current_default = GetDefaultSearchProvider(); |
| 808 |
| 809 if (!default_guid.empty() && |
| 810 (!current_default || current_default->sync_guid() != default_guid)) |
| 811 pending_synced_default_search_ = true; |
| 812 } |
| 813 |
756 // We do a lot of calls to Add/Remove/ResetTemplateURL here, so ensure we | 814 // We do a lot of calls to Add/Remove/ResetTemplateURL here, so ensure we |
757 // don't step on our own toes. | 815 // don't step on our own toes. |
758 AutoReset<bool> processing_changes(&processing_syncer_changes_, true); | 816 AutoReset<bool> processing_changes(&processing_syncer_changes_, true); |
759 | 817 |
760 SyncChangeList new_changes; | 818 SyncChangeList new_changes; |
761 | 819 |
762 // Build maps of our sync GUIDs to SyncData. | 820 // Build maps of our sync GUIDs to SyncData. |
763 SyncDataMap local_data_map = CreateGUIDToSyncDataMap( | 821 SyncDataMap local_data_map = CreateGUIDToSyncDataMap( |
764 GetAllSyncData(syncable::SEARCH_ENGINES)); | 822 GetAllSyncData(syncable::SEARCH_ENGINES)); |
765 SyncDataMap sync_data_map = CreateGUIDToSyncDataMap(initial_sync_data); | 823 SyncDataMap sync_data_map = CreateGUIDToSyncDataMap(initial_sync_data); |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
805 if (dupe_turl) { | 863 if (dupe_turl) { |
806 // Merge duplicates and remove the processed local TURL from the map. | 864 // Merge duplicates and remove the processed local TURL from the map. |
807 TemplateURL* modifiable_dupe_turl = | 865 TemplateURL* modifiable_dupe_turl = |
808 const_cast<TemplateURL*>(dupe_turl); | 866 const_cast<TemplateURL*>(dupe_turl); |
809 std::string old_guid = dupe_turl->sync_guid(); | 867 std::string old_guid = dupe_turl->sync_guid(); |
810 MergeSyncAndLocalURLDuplicates(sync_turl.release(), | 868 MergeSyncAndLocalURLDuplicates(sync_turl.release(), |
811 modifiable_dupe_turl, | 869 modifiable_dupe_turl, |
812 &new_changes); | 870 &new_changes); |
813 local_data_map.erase(old_guid); | 871 local_data_map.erase(old_guid); |
814 } else { | 872 } else { |
| 873 std::string guid = sync_turl->sync_guid(); |
815 // Keyword conflict is possible in this case. Resolve it first before | 874 // Keyword conflict is possible in this case. Resolve it first before |
816 // adding the new TemplateURL. Note that we don't remove the local TURL | 875 // adding the new TemplateURL. Note that we don't remove the local TURL |
817 // from local_data_map in this case as it may still need to be pushed to | 876 // from local_data_map in this case as it may still need to be pushed to |
818 // the cloud. | 877 // the cloud. |
819 ResolveSyncKeywordConflict(sync_turl.get(), &new_changes); | 878 ResolveSyncKeywordConflict(sync_turl.get(), &new_changes); |
820 // Force the local ID to 0 so we can add it. | 879 // Force the local ID to 0 so we can add it. |
821 sync_turl->set_id(0); | 880 sync_turl->set_id(0); |
822 Add(sync_turl.release()); | 881 Add(sync_turl.release()); |
| 882 |
| 883 // Possibly set the newly added |turl| as the default search provider. |
| 884 SetDefaultSearchProviderIfNewlySynced(guid); |
823 } | 885 } |
824 } | 886 } |
825 } // for | 887 } // for |
826 | 888 |
827 // The remaining SyncData in local_data_map should be everything that needs to | 889 // The remaining SyncData in local_data_map should be everything that needs to |
828 // be pushed as ADDs to sync. | 890 // be pushed as ADDs to sync. |
829 for (SyncDataMap::const_iterator iter = local_data_map.begin(); | 891 for (SyncDataMap::const_iterator iter = local_data_map.begin(); |
830 iter != local_data_map.end(); ++iter) { | 892 iter != local_data_map.end(); ++iter) { |
831 new_changes.push_back(SyncChange(SyncChange::ACTION_ADD, iter->second)); | 893 new_changes.push_back(SyncChange(SyncChange::ACTION_ADD, iter->second)); |
832 } | 894 } |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
945 const GURL& url, | 1007 const GURL& url, |
946 const string16& term) { | 1008 const string16& term) { |
947 HistoryService* history = profile_ ? | 1009 HistoryService* history = profile_ ? |
948 profile_->GetHistoryService(Profile::EXPLICIT_ACCESS) : NULL; | 1010 profile_->GetHistoryService(Profile::EXPLICIT_ACCESS) : NULL; |
949 if (!history) | 1011 if (!history) |
950 return; | 1012 return; |
951 history->SetKeywordSearchTermsForURL(url, t_url->id(), term); | 1013 history->SetKeywordSearchTermsForURL(url, t_url->id(), term); |
952 } | 1014 } |
953 | 1015 |
954 void TemplateURLService::Init(const Initializer* initializers, | 1016 void TemplateURLService::Init(const Initializer* initializers, |
955 int num_initializers) { | 1017 int num_initializers) { |
956 // Register for notifications. | 1018 // Register for notifications. |
957 if (profile_) { | 1019 if (profile_) { |
958 // TODO(sky): bug 1166191. The keywords should be moved into the history | 1020 // TODO(sky): bug 1166191. The keywords should be moved into the history |
959 // db, which will mean we no longer need this notification and the history | 1021 // db, which will mean we no longer need this notification and the history |
960 // backend can handle automatically adding the search terms as the user | 1022 // backend can handle automatically adding the search terms as the user |
961 // navigates. | 1023 // navigates. |
962 registrar_.Add(this, chrome::NOTIFICATION_HISTORY_URL_VISITED, | 1024 registrar_.Add(this, chrome::NOTIFICATION_HISTORY_URL_VISITED, |
963 content::Source<Profile>(profile_->GetOriginalProfile())); | 1025 content::Source<Profile>(profile_->GetOriginalProfile())); |
964 PrefService* prefs = GetPrefs(); | 1026 PrefService* prefs = GetPrefs(); |
965 default_search_prefs_.reset( | 1027 default_search_prefs_.reset( |
(...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1481 DCHECK(is_default_search_managed_ && !new_is_default_managed); | 1543 DCHECK(is_default_search_managed_ && !new_is_default_managed); |
1482 is_default_search_managed_ = new_is_default_managed; | 1544 is_default_search_managed_ = new_is_default_managed; |
1483 // If we had a default, delete the previous default if created by policy | 1545 // If we had a default, delete the previous default if created by policy |
1484 // and set a likely default. | 1546 // and set a likely default. |
1485 if (NULL != default_search_provider_ && | 1547 if (NULL != default_search_provider_ && |
1486 default_search_provider_->created_by_policy()) { | 1548 default_search_provider_->created_by_policy()) { |
1487 const TemplateURL* old_default = default_search_provider_; | 1549 const TemplateURL* old_default = default_search_provider_; |
1488 default_search_provider_ = NULL; | 1550 default_search_provider_ = NULL; |
1489 RemoveNoNotify(old_default); | 1551 RemoveNoNotify(old_default); |
1490 } | 1552 } |
1491 SetDefaultSearchProviderNoNotify(FindNewDefaultSearchProvider()); | 1553 |
| 1554 // The likely default should be from Sync if we were waiting on Sync. |
| 1555 // Otherwise, it should be FindNewDefaultSearchProvider. |
| 1556 const TemplateURL* synced_default = GetPendingSyncedDefaultSearchProvider(); |
| 1557 if (synced_default) |
| 1558 pending_synced_default_search_ = false; |
| 1559 SetDefaultSearchProviderNoNotify(synced_default ? synced_default : |
| 1560 FindNewDefaultSearchProvider()); |
1492 } | 1561 } |
1493 NotifyObservers(); | 1562 NotifyObservers(); |
1494 } | 1563 } |
1495 | 1564 |
1496 void TemplateURLService::SetDefaultSearchProviderNoNotify( | 1565 void TemplateURLService::SetDefaultSearchProviderNoNotify( |
1497 const TemplateURL* url) { | 1566 const TemplateURL* url) { |
1498 DCHECK(!url || find(template_urls_.begin(), template_urls_.end(), url) != | 1567 DCHECK(!url || find(template_urls_.begin(), template_urls_.end(), url) != |
1499 template_urls_.end()); | 1568 template_urls_.end()); |
1500 default_search_provider_ = url; | 1569 default_search_provider_ = url; |
1501 | 1570 |
(...skipping 11 matching lines...) Expand all Loading... |
1513 #if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) | 1582 #if defined(OS_WIN) && defined(GOOGLE_CHROME_BUILD) |
1514 // Needs to be evaluated. See http://crbug.com/62328. | 1583 // Needs to be evaluated. See http://crbug.com/62328. |
1515 base::ThreadRestrictions::ScopedAllowIO allow_io; | 1584 base::ThreadRestrictions::ScopedAllowIO allow_io; |
1516 RLZTracker::RecordProductEvent(rlz_lib::CHROME, | 1585 RLZTracker::RecordProductEvent(rlz_lib::CHROME, |
1517 rlz_lib::CHROME_OMNIBOX, | 1586 rlz_lib::CHROME_OMNIBOX, |
1518 rlz_lib::SET_TO_GOOGLE); | 1587 rlz_lib::SET_TO_GOOGLE); |
1519 #endif | 1588 #endif |
1520 } | 1589 } |
1521 } | 1590 } |
1522 | 1591 |
1523 if (!is_default_search_managed_) | 1592 if (!is_default_search_managed_) { |
1524 SaveDefaultSearchProviderToPrefs(url); | 1593 SaveDefaultSearchProviderToPrefs(url); |
1525 | 1594 |
| 1595 // If we are syncing, we want to set the synced pref that will notify other |
| 1596 // instances to change their default to this new search provider. |
| 1597 if (sync_processor_ && !url->sync_guid().empty() && GetPrefs()) { |
| 1598 GetPrefs()->SetString(prefs::kSyncedDefaultSearchProviderGUID, |
| 1599 url->sync_guid()); |
| 1600 } |
| 1601 } |
| 1602 |
1526 if (service_.get()) | 1603 if (service_.get()) |
1527 service_->SetDefaultSearchProvider(url); | 1604 service_->SetDefaultSearchProvider(url); |
1528 | 1605 |
1529 // Inform sync the change to the show_in_default_list flag. | 1606 // Inform sync the change to the show_in_default_list flag. |
1530 if (url) | 1607 if (url) |
1531 ProcessTemplateURLChange(url, SyncChange::ACTION_UPDATE); | 1608 ProcessTemplateURLChange(url, SyncChange::ACTION_UPDATE); |
1532 } | 1609 } |
1533 | 1610 |
1534 void TemplateURLService::AddNoNotify(TemplateURL* template_url) { | 1611 void TemplateURLService::AddNoNotify(TemplateURL* template_url) { |
1535 DCHECK(template_url); | 1612 DCHECK(template_url); |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1674 } | 1751 } |
1675 | 1752 |
1676 bool TemplateURLService::ResolveSyncKeywordConflict( | 1753 bool TemplateURLService::ResolveSyncKeywordConflict( |
1677 TemplateURL* sync_turl, | 1754 TemplateURL* sync_turl, |
1678 SyncChangeList* change_list) { | 1755 SyncChangeList* change_list) { |
1679 DCHECK(sync_turl); | 1756 DCHECK(sync_turl); |
1680 DCHECK(change_list); | 1757 DCHECK(change_list); |
1681 | 1758 |
1682 const TemplateURL* existing_turl = | 1759 const TemplateURL* existing_turl = |
1683 GetTemplateURLForKeyword(sync_turl->keyword()); | 1760 GetTemplateURLForKeyword(sync_turl->keyword()); |
1684 if (!existing_turl) | 1761 // If there is no conflict, or it's just conflicting with itself, return. |
| 1762 if (!existing_turl || existing_turl->sync_guid() == sync_turl->sync_guid()) |
1685 return false; | 1763 return false; |
1686 | 1764 |
1687 if (existing_turl->last_modified() > sync_turl->last_modified() || | 1765 if (existing_turl->last_modified() > sync_turl->last_modified() || |
1688 existing_turl->created_by_policy()) { | 1766 existing_turl->created_by_policy()) { |
1689 string16 new_keyword = UniquifyKeyword(*sync_turl); | 1767 string16 new_keyword = UniquifyKeyword(*sync_turl); |
1690 DCHECK(!GetTemplateURLForKeyword(new_keyword)); | 1768 DCHECK(!GetTemplateURLForKeyword(new_keyword)); |
1691 sync_turl->set_keyword(new_keyword); | 1769 sync_turl->set_keyword(new_keyword); |
1692 // If we update the cloud TURL, we need to push an update back to sync | 1770 // If we update the cloud TURL, we need to push an update back to sync |
1693 // informing it that something has changed. | 1771 // informing it that something has changed. |
1694 SyncData sync_data = CreateSyncDataFromTemplateURL(*sync_turl); | 1772 SyncData sync_data = CreateSyncDataFromTemplateURL(*sync_turl); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1738 // Change the local TURL's GUID to the server's GUID and push an update to | 1816 // Change the local TURL's GUID to the server's GUID and push an update to |
1739 // Sync. This ensures that the rest of local_url's fields are sync'd up to | 1817 // Sync. This ensures that the rest of local_url's fields are sync'd up to |
1740 // the server, and the next time local_url is synced, it is recognized by | 1818 // the server, and the next time local_url is synced, it is recognized by |
1741 // having the same GUID. | 1819 // having the same GUID. |
1742 ResetTemplateURLGUID(local_turl, sync_turl->sync_guid()); | 1820 ResetTemplateURLGUID(local_turl, sync_turl->sync_guid()); |
1743 SyncData sync_data = CreateSyncDataFromTemplateURL(*local_turl); | 1821 SyncData sync_data = CreateSyncDataFromTemplateURL(*local_turl); |
1744 change_list->push_back(SyncChange(SyncChange::ACTION_UPDATE, sync_data)); | 1822 change_list->push_back(SyncChange(SyncChange::ACTION_UPDATE, sync_data)); |
1745 } | 1823 } |
1746 } | 1824 } |
1747 | 1825 |
| 1826 void TemplateURLService::SetDefaultSearchProviderIfNewlySynced( |
| 1827 const std::string& guid) { |
| 1828 // If we're not syncing or if default search is managed by policy, ignore. |
| 1829 if (!sync_processor_ || is_default_search_managed_) |
| 1830 return; |
| 1831 |
| 1832 PrefService* prefs = GetPrefs(); |
| 1833 if (prefs && pending_synced_default_search_ && |
| 1834 prefs->GetString(prefs::kSyncedDefaultSearchProviderGUID) == guid) { |
| 1835 // Make sure this actually exists. We should not be calling this unless we |
| 1836 // really just added this TemplateURL. |
| 1837 const TemplateURL* turl_from_sync = GetTemplateURLForGUID(guid); |
| 1838 DCHECK(turl_from_sync); |
| 1839 SetDefaultSearchProvider(turl_from_sync); |
| 1840 pending_synced_default_search_ = false; |
| 1841 } |
| 1842 } |
| 1843 |
| 1844 const TemplateURL* TemplateURLService::GetPendingSyncedDefaultSearchProvider() { |
| 1845 PrefService* prefs = GetPrefs(); |
| 1846 if (!prefs || !pending_synced_default_search_) |
| 1847 return NULL; |
| 1848 |
| 1849 // Could be NULL if no such thing exists. |
| 1850 return GetTemplateURLForGUID( |
| 1851 prefs->GetString(prefs::kSyncedDefaultSearchProviderGUID)); |
| 1852 } |
| 1853 |
1748 void TemplateURLService::PatchMissingSyncGUIDs( | 1854 void TemplateURLService::PatchMissingSyncGUIDs( |
1749 std::vector<TemplateURL*>* template_urls) { | 1855 std::vector<TemplateURL*>* template_urls) { |
1750 DCHECK(template_urls); | 1856 DCHECK(template_urls); |
1751 for (std::vector<TemplateURL*>::iterator i = template_urls->begin(); | 1857 for (std::vector<TemplateURL*>::iterator i = template_urls->begin(); |
1752 i != template_urls->end(); ++i) { | 1858 i != template_urls->end(); ++i) { |
1753 TemplateURL* template_url = *i; | 1859 TemplateURL* template_url = *i; |
1754 DCHECK(template_url); | 1860 DCHECK(template_url); |
1755 if (template_url->sync_guid().empty()) { | 1861 if (template_url->sync_guid().empty()) { |
1756 template_url->set_sync_guid(guid::GenerateGUID()); | 1862 template_url->set_sync_guid(guid::GenerateGUID()); |
1757 if (service_.get()) | 1863 if (service_.get()) |
1758 service_->UpdateKeyword(*template_url); | 1864 service_->UpdateKeyword(*template_url); |
1759 } | 1865 } |
1760 } | 1866 } |
1761 } | 1867 } |
OLD | NEW |