diff options
Diffstat (limited to 'chromium/components/browsing_data')
17 files changed, 346 insertions, 192 deletions
diff --git a/chromium/components/browsing_data/content/appcache_helper.cc b/chromium/components/browsing_data/content/appcache_helper.cc index 2843d6610b7..3a687538115 100644 --- a/chromium/components/browsing_data/content/appcache_helper.cc +++ b/chromium/components/browsing_data/content/appcache_helper.cc @@ -10,7 +10,6 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/location.h" -#include "base/task/post_task.h" #include "base/time/time.h" #include "components/browsing_data/content/browsing_data_helper.h" #include "content/public/browser/browser_context.h" @@ -120,8 +119,8 @@ void CannedAppCacheHelper::StartFetching(FetchCallback callback) { for (const auto& origin : pending_origins_) result.emplace_back(origin, 0, base::Time()); - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(std::move(callback), result)); + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), result)); } void CannedAppCacheHelper::DeleteAppCaches(const url::Origin& origin) { diff --git a/chromium/components/browsing_data/content/browsing_data_helper_browsertest.h b/chromium/components/browsing_data/content/browsing_data_helper_browsertest.h index d390cf450a2..1f5e7bb9886 100644 --- a/chromium/components/browsing_data/content/browsing_data_helper_browsertest.h +++ b/chromium/components/browsing_data/content/browsing_data_helper_browsertest.h @@ -9,7 +9,7 @@ #include <list> -#include "base/logging.h" +#include "base/check.h" #include "base/macros.h" #include "base/run_loop.h" diff --git a/chromium/components/browsing_data/content/cache_storage_helper.cc b/chromium/components/browsing_data/content/cache_storage_helper.cc index 1827b765037..f4d6a547764 100644 --- a/chromium/components/browsing_data/content/cache_storage_helper.cc +++ b/chromium/components/browsing_data/content/cache_storage_helper.cc @@ -9,7 +9,6 @@ #include "base/bind.h" #include "base/location.h" -#include "base/task/post_task.h" #include "components/browsing_data/content/browsing_data_helper.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" @@ -99,8 +98,8 @@ void CannedCacheStorageHelper::StartFetching(FetchCallback callback) { for (const auto& origin : pending_origins_) result.emplace_back(origin, 0, base::Time()); - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(std::move(callback), result)); + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), result)); } void CannedCacheStorageHelper::DeleteCacheStorage(const url::Origin& origin) { diff --git a/chromium/components/browsing_data/content/cookie_helper.cc b/chromium/components/browsing_data/content/cookie_helper.cc index c65b9936f5d..6b5cbdd1568 100644 --- a/chromium/components/browsing_data/content/cookie_helper.cc +++ b/chromium/components/browsing_data/content/cookie_helper.cc @@ -94,12 +94,7 @@ size_t CannedCookieHelper::GetCookieCount() const { void CannedCookieHelper::StartFetching(FetchCallback callback) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - net::CookieList cookie_list; - for (const auto& pair : origin_cookie_set_map_) { - cookie_list.insert(cookie_list.begin(), pair.second->begin(), - pair.second->end()); - } - std::move(callback).Run(cookie_list); + std::move(callback).Run(GetCookieList()); } void CannedCookieHelper::DeleteCookie(const net::CanonicalCookie& cookie) { @@ -108,6 +103,15 @@ void CannedCookieHelper::DeleteCookie(const net::CanonicalCookie& cookie) { CookieHelper::DeleteCookie(cookie); } +net::CookieList CannedCookieHelper::GetCookieList() { + net::CookieList cookie_list; + for (const auto& pair : origin_cookie_set_map_) { + cookie_list.insert(cookie_list.begin(), pair.second->begin(), + pair.second->end()); + } + return cookie_list; +} + bool CannedCookieHelper::DeleteMatchingCookie( const net::CanonicalCookie& add_cookie, canonical_cookie::CookieHashSet* cookie_set) { diff --git a/chromium/components/browsing_data/content/cookie_helper.h b/chromium/components/browsing_data/content/cookie_helper.h index 1abd0b4616c..99bd6da1335 100644 --- a/chromium/components/browsing_data/content/cookie_helper.h +++ b/chromium/components/browsing_data/content/cookie_helper.h @@ -99,6 +99,9 @@ class CannedCookieHelper : public CookieHelper { // Returns the number of stored cookies. size_t GetCookieCount() const; + // Directly returns stored cookies. + net::CookieList GetCookieList(); + // Returns the map that contains the cookie lists for all frame urls. const OriginCookieSetMap& origin_cookie_set_map() { return origin_cookie_set_map_; diff --git a/chromium/components/browsing_data/content/database_helper.cc b/chromium/components/browsing_data/content/database_helper.cc index 7cf61910146..f8d55b638d5 100644 --- a/chromium/components/browsing_data/content/database_helper.cc +++ b/chromium/components/browsing_data/content/database_helper.cc @@ -113,8 +113,8 @@ void CannedDatabaseHelper::StartFetching(FetchCallback callback) { result.emplace_back(origin, 0, base::Time()); } - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(std::move(callback), result)); + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), result)); } void CannedDatabaseHelper::DeleteDatabase(const url::Origin& origin) { diff --git a/chromium/components/browsing_data/content/file_system_helper.cc b/chromium/components/browsing_data/content/file_system_helper.cc index dfe4beabaad..f7b7017bdd2 100644 --- a/chromium/components/browsing_data/content/file_system_helper.cc +++ b/chromium/components/browsing_data/content/file_system_helper.cc @@ -11,7 +11,6 @@ #include "base/location.h" #include "base/sequenced_task_runner.h" #include "base/stl_util.h" -#include "base/task/post_task.h" #include "components/browsing_data/content/browsing_data_helper.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" @@ -87,8 +86,8 @@ void FileSystemHelper::FetchFileSystemInfoInFileThread(FetchCallback callback) { for (const auto& iter : file_system_info_map) result.push_back(iter.second); - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(std::move(callback), result)); + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), result)); } void FileSystemHelper::DeleteFileSystemOriginInFileThread( @@ -147,8 +146,8 @@ void CannedFileSystemHelper::StartFetching(FetchCallback callback) { for (const auto& origin : pending_origins_) result.emplace_back(origin); - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(std::move(callback), result)); + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), result)); } void CannedFileSystemHelper::DeleteFileSystemOrigin(const url::Origin& origin) { diff --git a/chromium/components/browsing_data/content/indexed_db_helper.cc b/chromium/components/browsing_data/content/indexed_db_helper.cc index 787ec701958..c7dcee56aad 100644 --- a/chromium/components/browsing_data/content/indexed_db_helper.cc +++ b/chromium/components/browsing_data/content/indexed_db_helper.cc @@ -11,7 +11,6 @@ #include "base/bind.h" #include "base/location.h" #include "base/memory/scoped_refptr.h" -#include "base/task/post_task.h" #include "base/time/time.h" #include "components/browsing_data/content/browsing_data_helper.h" #include "components/services/storage/public/mojom/indexed_db_control.mojom.h" @@ -99,8 +98,8 @@ void CannedIndexedDBHelper::StartFetching(FetchCallback callback) { for (const auto& origin : pending_origins_) result.emplace_back(origin, 0, base::Time()); - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(std::move(callback), result)); + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), result)); } void CannedIndexedDBHelper::DeleteIndexedDB( diff --git a/chromium/components/browsing_data/content/local_storage_helper.cc b/chromium/components/browsing_data/content/local_storage_helper.cc index 5dabe426343..62830c440be 100644 --- a/chromium/components/browsing_data/content/local_storage_helper.cc +++ b/chromium/components/browsing_data/content/local_storage_helper.cc @@ -10,7 +10,6 @@ #include "base/bind.h" #include "base/location.h" #include "base/stl_util.h" -#include "base/task/post_task.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" @@ -44,8 +43,8 @@ void GetUsageInfoCallback(LocalStorageHelper::FetchCallback callback, result.push_back(info); } - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(std::move(callback), result)); + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), result)); } } // namespace @@ -106,8 +105,8 @@ void CannedLocalStorageHelper::StartFetching(FetchCallback callback) { for (const auto& origin : pending_origins_) result.emplace_back(origin, 0, base::Time()); - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(std::move(callback), result)); + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), result)); } void CannedLocalStorageHelper::DeleteOrigin(const url::Origin& origin, diff --git a/chromium/components/browsing_data/content/service_worker_helper.cc b/chromium/components/browsing_data/content/service_worker_helper.cc index cb64f988c1d..d6243cc627f 100644 --- a/chromium/components/browsing_data/content/service_worker_helper.cc +++ b/chromium/components/browsing_data/content/service_worker_helper.cc @@ -11,7 +11,6 @@ #include "base/bind.h" #include "base/bind_helpers.h" #include "base/location.h" -#include "base/task/post_task.h" #include "components/browsing_data/content/browsing_data_helper.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" @@ -121,8 +120,8 @@ void CannedServiceWorkerHelper::StartFetching(FetchCallback callback) { for (const auto& origin : pending_origins_) result.emplace_back(origin, 0, base::Time()); - base::PostTask(FROM_HERE, {BrowserThread::UI}, - base::BindOnce(std::move(callback), result)); + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), result)); } void CannedServiceWorkerHelper::DeleteServiceWorkers(const GURL& origin) { diff --git a/chromium/components/browsing_data/content/shared_worker_helper.cc b/chromium/components/browsing_data/content/shared_worker_helper.cc index f8df596ffce..0ae69676549 100644 --- a/chromium/components/browsing_data/content/shared_worker_helper.cc +++ b/chromium/components/browsing_data/content/shared_worker_helper.cc @@ -9,7 +9,6 @@ #include "base/bind.h" #include "base/location.h" -#include "base/task/post_task.h" #include "components/browsing_data/content/browsing_data_helper.h" #include "content/public/browser/browser_task_traits.h" #include "content/public/browser/browser_thread.h" @@ -50,8 +49,8 @@ void SharedWorkerHelper::StartFetching(FetchCallback callback) { // We always return an empty list, as there are no "persistent" shared // workers. std::list<SharedWorkerInfo> result; - base::PostTask(FROM_HERE, {content::BrowserThread::UI}, - base::BindOnce(std::move(callback), result)); + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), result)); } void SharedWorkerHelper::DeleteSharedWorker( const GURL& worker, @@ -104,8 +103,8 @@ void CannedSharedWorkerHelper::StartFetching(FetchCallback callback) { std::list<SharedWorkerInfo> result; for (auto& it : pending_shared_worker_info_) result.push_back(it); - base::PostTask(FROM_HERE, {content::BrowserThread::UI}, - base::BindOnce(std::move(callback), result)); + content::GetUIThreadTaskRunner({})->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), result)); } void CannedSharedWorkerHelper::DeleteSharedWorker( diff --git a/chromium/components/browsing_data/core/browsing_data_utils.cc b/chromium/components/browsing_data/core/browsing_data_utils.cc index df660844a7f..9b3cb6d47de 100644 --- a/chromium/components/browsing_data/core/browsing_data_utils.cc +++ b/chromium/components/browsing_data/core/browsing_data_utils.cc @@ -22,6 +22,33 @@ namespace browsing_data { +// Creates a string like "for a.com, b.com, and 4 more". +base::string16 CreateDomainExamples( + int password_count, + const std::vector<std::string> domain_examples) { + DCHECK_GE(password_count, + base::checked_cast<browsing_data::BrowsingDataCounter::ResultInt>( + domain_examples.size())); + DCHECK_EQ(domain_examples.empty(), password_count == 0); + std::vector<base::string16> replacements; + + replacements.emplace_back(base::UTF8ToUTF16(domain_examples[0])); + if (domain_examples.size() > 1) { + replacements.emplace_back(base::UTF8ToUTF16(domain_examples[1])); + } + if (password_count > 2 && domain_examples.size() > 1) { + replacements.emplace_back(l10n_util::GetPluralStringFUTF16( + IDS_DEL_PASSWORDS_COUNTER_AND_X_MORE, password_count - 2)); + } + base::string16 domains_list = base::ReplaceStringPlaceholders( + l10n_util::GetPluralStringFUTF16(IDS_DEL_PASSWORDS_DOMAINS_DISPLAY, + (domain_examples.size() > 1) + ? password_count + : domain_examples.size()), + replacements, nullptr); + return domains_list; +} + base::Time CalculateBeginDeleteTime(TimePeriod time_period) { base::TimeDelta diff; base::Time delete_begin_time = base::Time::Now(); @@ -110,81 +137,91 @@ void RecordTimePeriodChange(TimePeriod period) { base::string16 GetCounterTextFromResult( const BrowsingDataCounter::Result* result) { - base::string16 text; std::string pref_name = result->source()->GetPrefName(); if (!result->Finished()) { // The counter is still counting. - text = l10n_util::GetStringUTF16(IDS_CLEAR_BROWSING_DATA_CALCULATING); + return l10n_util::GetStringUTF16(IDS_CLEAR_BROWSING_DATA_CALCULATING); + } - } else if (pref_name == prefs::kDeletePasswords) { + if (pref_name == prefs::kDeletePasswords) { const PasswordsCounter::PasswordsResult* password_result = static_cast<const PasswordsCounter::PasswordsResult*>(result); - BrowsingDataCounter::ResultInt password_count = password_result->Value(); - const std::vector<std::string>& domain_examples = - password_result->domain_examples(); - - DCHECK_GE(password_count, - base::checked_cast<browsing_data::BrowsingDataCounter::ResultInt>( - domain_examples.size())); - DCHECK_EQ(domain_examples.empty(), password_count == 0); + std::vector<base::string16> parts; + BrowsingDataCounter::ResultInt profile_passwords = password_result->Value(); - std::vector<base::string16> replacements; - if (domain_examples.size()) { - replacements.emplace_back(base::UTF8ToUTF16(domain_examples[0])); - if (domain_examples.size() > 1) { - replacements.emplace_back(base::UTF8ToUTF16(domain_examples[1])); - } - if (password_count > 2 && domain_examples.size() > 1) { - replacements.emplace_back(l10n_util::GetPluralStringFUTF16( - IDS_DEL_PASSWORDS_COUNTER_AND_X_MORE, password_count - 2)); - } - const base::string16& domains_list = base::ReplaceStringPlaceholders( - l10n_util::GetPluralStringFUTF16(IDS_DEL_PASSWORDS_DOMAINS_DISPLAY, - (domain_examples.size() > 1) - ? password_count - : domain_examples.size()), - replacements, nullptr); - text = base::ReplaceStringPlaceholders( + if (profile_passwords) { + parts.emplace_back(base::ReplaceStringPlaceholders( l10n_util::GetPluralStringFUTF16( password_result->is_sync_enabled() ? IDS_DEL_PASSWORDS_COUNTER_SYNCED : IDS_DEL_PASSWORDS_COUNTER, - password_count), - {domains_list}, nullptr); - } else { - text = l10n_util::GetStringUTF16( - IDS_DEL_PASSWORDS_AND_SIGNIN_DATA_COUNTER_NONE); + profile_passwords), + {CreateDomainExamples(profile_passwords, + password_result->domain_examples())}, + nullptr)); + } + + if (password_result->account_passwords()) { + parts.emplace_back(base::ReplaceStringPlaceholders( + l10n_util::GetPluralStringFUTF16( + IDS_DEL_ACCOUNT_PASSWORDS_COUNTER, + password_result->account_passwords()), + {CreateDomainExamples(password_result->account_passwords(), + password_result->account_domain_examples())}, + nullptr)); + } + + switch (parts.size()) { + case 0: + return l10n_util::GetStringUTF16( + IDS_DEL_PASSWORDS_AND_SIGNIN_DATA_COUNTER_NONE); + case 1: + return parts[0]; + case 2: + return l10n_util::GetStringFUTF16( + IDS_DEL_PASSWORDS_AND_SIGNIN_DATA_COUNTER_COMBINATION, parts[0], + parts[1]); + default: + NOTREACHED(); } + } - } else if (pref_name == prefs::kDeleteDownloadHistory) { + if (pref_name == prefs::kDeleteDownloadHistory) { BrowsingDataCounter::ResultInt count = static_cast<const BrowsingDataCounter::FinishedResult*>(result) ->Value(); - text = l10n_util::GetPluralStringFUTF16(IDS_DEL_DOWNLOADS_COUNTER, count); - } else if (pref_name == prefs::kDeleteSiteSettings) { + return l10n_util::GetPluralStringFUTF16(IDS_DEL_DOWNLOADS_COUNTER, count); + } + + if (pref_name == prefs::kDeleteSiteSettings) { BrowsingDataCounter::ResultInt count = static_cast<const BrowsingDataCounter::FinishedResult*>(result) ->Value(); - text = - l10n_util::GetPluralStringFUTF16(IDS_DEL_SITE_SETTINGS_COUNTER, count); - } else if (pref_name == prefs::kDeleteBrowsingHistoryBasic) { + return l10n_util::GetPluralStringFUTF16(IDS_DEL_SITE_SETTINGS_COUNTER, + count); + } + + if (pref_name == prefs::kDeleteBrowsingHistoryBasic) { // The basic tab doesn't show history counter results. NOTREACHED(); - } else if (pref_name == prefs::kDeleteBrowsingHistory) { + } + + if (pref_name == prefs::kDeleteBrowsingHistory) { // History counter. const HistoryCounter::HistoryResult* history_result = static_cast<const HistoryCounter::HistoryResult*>(result); BrowsingDataCounter::ResultInt local_item_count = history_result->Value(); bool has_synced_visits = history_result->has_synced_visits(); - text = has_synced_visits + return has_synced_visits ? l10n_util::GetPluralStringFUTF16( IDS_DEL_BROWSING_HISTORY_COUNTER_SYNCED, local_item_count) : l10n_util::GetPluralStringFUTF16( IDS_DEL_BROWSING_HISTORY_COUNTER, local_item_count); + } - } else if (pref_name == prefs::kDeleteFormData) { + if (pref_name == prefs::kDeleteFormData) { // Autofill counter. const AutofillCounter::AutofillResult* autofill_result = static_cast<const AutofillCounter::AutofillResult*>(result); @@ -229,22 +266,22 @@ base::string16 GetCounterTextFromResult( // Construct the resulting string from the sections in |displayed_strings|. switch (displayed_strings.size()) { case 0: - text = l10n_util::GetStringUTF16(IDS_DEL_AUTOFILL_COUNTER_EMPTY); + return l10n_util::GetStringUTF16(IDS_DEL_AUTOFILL_COUNTER_EMPTY); break; case 1: - text = synced ? l10n_util::GetStringFUTF16( + return synced ? l10n_util::GetStringFUTF16( IDS_DEL_AUTOFILL_COUNTER_ONE_TYPE_SYNCED, displayed_strings[0]) : displayed_strings[0]; break; case 2: - text = l10n_util::GetStringFUTF16( + return l10n_util::GetStringFUTF16( synced ? IDS_DEL_AUTOFILL_COUNTER_TWO_TYPES_SYNCED : IDS_DEL_AUTOFILL_COUNTER_TWO_TYPES, displayed_strings[0], displayed_strings[1]); break; case 3: - text = l10n_util::GetStringFUTF16( + return l10n_util::GetStringFUTF16( synced ? IDS_DEL_AUTOFILL_COUNTER_THREE_TYPES_SYNCED : IDS_DEL_AUTOFILL_COUNTER_THREE_TYPES, displayed_strings[0], displayed_strings[1], displayed_strings[2]); @@ -254,7 +291,8 @@ base::string16 GetCounterTextFromResult( } } - return text; + NOTREACHED(); + return base::string16(); } const char* GetTimePeriodPreferenceName( diff --git a/chromium/components/browsing_data/core/browsing_data_utils_unittest.cc b/chromium/components/browsing_data/core/browsing_data_utils_unittest.cc index 78f79bf795d..e217276791d 100644 --- a/chromium/components/browsing_data/core/browsing_data_utils_unittest.cc +++ b/chromium/components/browsing_data/core/browsing_data_utils_unittest.cc @@ -33,15 +33,14 @@ class FakeWebDataService : public autofill::AutofillWebDataService { base::ThreadTaskRunnerHandle::Get()) {} protected: - ~FakeWebDataService() override {} + ~FakeWebDataService() override = default; }; } // namespace class BrowsingDataUtilsTest : public testing::Test { public: - BrowsingDataUtilsTest() {} - ~BrowsingDataUtilsTest() override {} + ~BrowsingDataUtilsTest() override = default; void SetUp() override { browsing_data::prefs::RegisterBrowserUserPrefs(prefs_.registry()); @@ -105,36 +104,48 @@ TEST_F(BrowsingDataUtilsTest, PasswordsCounterResult) { scoped_refptr<password_manager::TestPasswordStore> store( new password_manager::TestPasswordStore()); PasswordsCounter counter( - scoped_refptr<password_manager::PasswordStore>(store), nullptr); + scoped_refptr<password_manager::PasswordStore>(store), nullptr, nullptr); - const struct TestCase { + // Use a separate struct for input to make test cases easier to read after + // auto formatting. + struct TestInput { int num_passwords; + int num_account_passwords; int is_synced; std::vector<std::string> domain_examples; + std::vector<std::string> account_domain_examples; + }; + const struct TestCase { + TestInput input; std::string expected_output; } kTestCases[] = { - {0, false, {}, "None"}, - {0, true, {}, "None"}, - {1, false, {"domain1.com"}, "1 password (for domain1.com)"}, - {1, true, {"domain1.com"}, "1 password (for domain1.com, synced)"}, - {5, - false, - {"domain1.com", "domain2.com", "domain3.com", "domain4.com"}, - "5 passwords (for domain1.com, domain2.com, and 3 more)"}, - {5, - true, - {"domain1.com", "domain2.com", "domain3.com", "domain4.com", - "domain5.com"}, - "5 passwords (for domain1.com, domain2.com, and 3 more, synced)"}, + {{0, 0, false, {}, {}}, "None"}, + {{0, 0, true, {}, {}}, "None"}, + {{1, 0, false, {"a.com"}, {}}, "1 password (for a.com)"}, + {{1, 0, true, {"a.com"}, {}}, "1 password (for a.com, synced)"}, + {{5, 0, false, {"a.com", "b.com", "c.com", "d.com"}, {}}, + "5 passwords (for a.com, b.com, and 3 more)"}, + {{2, 0, false, {"a.com", "b.com"}, {}}, "2 passwords (for a.com, b.com)"}, + {{5, 0, true, {"a.com", "b.com", "c.com", "d.com", "e.com"}, {}}, + "5 passwords (for a.com, b.com, and 3 more, synced)"}, + {{0, 1, false, {}, {"a.com"}}, "1 password in your account (for a.com)"}, + {{0, 2, false, {}, {"a.com", "b.com"}}, + "2 passwords in your account (for a.com, b.com)"}, + {{0, 3, false, {}, {"a.com", "b.com", "c.com"}}, + "3 passwords in your account (for a.com, b.com, and 1 more)"}, + {{2, 1, false, {"a.com", "b.com"}, {"c.com"}}, + "2 passwords (for a.com, b.com); 1 password in your account (for " + "c.com)"}, }; for (const TestCase& test_case : kTestCases) { - PasswordsCounter::PasswordsResult result(&counter, test_case.num_passwords, - test_case.is_synced, - test_case.domain_examples); - SCOPED_TRACE(base::StringPrintf("Test params: %d password(s), %d is_synced", - test_case.num_passwords, - test_case.is_synced)); + auto& input = test_case.input; + PasswordsCounter::PasswordsResult result( + &counter, input.num_passwords, input.num_account_passwords, + input.is_synced, input.domain_examples, input.account_domain_examples); + SCOPED_TRACE(base::StringPrintf( + "Test params: %d password(s), %d account password(s), %d is_synced", + input.num_passwords, input.num_account_passwords, input.is_synced)); base::string16 output = browsing_data::GetCounterTextFromResult(&result); EXPECT_EQ(output, base::ASCIIToUTF16(test_case.expected_output)); } diff --git a/chromium/components/browsing_data/core/counters/history_counter.cc b/chromium/components/browsing_data/core/counters/history_counter.cc index a54e8a6a023..2cb0043e9b7 100644 --- a/chromium/components/browsing_data/core/counters/history_counter.cc +++ b/chromium/components/browsing_data/core/counters/history_counter.cc @@ -124,7 +124,7 @@ void HistoryCounter::OnGetLocalHistoryCount( history::HistoryCountResult result) { // Ensure that all callbacks are on the same thread, so that we do not need // a mutex for |MergeResults|. - DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!result.success) { return; @@ -140,7 +140,7 @@ void HistoryCounter::OnGetWebHistoryCount( const base::DictionaryValue* result) { // Ensure that all callbacks are on the same thread, so that we do not need // a mutex for |MergeResults|. - DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // If the timeout for this request already fired, ignore the result. if (!web_history_timeout_.IsRunning()) @@ -161,7 +161,7 @@ void HistoryCounter::OnGetWebHistoryCount( void HistoryCounter::OnWebHistoryTimeout() { // Ensure that all callbacks are on the same thread, so that we do not need // a mutex for |MergeResults|. - DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // If the query timed out, err on the safe side and inform the user that they // may have history items stored in Sync. diff --git a/chromium/components/browsing_data/core/counters/history_counter.h b/chromium/components/browsing_data/core/counters/history_counter.h index 11be1d01cec..b80a8e8aabd 100644 --- a/chromium/components/browsing_data/core/counters/history_counter.h +++ b/chromium/components/browsing_data/core/counters/history_counter.h @@ -7,6 +7,7 @@ #include <memory> +#include "base/sequence_checker.h" #include "base/task/cancelable_task_tracker.h" #include "base/timer/timer.h" #include "components/browsing_data/core/counters/browsing_data_counter.h" @@ -76,7 +77,7 @@ class HistoryCounter : public browsing_data::BrowsingDataCounter { std::unique_ptr<history::WebHistoryService::Request> web_history_request_; base::OneShotTimer web_history_timeout_; - base::ThreadChecker thread_checker_; + SEQUENCE_CHECKER(sequence_checker_); BrowsingDataCounter::ResultInt local_result_; diff --git a/chromium/components/browsing_data/core/counters/passwords_counter.cc b/chromium/components/browsing_data/core/counters/passwords_counter.cc index 61490d42871..f8b47a33c30 100644 --- a/chromium/components/browsing_data/core/counters/passwords_counter.cc +++ b/chromium/components/browsing_data/core/counters/passwords_counter.cc @@ -12,79 +12,104 @@ #include "components/browsing_data/core/pref_names.h" #include "components/password_manager/core/browser/password_manager_util.h" #include "components/password_manager/core/browser/password_store.h" +#include "components/password_manager/core/browser/password_store_change.h" #include "components/sync/driver/sync_service.h" #include "net/base/registry_controlled_domains/registry_controlled_domain.h" #include "url/gurl.h" +namespace browsing_data { namespace { bool IsPasswordSyncEnabled(const syncer::SyncService* sync_service) { if (!sync_service) return false; - return password_manager_util::GetPasswordSyncState(sync_service) != - password_manager::SyncState::NOT_SYNCING; + switch (password_manager_util::GetPasswordSyncState(sync_service)) { + case password_manager::NOT_SYNCING: + case password_manager::ACCOUNT_PASSWORDS_ACTIVE_NORMAL_ENCRYPTION: + return false; + case password_manager::SYNCING_NORMAL_ENCRYPTION: + case password_manager::SYNCING_WITH_CUSTOM_PASSPHRASE: + return true; + } } -} // namespace - -namespace browsing_data { - -// PasswordsCounter::PasswordsResult ---------------------------------- -PasswordsCounter::PasswordsResult::PasswordsResult( - const BrowsingDataCounter* source, - BrowsingDataCounter::ResultInt value, - bool sync_enabled, - std::vector<std::string> domain_examples) - : SyncResult(source, value, sync_enabled), - domain_examples_(std::move(domain_examples)) {} - -PasswordsCounter::PasswordsResult::~PasswordsResult() {} - -PasswordsCounter::PasswordsCounter( +// PasswordStoreFetcher ---------------------------------- + +// Fetches passswords and observes a PasswordStore. +class PasswordStoreFetcher : public password_manager::PasswordStoreConsumer, + public password_manager::PasswordStore::Observer { + public: + PasswordStoreFetcher(scoped_refptr<password_manager::PasswordStore> store, + base::RepeatingClosure logins_changed_closure); + ~PasswordStoreFetcher() override; + void Fetch(base::Time start, + base::Time end, + base::OnceClosure fetch_complete); + + void OnGetPasswordStoreResults( + std::vector<std::unique_ptr<autofill::PasswordForm>> results) override; + + // Called when the contents of the password store change. Triggers new + // counting. + void OnLoginsChanged( + const password_manager::PasswordStoreChangeList& changes) override; + + int num_passwords() { return num_passwords_; } + const std::vector<std::string>& domain_examples() { return domain_examples_; } + + private: + scoped_refptr<password_manager::PasswordStore> store_; + base::RepeatingClosure logins_changed_closure_; + base::OnceClosure fetch_complete_; + base::Time start_; + base::Time end_; + + int num_passwords_ = 0; + std::vector<std::string> domain_examples_; +}; + +PasswordStoreFetcher::PasswordStoreFetcher( scoped_refptr<password_manager::PasswordStore> store, - syncer::SyncService* sync_service) - : store_(store), sync_tracker_(this, sync_service) { - DCHECK(store_); + base::RepeatingClosure logins_changed_closure) + : store_(store), logins_changed_closure_(logins_changed_closure) { + if (store_) + store_->AddObserver(this); } -PasswordsCounter::~PasswordsCounter() { - store_->RemoveObserver(this); -} - -void PasswordsCounter::OnInitialized() { - sync_tracker_.OnInitialized(base::BindRepeating(&IsPasswordSyncEnabled)); - store_->AddObserver(this); +PasswordStoreFetcher::~PasswordStoreFetcher() { + if (store_) + store_->RemoveObserver(this); } -const char* PasswordsCounter::GetPrefName() const { - return browsing_data::prefs::kDeletePasswords; +void PasswordStoreFetcher::OnLoginsChanged( + const password_manager::PasswordStoreChangeList& changes) { + logins_changed_closure_.Run(); } -void PasswordsCounter::Count() { +void PasswordStoreFetcher::Fetch(base::Time start, + base::Time end, + base::OnceClosure fetch_complete) { CancelAllRequests(); - domain_examples_.clear(); - // TODO(msramek): We don't actually need the logins themselves, just their - // count. Consider implementing |PasswordStore::CountAutofillableLogins|. - // This custom request should also allow us to specify the time range, so that - // we can use it to filter the login creation date in the database. - store_->GetAutofillableLogins(this); -} - -std::unique_ptr<PasswordsCounter::PasswordsResult> -PasswordsCounter::MakeResult() { - return std::make_unique<PasswordsCounter::PasswordsResult>( - this, num_passwords_, is_sync_active(), domain_examples_); + start_ = start; + end_ = end; + fetch_complete_ = std::move(fetch_complete); + + if (store_) { + store_->GetAutofillableLogins(this); + } else { + std::move(fetch_complete_).Run(); + } } -void PasswordsCounter::OnGetPasswordStoreResults( +void PasswordStoreFetcher::OnGetPasswordStoreResults( std::vector<std::unique_ptr<autofill::PasswordForm>> results) { - base::Time start = GetPeriodStart(); - base::Time end = GetPeriodEnd(); + domain_examples_.clear(); + results.erase( std::remove_if( results.begin(), results.end(), - [start, end](const std::unique_ptr<autofill::PasswordForm>& form) { - return (form->date_created < start || form->date_created >= end); + [this](const std::unique_ptr<autofill::PasswordForm>& form) { + return (form->date_created < start_ || form->date_created >= end_); }), results.end()); num_passwords_ = results.size(); @@ -97,10 +122,10 @@ void PasswordsCounter::OnGetPasswordStoreResults( std::vector<std::string> sorted_domains; for (const auto& result : results) { std::string domain = net::registry_controlled_domains::GetDomainAndRegistry( - result->origin, + result->url, net::registry_controlled_domains::INCLUDE_PRIVATE_REGISTRIES); if (domain.empty()) - domain = result->origin.host(); + domain = result->url.host(); sorted_domains.emplace_back(domain); } // Only consecutive duplicates are removed below. Since we're only listing two @@ -110,18 +135,94 @@ void PasswordsCounter::OnGetPasswordStoreResults( sorted_domains.erase( std::unique(sorted_domains.begin(), sorted_domains.end()), sorted_domains.end()); - if (sorted_domains.size() > 0) { + if (sorted_domains.size() > 0) domain_examples_.emplace_back(sorted_domains[0]); - } - if (sorted_domains.size() > 1) { + if (sorted_domains.size() > 1) domain_examples_.emplace_back(sorted_domains[1]); - } - ReportResult(MakeResult()); + + std::move(fetch_complete_).Run(); } -void PasswordsCounter::OnLoginsChanged( - const password_manager::PasswordStoreChangeList& changes) { - Restart(); +} // namespace + +// PasswordsCounter::PasswordsResult ---------------------------------- +PasswordsCounter::PasswordsResult::PasswordsResult( + const BrowsingDataCounter* source, + ResultInt profile_passwords, + ResultInt account_passwords, + bool sync_enabled, + std::vector<std::string> domain_examples, + std::vector<std::string> account_domain_examples) + : SyncResult(source, profile_passwords, sync_enabled), + account_passwords_(account_passwords), + domain_examples_(std::move(domain_examples)), + account_domain_examples_(std::move(account_domain_examples)) {} + +PasswordsCounter::PasswordsResult::~PasswordsResult() = default; + +// PasswordsCounter ---------------------------------- + +PasswordsCounter::PasswordsCounter( + scoped_refptr<password_manager::PasswordStore> profile_store, + scoped_refptr<password_manager::PasswordStore> account_store, + syncer::SyncService* sync_service) + : sync_tracker_(this, sync_service) { + profile_store_fetcher_ = std::make_unique<PasswordStoreFetcher>( + profile_store, + base::BindRepeating(&PasswordsCounter::Restart, base::Unretained(this))), + account_store_fetcher_ = std::make_unique<PasswordStoreFetcher>( + account_store, + base::BindRepeating(&PasswordsCounter::Restart, base::Unretained(this))); + DCHECK(profile_store); + // |account_store| may be null. +} + +PasswordsCounter::~PasswordsCounter() = default; + +int PasswordsCounter::num_passwords() { + return profile_store_fetcher_->num_passwords(); +} + +int PasswordsCounter::num_account_passwords() { + return account_store_fetcher_->num_passwords(); +} + +const std::vector<std::string>& PasswordsCounter::domain_examples() { + return profile_store_fetcher_->domain_examples(); +} +const std::vector<std::string>& PasswordsCounter::account_domain_examples() { + return account_store_fetcher_->domain_examples(); +} + +void PasswordsCounter::OnInitialized() { + sync_tracker_.OnInitialized(base::BindRepeating(&IsPasswordSyncEnabled)); +} + +const char* PasswordsCounter::GetPrefName() const { + return browsing_data::prefs::kDeletePasswords; +} + +void PasswordsCounter::Count() { + remaining_tasks_ = 2; + profile_store_fetcher_->Fetch( + GetPeriodStart(), GetPeriodEnd(), + base::BindOnce(&PasswordsCounter::OnFetchDone, base::Unretained(this))); + account_store_fetcher_->Fetch( + GetPeriodStart(), GetPeriodEnd(), + base::BindOnce(&PasswordsCounter::OnFetchDone, base::Unretained(this))); +} + +std::unique_ptr<PasswordsCounter::PasswordsResult> +PasswordsCounter::MakeResult() { + DCHECK(!(is_sync_active() && num_account_passwords() > 0)); + return std::make_unique<PasswordsCounter::PasswordsResult>( + this, num_passwords(), num_account_passwords(), is_sync_active(), + domain_examples(), account_domain_examples()); +} + +void PasswordsCounter::OnFetchDone() { + if (--remaining_tasks_ == 0) + ReportResult(MakeResult()); } } // namespace browsing_data diff --git a/chromium/components/browsing_data/core/counters/passwords_counter.h b/chromium/components/browsing_data/core/counters/passwords_counter.h index 6324a803e62..49a20368204 100644 --- a/chromium/components/browsing_data/core/counters/passwords_counter.h +++ b/chromium/components/browsing_data/core/counters/passwords_counter.h @@ -15,10 +15,10 @@ #include "components/password_manager/core/browser/password_store_consumer.h" namespace browsing_data { - -class PasswordsCounter : public browsing_data::BrowsingDataCounter, - public password_manager::PasswordStoreConsumer, - public password_manager::PasswordStore::Observer { +namespace { +class PasswordStoreFetcher; +} +class PasswordsCounter : public browsing_data::BrowsingDataCounter { public: // A subclass of SyncResult that stores the result value, a boolean // representing whether the datatype is synced, and a vector of example @@ -26,55 +26,58 @@ class PasswordsCounter : public browsing_data::BrowsingDataCounter, class PasswordsResult : public SyncResult { public: PasswordsResult(const BrowsingDataCounter* source, - ResultInt value, + ResultInt profile_passwords, + ResultInt account_passwords, bool sync_enabled, - std::vector<std::string> domain_examples); + std::vector<std::string> domain_examples, + std::vector<std::string> account_domain_examples); ~PasswordsResult() override; + ResultInt account_passwords() const { return account_passwords_; } + const std::vector<std::string>& domain_examples() const { return domain_examples_; } + const std::vector<std::string>& account_domain_examples() const { + return account_domain_examples_; + } + private: + ResultInt account_passwords_ = 0; std::vector<std::string> domain_examples_; + std::vector<std::string> account_domain_examples_; DISALLOW_COPY_AND_ASSIGN(PasswordsResult); }; explicit PasswordsCounter( - scoped_refptr<password_manager::PasswordStore> store, + scoped_refptr<password_manager::PasswordStore> profile_store, + scoped_refptr<password_manager::PasswordStore> account_store, syncer::SyncService* sync_service); ~PasswordsCounter() override; const char* GetPrefName() const override; - protected: virtual std::unique_ptr<PasswordsResult> MakeResult(); bool is_sync_active() { return sync_tracker_.IsSyncActive(); } - int num_passwords() { return num_passwords_; } - const std::vector<std::string>& domain_examples() { return domain_examples_; } + int num_passwords(); + int num_account_passwords(); + const std::vector<std::string>& domain_examples(); + const std::vector<std::string>& account_domain_examples(); private: void OnInitialized() override; - - // Counting is done asynchronously in a request to PasswordStore. - // This callback returns the results, which are subsequently reported. - void OnGetPasswordStoreResults( - std::vector<std::unique_ptr<autofill::PasswordForm>> results) override; - - // Called when the contents of the password store change. Triggers new - // counting. - void OnLoginsChanged( - const password_manager::PasswordStoreChangeList& changes) override; + void OnFetchDone(); void Count() override; base::CancelableTaskTracker cancelable_task_tracker_; - scoped_refptr<password_manager::PasswordStore> store_; + std::unique_ptr<PasswordStoreFetcher> profile_store_fetcher_; + std::unique_ptr<PasswordStoreFetcher> account_store_fetcher_; SyncTracker sync_tracker_; - int num_passwords_; - std::vector<std::string> domain_examples_; + int remaining_tasks_ = 0; }; } // namespace browsing_data |