| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/sync/glue/favicon_cache.h" | 5 #include "chrome/browser/sync/glue/favicon_cache.h" |
| 6 | 6 |
| 7 #include "base/message_loop/message_loop.h" | 7 #include "base/message_loop/message_loop.h" |
| 8 #include "base/metrics/histogram.h" | 8 #include "base/metrics/histogram.h" |
| 9 #include "chrome/browser/chrome_notification_types.h" | |
| 10 #include "chrome/browser/favicon/favicon_service.h" | 9 #include "chrome/browser/favicon/favicon_service.h" |
| 11 #include "chrome/browser/favicon/favicon_service_factory.h" | 10 #include "chrome/browser/favicon/favicon_service_factory.h" |
| 12 #include "chrome/browser/history/history_notifications.h" | 11 #include "chrome/browser/history/history_service.h" |
| 12 #include "chrome/browser/history/history_service_factory.h" |
| 13 #include "components/history/core/browser/history_types.h" | 13 #include "components/history/core/browser/history_types.h" |
| 14 #include "content/public/browser/notification_details.h" | |
| 15 #include "content/public/browser/notification_source.h" | |
| 16 #include "sync/api/time.h" | 14 #include "sync/api/time.h" |
| 17 #include "sync/protocol/favicon_image_specifics.pb.h" | 15 #include "sync/protocol/favicon_image_specifics.pb.h" |
| 18 #include "sync/protocol/favicon_tracking_specifics.pb.h" | 16 #include "sync/protocol/favicon_tracking_specifics.pb.h" |
| 19 #include "sync/protocol/sync.pb.h" | 17 #include "sync/protocol/sync.pb.h" |
| 20 #include "ui/gfx/favicon_size.h" | 18 #include "ui/gfx/favicon_size.h" |
| 21 | 19 |
| 22 namespace browser_sync { | 20 namespace browser_sync { |
| 23 | 21 |
| 24 // Synced favicon storage and tracking. | 22 // Synced favicon storage and tracking. |
| 25 // Note: we don't use the favicon service for storing these because these | 23 // Note: we don't use the favicon service for storing these because these |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 219 return FaviconInfoHasTracking(favicon_info); | 217 return FaviconInfoHasTracking(favicon_info); |
| 220 NOTREACHED(); | 218 NOTREACHED(); |
| 221 return false; | 219 return false; |
| 222 } | 220 } |
| 223 | 221 |
| 224 } // namespace | 222 } // namespace |
| 225 | 223 |
| 226 FaviconCache::FaviconCache(Profile* profile, int max_sync_favicon_limit) | 224 FaviconCache::FaviconCache(Profile* profile, int max_sync_favicon_limit) |
| 227 : profile_(profile), | 225 : profile_(profile), |
| 228 max_sync_favicon_limit_(max_sync_favicon_limit), | 226 max_sync_favicon_limit_(max_sync_favicon_limit), |
| 227 history_service_observer_(this), |
| 229 weak_ptr_factory_(this) { | 228 weak_ptr_factory_(this) { |
| 230 notification_registrar_.Add(this, | 229 HistoryService* hs = NULL; |
| 231 chrome::NOTIFICATION_HISTORY_URLS_DELETED, | 230 if (profile_) { |
| 232 content::Source<Profile>(profile_)); | 231 hs = HistoryServiceFactory::GetForProfile( |
| 232 profile_, ServiceAccessType::EXPLICIT_ACCESS); |
| 233 } |
| 234 if (hs) |
| 235 history_service_observer_.Add(hs); |
| 233 DVLOG(1) << "Setting favicon limit to " << max_sync_favicon_limit; | 236 DVLOG(1) << "Setting favicon limit to " << max_sync_favicon_limit; |
| 234 } | 237 } |
| 235 | 238 |
| 236 FaviconCache::~FaviconCache() {} | 239 FaviconCache::~FaviconCache() {} |
| 237 | 240 |
| 238 syncer::SyncMergeResult FaviconCache::MergeDataAndStartSyncing( | 241 syncer::SyncMergeResult FaviconCache::MergeDataAndStartSyncing( |
| 239 syncer::ModelType type, | 242 syncer::ModelType type, |
| 240 const syncer::SyncDataList& initial_sync_data, | 243 const syncer::SyncDataList& initial_sync_data, |
| 241 scoped_ptr<syncer::SyncChangeProcessor> sync_processor, | 244 scoped_ptr<syncer::SyncChangeProcessor> sync_processor, |
| 242 scoped_ptr<syncer::SyncErrorFactory> error_handler) { | 245 scoped_ptr<syncer::SyncErrorFactory> error_handler) { |
| (...skipping 321 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 564 UpdateFaviconVisitTime(icon_url, | 567 UpdateFaviconVisitTime(icon_url, |
| 565 syncer::ProtoTimeToTime(visit_time_ms)); | 568 syncer::ProtoTimeToTime(visit_time_ms)); |
| 566 | 569 |
| 567 UpdateSyncState(icon_url, | 570 UpdateSyncState(icon_url, |
| 568 syncer::SyncChange::ACTION_ADD, | 571 syncer::SyncChange::ACTION_ADD, |
| 569 (added_tracking ? | 572 (added_tracking ? |
| 570 syncer::SyncChange::ACTION_ADD : | 573 syncer::SyncChange::ACTION_ADD : |
| 571 syncer::SyncChange::ACTION_UPDATE)); | 574 syncer::SyncChange::ACTION_UPDATE)); |
| 572 } | 575 } |
| 573 | 576 |
| 574 void FaviconCache::Observe(int type, | |
| 575 const content::NotificationSource& source, | |
| 576 const content::NotificationDetails& details) { | |
| 577 DCHECK_EQ(type, chrome::NOTIFICATION_HISTORY_URLS_DELETED); | |
| 578 | |
| 579 content::Details<history::URLsDeletedDetails> deleted_details(details); | |
| 580 | |
| 581 // We only care about actual user (or sync) deletions. | |
| 582 if (deleted_details->expired) | |
| 583 return; | |
| 584 | |
| 585 if (!deleted_details->all_history) { | |
| 586 DeleteSyncedFavicons(deleted_details->favicon_urls); | |
| 587 return; | |
| 588 } | |
| 589 | |
| 590 // All history was cleared: just delete all favicons. | |
| 591 DVLOG(1) << "History clear detected, deleting all synced favicons."; | |
| 592 syncer::SyncChangeList image_deletions, tracking_deletions; | |
| 593 while (!synced_favicons_.empty()) { | |
| 594 DeleteSyncedFavicon(synced_favicons_.begin(), | |
| 595 &image_deletions, | |
| 596 &tracking_deletions); | |
| 597 } | |
| 598 | |
| 599 if (favicon_images_sync_processor_.get()) { | |
| 600 favicon_images_sync_processor_->ProcessSyncChanges(FROM_HERE, | |
| 601 image_deletions); | |
| 602 } | |
| 603 if (favicon_tracking_sync_processor_.get()) { | |
| 604 favicon_tracking_sync_processor_->ProcessSyncChanges(FROM_HERE, | |
| 605 tracking_deletions); | |
| 606 } | |
| 607 } | |
| 608 | |
| 609 bool FaviconCache::FaviconRecencyFunctor::operator()( | 577 bool FaviconCache::FaviconRecencyFunctor::operator()( |
| 610 const linked_ptr<SyncedFaviconInfo>& lhs, | 578 const linked_ptr<SyncedFaviconInfo>& lhs, |
| 611 const linked_ptr<SyncedFaviconInfo>& rhs) const { | 579 const linked_ptr<SyncedFaviconInfo>& rhs) const { |
| 612 // TODO(zea): incorporate bookmarked status here once we care about it. | 580 // TODO(zea): incorporate bookmarked status here once we care about it. |
| 613 if (lhs->last_visit_time < rhs->last_visit_time) | 581 if (lhs->last_visit_time < rhs->last_visit_time) |
| 614 return true; | 582 return true; |
| 615 else if (lhs->last_visit_time == rhs->last_visit_time) | 583 else if (lhs->last_visit_time == rhs->last_visit_time) |
| 616 return lhs->favicon_url.spec() < rhs->favicon_url.spec(); | 584 return lhs->favicon_url.spec() < rhs->favicon_url.spec(); |
| 617 return false; | 585 return false; |
| 618 } | 586 } |
| (...skipping 439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1058 } | 1026 } |
| 1059 | 1027 |
| 1060 size_t FaviconCache::NumFaviconsForTest() const { | 1028 size_t FaviconCache::NumFaviconsForTest() const { |
| 1061 return synced_favicons_.size(); | 1029 return synced_favicons_.size(); |
| 1062 } | 1030 } |
| 1063 | 1031 |
| 1064 size_t FaviconCache::NumTasksForTest() const { | 1032 size_t FaviconCache::NumTasksForTest() const { |
| 1065 return page_task_map_.size(); | 1033 return page_task_map_.size(); |
| 1066 } | 1034 } |
| 1067 | 1035 |
| 1036 void FaviconCache::OnURLsDeleted(HistoryService* history_service, |
| 1037 bool all_history, |
| 1038 bool expired, |
| 1039 const history::URLRows& deleted_rows, |
| 1040 const std::set<GURL>& favicon_urls) { |
| 1041 // We only care about actual user (or sync) deletions. |
| 1042 if (expired) |
| 1043 return; |
| 1044 |
| 1045 if (!all_history) { |
| 1046 DeleteSyncedFavicons(favicon_urls); |
| 1047 return; |
| 1048 } |
| 1049 |
| 1050 // All history was cleared: just delete all favicons. |
| 1051 DVLOG(1) << "History clear detected, deleting all synced favicons."; |
| 1052 syncer::SyncChangeList image_deletions, tracking_deletions; |
| 1053 while (!synced_favicons_.empty()) { |
| 1054 DeleteSyncedFavicon(synced_favicons_.begin(), &image_deletions, |
| 1055 &tracking_deletions); |
| 1056 } |
| 1057 |
| 1058 if (favicon_images_sync_processor_.get()) { |
| 1059 favicon_images_sync_processor_->ProcessSyncChanges(FROM_HERE, |
| 1060 image_deletions); |
| 1061 } |
| 1062 if (favicon_tracking_sync_processor_.get()) { |
| 1063 favicon_tracking_sync_processor_->ProcessSyncChanges(FROM_HERE, |
| 1064 tracking_deletions); |
| 1065 } |
| 1066 } |
| 1067 |
| 1068 } // namespace browser_sync | 1068 } // namespace browser_sync |
| OLD | NEW |