| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "components/ntp_snippets/ntp_snippets_service.h" | 5 #include "components/ntp_snippets/ntp_snippets_service.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <iterator> | 8 #include <iterator> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 133 bool AddSnippetsFromListValue(const base::ListValue& list, | 133 bool AddSnippetsFromListValue(const base::ListValue& list, |
| 134 NTPSnippetsService::NTPSnippetStorage* snippets) { | 134 NTPSnippetsService::NTPSnippetStorage* snippets) { |
| 135 for (const base::Value* const value : list) { | 135 for (const base::Value* const value : list) { |
| 136 const base::DictionaryValue* dict = nullptr; | 136 const base::DictionaryValue* dict = nullptr; |
| 137 if (!value->GetAsDictionary(&dict)) | 137 if (!value->GetAsDictionary(&dict)) |
| 138 return false; | 138 return false; |
| 139 | 139 |
| 140 const base::DictionaryValue* content = nullptr; | 140 const base::DictionaryValue* content = nullptr; |
| 141 if (!dict->GetDictionary(kContentInfo, &content)) | 141 if (!dict->GetDictionary(kContentInfo, &content)) |
| 142 return false; | 142 return false; |
| 143 scoped_ptr<NTPSnippet> snippet = NTPSnippet::CreateFromDictionary(*content); | 143 std::unique_ptr<NTPSnippet> snippet = |
| 144 NTPSnippet::CreateFromDictionary(*content); |
| 144 if (!snippet) | 145 if (!snippet) |
| 145 return false; | 146 return false; |
| 146 | 147 |
| 147 snippets->push_back(std::move(snippet)); | 148 snippets->push_back(std::move(snippet)); |
| 148 } | 149 } |
| 149 return true; | 150 return true; |
| 150 } | 151 } |
| 151 | 152 |
| 152 scoped_ptr<base::ListValue> SnippetsToListValue( | 153 std::unique_ptr<base::ListValue> SnippetsToListValue( |
| 153 const NTPSnippetsService::NTPSnippetStorage& snippets) { | 154 const NTPSnippetsService::NTPSnippetStorage& snippets) { |
| 154 scoped_ptr<base::ListValue> list(new base::ListValue); | 155 std::unique_ptr<base::ListValue> list(new base::ListValue); |
| 155 for (const auto& snippet : snippets) { | 156 for (const auto& snippet : snippets) { |
| 156 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue); | 157 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue); |
| 157 dict->Set(kContentInfo, snippet->ToDictionary()); | 158 dict->Set(kContentInfo, snippet->ToDictionary()); |
| 158 list->Append(std::move(dict)); | 159 list->Append(std::move(dict)); |
| 159 } | 160 } |
| 160 return list; | 161 return list; |
| 161 } | 162 } |
| 162 | 163 |
| 163 bool ContainsSnippet(const NTPSnippetsService::NTPSnippetStorage& haystack, | 164 bool ContainsSnippet(const NTPSnippetsService::NTPSnippetStorage& haystack, |
| 164 const scoped_ptr<NTPSnippet>& needle) { | 165 const std::unique_ptr<NTPSnippet>& needle) { |
| 165 const GURL& url = needle->url(); | 166 const GURL& url = needle->url(); |
| 166 return std::find_if(haystack.begin(), haystack.end(), | 167 return std::find_if(haystack.begin(), haystack.end(), |
| 167 [&url](const scoped_ptr<NTPSnippet>& snippet) { | 168 [&url](const std::unique_ptr<NTPSnippet>& snippet) { |
| 168 return snippet->url() == url; | 169 return snippet->url() == url; |
| 169 }) != haystack.end(); | 170 }) != haystack.end(); |
| 170 } | 171 } |
| 171 | 172 |
| 172 } // namespace | 173 } // namespace |
| 173 | 174 |
| 174 NTPSnippetsService::NTPSnippetsService( | 175 NTPSnippetsService::NTPSnippetsService( |
| 175 PrefService* pref_service, | 176 PrefService* pref_service, |
| 176 SuggestionsService* suggestions_service, | 177 SuggestionsService* suggestions_service, |
| 177 scoped_refptr<base::SequencedTaskRunner> file_task_runner, | 178 scoped_refptr<base::SequencedTaskRunner> file_task_runner, |
| 178 const std::string& application_language_code, | 179 const std::string& application_language_code, |
| 179 NTPSnippetsScheduler* scheduler, | 180 NTPSnippetsScheduler* scheduler, |
| 180 scoped_ptr<NTPSnippetsFetcher> snippets_fetcher, | 181 std::unique_ptr<NTPSnippetsFetcher> snippets_fetcher, |
| 181 const ParseJSONCallback& parse_json_callback) | 182 const ParseJSONCallback& parse_json_callback) |
| 182 : enabled_(false), | 183 : enabled_(false), |
| 183 pref_service_(pref_service), | 184 pref_service_(pref_service), |
| 184 suggestions_service_(suggestions_service), | 185 suggestions_service_(suggestions_service), |
| 185 file_task_runner_(file_task_runner), | 186 file_task_runner_(file_task_runner), |
| 186 application_language_code_(application_language_code), | 187 application_language_code_(application_language_code), |
| 187 scheduler_(scheduler), | 188 scheduler_(scheduler), |
| 188 snippets_fetcher_(std::move(snippets_fetcher)), | 189 snippets_fetcher_(std::move(snippets_fetcher)), |
| 189 parse_json_callback_(parse_json_callback), | 190 parse_json_callback_(parse_json_callback), |
| 190 weak_ptr_factory_(this) { | 191 weak_ptr_factory_(this) { |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 277 if (!suggestions_service_) | 278 if (!suggestions_service_) |
| 278 return std::set<std::string>(); | 279 return std::set<std::string>(); |
| 279 | 280 |
| 280 // TODO(treib) this should just call GetSnippetHostsFromPrefs | 281 // TODO(treib) this should just call GetSnippetHostsFromPrefs |
| 281 return GetSuggestionsHostsImpl( | 282 return GetSuggestionsHostsImpl( |
| 282 suggestions_service_->GetSuggestionsDataFromCache()); | 283 suggestions_service_->GetSuggestionsDataFromCache()); |
| 283 } | 284 } |
| 284 | 285 |
| 285 bool NTPSnippetsService::DiscardSnippet(const GURL& url) { | 286 bool NTPSnippetsService::DiscardSnippet(const GURL& url) { |
| 286 auto it = std::find_if(snippets_.begin(), snippets_.end(), | 287 auto it = std::find_if(snippets_.begin(), snippets_.end(), |
| 287 [&url](const scoped_ptr<NTPSnippet>& snippet) { | 288 [&url](const std::unique_ptr<NTPSnippet>& snippet) { |
| 288 return snippet->url() == url; | 289 return snippet->url() == url; |
| 289 }); | 290 }); |
| 290 if (it == snippets_.end()) | 291 if (it == snippets_.end()) |
| 291 return false; | 292 return false; |
| 292 discarded_snippets_.push_back(std::move(*it)); | 293 discarded_snippets_.push_back(std::move(*it)); |
| 293 snippets_.erase(it); | 294 snippets_.erase(it); |
| 294 StoreDiscardedSnippetsToPrefs(); | 295 StoreDiscardedSnippetsToPrefs(); |
| 295 StoreSnippetsToPrefs(); | 296 StoreSnippetsToPrefs(); |
| 296 FOR_EACH_OBSERVER(NTPSnippetsServiceObserver, observers_, | 297 FOR_EACH_OBSERVER(NTPSnippetsServiceObserver, observers_, |
| 297 NTPSnippetsServiceLoaded()); | 298 NTPSnippetsServiceLoaded()); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 319 | 320 |
| 320 void NTPSnippetsService::OnSuggestionsChanged( | 321 void NTPSnippetsService::OnSuggestionsChanged( |
| 321 const SuggestionsProfile& suggestions) { | 322 const SuggestionsProfile& suggestions) { |
| 322 std::set<std::string> hosts = GetSuggestionsHostsImpl(suggestions); | 323 std::set<std::string> hosts = GetSuggestionsHostsImpl(suggestions); |
| 323 if (hosts == GetSnippetHostsFromPrefs()) | 324 if (hosts == GetSnippetHostsFromPrefs()) |
| 324 return; | 325 return; |
| 325 | 326 |
| 326 // Remove existing snippets that aren't in the suggestions anymore. | 327 // Remove existing snippets that aren't in the suggestions anymore. |
| 327 snippets_.erase( | 328 snippets_.erase( |
| 328 std::remove_if(snippets_.begin(), snippets_.end(), | 329 std::remove_if(snippets_.begin(), snippets_.end(), |
| 329 [&hosts](const scoped_ptr<NTPSnippet>& snippet) { | 330 [&hosts](const std::unique_ptr<NTPSnippet>& snippet) { |
| 330 return !hosts.count(snippet->url().host()); | 331 return !hosts.count(snippet->url().host()); |
| 331 }), | 332 }), |
| 332 snippets_.end()); | 333 snippets_.end()); |
| 333 | 334 |
| 334 StoreSnippetsToPrefs(); | 335 StoreSnippetsToPrefs(); |
| 335 StoreSnippetHostsToPrefs(hosts); | 336 StoreSnippetHostsToPrefs(hosts); |
| 336 | 337 |
| 337 FOR_EACH_OBSERVER(NTPSnippetsServiceObserver, observers_, | 338 FOR_EACH_OBSERVER(NTPSnippetsServiceObserver, observers_, |
| 338 NTPSnippetsServiceLoaded()); | 339 NTPSnippetsServiceLoaded()); |
| 339 | 340 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 352 weak_ptr_factory_.GetWeakPtr(), snippets_json), | 353 weak_ptr_factory_.GetWeakPtr(), snippets_json), |
| 353 base::Bind(&NTPSnippetsService::OnJsonError, | 354 base::Bind(&NTPSnippetsService::OnJsonError, |
| 354 weak_ptr_factory_.GetWeakPtr(), snippets_json)); | 355 weak_ptr_factory_.GetWeakPtr(), snippets_json)); |
| 355 } else { | 356 } else { |
| 356 last_fetch_status_ = status; | 357 last_fetch_status_ = status; |
| 357 LoadingSnippetsFinished(); | 358 LoadingSnippetsFinished(); |
| 358 } | 359 } |
| 359 } | 360 } |
| 360 | 361 |
| 361 void NTPSnippetsService::OnJsonParsed(const std::string& snippets_json, | 362 void NTPSnippetsService::OnJsonParsed(const std::string& snippets_json, |
| 362 scoped_ptr<base::Value> parsed) { | 363 std::unique_ptr<base::Value> parsed) { |
| 363 if (!LoadFromValue(*parsed)) { | 364 if (!LoadFromValue(*parsed)) { |
| 364 LOG(WARNING) << "Received invalid snippets: " << snippets_json; | 365 LOG(WARNING) << "Received invalid snippets: " << snippets_json; |
| 365 last_fetch_status_ = kStatusMessageEmptyList; | 366 last_fetch_status_ = kStatusMessageEmptyList; |
| 366 } else { | 367 } else { |
| 367 last_fetch_status_ = kStatusMessageOK; | 368 last_fetch_status_ = kStatusMessageOK; |
| 368 } | 369 } |
| 369 | 370 |
| 370 LoadingSnippetsFinished(); | 371 LoadingSnippetsFinished(); |
| 371 } | 372 } |
| 372 | 373 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 392 } | 393 } |
| 393 | 394 |
| 394 bool NTPSnippetsService::LoadFromListValue(const base::ListValue& list) { | 395 bool NTPSnippetsService::LoadFromListValue(const base::ListValue& list) { |
| 395 NTPSnippetStorage new_snippets; | 396 NTPSnippetStorage new_snippets; |
| 396 if (!AddSnippetsFromListValue(list, &new_snippets)) | 397 if (!AddSnippetsFromListValue(list, &new_snippets)) |
| 397 return false; | 398 return false; |
| 398 | 399 |
| 399 // Remove new snippets that we already have, or that have been discarded. | 400 // Remove new snippets that we already have, or that have been discarded. |
| 400 new_snippets.erase( | 401 new_snippets.erase( |
| 401 std::remove_if(new_snippets.begin(), new_snippets.end(), | 402 std::remove_if(new_snippets.begin(), new_snippets.end(), |
| 402 [this](const scoped_ptr<NTPSnippet>& snippet) { | 403 [this](const std::unique_ptr<NTPSnippet>& snippet) { |
| 403 return ContainsSnippet(discarded_snippets_, snippet) || | 404 return ContainsSnippet(discarded_snippets_, snippet) || |
| 404 ContainsSnippet(snippets_, snippet); | 405 ContainsSnippet(snippets_, snippet); |
| 405 }), | 406 }), |
| 406 new_snippets.end()); | 407 new_snippets.end()); |
| 407 | 408 |
| 408 // Fill in default publish/expiry dates where required. | 409 // Fill in default publish/expiry dates where required. |
| 409 for (scoped_ptr<NTPSnippet>& snippet : new_snippets) { | 410 for (std::unique_ptr<NTPSnippet>& snippet : new_snippets) { |
| 410 if (snippet->publish_date().is_null()) | 411 if (snippet->publish_date().is_null()) |
| 411 snippet->set_publish_date(base::Time::Now()); | 412 snippet->set_publish_date(base::Time::Now()); |
| 412 if (snippet->expiry_date().is_null()) { | 413 if (snippet->expiry_date().is_null()) { |
| 413 snippet->set_expiry_date( | 414 snippet->set_expiry_date( |
| 414 snippet->publish_date() + | 415 snippet->publish_date() + |
| 415 base::TimeDelta::FromMinutes(kDefaultExpiryTimeMins)); | 416 base::TimeDelta::FromMinutes(kDefaultExpiryTimeMins)); |
| 416 } | 417 } |
| 417 } | 418 } |
| 418 | 419 |
| 419 // Insert the new snippets at the front. | 420 // Insert the new snippets at the front. |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 472 list.AppendString(host); | 473 list.AppendString(host); |
| 473 pref_service_->Set(prefs::kSnippetHosts, list); | 474 pref_service_->Set(prefs::kSnippetHosts, list); |
| 474 } | 475 } |
| 475 | 476 |
| 476 void NTPSnippetsService::LoadingSnippetsFinished() { | 477 void NTPSnippetsService::LoadingSnippetsFinished() { |
| 477 // Remove expired snippets. | 478 // Remove expired snippets. |
| 478 base::Time expiry = base::Time::Now(); | 479 base::Time expiry = base::Time::Now(); |
| 479 | 480 |
| 480 snippets_.erase( | 481 snippets_.erase( |
| 481 std::remove_if(snippets_.begin(), snippets_.end(), | 482 std::remove_if(snippets_.begin(), snippets_.end(), |
| 482 [&expiry](const scoped_ptr<NTPSnippet>& snippet) { | 483 [&expiry](const std::unique_ptr<NTPSnippet>& snippet) { |
| 483 return snippet->expiry_date() <= expiry; | 484 return snippet->expiry_date() <= expiry; |
| 484 }), | 485 }), |
| 485 snippets_.end()); | 486 snippets_.end()); |
| 486 StoreSnippetsToPrefs(); | 487 StoreSnippetsToPrefs(); |
| 487 | 488 |
| 488 discarded_snippets_.erase( | 489 discarded_snippets_.erase( |
| 489 std::remove_if(discarded_snippets_.begin(), discarded_snippets_.end(), | 490 std::remove_if(discarded_snippets_.begin(), discarded_snippets_.end(), |
| 490 [&expiry](const scoped_ptr<NTPSnippet>& snippet) { | 491 [&expiry](const std::unique_ptr<NTPSnippet>& snippet) { |
| 491 return snippet->expiry_date() <= expiry; | 492 return snippet->expiry_date() <= expiry; |
| 492 }), | 493 }), |
| 493 discarded_snippets_.end()); | 494 discarded_snippets_.end()); |
| 494 StoreDiscardedSnippetsToPrefs(); | 495 StoreDiscardedSnippetsToPrefs(); |
| 495 | 496 |
| 496 FOR_EACH_OBSERVER(NTPSnippetsServiceObserver, observers_, | 497 FOR_EACH_OBSERVER(NTPSnippetsServiceObserver, observers_, |
| 497 NTPSnippetsServiceLoaded()); | 498 NTPSnippetsServiceLoaded()); |
| 498 | 499 |
| 499 // If there are any snippets left, schedule a timer for the next expiry. | 500 // If there are any snippets left, schedule a timer for the next expiry. |
| 500 if (snippets_.empty() && discarded_snippets_.empty()) | 501 if (snippets_.empty() && discarded_snippets_.empty()) |
| 501 return; | 502 return; |
| 502 | 503 |
| 503 base::Time next_expiry = base::Time::Max(); | 504 base::Time next_expiry = base::Time::Max(); |
| 504 for (const auto& snippet : snippets_) { | 505 for (const auto& snippet : snippets_) { |
| 505 if (snippet->expiry_date() < next_expiry) | 506 if (snippet->expiry_date() < next_expiry) |
| 506 next_expiry = snippet->expiry_date(); | 507 next_expiry = snippet->expiry_date(); |
| 507 } | 508 } |
| 508 for (const auto& snippet : discarded_snippets_) { | 509 for (const auto& snippet : discarded_snippets_) { |
| 509 if (snippet->expiry_date() < next_expiry) | 510 if (snippet->expiry_date() < next_expiry) |
| 510 next_expiry = snippet->expiry_date(); | 511 next_expiry = snippet->expiry_date(); |
| 511 } | 512 } |
| 512 DCHECK_GT(next_expiry, expiry); | 513 DCHECK_GT(next_expiry, expiry); |
| 513 expiry_timer_.Start(FROM_HERE, next_expiry - expiry, | 514 expiry_timer_.Start(FROM_HERE, next_expiry - expiry, |
| 514 base::Bind(&NTPSnippetsService::LoadingSnippetsFinished, | 515 base::Bind(&NTPSnippetsService::LoadingSnippetsFinished, |
| 515 base::Unretained(this))); | 516 base::Unretained(this))); |
| 516 } | 517 } |
| 517 | 518 |
| 518 } // namespace ntp_snippets | 519 } // namespace ntp_snippets |
| OLD | NEW |