Index: components/ntp_snippets/remote/ntp_snippets_fetcher.cc |
diff --git a/components/ntp_snippets/remote/ntp_snippets_fetcher.cc b/components/ntp_snippets/remote/ntp_snippets_fetcher.cc |
index 2de69441bbe8a0557c1d8b5b07e92d7e3c6609c8..45f59d5ff88250440326fe572ff0c8dbda82afda 100644 |
--- a/components/ntp_snippets/remote/ntp_snippets_fetcher.cc |
+++ b/components/ntp_snippets/remote/ntp_snippets_fetcher.cc |
@@ -24,6 +24,7 @@ |
#include "components/ntp_snippets/category_factory.h" |
#include "components/ntp_snippets/features.h" |
#include "components/ntp_snippets/ntp_snippets_constants.h" |
+#include "components/ntp_snippets/user_classifier.h" |
#include "components/signin/core/browser/profile_oauth2_token_service.h" |
#include "components/signin/core/browser/signin_manager.h" |
#include "components/signin/core/browser/signin_manager_base.h" |
@@ -69,8 +70,12 @@ const int kMaxExcludedIds = 100; |
// Variation parameter for sending LanguageModel info to the server. |
const char kSendTopLanguagesName[] = "send_top_languages"; |
-const char kSendTopLanguagesEnabled[] = "true"; |
-const char kSendTopLanguagesDisabled[] = "false"; |
+ |
+// Variation parameter for sending UserClassifier info to the server. |
+const char kSendUserClassName[] = "send_user_class"; |
+ |
+const char kBooleanParameterEnabled[] = "true"; |
+const char kBooleanParameterDisabled[] = "false"; |
std::string FetchResultToString(NTPSnippetsFetcher::FetchResult result) { |
switch (result) { |
@@ -124,17 +129,27 @@ std::string GetFetchEndpoint() { |
return endpoint.empty() ? kChromeReaderServer : endpoint; |
} |
-bool IsSendingTopLanguagesEnabled() { |
- std::string send_top_languages = variations::GetVariationParamValueByFeature( |
- ntp_snippets::kArticleSuggestionsFeature, kSendTopLanguagesName); |
- if (send_top_languages == kSendTopLanguagesEnabled) |
+bool IsBooleanParameterEnabled(const std::string& param_name, |
+ bool default_value) { |
+ std::string param_value = variations::GetVariationParamValueByFeature( |
+ ntp_snippets::kArticleSuggestionsFeature, param_name); |
+ if (param_value == kBooleanParameterEnabled) |
return true; |
- if (!send_top_languages.empty() && |
- send_top_languages != kSendTopLanguagesDisabled) { |
- LOG(WARNING) << "Invalid value \"" << send_top_languages |
- << "\" for variation parameter " << kSendTopLanguagesName; |
+ if (param_value == kBooleanParameterDisabled) |
+ return false; |
+ if (!param_value.empty()) { |
+ LOG(WARNING) << "Invalid value \"" << param_value |
+ << "\" for variation parameter " << param_name; |
} |
- return false; |
+ return default_value; |
+} |
+ |
+bool IsSendingTopLanguagesEnabled() { |
+ return IsBooleanParameterEnabled(kSendTopLanguagesName, false); |
+} |
+ |
+bool IsSendingUserClassEnabled() { |
+ return IsBooleanParameterEnabled(kSendUserClassName, false); |
} |
bool UsesChromeContentSuggestionsAPI(const GURL& endpoint) { |
@@ -212,6 +227,19 @@ void AppendLanguageInfoToList(base::ListValue* list, |
list->Append(std::move(lang)); |
} |
+std::string GetUserClassString(UserClassifier::UserClass user_class) { |
+ switch (user_class) { |
+ case UserClassifier::UserClass::RARE_NTP_USER: |
+ return "RARE_NTP_USER"; |
+ case UserClassifier::UserClass::ACTIVE_NTP_USER: |
+ return "ACTIVE_NTP_USER"; |
+ case UserClassifier::UserClass::ACTIVE_SUGGESTIONS_CONSUMER: |
+ return "ACTIVE_SUGGESTIONS_CONSUMER"; |
+ } |
+ NOTREACHED(); |
+ return std::string(); |
+} |
+ |
} // namespace |
NTPSnippetsFetcher::FetchedCategory::FetchedCategory(Category c) |
@@ -231,7 +259,8 @@ NTPSnippetsFetcher::NTPSnippetsFetcher( |
CategoryFactory* category_factory, |
LanguageModel* language_model, |
const ParseJSONCallback& parse_json_callback, |
- const std::string& api_key) |
+ const std::string& api_key, |
+ const UserClassifier* user_classifier) |
: OAuth2TokenService::Consumer("ntp_snippets"), |
signin_manager_(signin_manager), |
token_service_(token_service), |
@@ -248,9 +277,19 @@ NTPSnippetsFetcher::NTPSnippetsFetcher( |
api_key_(api_key), |
interactive_request_(false), |
tick_clock_(new base::DefaultTickClock()), |
- request_throttler_( |
+ user_classifier_(user_classifier), |
+ request_throttler_rare_ntp_user_( |
+ pref_service, |
+ RequestThrottler::RequestType:: |
+ CONTENT_SUGGESTION_FETCHER_RARE_NTP_USER), |
+ request_throttler_active_ntp_user_( |
pref_service, |
- RequestThrottler::RequestType::CONTENT_SUGGESTION_FETCHER), |
+ RequestThrottler::RequestType:: |
+ CONTENT_SUGGESTION_FETCHER_ACTIVE_NTP_USER), |
+ request_throttler_active_suggestions_consumer_( |
+ pref_service, |
+ RequestThrottler::RequestType:: |
+ CONTENT_SUGGESTION_FETCHER_ACTIVE_SUGGESTIONS_CONSUMER), |
oauth_token_retried_(false), |
weak_ptr_factory_(this) { |
// Parse the variation parameters and set the defaults if missing. |
@@ -285,7 +324,7 @@ void NTPSnippetsFetcher::FetchSnippetsFromHosts( |
const std::set<std::string>& excluded_ids, |
int count, |
bool interactive_request) { |
- if (!request_throttler_.DemandQuotaForRequest(interactive_request)) { |
+ if (!DemandQuotaForRequest(interactive_request)) { |
FetchFinished(OptionalFetchedCategories(), |
interactive_request |
? FetchResult::INTERACTIVE_QUOTA_ERROR |
@@ -329,7 +368,8 @@ NTPSnippetsFetcher::RequestParams::RequestParams() |
user_locale(), |
host_restricts(), |
count_to_fetch(), |
- interactive_request() {} |
+ interactive_request(), |
+ user_class() {} |
NTPSnippetsFetcher::RequestParams::~RequestParams() = default; |
@@ -405,6 +445,9 @@ std::string NTPSnippetsFetcher::RequestParams::BuildRequest() { |
} |
request->Set("excludedSuggestionIds", std::move(excluded)); |
+ if (!user_class.empty()) |
+ request->SetString("userActivenessClass", user_class); |
+ |
if (ui_language.frequency == 0 && other_top_language.frequency == 0) |
break; |
@@ -413,7 +456,7 @@ std::string NTPSnippetsFetcher::RequestParams::BuildRequest() { |
AppendLanguageInfoToList(language_list.get(), ui_language); |
if (other_top_language.frequency > 0) |
AppendLanguageInfoToList(language_list.get(), other_top_language); |
- request->Set("top_languages", std::move(language_list)); |
+ request->Set("topLanguages", std::move(language_list)); |
// TODO(sfiera): support authentication and personalization |
// TODO(sfiera): support count_to_fetch |
@@ -475,6 +518,10 @@ void NTPSnippetsFetcher::SetUpCommonFetchingParameters( |
params->excluded_ids = excluded_ids_; |
params->count_to_fetch = count_to_fetch_; |
params->interactive_request = interactive_request_; |
+ |
+ if (IsSendingUserClassEnabled()) |
+ params->user_class = GetUserClassString(user_classifier_->GetUserClass()); |
+ |
// TODO(jkrcal): add the initializers into the struct and remove it from here |
// and from the unit-tests (building the request). |
params->ui_language.frequency = 0; |
@@ -721,4 +768,20 @@ void NTPSnippetsFetcher::FetchFinished( |
snippets_available_callback_.Run(std::move(fetched_categories)); |
} |
+bool NTPSnippetsFetcher::DemandQuotaForRequest(bool interactive_request) { |
+ switch (user_classifier_->GetUserClass()) { |
+ case UserClassifier::UserClass::RARE_NTP_USER: |
+ return request_throttler_rare_ntp_user_.DemandQuotaForRequest( |
+ interactive_request); |
+ case UserClassifier::UserClass::ACTIVE_NTP_USER: |
+ return request_throttler_active_ntp_user_.DemandQuotaForRequest( |
+ interactive_request); |
+ case UserClassifier::UserClass::ACTIVE_SUGGESTIONS_CONSUMER: |
+ return request_throttler_active_suggestions_consumer_ |
+ .DemandQuotaForRequest(interactive_request); |
+ } |
+ NOTREACHED(); |
+ return false; |
+} |
+ |
} // namespace ntp_snippets |