Chromium Code Reviews| Index: components/ntp_snippets/request_counter.cc |
| diff --git a/components/ntp_snippets/request_counter.cc b/components/ntp_snippets/request_counter.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..8013fb7ffd4ef67d0cc67dcfce070c608bff8d15 |
| --- /dev/null |
| +++ b/components/ntp_snippets/request_counter.cc |
| @@ -0,0 +1,123 @@ |
| +// Copyright 2016 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "components/ntp_snippets/request_counter.h" |
| + |
| +#include <vector> |
| + |
| +#include "base/metrics/histogram_macros.h" |
| +#include "base/strings/string_number_conversions.h" |
| +#include "base/strings/string_split.h" |
| +#include "base/strings/stringprintf.h" |
| +#include "base/time/time.h" |
| +#include "components/ntp_snippets/ntp_snippets_constants.h" |
| +#include "components/ntp_snippets/pref_names.h" |
| +#include "components/prefs/pref_registry_simple.h" |
| +#include "components/prefs/pref_service.h" |
| +#include "components/variations/variations_associated_data.h" |
| + |
| +namespace { |
| + |
| +const char kQuotaParamPrefix[] = "quota_"; |
| +const char kUMAHistogramTotalFormat[] = "NewTabPage.RequestCounter.%s.Total"; |
| +const char kUMAHistogramPerUserFormat[] = |
| + "NewTabPage.RequestCounter.%s.PerUser"; |
| + |
| +} // namespace |
| + |
| +namespace ntp_snippets { |
| + |
| +RequestCounter::RequestCounter(PrefService* pref_service, |
| + const std::string& id, |
| + int default_quota) |
| + : pref_service_(pref_service), id_(id), counter_(-1) { |
| + DCHECK(!id_.empty()); |
| + |
| + std::string quota = variations::GetVariationParamValue( |
| + ntp_snippets::kStudyName, kQuotaParamPrefix + id_); |
| + if (!base::StringToInt(quota, "a_)) { |
|
Marc Treib
2016/07/19 09:06:17
Maybe warn if the param is non-empty, but fails to
jkrcal
2016/07/20 09:40:40
Done.
Marc Treib
2016/07/20 10:19:05
This should be LOG, not DCHECK - getting invalid i
jkrcal
2016/07/20 12:09:27
Done.
|
| + quota_ = default_quota; |
| + } |
| + |
| + // Create the CamelCase version of |id_|, i.e. "sample_id" -> "SampleId" |
| + std::vector<std::string> words = base::SplitString( |
| + id_, "_", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY); |
| + for (std::string& word : words) { |
| + word[0] = toupper(word[0]); |
| + id_camel_case_ += word; |
| + } |
| +} |
| + |
| +// static |
| +void RequestCounter::RegisterProfilePrefs(PrefRegistrySimple* registry, |
| + const std::string& id) { |
| + registry->RegisterIntegerPref(GetCountPref(id), 0); |
| + registry->RegisterIntegerPref(GetDaysPref(id), 0); |
| +} |
| + |
| +bool RequestCounter::IsQuotaAvailable() { |
| + ResetCounterIfDayChanged(); |
| + |
| + counter_++; |
| + pref_service_->SetInteger(GetCountPref(id_), counter_); |
| + |
| + bool available = (counter_ <= quota_); |
| + UMA_HISTOGRAM_ENUMERATION( |
| + GetTotalHistogramName(), |
|
Marc Treib
2016/07/19 09:06:17
This doesn't work - the UMA_HISTOGRAM macros requi
jkrcal
2016/07/20 09:40:40
Done.
|
| + static_cast<int>(available ? RequestType::QUOTA_GRANTED |
| + : RequestType::QUOTA_EXCEEDED), |
| + static_cast<int>(RequestType::REQUEST_TYPE_MAX)); |
| + |
| + return available; |
| +} |
| + |
| +void RequestCounter::ReportForcedRequest() { |
| + UMA_HISTOGRAM_ENUMERATION(GetTotalHistogramName(), |
| + static_cast<int>(RequestType::FORCED), |
| + static_cast<int>(RequestType::REQUEST_TYPE_MAX)); |
| +} |
| + |
| +void RequestCounter::ResetCounterIfDayChanged() { |
| + // Load the counter from pref, if not done yet. Loading is not done in the |
| + // constructor to simplify code in unittests. |
| + if (counter_ == -1) |
| + counter_ = pref_service_->GetInteger(GetCountPref(id_)); |
|
Marc Treib
2016/07/19 09:06:17
I assume the problem is that the perf service is n
jkrcal
2016/07/20 09:40:39
Done.
|
| + |
| + int now_day = |
| + base::TimeDelta::FromMilliseconds(base::Time::Now().ToJavaTime()) |
|
Marc Treib
2016/07/19 09:06:17
Why not just Now().InDays()?
jkrcal
2016/07/20 09:40:40
Found something that looks much better to me.
|
| + .InDays(); |
| + std::string day_pref_key = GetDaysPref(id_); |
| + |
| + if (!pref_service_->HasPrefPath(day_pref_key)) { |
| + // The counter starts from 0 for the first time in this profile. |
| + pref_service_->SetInteger(day_pref_key, now_day); |
| + } else if (now_day != pref_service_->GetInteger(day_pref_key)) { |
| + // Day has changed - report the no of requests from the previous day. |
| + UMA_HISTOGRAM_COUNTS_100(GetPerUserHistogramName(), counter_); |
| + pref_service_->SetInteger(day_pref_key, now_day); |
| + counter_ = 0; |
| + } |
| +} |
| + |
| +std::string RequestCounter::GetTotalHistogramName() { |
| + return base::StringPrintf(kUMAHistogramTotalFormat, id_camel_case_.c_str()); |
| +} |
| + |
| +std::string RequestCounter::GetPerUserHistogramName() { |
| + return base::StringPrintf(kUMAHistogramPerUserFormat, id_camel_case_.c_str()); |
| +} |
| + |
| +// static |
| +std::string RequestCounter::GetDaysPref(const std::string& id) { |
| + return base::StringPrintf( |
| + ntp_snippets::prefs::kSnippetQuotaDayFormat, id.c_str()); |
| +} |
| + |
| +// static |
| +std::string RequestCounter::GetCountPref(const std::string& id) { |
| + return base::StringPrintf( |
| + ntp_snippets::prefs::kSnippetQuotaCountFormat, id.c_str()); |
| +} |
| + |
| +} // namespace ntp_snippets |