Chromium Code Reviews| 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 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 252 FetchSnippetsFromHosts(GetSuggestionsHosts(), force_request); | 252 FetchSnippetsFromHosts(GetSuggestionsHosts(), force_request); |
| 253 else | 253 else |
| 254 fetch_after_load_ = true; | 254 fetch_after_load_ = true; |
| 255 } | 255 } |
| 256 | 256 |
| 257 void NTPSnippetsService::FetchSnippetsFromHosts( | 257 void NTPSnippetsService::FetchSnippetsFromHosts( |
| 258 const std::set<std::string>& hosts, | 258 const std::set<std::string>& hosts, |
| 259 bool force_request) { | 259 bool force_request) { |
| 260 if (!ready()) | 260 if (!ready()) |
| 261 return; | 261 return; |
| 262 LOG(INFO) << "DGN - Initiating fetch"; | |
| 263 EnterState(state_, ContentSuggestionsCategoryStatus::AVAILABLE_LOADING); | |
|
Marc Treib
2016/07/29 10:19:47
I don't think this is right. AVAILABLE_LOADING is
dgn
2016/07/29 10:42:48
Ah ok I didn't understand AVAILABLE_LOADING proper
Marc Treib
2016/07/29 10:45:46
Also while we're waiting for results from the DB (
dgn
2016/07/29 16:37:46
What about when the service was disabled, so we cl
Marc Treib
2016/08/01 09:03:31
Yes, that sounds right.
| |
| 262 snippets_fetcher_->FetchSnippetsFromHosts(hosts, application_language_code_, | 264 snippets_fetcher_->FetchSnippetsFromHosts(hosts, application_language_code_, |
| 263 kMaxSnippetCount, force_request); | 265 kMaxSnippetCount, force_request); |
| 264 } | 266 } |
| 265 | 267 |
| 266 void NTPSnippetsService::RescheduleFetching() { | 268 void NTPSnippetsService::RescheduleFetching() { |
| 267 // The scheduler only exists on Android so far, it's null on other platforms. | 269 // The scheduler only exists on Android so far, it's null on other platforms. |
| 268 if (!scheduler_) | 270 if (!scheduler_) |
| 269 return; | 271 return; |
| 270 | 272 |
| 271 if (ready()) { | 273 if (ready()) { |
| (...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 409 }); | 411 }); |
| 410 | 412 |
| 411 ClearExpiredSnippets(); | 413 ClearExpiredSnippets(); |
| 412 FinishInitialization(); | 414 FinishInitialization(); |
| 413 } | 415 } |
| 414 | 416 |
| 415 void NTPSnippetsService::OnDatabaseError() { | 417 void NTPSnippetsService::OnDatabaseError() { |
| 416 EnterState(State::SHUT_DOWN, ContentSuggestionsCategoryStatus::LOADING_ERROR); | 418 EnterState(State::SHUT_DOWN, ContentSuggestionsCategoryStatus::LOADING_ERROR); |
| 417 } | 419 } |
| 418 | 420 |
| 421 // TODO(dgn): name clash between content suggestions and suggestions hosts. | |
| 422 // method name should be changed. | |
| 419 void NTPSnippetsService::OnSuggestionsChanged( | 423 void NTPSnippetsService::OnSuggestionsChanged( |
| 420 const SuggestionsProfile& suggestions) { | 424 const SuggestionsProfile& suggestions) { |
| 421 DCHECK(initialized()); | 425 DCHECK(initialized()); |
| 422 | 426 |
| 423 std::set<std::string> hosts = GetSuggestionsHostsImpl(suggestions); | 427 std::set<std::string> hosts = GetSuggestionsHostsImpl(suggestions); |
| 424 if (hosts == GetSnippetHostsFromPrefs()) | 428 if (hosts == GetSnippetHostsFromPrefs()) |
| 425 return; | 429 return; |
| 426 | 430 |
| 427 // Remove existing snippets that aren't in the suggestions anymore. | 431 // Remove existing snippets that aren't in the suggestions anymore. |
| 428 // TODO(treib,maybelle): If there is another source with an allowed host, | 432 // TODO(treib,maybelle): If there is another source with an allowed host, |
| 429 // then we should fall back to that. | 433 // then we should fall back to that. |
| 430 // First, move them over into |to_delete|. | 434 // First, move them over into |to_delete|. |
| 431 NTPSnippet::PtrVector to_delete; | 435 NTPSnippet::PtrVector to_delete; |
| 432 for (std::unique_ptr<NTPSnippet>& snippet : snippets_) { | 436 for (std::unique_ptr<NTPSnippet>& snippet : snippets_) { |
| 433 if (!hosts.count(snippet->best_source().url.host())) | 437 if (!hosts.count(snippet->best_source().url.host())) |
| 434 to_delete.emplace_back(std::move(snippet)); | 438 to_delete.emplace_back(std::move(snippet)); |
| 435 } | 439 } |
| 436 Compact(&snippets_); | 440 Compact(&snippets_); |
| 437 // Then delete the removed snippets from the database. | 441 // Then delete the removed snippets from the database. |
| 438 database_->DeleteSnippets(to_delete); | 442 database_->DeleteSnippets(to_delete); |
| 439 | 443 |
| 440 StoreSnippetHostsToPrefs(hosts); | 444 StoreSnippetHostsToPrefs(hosts); |
| 441 | 445 |
| 446 // TODO(dgn) Why do we do that BEFORE fetching? | |
| 442 NotifyNewSuggestions(); | 447 NotifyNewSuggestions(); |
|
dgn
2016/07/29 09:58:36
Why do we do that BEFORE fetching?
Marc Treib
2016/07/29 10:19:47
We potentially deleted some snippets above, so we
dgn
2016/07/29 10:42:48
Wouldn't they be notified of the new list when the
Marc Treib
2016/07/29 10:45:46
True, but that might take any amount of time, and
dgn
2016/07/29 16:37:46
Added a comment about this.
| |
| 443 | 448 |
| 444 FetchSnippetsFromHosts(hosts, /*force_request=*/false); | 449 FetchSnippetsFromHosts(hosts, /*force_request=*/false); |
| 445 } | 450 } |
| 446 | 451 |
| 447 void NTPSnippetsService::OnFetchFinished( | 452 void NTPSnippetsService::OnFetchFinished( |
| 448 NTPSnippetsFetcher::OptionalSnippets snippets) { | 453 NTPSnippetsFetcher::OptionalSnippets snippets) { |
| 449 if (!ready()) | 454 if (!ready()) |
| 450 return; | 455 return; |
| 451 | 456 |
| 452 if (snippets) { | 457 if (snippets) { |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 698 image_fetcher_->SetImageFetcherDelegate(this); | 703 image_fetcher_->SetImageFetcherDelegate(this); |
| 699 image_fetcher_->SetDataUseServiceName( | 704 image_fetcher_->SetDataUseServiceName( |
| 700 data_use_measurement::DataUseUserData::NTP_SNIPPETS); | 705 data_use_measurement::DataUseUserData::NTP_SNIPPETS); |
| 701 } | 706 } |
| 702 | 707 |
| 703 // Note: Initializing the status service will run the callback right away with | 708 // Note: Initializing the status service will run the callback right away with |
| 704 // the current state. | 709 // the current state. |
| 705 snippets_status_service_->Init(base::Bind( | 710 snippets_status_service_->Init(base::Bind( |
| 706 &NTPSnippetsService::OnDisabledReasonChanged, base::Unretained(this))); | 711 &NTPSnippetsService::OnDisabledReasonChanged, base::Unretained(this))); |
| 707 | 712 |
| 713 // TODO(dgn): If we started a fetch as a result of the state being updated | |
| 714 // and not having snippets from the DB, because of the call below we would | |
| 715 // still notify the client with no snippets and force the "AVAILABLE" status. | |
| 716 // WAI? | |
| 717 // IMO that seems wrong. Skipping this call will put us either: | |
| 718 // - in AVAILABLE_LOADING: because of the pending fetch started above. | |
| 719 // - in INITIALIZING status: If it's right on startup and because we don't | |
| 720 // have sync data, the fetch can't start. We appropriately report that we | |
| 721 // are still initializing. | |
| 708 NotifyNewSuggestions(); | 722 NotifyNewSuggestions(); |
|
dgn
2016/07/29 09:58:36
If we started a fetch as a result of the state bei
Marc Treib
2016/07/29 10:19:47
I guess this is here because we "probably" loaded
dgn
2016/07/29 10:42:48
So the intent is that while a fetch is pending and
Marc Treib
2016/07/29 10:45:46
I think so, yes. We should also be in _LOADING if
| |
| 709 } | 723 } |
| 710 | 724 |
| 711 void NTPSnippetsService::OnDisabledReasonChanged( | 725 void NTPSnippetsService::OnDisabledReasonChanged( |
| 712 DisabledReason disabled_reason) { | 726 DisabledReason disabled_reason) { |
| 713 FOR_EACH_OBSERVER(NTPSnippetsServiceObserver, observers_, | 727 FOR_EACH_OBSERVER(NTPSnippetsServiceObserver, observers_, |
| 714 NTPSnippetsServiceDisabledReasonChanged(disabled_reason)); | 728 NTPSnippetsServiceDisabledReasonChanged(disabled_reason)); |
| 715 | 729 |
| 716 switch (disabled_reason) { | 730 switch (disabled_reason) { |
| 717 case DisabledReason::NONE: | 731 case DisabledReason::NONE: { |
| 718 EnterState(State::READY, ContentSuggestionsCategoryStatus::AVAILABLE); | 732 // Do not change the status. As the service becomes enabled, it will |
| 733 // either start a new fetch (and transition to |AVAILABLE_LOADING|), or | |
| 734 // send cached suggestions (and transition to |AVAILABLE|). | |
| 735 EnterState(State::READY, category_status_); | |
| 719 break; | 736 break; |
| 737 } | |
| 720 | 738 |
| 721 case DisabledReason::HISTORY_SYNC_STATE_UNKNOWN: | 739 case DisabledReason::HISTORY_SYNC_STATE_UNKNOWN: |
| 722 // HistorySync is not initialized yet, so we don't know what the actual | 740 // HistorySync is not initialized yet, so we don't know what the actual |
| 723 // state is and we just return the current one. If things change, | 741 // state is and we just return the current one. If things change, |
| 724 // |OnStateChanged| will call this function again to update the state. | 742 // |OnStateChanged| will call this function again to update the state. |
| 725 DVLOG(1) << "Sync configuration incomplete, continuing based on the " | 743 DVLOG(1) << "Sync configuration incomplete, continuing based on the " |
| 726 "current state."; | 744 "current state."; |
| 727 EnterState(state_, ContentSuggestionsCategoryStatus::INITIALIZING); | 745 EnterState(state_, ContentSuggestionsCategoryStatus::INITIALIZING); |
| 728 break; | 746 break; |
| 729 | 747 |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 750 | 768 |
| 751 case DisabledReason::HISTORY_SYNC_DISABLED: | 769 case DisabledReason::HISTORY_SYNC_DISABLED: |
| 752 EnterState(State::DISABLED, | 770 EnterState(State::DISABLED, |
| 753 ContentSuggestionsCategoryStatus::HISTORY_SYNC_DISABLED); | 771 ContentSuggestionsCategoryStatus::HISTORY_SYNC_DISABLED); |
| 754 break; | 772 break; |
| 755 } | 773 } |
| 756 } | 774 } |
| 757 | 775 |
| 758 void NTPSnippetsService::EnterState(State state, | 776 void NTPSnippetsService::EnterState(State state, |
| 759 ContentSuggestionsCategoryStatus status) { | 777 ContentSuggestionsCategoryStatus status) { |
| 778 LOG(INFO) << "DGN - EnterState(" << (int)state << ", " << (int)status << ")"; | |
| 779 | |
| 760 if (status != category_status_) { | 780 if (status != category_status_) { |
| 761 category_status_ = status; | 781 category_status_ = status; |
| 762 NotifyCategoryStatusChanged(); | 782 NotifyCategoryStatusChanged(); |
| 763 } | 783 } |
| 764 | 784 |
| 765 if (state == state_) | 785 if (state == state_) |
| 766 return; | 786 return; |
| 767 | 787 |
| 768 switch (state) { | 788 switch (state) { |
| 769 case State::NOT_INITED: | 789 case State::NOT_INITED: |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 792 | 812 |
| 793 case State::SHUT_DOWN: | 813 case State::SHUT_DOWN: |
| 794 DVLOG(1) << "Entering state: SHUT_DOWN"; | 814 DVLOG(1) << "Entering state: SHUT_DOWN"; |
| 795 state_ = State::SHUT_DOWN; | 815 state_ = State::SHUT_DOWN; |
| 796 EnterStateShutdown(); | 816 EnterStateShutdown(); |
| 797 return; | 817 return; |
| 798 } | 818 } |
| 799 } | 819 } |
| 800 | 820 |
| 801 void NTPSnippetsService::NotifyNewSuggestions() { | 821 void NTPSnippetsService::NotifyNewSuggestions() { |
| 822 EnterState(state_, ContentSuggestionsCategoryStatus::AVAILABLE); | |
|
Marc Treib
2016/07/29 10:19:47
Huh, seems like we should already be in this state
| |
| 823 | |
| 802 // TODO(pke): Remove this as soon as this becomes a pure provider. | 824 // TODO(pke): Remove this as soon as this becomes a pure provider. |
| 803 FOR_EACH_OBSERVER(NTPSnippetsServiceObserver, observers_, | 825 FOR_EACH_OBSERVER(NTPSnippetsServiceObserver, observers_, |
| 804 NTPSnippetsServiceLoaded()); | 826 NTPSnippetsServiceLoaded()); |
| 805 | 827 |
| 806 if (!observer_) | 828 if (!observer_) |
| 807 return; | 829 return; |
| 808 | 830 |
| 809 std::vector<ContentSuggestion> result; | 831 std::vector<ContentSuggestion> result; |
| 810 for (const std::unique_ptr<NTPSnippet>& snippet : snippets_) { | 832 for (const std::unique_ptr<NTPSnippet>& snippet : snippets_) { |
| 811 if (!snippet->is_complete()) | 833 if (!snippet->is_complete()) |
| 812 continue; | 834 continue; |
| 813 ContentSuggestion suggestion( | 835 ContentSuggestion suggestion( |
| 814 MakeUniqueID(ContentSuggestionsCategory::ARTICLES, snippet->id()), | 836 MakeUniqueID(ContentSuggestionsCategory::ARTICLES, snippet->id()), |
| 815 snippet->best_source().url); | 837 snippet->best_source().url); |
| 816 suggestion.set_amp_url(snippet->best_source().amp_url); | 838 suggestion.set_amp_url(snippet->best_source().amp_url); |
| 817 suggestion.set_title(snippet->title()); | 839 suggestion.set_title(snippet->title()); |
| 818 suggestion.set_snippet_text(snippet->snippet()); | 840 suggestion.set_snippet_text(snippet->snippet()); |
| 819 suggestion.set_publish_date(snippet->publish_date()); | 841 suggestion.set_publish_date(snippet->publish_date()); |
| 820 suggestion.set_publisher_name(snippet->best_source().publisher_name); | 842 suggestion.set_publisher_name(snippet->best_source().publisher_name); |
| 821 suggestion.set_score(snippet->score()); | 843 suggestion.set_score(snippet->score()); |
| 822 result.emplace_back(std::move(suggestion)); | 844 result.emplace_back(std::move(suggestion)); |
| 823 } | 845 } |
| 824 observer_->OnNewSuggestions(ContentSuggestionsCategory::ARTICLES, | 846 observer_->OnNewSuggestions(ContentSuggestionsCategory::ARTICLES, |
| 825 std::move(result)); | 847 std::move(result)); |
| 826 } | 848 } |
| 827 | 849 |
| 828 void NTPSnippetsService::NotifyCategoryStatusChanged() { | 850 void NTPSnippetsService::NotifyCategoryStatusChanged() { |
| 851 LOG(INFO) << "DGN - NotifyCategoryStatusChanged " << (int)category_status_; | |
| 829 if (observer_) { | 852 if (observer_) { |
| 830 observer_->OnCategoryStatusChanged(ContentSuggestionsCategory::ARTICLES, | 853 observer_->OnCategoryStatusChanged(ContentSuggestionsCategory::ARTICLES, |
| 831 category_status_); | 854 category_status_); |
| 832 } | 855 } |
| 833 } | 856 } |
| 834 | 857 |
| 835 } // namespace ntp_snippets | 858 } // namespace ntp_snippets |
| OLD | NEW |