Chromium Code Reviews| Index: components/ntp_snippets/ntp_snippets_service.cc |
| diff --git a/components/ntp_snippets/ntp_snippets_service.cc b/components/ntp_snippets/ntp_snippets_service.cc |
| index 50d8883bab478ee0acb7a34475f8ab1235707612..6cf18305e283ce5c635a9f62d0c85b6e8c71ef80 100644 |
| --- a/components/ntp_snippets/ntp_snippets_service.cc |
| +++ b/components/ntp_snippets/ntp_snippets_service.cc |
| @@ -148,6 +148,15 @@ bool NTPSnippetsService::LoadFromJSONList(const base::ListValue& list) { |
| if (!snippet) |
| return false; |
| + // If the snippet has no publish/expiry dates, fill in defaults. |
| + if (snippet->publish_date().is_null()) |
| + snippet->set_publish_date(base::Time::Now()); |
| + if (snippet->expiry_date().is_null()) { |
| + snippet->set_expiry_date( |
| + snippet->publish_date() + |
| + base::TimeDelta::FromSeconds(2 * kDefaultFetchingIntervalSeconds)); |
| + } |
| + |
| // Check if we already have a snippet with the same URL. If so, replace it |
| // rather than adding a duplicate. |
| const GURL& url = snippet->url(); |
| @@ -162,8 +171,10 @@ bool NTPSnippetsService::LoadFromJSONList(const base::ListValue& list) { |
| } |
| loaded_ = true; |
| - FOR_EACH_OBSERVER(NTPSnippetsServiceObserver, observers_, |
| - NTPSnippetsServiceLoaded(this)); |
| + // Immediately remove any already-expired snippets. This will also notify our |
| + // observers and schedule the expiry timer. |
| + RemoveExpiredSnippets(); |
| + |
| return true; |
| } |
| @@ -188,4 +199,34 @@ void NTPSnippetsService::StoreToPrefs() { |
| pref_service_->Set(prefs::kSnippets, list); |
| } |
| +void NTPSnippetsService::ScheduleExpiryTimer() { |
| + if (snippets_.empty()) |
| + return; |
| + |
| + base::Time next_expiry = base::Time::Max(); |
| + for (const auto& snippet : snippets_) { |
| + if (snippet->expiry_date() < next_expiry) |
| + next_expiry = snippet->expiry_date(); |
| + } |
| + // Note: If |next_expiry| is in the past, this will run immediately. |
|
Bernhard Bauer
2016/03/01 11:54:27
Would this still happen now? Should we rather DCHE
Marc Treib
2016/03/01 13:16:49
Done.
|
| + expiry_timer_.Start(FROM_HERE, next_expiry - base::Time::Now(), |
| + base::Bind(&NTPSnippetsService::RemoveExpiredSnippets, |
| + base::Unretained(this))); |
| +} |
| + |
| +void NTPSnippetsService::RemoveExpiredSnippets() { |
| + base::Time expiry = base::Time::Now(); |
| + snippets_.erase( |
| + std::remove_if(snippets_.begin(), snippets_.end(), |
| + [&expiry](const scoped_ptr<NTPSnippet>& snippet) { |
| + return snippet->expiry_date() <= expiry; |
| + }), |
| + snippets_.end()); |
| + |
| + FOR_EACH_OBSERVER(NTPSnippetsServiceObserver, observers_, |
| + NTPSnippetsServiceLoaded(this)); |
| + |
| + ScheduleExpiryTimer(); |
|
Bernhard Bauer
2016/03/01 11:54:27
You could also merge these two methods now.
Marc Treib
2016/03/01 13:16:49
Done.
|
| +} |
| + |
| } // namespace ntp_snippets |