blob: 3d7e0d11c7dd7014f4bf39466138a3e3f3a79f3c [file] [log] [blame]
// Copyright (c) 2012 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 <memory>
#include <string>
#include "base/callback.h"
#include "base/json/json_string_value_serializer.h"
#include "base/memory/ref_counted.h"
#include "base/strings/pattern.h"
#include "base/strings/string_util.h"
#include "base/test/bind_test_util.h"
#include "base/values.h"
#include "chrome/browser/browsing_data/browsing_data_helper.h"
#include "chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.h"
#include "chrome/browser/extensions/api/browsing_data/browsing_data_api.h"
#include "chrome/browser/extensions/extension_function_test_utils.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/signin/account_reconcilor_factory.h"
#include "chrome/browser/signin/profile_oauth2_token_service_factory.h"
#include "chrome/browser/signin/scoped_account_consistency.h"
#include "chrome/browser/signin/signin_manager_factory.h"
#include "chrome/browser/sync/profile_sync_service_factory.h"
#include "chrome/browser/sync/sync_ui_util.h"
#include "chrome/browser/ui/browser.h"
#include "chrome/common/pref_names.h"
#include "chrome/test/base/in_process_browser_test.h"
#include "components/browser_sync/profile_sync_service.h"
#include "components/browsing_data/core/browsing_data_utils.h"
#include "components/browsing_data/core/pref_names.h"
#include "components/prefs/pref_service.h"
#include "components/signin/core/browser/account_reconcilor.h"
#include "components/signin/core/browser/profile_oauth2_token_service.h"
#include "components/signin/core/browser/signin_buildflags.h"
#include "components/signin/core/browser/signin_manager.h"
#include "content/public/browser/browsing_data_remover.h"
#include "content/public/browser/storage_partition.h"
#include "google_apis/gaia/gaia_urls.h"
#include "google_apis/gaia/google_service_auth_error.h"
#include "mojo/public/cpp/bindings/callback_helpers.h"
#include "net/cookies/canonical_cookie.h"
#include "url/gurl.h"
using extension_function_test_utils::RunFunctionAndReturnError;
using extension_function_test_utils::RunFunctionAndReturnSingleResult;
namespace {
enum OriginTypeMask {
UNPROTECTED_WEB = content::BrowsingDataRemover::ORIGIN_TYPE_UNPROTECTED_WEB,
PROTECTED_WEB = content::BrowsingDataRemover::ORIGIN_TYPE_PROTECTED_WEB,
EXTENSION = ChromeBrowsingDataRemoverDelegate::ORIGIN_TYPE_EXTENSION
};
const char kRemoveEverythingArguments[] =
"[{\"since\": 1000}, {"
"\"appcache\": true, \"cache\": true, \"cookies\": true, "
"\"downloads\": true, \"fileSystems\": true, \"formData\": true, "
"\"history\": true, \"indexedDB\": true, \"localStorage\": true, "
"\"serverBoundCertificates\": true, \"passwords\": true, "
"\"pluginData\": true, \"serviceWorkers\": true, \"cacheStorage\": true, "
"\"webSQL\": true"
"}]";
class ExtensionBrowsingDataTest : public InProcessBrowserTest {
public:
const base::Time& GetBeginTime() {
return remover_->GetLastUsedBeginTime();
}
int GetRemovalMask() {
return remover_->GetLastUsedRemovalMask();
}
int GetOriginTypeMask() {
return remover_->GetLastUsedOriginTypeMask();
}
protected:
void SetUp() override {
InProcessBrowserTest::SetUp();
}
void SetUpOnMainThread() override {
remover_ =
content::BrowserContext::GetBrowsingDataRemover(browser()->profile());
}
int GetAsMask(const base::DictionaryValue* dict, std::string path,
int mask_value) {
bool result;
EXPECT_TRUE(dict->GetBoolean(path, &result)) << "for " << path;
return result ? mask_value : 0;
}
void RunBrowsingDataRemoveFunctionAndCompareRemovalMask(
const std::string& data_types,
int expected_mask) {
scoped_refptr<BrowsingDataRemoveFunction> function =
new BrowsingDataRemoveFunction();
SCOPED_TRACE(data_types);
EXPECT_EQ(NULL, RunFunctionAndReturnSingleResult(
function.get(),
std::string("[{\"since\": 1},") + data_types + "]",
browser()));
EXPECT_EQ(expected_mask, GetRemovalMask());
EXPECT_EQ(UNPROTECTED_WEB, GetOriginTypeMask());
}
void RunBrowsingDataRemoveWithKeyAndCompareRemovalMask(
const std::string& key,
int expected_mask) {
RunBrowsingDataRemoveFunctionAndCompareRemovalMask(
std::string("{\"") + key + "\": true}", expected_mask);
}
void RunBrowsingDataRemoveFunctionAndCompareOriginTypeMask(
const std::string& protectedStr,
int expected_mask) {
scoped_refptr<BrowsingDataRemoveFunction> function =
new BrowsingDataRemoveFunction();
SCOPED_TRACE(protectedStr);
EXPECT_EQ(NULL, RunFunctionAndReturnSingleResult(
function.get(),
"[{\"originTypes\": " + protectedStr + "}, {\"cookies\": true}]",
browser()));
EXPECT_EQ(expected_mask, GetOriginTypeMask());
}
template<class ShortcutFunction>
void RunAndCompareRemovalMask(int expected_mask) {
scoped_refptr<ShortcutFunction> function =
new ShortcutFunction();
SCOPED_TRACE(ShortcutFunction::function_name());
EXPECT_EQ(NULL, RunFunctionAndReturnSingleResult(
function.get(),
std::string("[{\"since\": 1}]"),
browser()));
EXPECT_EQ(expected_mask, GetRemovalMask());
EXPECT_EQ(UNPROTECTED_WEB, GetOriginTypeMask());
}
void SetSinceAndVerify(browsing_data::TimePeriod since_pref) {
PrefService* prefs = browser()->profile()->GetPrefs();
prefs->SetInteger(browsing_data::prefs::kDeleteTimePeriod,
static_cast<int>(since_pref));
scoped_refptr<BrowsingDataSettingsFunction> function =
new BrowsingDataSettingsFunction();
SCOPED_TRACE("settings");
std::unique_ptr<base::Value> result_value(RunFunctionAndReturnSingleResult(
function.get(), std::string("[]"), browser()));
base::DictionaryValue* result;
EXPECT_TRUE(result_value->GetAsDictionary(&result));
base::DictionaryValue* options;
EXPECT_TRUE(result->GetDictionary("options", &options));
double since;
EXPECT_TRUE(options->GetDouble("since", &since));
double expected_since = 0;
if (since_pref != browsing_data::TimePeriod::ALL_TIME) {
base::Time time = CalculateBeginDeleteTime(since_pref);
expected_since = time.ToJsTime();
}
// Even a synchronous function takes nonzero time, but the difference
// between when the function was called and now should be well under a
// second, so we'll make sure the requested start time is within 10 seconds.
// Since the smallest selectable period is an hour, that should be
// sufficient.
EXPECT_LE(expected_since, since + 10.0 * 1000.0);
}
void SetPrefsAndVerifySettings(int data_type_flags,
int expected_origin_type_mask,
int expected_removal_mask) {
PrefService* prefs = browser()->profile()->GetPrefs();
prefs->SetInteger(
browsing_data::prefs::kLastClearBrowsingDataTab,
static_cast<int>(browsing_data::ClearBrowsingDataTab::ADVANCED));
prefs->SetBoolean(
browsing_data::prefs::kDeleteCache,
!!(data_type_flags & content::BrowsingDataRemover::DATA_TYPE_CACHE));
prefs->SetBoolean(
browsing_data::prefs::kDeleteCookies,
!!(data_type_flags & content::BrowsingDataRemover::DATA_TYPE_COOKIES));
prefs->SetBoolean(browsing_data::prefs::kDeleteBrowsingHistory,
!!(data_type_flags &
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_HISTORY));
prefs->SetBoolean(
browsing_data::prefs::kDeleteFormData,
!!(data_type_flags &
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_FORM_DATA));
prefs->SetBoolean(browsing_data::prefs::kDeleteDownloadHistory,
!!(data_type_flags &
content::BrowsingDataRemover::DATA_TYPE_DOWNLOADS));
prefs->SetBoolean(
browsing_data::prefs::kDeleteHostedAppsData,
!!(data_type_flags & ChromeBrowsingDataRemoverDelegate::
DATA_TYPE_HOSTED_APP_DATA_TEST_ONLY));
prefs->SetBoolean(
browsing_data::prefs::kDeletePasswords,
!!(data_type_flags &
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PASSWORDS));
prefs->SetBoolean(
prefs::kClearPluginLSODataEnabled,
!!(data_type_flags &
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PLUGIN_DATA));
VerifyRemovalMask(expected_origin_type_mask, expected_removal_mask);
}
void SetBasicPrefsAndVerifySettings(int data_type_flags,
int expected_origin_type_mask,
int expected_removal_mask) {
PrefService* prefs = browser()->profile()->GetPrefs();
prefs->SetInteger(
browsing_data::prefs::kLastClearBrowsingDataTab,
static_cast<int>(browsing_data::ClearBrowsingDataTab::BASIC));
prefs->SetBoolean(
browsing_data::prefs::kDeleteCacheBasic,
!!(data_type_flags & content::BrowsingDataRemover::DATA_TYPE_CACHE));
prefs->SetBoolean(
browsing_data::prefs::kDeleteCookiesBasic,
!!(data_type_flags & content::BrowsingDataRemover::DATA_TYPE_COOKIES));
prefs->SetBoolean(browsing_data::prefs::kDeleteBrowsingHistoryBasic,
!!(data_type_flags &
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_HISTORY));
prefs->SetBoolean(
prefs::kClearPluginLSODataEnabled,
!!(data_type_flags &
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PLUGIN_DATA));
VerifyRemovalMask(expected_origin_type_mask, expected_removal_mask);
}
void VerifyRemovalMask(int expected_origin_type_mask,
int expected_removal_mask) {
scoped_refptr<BrowsingDataSettingsFunction> function =
new BrowsingDataSettingsFunction();
SCOPED_TRACE("settings");
std::unique_ptr<base::Value> result_value(RunFunctionAndReturnSingleResult(
function.get(), std::string("[]"), browser()));
base::DictionaryValue* result;
EXPECT_TRUE(result_value->GetAsDictionary(&result));
base::DictionaryValue* options;
EXPECT_TRUE(result->GetDictionary("options", &options));
base::DictionaryValue* origin_types;
EXPECT_TRUE(options->GetDictionary("originTypes", &origin_types));
int origin_type_mask = GetAsMask(origin_types, "unprotectedWeb",
UNPROTECTED_WEB) |
GetAsMask(origin_types, "protectedWeb",
PROTECTED_WEB) |
GetAsMask(origin_types, "extension", EXTENSION);
EXPECT_EQ(expected_origin_type_mask, origin_type_mask);
base::DictionaryValue* data_to_remove;
EXPECT_TRUE(result->GetDictionary("dataToRemove", &data_to_remove));
int removal_mask =
GetAsMask(data_to_remove, "appcache",
content::BrowsingDataRemover::DATA_TYPE_APP_CACHE) |
GetAsMask(data_to_remove, "cache",
content::BrowsingDataRemover::DATA_TYPE_CACHE) |
GetAsMask(data_to_remove, "cacheStorage",
content::BrowsingDataRemover::DATA_TYPE_CACHE_STORAGE) |
GetAsMask(data_to_remove, "cookies",
content::BrowsingDataRemover::DATA_TYPE_COOKIES) |
GetAsMask(data_to_remove, "downloads",
content::BrowsingDataRemover::DATA_TYPE_DOWNLOADS) |
GetAsMask(data_to_remove, "fileSystems",
content::BrowsingDataRemover::DATA_TYPE_FILE_SYSTEMS) |
GetAsMask(data_to_remove, "formData",
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_FORM_DATA) |
GetAsMask(data_to_remove, "history",
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_HISTORY) |
GetAsMask(data_to_remove, "indexedDB",
content::BrowsingDataRemover::DATA_TYPE_INDEXED_DB) |
GetAsMask(data_to_remove, "localStorage",
content::BrowsingDataRemover::DATA_TYPE_LOCAL_STORAGE) |
GetAsMask(data_to_remove, "pluginData",
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PLUGIN_DATA) |
GetAsMask(data_to_remove, "passwords",
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PASSWORDS) |
GetAsMask(data_to_remove, "serviceWorkers",
content::BrowsingDataRemover::DATA_TYPE_SERVICE_WORKERS) |
GetAsMask(data_to_remove, "webSQL",
content::BrowsingDataRemover::DATA_TYPE_WEB_SQL) |
GetAsMask(data_to_remove, "serverBoundCertificates",
content::BrowsingDataRemover::DATA_TYPE_CHANNEL_IDS);
EXPECT_EQ(expected_removal_mask, removal_mask);
}
// The kAllowDeletingBrowserHistory pref must be set to false before this
// is called.
void CheckRemovalPermitted(const std::string& data_types, bool permitted) {
scoped_refptr<BrowsingDataRemoveFunction> function =
new BrowsingDataRemoveFunction();
std::string args = "[{\"since\": 1}," + data_types + "]";
if (permitted) {
EXPECT_EQ(NULL, RunFunctionAndReturnSingleResult(
function.get(), args, browser())) << " for " << args;
} else {
EXPECT_TRUE(base::MatchPattern(
RunFunctionAndReturnError(function.get(), args, browser()),
extension_browsing_data_api_constants::kDeleteProhibitedError))
<< " for " << args;
}
}
private:
// Cached pointer to BrowsingDataRemover for access to testing methods.
content::BrowsingDataRemover* remover_;
};
#if BUILDFLAG(ENABLE_DICE_SUPPORT)
// Sets the APISID Gaia cookie, which is monitored by the AccountReconcilor.
bool SetGaiaCookieForProfile(Profile* profile) {
GURL google_url = GaiaUrls::GetInstance()->google_url();
net::CanonicalCookie cookie("APISID", std::string(), "." + google_url.host(),
"/", base::Time(), base::Time(), base::Time(),
false, false, net::CookieSameSite::DEFAULT_MODE,
net::COOKIE_PRIORITY_DEFAULT);
bool success = false;
base::RunLoop loop;
base::OnceClosure loop_quit = loop.QuitClosure();
base::OnceCallback<void(bool)> callback =
base::BindLambdaForTesting([&success, &loop_quit](bool s) {
success = s;
std::move(loop_quit).Run();
});
network::mojom::CookieManager* cookie_manager =
content::BrowserContext::GetDefaultStoragePartition(profile)
->GetCookieManagerForBrowserProcess();
cookie_manager->SetCanonicalCookie(
cookie, true, true,
mojo::WrapCallbackWithDefaultInvokeIfNotRun(std::move(callback), false));
loop.Run();
return success;
}
#endif
} // namespace
IN_PROC_BROWSER_TEST_F(ExtensionBrowsingDataTest, RemovalProhibited) {
PrefService* prefs = browser()->profile()->GetPrefs();
prefs->SetBoolean(prefs::kAllowDeletingBrowserHistory, false);
CheckRemovalPermitted("{\"appcache\": true}", true);
CheckRemovalPermitted("{\"cache\": true}", true);
CheckRemovalPermitted("{\"cacheStorage\": true}", true);
CheckRemovalPermitted("{\"cookies\": true}", true);
CheckRemovalPermitted("{\"downloads\": true}", false);
CheckRemovalPermitted("{\"fileSystems\": true}", true);
CheckRemovalPermitted("{\"formData\": true}", true);
CheckRemovalPermitted("{\"history\": true}", false);
CheckRemovalPermitted("{\"indexedDB\": true}", true);
CheckRemovalPermitted("{\"localStorage\": true}", true);
CheckRemovalPermitted("{\"serverBoundCertificates\": true}", true);
CheckRemovalPermitted("{\"passwords\": true}", true);
CheckRemovalPermitted("{\"serviceWorkers\": true}", true);
CheckRemovalPermitted("{\"webSQL\": true}", true);
// The entire removal is prohibited if any part is.
CheckRemovalPermitted("{\"cache\": true, \"history\": true}", false);
CheckRemovalPermitted("{\"cookies\": true, \"downloads\": true}", false);
// If a prohibited type is not selected, the removal is OK.
CheckRemovalPermitted("{\"history\": false}", true);
CheckRemovalPermitted("{\"downloads\": false}", true);
CheckRemovalPermitted("{\"cache\": true, \"history\": false}", true);
CheckRemovalPermitted("{\"cookies\": true, \"downloads\": false}", true);
}
IN_PROC_BROWSER_TEST_F(ExtensionBrowsingDataTest, RemoveBrowsingDataAll) {
scoped_refptr<BrowsingDataRemoveFunction> function =
new BrowsingDataRemoveFunction();
EXPECT_EQ(NULL, RunFunctionAndReturnSingleResult(function.get(),
kRemoveEverythingArguments,
browser()));
EXPECT_EQ(base::Time::FromDoubleT(1.0), GetBeginTime());
EXPECT_EQ(
// TODO(benwells): implement clearing of site usage data via the
// browsing data API. https://crbug.com/500801.
// TODO(dmurph): implement clearing of durable storage permission
// via the browsing data API. https://crbug.com/500801.
// TODO(ramyasharma): implement clearing of external protocol data
// via the browsing data API. https://crbug.com/692850.
content::BrowsingDataRemover::DATA_TYPE_COOKIES |
content::BrowsingDataRemover::DATA_TYPE_CHANNEL_IDS |
(content::BrowsingDataRemover::DATA_TYPE_DOM_STORAGE &
~content::BrowsingDataRemover::DATA_TYPE_BACKGROUND_FETCH &
~content::BrowsingDataRemover::DATA_TYPE_EMBEDDER_DOM_STORAGE) |
content::BrowsingDataRemover::DATA_TYPE_CACHE |
content::BrowsingDataRemover::DATA_TYPE_DOWNLOADS |
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_FORM_DATA |
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_HISTORY |
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PASSWORDS,
GetRemovalMask());
}
#if BUILDFLAG(ENABLE_DICE_SUPPORT)
// Test that Sync is not paused when browsing data is cleared.
IN_PROC_BROWSER_TEST_F(ExtensionBrowsingDataTest, Syncing) {
Profile* profile = browser()->profile();
// Set a Gaia cookie.
ASSERT_TRUE(SetGaiaCookieForProfile(profile));
// Set a Sync account and a secondary account.
const char kPrimaryAccountId[] = "primary_account_id";
const char kSecondaryAccountId[] = "secondary_account_id";
ProfileOAuth2TokenService* token_service =
ProfileOAuth2TokenServiceFactory::GetForProfile(profile);
token_service->UpdateCredentials(kPrimaryAccountId, "token");
ASSERT_TRUE(token_service->RefreshTokenIsAvailable(kPrimaryAccountId));
token_service->UpdateCredentials(kSecondaryAccountId, "token");
ASSERT_TRUE(token_service->RefreshTokenIsAvailable(kSecondaryAccountId));
SigninManager* signin_manager = SigninManagerFactory::GetForProfile(profile);
signin_manager->SetAuthenticatedAccountInfo(kPrimaryAccountId,
"user@gmail.com");
// Sync is running.
browser_sync::ProfileSyncService* sync_service =
ProfileSyncServiceFactory::GetForProfile(profile);
sync_service->GetUserSettings()->SetFirstSetupComplete();
sync_ui_util::MessageType sync_status =
sync_ui_util::GetStatus(profile, sync_service, *signin_manager);
ASSERT_EQ(sync_ui_util::SYNCED, sync_status);
// Clear browsing data.
scoped_refptr<BrowsingDataRemoveFunction> function =
new BrowsingDataRemoveFunction();
EXPECT_EQ(NULL, RunFunctionAndReturnSingleResult(
function.get(), kRemoveEverythingArguments, browser()));
// Check that the Sync token was not revoked.
EXPECT_TRUE(token_service->RefreshTokenIsAvailable(kPrimaryAccountId));
EXPECT_FALSE(token_service->RefreshTokenHasError(kPrimaryAccountId));
// Check that the secondary token was revoked.
EXPECT_FALSE(token_service->RefreshTokenIsAvailable(kSecondaryAccountId));
}
// Test that Sync is paused when browsing data is cleared if Sync was in
// authentication error.
IN_PROC_BROWSER_TEST_F(ExtensionBrowsingDataTest, SyncError) {
Profile* profile = browser()->profile();
// Set a Gaia cookie.
ASSERT_TRUE(SetGaiaCookieForProfile(profile));
// Set a Sync account with authentication error.
const char kAccountId[] = "account_id";
ProfileOAuth2TokenService* token_service =
ProfileOAuth2TokenServiceFactory::GetForProfile(profile);
token_service->UpdateCredentials(kAccountId, "token");
ASSERT_TRUE(token_service->RefreshTokenIsAvailable(kAccountId));
SigninManager* signin_manager = SigninManagerFactory::GetForProfile(profile);
signin_manager->SetAuthenticatedAccountInfo(kAccountId, "user@gmail.com");
token_service->GetDelegate()->UpdateAuthError(
kAccountId, GoogleServiceAuthError::FromInvalidGaiaCredentialsReason(
GoogleServiceAuthError::InvalidGaiaCredentialsReason::
CREDENTIALS_REJECTED_BY_SERVER));
// Sync is not running.
sync_ui_util::MessageType sync_status = sync_ui_util::GetStatus(
profile, ProfileSyncServiceFactory::GetForProfile(profile),
*signin_manager);
ASSERT_NE(sync_ui_util::SYNCED, sync_status);
// Clear browsing data.
scoped_refptr<BrowsingDataRemoveFunction> function =
new BrowsingDataRemoveFunction();
EXPECT_EQ(NULL, RunFunctionAndReturnSingleResult(
function.get(), kRemoveEverythingArguments, browser()));
// Check that the account was not removed and Sync was paused.
EXPECT_TRUE(token_service->RefreshTokenIsAvailable(kAccountId));
EXPECT_EQ(GoogleServiceAuthError::InvalidGaiaCredentialsReason::
CREDENTIALS_REJECTED_BY_CLIENT,
token_service->GetAuthError(kAccountId)
.GetInvalidGaiaCredentialsReason());
}
// Test that the tokens are revoked when browsing data is cleared when there is
// no primary account.
IN_PROC_BROWSER_TEST_F(ExtensionBrowsingDataTest, NotSyncing) {
Profile* profile = browser()->profile();
// Set a Gaia cookie.
ASSERT_TRUE(SetGaiaCookieForProfile(profile));
// Set a non-Sync account.
const char kAccountId[] = "account_id";
ProfileOAuth2TokenService* token_service =
ProfileOAuth2TokenServiceFactory::GetForProfile(profile);
token_service->UpdateCredentials(kAccountId, "token");
ASSERT_TRUE(token_service->RefreshTokenIsAvailable(kAccountId));
// Clear browsing data.
scoped_refptr<BrowsingDataRemoveFunction> function =
new BrowsingDataRemoveFunction();
EXPECT_EQ(NULL, RunFunctionAndReturnSingleResult(
function.get(), kRemoveEverythingArguments, browser()));
// Check that the account was removed.
EXPECT_FALSE(token_service->RefreshTokenIsAvailable(kAccountId));
}
#endif
IN_PROC_BROWSER_TEST_F(ExtensionBrowsingDataTest, BrowsingDataOriginTypeMask) {
RunBrowsingDataRemoveFunctionAndCompareOriginTypeMask("{}", 0);
RunBrowsingDataRemoveFunctionAndCompareOriginTypeMask(
"{\"unprotectedWeb\": true}", UNPROTECTED_WEB);
RunBrowsingDataRemoveFunctionAndCompareOriginTypeMask(
"{\"protectedWeb\": true}", PROTECTED_WEB);
RunBrowsingDataRemoveFunctionAndCompareOriginTypeMask(
"{\"extension\": true}", EXTENSION);
RunBrowsingDataRemoveFunctionAndCompareOriginTypeMask(
"{\"unprotectedWeb\": true, \"protectedWeb\": true}",
UNPROTECTED_WEB | PROTECTED_WEB);
RunBrowsingDataRemoveFunctionAndCompareOriginTypeMask(
"{\"unprotectedWeb\": true, \"extension\": true}",
UNPROTECTED_WEB | EXTENSION);
RunBrowsingDataRemoveFunctionAndCompareOriginTypeMask(
"{\"protectedWeb\": true, \"extension\": true}",
PROTECTED_WEB | EXTENSION);
RunBrowsingDataRemoveFunctionAndCompareOriginTypeMask(
("{\"unprotectedWeb\": true, \"protectedWeb\": true, "
"\"extension\": true}"),
UNPROTECTED_WEB | PROTECTED_WEB | EXTENSION);
}
IN_PROC_BROWSER_TEST_F(ExtensionBrowsingDataTest,
BrowsingDataRemovalMask) {
RunBrowsingDataRemoveWithKeyAndCompareRemovalMask(
"appcache", content::BrowsingDataRemover::DATA_TYPE_APP_CACHE);
RunBrowsingDataRemoveWithKeyAndCompareRemovalMask(
"cache", content::BrowsingDataRemover::DATA_TYPE_CACHE);
RunBrowsingDataRemoveWithKeyAndCompareRemovalMask(
"cacheStorage", content::BrowsingDataRemover::DATA_TYPE_CACHE_STORAGE);
RunBrowsingDataRemoveWithKeyAndCompareRemovalMask(
"cookies", content::BrowsingDataRemover::DATA_TYPE_COOKIES);
RunBrowsingDataRemoveWithKeyAndCompareRemovalMask(
"downloads", content::BrowsingDataRemover::DATA_TYPE_DOWNLOADS);
RunBrowsingDataRemoveWithKeyAndCompareRemovalMask(
"fileSystems", content::BrowsingDataRemover::DATA_TYPE_FILE_SYSTEMS);
RunBrowsingDataRemoveWithKeyAndCompareRemovalMask(
"formData", ChromeBrowsingDataRemoverDelegate::DATA_TYPE_FORM_DATA);
RunBrowsingDataRemoveWithKeyAndCompareRemovalMask(
"history", ChromeBrowsingDataRemoverDelegate::DATA_TYPE_HISTORY);
RunBrowsingDataRemoveWithKeyAndCompareRemovalMask(
"indexedDB", content::BrowsingDataRemover::DATA_TYPE_INDEXED_DB);
RunBrowsingDataRemoveWithKeyAndCompareRemovalMask(
"localStorage", content::BrowsingDataRemover::DATA_TYPE_LOCAL_STORAGE);
RunBrowsingDataRemoveWithKeyAndCompareRemovalMask(
"serverBoundCertificates",
content::BrowsingDataRemover::DATA_TYPE_CHANNEL_IDS);
RunBrowsingDataRemoveWithKeyAndCompareRemovalMask(
"passwords", ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PASSWORDS);
// We can't remove plugin data inside a test profile.
RunBrowsingDataRemoveWithKeyAndCompareRemovalMask(
"serviceWorkers",
content::BrowsingDataRemover::DATA_TYPE_SERVICE_WORKERS);
RunBrowsingDataRemoveWithKeyAndCompareRemovalMask(
"webSQL", content::BrowsingDataRemover::DATA_TYPE_WEB_SQL);
}
// Test an arbitrary combination of data types.
IN_PROC_BROWSER_TEST_F(ExtensionBrowsingDataTest,
BrowsingDataRemovalMaskCombination) {
RunBrowsingDataRemoveFunctionAndCompareRemovalMask(
"{\"appcache\": true, \"cookies\": true, \"history\": true}",
content::BrowsingDataRemover::DATA_TYPE_APP_CACHE |
content::BrowsingDataRemover::DATA_TYPE_COOKIES |
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_HISTORY);
}
// Make sure the remove() function accepts the format produced by settings().
IN_PROC_BROWSER_TEST_F(ExtensionBrowsingDataTest,
BrowsingDataRemovalInputFromSettings) {
PrefService* prefs = browser()->profile()->GetPrefs();
prefs->SetInteger(
browsing_data::prefs::kLastClearBrowsingDataTab,
static_cast<int>(browsing_data::ClearBrowsingDataTab::ADVANCED));
prefs->SetBoolean(browsing_data::prefs::kDeleteCache, true);
prefs->SetBoolean(browsing_data::prefs::kDeleteBrowsingHistory, true);
prefs->SetBoolean(browsing_data::prefs::kDeleteDownloadHistory, true);
prefs->SetBoolean(browsing_data::prefs::kDeleteCookies, false);
prefs->SetBoolean(browsing_data::prefs::kDeleteFormData, false);
prefs->SetBoolean(browsing_data::prefs::kDeleteHostedAppsData, false);
prefs->SetBoolean(browsing_data::prefs::kDeletePasswords, false);
prefs->SetBoolean(prefs::kClearPluginLSODataEnabled, false);
int expected_mask = content::BrowsingDataRemover::DATA_TYPE_CACHE |
content::BrowsingDataRemover::DATA_TYPE_DOWNLOADS |
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_HISTORY;
std::string json;
// Scoping for the traces.
{
scoped_refptr<BrowsingDataSettingsFunction> settings_function =
new BrowsingDataSettingsFunction();
SCOPED_TRACE("settings_json");
std::unique_ptr<base::Value> result_value(RunFunctionAndReturnSingleResult(
settings_function.get(), std::string("[]"), browser()));
base::DictionaryValue* result;
EXPECT_TRUE(result_value->GetAsDictionary(&result));
base::DictionaryValue* data_to_remove;
EXPECT_TRUE(result->GetDictionary("dataToRemove", &data_to_remove));
JSONStringValueSerializer serializer(&json);
EXPECT_TRUE(serializer.Serialize(*data_to_remove));
}
{
scoped_refptr<BrowsingDataRemoveFunction> remove_function =
new BrowsingDataRemoveFunction();
SCOPED_TRACE("remove_json");
EXPECT_EQ(NULL, RunFunctionAndReturnSingleResult(
remove_function.get(),
std::string("[{\"since\": 1},") + json + "]",
browser()));
EXPECT_EQ(expected_mask, GetRemovalMask());
EXPECT_EQ(UNPROTECTED_WEB, GetOriginTypeMask());
}
}
IN_PROC_BROWSER_TEST_F(ExtensionBrowsingDataTest, ShortcutFunctionRemovalMask) {
RunAndCompareRemovalMask<BrowsingDataRemoveAppcacheFunction>(
content::BrowsingDataRemover::DATA_TYPE_APP_CACHE);
RunAndCompareRemovalMask<BrowsingDataRemoveCacheFunction>(
content::BrowsingDataRemover::DATA_TYPE_CACHE);
RunAndCompareRemovalMask<BrowsingDataRemoveCacheStorageFunction>(
content::BrowsingDataRemover::DATA_TYPE_CACHE_STORAGE);
RunAndCompareRemovalMask<BrowsingDataRemoveCookiesFunction>(
content::BrowsingDataRemover::DATA_TYPE_COOKIES |
content::BrowsingDataRemover::DATA_TYPE_CHANNEL_IDS);
RunAndCompareRemovalMask<BrowsingDataRemoveDownloadsFunction>(
content::BrowsingDataRemover::DATA_TYPE_DOWNLOADS);
RunAndCompareRemovalMask<BrowsingDataRemoveFileSystemsFunction>(
content::BrowsingDataRemover::DATA_TYPE_FILE_SYSTEMS);
RunAndCompareRemovalMask<BrowsingDataRemoveFormDataFunction>(
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_FORM_DATA);
RunAndCompareRemovalMask<BrowsingDataRemoveHistoryFunction>(
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_HISTORY);
RunAndCompareRemovalMask<BrowsingDataRemoveIndexedDBFunction>(
content::BrowsingDataRemover::DATA_TYPE_INDEXED_DB);
RunAndCompareRemovalMask<BrowsingDataRemoveLocalStorageFunction>(
content::BrowsingDataRemover::DATA_TYPE_LOCAL_STORAGE);
// We can't remove plugin data inside a test profile.
RunAndCompareRemovalMask<BrowsingDataRemovePasswordsFunction>(
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PASSWORDS);
RunAndCompareRemovalMask<BrowsingDataRemoveServiceWorkersFunction>(
content::BrowsingDataRemover::DATA_TYPE_SERVICE_WORKERS);
RunAndCompareRemovalMask<BrowsingDataRemoveWebSQLFunction>(
content::BrowsingDataRemover::DATA_TYPE_WEB_SQL);
}
// Test the processing of the 'delete since' preference.
IN_PROC_BROWSER_TEST_F(ExtensionBrowsingDataTest, SettingsFunctionSince) {
SetSinceAndVerify(browsing_data::TimePeriod::ALL_TIME);
SetSinceAndVerify(browsing_data::TimePeriod::LAST_HOUR);
SetSinceAndVerify(browsing_data::TimePeriod::LAST_DAY);
SetSinceAndVerify(browsing_data::TimePeriod::LAST_WEEK);
SetSinceAndVerify(browsing_data::TimePeriod::FOUR_WEEKS);
}
IN_PROC_BROWSER_TEST_F(ExtensionBrowsingDataTest, SettingsFunctionEmpty) {
SetPrefsAndVerifySettings(0, 0, 0);
}
// Test straightforward settings, mapped 1:1 to data types.
IN_PROC_BROWSER_TEST_F(ExtensionBrowsingDataTest, SettingsFunctionSimple) {
SetPrefsAndVerifySettings(content::BrowsingDataRemover::DATA_TYPE_CACHE, 0,
content::BrowsingDataRemover::DATA_TYPE_CACHE);
SetPrefsAndVerifySettings(
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_HISTORY, 0,
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_HISTORY);
SetPrefsAndVerifySettings(
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_FORM_DATA, 0,
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_FORM_DATA);
SetPrefsAndVerifySettings(content::BrowsingDataRemover::DATA_TYPE_DOWNLOADS,
0,
content::BrowsingDataRemover::DATA_TYPE_DOWNLOADS);
SetPrefsAndVerifySettings(
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PASSWORDS, 0,
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PASSWORDS);
SetBasicPrefsAndVerifySettings(content::BrowsingDataRemover::DATA_TYPE_CACHE,
0,
content::BrowsingDataRemover::DATA_TYPE_CACHE);
SetBasicPrefsAndVerifySettings(
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_HISTORY, 0,
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_HISTORY);
}
// Test cookie and app data settings.
IN_PROC_BROWSER_TEST_F(ExtensionBrowsingDataTest, SettingsFunctionSiteData) {
int supported_site_data_except_plugins =
(content::BrowsingDataRemover::DATA_TYPE_COOKIES |
content::BrowsingDataRemover::DATA_TYPE_CHANNEL_IDS |
content::BrowsingDataRemover::DATA_TYPE_DOM_STORAGE) &
~content::BrowsingDataRemover::DATA_TYPE_BACKGROUND_FETCH &
~content::BrowsingDataRemover::DATA_TYPE_EMBEDDER_DOM_STORAGE;
int supported_site_data =
supported_site_data_except_plugins |
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PLUGIN_DATA;
SetPrefsAndVerifySettings(content::BrowsingDataRemover::DATA_TYPE_COOKIES,
UNPROTECTED_WEB,
supported_site_data_except_plugins);
SetPrefsAndVerifySettings(
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_HOSTED_APP_DATA_TEST_ONLY,
PROTECTED_WEB, supported_site_data_except_plugins);
SetPrefsAndVerifySettings(content::BrowsingDataRemover::DATA_TYPE_COOKIES |
ChromeBrowsingDataRemoverDelegate::
DATA_TYPE_HOSTED_APP_DATA_TEST_ONLY,
PROTECTED_WEB | UNPROTECTED_WEB,
supported_site_data_except_plugins);
SetPrefsAndVerifySettings(
content::BrowsingDataRemover::DATA_TYPE_COOKIES |
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_PLUGIN_DATA,
UNPROTECTED_WEB, supported_site_data);
SetBasicPrefsAndVerifySettings(
content::BrowsingDataRemover::DATA_TYPE_COOKIES, UNPROTECTED_WEB,
supported_site_data_except_plugins);
}
// Test an arbitrary assortment of settings.
IN_PROC_BROWSER_TEST_F(ExtensionBrowsingDataTest, SettingsFunctionAssorted) {
int supported_site_data =
(content::BrowsingDataRemover::DATA_TYPE_COOKIES |
content::BrowsingDataRemover::DATA_TYPE_CHANNEL_IDS |
content::BrowsingDataRemover::DATA_TYPE_DOM_STORAGE) &
~content::BrowsingDataRemover::DATA_TYPE_BACKGROUND_FETCH &
~content::BrowsingDataRemover::DATA_TYPE_EMBEDDER_DOM_STORAGE;
SetPrefsAndVerifySettings(
content::BrowsingDataRemover::DATA_TYPE_COOKIES |
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_HISTORY |
content::BrowsingDataRemover::DATA_TYPE_DOWNLOADS,
UNPROTECTED_WEB,
supported_site_data |
ChromeBrowsingDataRemoverDelegate::DATA_TYPE_HISTORY |
content::BrowsingDataRemover::DATA_TYPE_DOWNLOADS);
}