blob: 25018a4be04613dbeb5089b18aefb460fcd8483b [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/profiles/profile_statistics_aggregator.h"
#include <stddef.h>
#include "base/functional/bind.h"
#include "base/time/time.h"
#include "chrome/browser/browsing_data/counters/signin_data_counter.h"
#include "chrome/browser/profiles/profile_statistics_common.h"
#include "components/autofill/core/browser/data_manager/autofill_ai/entity_data_manager.h"
#include "components/browsing_data/core/counters/autofill_counter.h"
#include "components/browsing_data/core/counters/bookmark_counter.h"
#include "components/browsing_data/core/counters/history_counter.h"
#include "components/browsing_data/core/pref_names.h"
#include "content/public/browser/browser_thread.h"
using browsing_data::BrowsingDataCounter;
ProfileStatisticsAggregator::ProfileStatisticsAggregator(
scoped_refptr<autofill::AutofillWebDataService> autofill_web_data_service,
autofill::PersonalDataManager* personal_data_manager,
const autofill::EntityDataManager* entity_data_manager,
bookmarks::BookmarkModel* bookmark_model,
history::HistoryService* history_service,
scoped_refptr<password_manager::PasswordStoreInterface>
profile_password_store,
PrefService* pref_service,
std::unique_ptr<device::fido::PlatformCredentialStore>
platform_credential_store,
base::OnceClosure done_callback)
: autofill_web_data_service_(std::move(autofill_web_data_service)),
personal_data_manager_(personal_data_manager),
entity_data_manager_(entity_data_manager),
bookmark_model_(bookmark_model),
history_service_(history_service),
profile_password_store_(profile_password_store),
pref_service_(pref_service),
platform_credential_store_(std::move(platform_credential_store)),
done_callback_(std::move(done_callback)) {}
ProfileStatisticsAggregator::~ProfileStatisticsAggregator() = default;
void ProfileStatisticsAggregator::AddCallbackAndStartAggregator(
profiles::ProfileStatisticsCallback stats_callback) {
if (stats_callback)
stats_callbacks_.push_back(std::move(stats_callback));
StartAggregator();
}
void ProfileStatisticsAggregator::AddCounter(
std::unique_ptr<BrowsingDataCounter> counter) {
counter->InitWithoutPref(
base::Time(),
base::BindRepeating(&ProfileStatisticsAggregator::OnCounterResult,
base::Unretained(this)));
counter->Restart();
counters_.push_back(std::move(counter));
}
void ProfileStatisticsAggregator::StartAggregator() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
profile_category_stats_.clear();
// Cancel tasks.
counters_.clear();
// Initiate bookmark counting.
AddCounter(std::make_unique<browsing_data::BookmarkCounter>(bookmark_model_));
// Initiate history counting.
AddCounter(std::make_unique<browsing_data::HistoryCounter>(
history_service_,
browsing_data::HistoryCounter::GetUpdatedWebHistoryServiceCallback(),
/*sync_service=*/nullptr));
// Only count local passwords.
AddCounter(std::make_unique<browsing_data::SigninDataCounter>(
profile_password_store_,
/*account_store=*/nullptr, pref_service_, /*sync_service=*/nullptr,
std::move(platform_credential_store_)));
// Initiate autofill counting.
AddCounter(std::make_unique<browsing_data::AutofillCounter>(
personal_data_manager_, autofill_web_data_service_, entity_data_manager_,
/*sync_service=*/nullptr));
}
void ProfileStatisticsAggregator::OnCounterResult(
std::unique_ptr<BrowsingDataCounter::Result> result) {
if (!result->Finished())
return;
const char* pref_name = result->source()->GetPrefName();
auto* finished_result =
static_cast<BrowsingDataCounter::FinishedResult*>(result.get());
int count = finished_result->Value();
if (pref_name == browsing_data::BookmarkCounter::kPrefName) {
StatisticsCallback(profiles::kProfileStatisticsBookmarks, count);
} else if (pref_name == browsing_data::prefs::kDeleteBrowsingHistory) {
StatisticsCallback(profiles::kProfileStatisticsBrowsingHistory, count);
} else if (pref_name == browsing_data::prefs::kDeletePasswords) {
const auto* signin_result =
static_cast<const browsing_data::SigninDataCounter::SigninDataResult*>(
result.get());
auto profile_passwords = signin_result->Value();
auto signin_data_count = signin_result->WebAuthnCredentialsValue();
StatisticsCallback(profiles::kProfileStatisticsPasswords,
profile_passwords + signin_data_count);
} else if (pref_name == browsing_data::prefs::kDeleteFormData) {
StatisticsCallback(profiles::kProfileStatisticsAutofill, count);
} else {
NOTREACHED();
}
}
void ProfileStatisticsAggregator::StatisticsCallback(const char* category,
int count) {
profiles::ProfileCategoryStat datum;
datum.category = category;
datum.count = count;
profile_category_stats_.push_back(datum);
for (const auto& stats_callback : stats_callbacks_) {
DCHECK(stats_callback);
stats_callback.Run(profile_category_stats_);
}
if (profile_category_stats_.size() ==
profiles::kProfileStatisticsCategories.size()) {
DCHECK(done_callback_);
std::move(done_callback_).Run();
}
}