blob: 834c1805aa1c27418486def1c3e66c0948e12c66 [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.
#import "ios/chrome/test/app/browsing_data_test_util.h"
#import <WebKit/WebKit.h>
#import "base/logging.h"
#import "base/task/cancelable_task_tracker.h"
#import "base/test/ios/wait_util.h"
#import "components/browsing_data/core/browsing_data_utils.h"
#import "components/history/core/browser/history_service.h"
#import "components/history/core/browser/history_types.h"
#import "components/keyed_service/core/service_access_type.h"
#import "ios/chrome/app/main_controller.h"
#import "ios/chrome/browser/browsing_data/model/browsing_data_remove_mask.h"
#import "ios/chrome/browser/browsing_data/model/browsing_data_remover.h"
#import "ios/chrome/browser/browsing_data/model/browsing_data_remover_factory.h"
#import "ios/chrome/browser/history/model/history_service_factory.h"
#import "ios/chrome/browser/shared/model/profile/profile_ios.h"
#import "ios/chrome/test/app/chrome_test_util.h"
#import "ios/web/public/browser_state_utils.h"
#import "ios/web/public/security/certificate_policy_cache.h"
#import "ios/web/public/thread/web_task_traits.h"
#import "ios/web/public/thread/web_thread.h"
using base::test::ios::WaitUntilConditionOrTimeout;
namespace {
bool ClearBrowsingData(bool off_the_record, BrowsingDataRemoveMask mask) {
ProfileIOS* profile = off_the_record
? chrome_test_util::GetCurrentIncognitoProfile()
: chrome_test_util::GetOriginalProfile();
__block bool did_complete = false;
BrowsingDataRemover* browsingDataRemover =
BrowsingDataRemoverFactory::GetForProfile(profile);
browsingDataRemover->Remove(browsing_data::TimePeriod::ALL_TIME, mask,
base::BindOnce(^{
did_complete = true;
}));
return WaitUntilConditionOrTimeout(
base::test::ios::kWaitForClearBrowsingDataTimeout, ^{
return did_complete;
});
}
} // namespace
namespace chrome_test_util {
bool RemoveBrowsingCache() {
return ClearBrowsingData(/*off_the_record=*/false,
BrowsingDataRemoveMask::REMOVE_CACHE_STORAGE);
}
bool ClearBrowsingHistory() {
return ClearBrowsingData(/*off_the_record=*/false,
BrowsingDataRemoveMask::REMOVE_HISTORY);
}
bool ClearCookiesAndSiteData() {
return ClearBrowsingData(/*off_the_record=*/false,
BrowsingDataRemoveMask::REMOVE_SITE_DATA);
}
bool ClearAllWebStateBrowsingData() {
__block bool callback_finished = false;
WKWebsiteDataStore* data_store =
web::GetDataStoreForBrowserState(GetOriginalProfile());
[data_store removeDataOfTypes:[WKWebsiteDataStore allWebsiteDataTypes]
modifiedSince:[NSDate distantPast]
completionHandler:^{
callback_finished = true;
}];
return WaitUntilConditionOrTimeout(base::Seconds(20), ^{
return callback_finished;
});
}
bool ClearCertificatePolicyCache(bool off_the_record) {
ProfileIOS* profile =
off_the_record ? GetCurrentIncognitoProfile() : GetOriginalProfile();
scoped_refptr<web::CertificatePolicyCache> cache =
web::BrowserState::GetCertificatePolicyCache(profile);
__block BOOL policies_cleared = NO;
web::GetIOThreadTaskRunner({})->PostTask(FROM_HERE, base::BindOnce(^{
cache->ClearCertificatePolicies();
policies_cleared = YES;
}));
return WaitUntilConditionOrTimeout(base::Seconds(2), ^{
return policies_cleared;
});
}
int GetBrowsingHistoryEntryCount(NSError** error) {
// Call the history service.
ProfileIOS* profile = chrome_test_util::GetOriginalProfile();
history::HistoryService* history_service =
ios::HistoryServiceFactory::GetForProfile(
profile, ServiceAccessType::EXPLICIT_ACCESS);
__block bool history_service_callback_called = false;
__block int count = -1;
base::CancelableTaskTracker task_tracker;
history_service->GetHistoryCount(
base::Time::Min(), base::Time::Max(),
history::VisitQuery404sPolicy::kInclude404s,
base::BindOnce(^(history::HistoryCountResult result) {
if (result.success) {
count = result.count;
}
history_service_callback_called = true;
}),
&task_tracker);
NSDate* deadline = [NSDate dateWithTimeIntervalSinceNow:4.0];
while (!history_service_callback_called &&
[[NSDate date] compare:deadline] != NSOrderedDescending) {
base::test::ios::SpinRunLoopWithMaxDelay(base::Seconds(0.1));
}
NSString* error_message = nil;
if (!history_service_callback_called) {
error_message = @"History::GetHistoryCount callback never called, app will "
"probably crash later.";
} else if (count == -1) {
error_message = @"History::GetHistoryCount did not succeed.";
}
if (error_message != nil && error != nil) {
NSDictionary* error_info = @{NSLocalizedDescriptionKey : error_message};
*error = [NSError errorWithDomain:@"BrowsingDataTestDomain"
code:0
userInfo:error_info];
LOG(ERROR) << "Querying history service failed: " << error_message;
return -1;
}
return count;
}
} // namespace chrome_test_util