Commit ae6987e1 authored by Sylvain Defresne's avatar Sylvain Defresne Committed by Commit Bot

Re-introduce new Clear Browsing Data UI

Partial manual revert of https://crrev.com/c/903245 to accomodate
the refactoring done in ios/chrome/browser/browsing_data.

Notable changes:

-   removed class IOSBrowsingDataCounterFactory that was used
    purely for namespacing a static function and instead used
    a free function in an anonymous namespace

-   use BrowsingDataRemoverObserver to watch for removal of
    browsing data instead of using subscription with the old
    global CallbackList

-   introduced chrome://flags#new-clear-browsing-data-ui
    flags (backed by a feature) to enable or disable the
    new UI

-   fix presubmit checks by converting uses of base::Bind to
    base::Bind{Repeating,Once}

-   re-enabled disabled tests

Bug: 760084
Change-Id: I18a59144f2ba461e096d1e009261a2e717e463b7
Cq-Include-Trybots: master.tryserver.chromium.mac:ios-simulator-cronet;master.tryserver.chromium.mac:ios-simulator-full-configs
Reviewed-on: https://chromium-review.googlesource.com/939624
Commit-Queue: Sylvain Defresne <sdefresne@chromium.org>
Reviewed-by: default avatarOlivier Robin <olivierrobin@chromium.org>
Reviewed-by: default avatarMartin Šrámek <msramek@chromium.org>
Cr-Commit-Position: refs/heads/master@{#540144}
parent 662c896b
...@@ -114,6 +114,7 @@ source_set("browser") { ...@@ -114,6 +114,7 @@ source_set("browser") {
"//google_apis", "//google_apis",
"//ios/chrome/app/strings", "//ios/chrome/app/strings",
"//ios/chrome/browser/browser_state", "//ios/chrome/browser/browser_state",
"//ios/chrome/browser/browsing_data:features",
"//ios/chrome/browser/download", "//ios/chrome/browser/download",
"//ios/chrome/browser/drag_and_drop", "//ios/chrome/browser/drag_and_drop",
"//ios/chrome/browser/mailto:features", "//ios/chrome/browser/mailto:features",
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "components/security_state/core/features.h" #include "components/security_state/core/features.h"
#include "components/signin/core/browser/signin_switches.h" #include "components/signin/core/browser/signin_switches.h"
#include "components/strings/grit/components_strings.h" #include "components/strings/grit/components_strings.h"
#include "ios/chrome/browser/browsing_data/browsing_data_features.h"
#include "ios/chrome/browser/chrome_switches.h" #include "ios/chrome/browser/chrome_switches.h"
#include "ios/chrome/browser/drag_and_drop/drag_and_drop_flag.h" #include "ios/chrome/browser/drag_and_drop/drag_and_drop_flag.h"
#include "ios/chrome/browser/ios_chrome_flag_descriptions.h" #include "ios/chrome/browser/ios_chrome_flag_descriptions.h"
...@@ -260,6 +261,10 @@ const flags_ui::FeatureEntry kFeatureEntries[] = { ...@@ -260,6 +261,10 @@ const flags_ui::FeatureEntry kFeatureEntries[] = {
{"feedback-kit-v2", flag_descriptions::kFeedbackKitV2Name, {"feedback-kit-v2", flag_descriptions::kFeedbackKitV2Name,
flag_descriptions::kFeedbackKitV2Description, flags_ui::kOsIos, flag_descriptions::kFeedbackKitV2Description, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kFeedbackKitV2)}, FEATURE_VALUE_TYPE(kFeedbackKitV2)},
{"new-clear-browsing-data-ui",
flag_descriptions::kNewClearBrowsingDataUIName,
flag_descriptions::kNewClearBrowsingDataUIDescription, flags_ui::kOsIos,
FEATURE_VALUE_TYPE(kNewClearBrowsingDataUI)},
}; };
// Add all switches from experimental flags to |command_line|. // Add all switches from experimental flags to |command_line|.
......
...@@ -2,6 +2,17 @@ ...@@ -2,6 +2,17 @@
# Use of this source code is governed by a BSD-style license that can be # Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file. # found in the LICENSE file.
source_set("features") {
sources = [
"browsing_data_features.cc",
"browsing_data_features.h",
]
deps = [
"//base",
]
configs += [ "//build/config/compiler:enable_arc" ]
}
source_set("browsing_data_remove_mask") { source_set("browsing_data_remove_mask") {
sources = [ sources = [
"browsing_data_remove_mask.h", "browsing_data_remove_mask.h",
...@@ -11,6 +22,8 @@ source_set("browsing_data_remove_mask") { ...@@ -11,6 +22,8 @@ source_set("browsing_data_remove_mask") {
source_set("browsing_data") { source_set("browsing_data") {
sources = [ sources = [
"browsing_data_counter_wrapper.cc",
"browsing_data_counter_wrapper.h",
"browsing_data_remover.cc", "browsing_data_remover.cc",
"browsing_data_remover.h", "browsing_data_remover.h",
"browsing_data_remover_factory.h", "browsing_data_remover_factory.h",
...@@ -20,6 +33,7 @@ source_set("browsing_data") { ...@@ -20,6 +33,7 @@ source_set("browsing_data") {
"browsing_data_remover_observer.h", "browsing_data_remover_observer.h",
] ]
deps = [ deps = [
":counters",
"//base", "//base",
"//components/autofill/core/browser", "//components/autofill/core/browser",
"//components/browser_sync", "//components/browser_sync",
...@@ -66,14 +80,31 @@ source_set("browsing_data") { ...@@ -66,14 +80,31 @@ source_set("browsing_data") {
configs += [ "//build/config/compiler:enable_arc" ] configs += [ "//build/config/compiler:enable_arc" ]
} }
source_set("counters") {
sources = [
"cache_counter.cc",
"cache_counter.h",
]
deps = [
"//base",
"//components/browsing_data/core",
"//ios/chrome/browser/browser_state",
"//ios/web/public",
"//net",
]
configs += [ "//build/config/compiler:enable_arc" ]
}
source_set("unit_tests") { source_set("unit_tests") {
configs += [ "//build/config/compiler:enable_arc" ] configs += [ "//build/config/compiler:enable_arc" ]
testonly = true testonly = true
sources = [ sources = [
"browsing_data_remover_impl_unittest.mm", "browsing_data_remover_impl_unittest.mm",
"cache_counter_unittest.cc",
] ]
deps = [ deps = [
":browsing_data", ":browsing_data",
":counters",
"//base", "//base",
"//base/test:test_support", "//base/test:test_support",
"//components/browsing_data/core", "//components/browsing_data/core",
......
// 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 "ios/chrome/browser/browsing_data/browsing_data_counter_wrapper.h"
#include "base/bind.h"
#include "base/callback.h"
#include "base/memory/ptr_util.h"
#include "components/browser_sync/profile_sync_service.h"
#include "components/browsing_data/core/counters/autofill_counter.h"
#include "components/browsing_data/core/counters/browsing_data_counter.h"
#include "components/browsing_data/core/counters/history_counter.h"
#include "components/browsing_data/core/counters/passwords_counter.h"
#include "components/browsing_data/core/pref_names.h"
#include "components/keyed_service/core/service_access_type.h"
#include "components/prefs/pref_service.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#include "ios/chrome/browser/browsing_data/cache_counter.h"
#include "ios/chrome/browser/experimental_flags.h"
#include "ios/chrome/browser/history/history_service_factory.h"
#include "ios/chrome/browser/history/web_history_service_factory.h"
#include "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h"
#include "ios/chrome/browser/sync/ios_chrome_profile_sync_service_factory.h"
#include "ios/chrome/browser/web_data_service_factory.h"
namespace {
// Creates a new instance of BrowsingDataCounter that is counting the data
// for |browser_state| related to a given deletion preference |pref_name|.
std::unique_ptr<browsing_data::BrowsingDataCounter>
CreateCounterForBrowserStateAndPref(ios::ChromeBrowserState* browser_state,
base::StringPiece pref_name) {
if (!experimental_flags::IsNewClearBrowsingDataUIEnabled())
return nullptr;
if (pref_name == browsing_data::prefs::kDeleteBrowsingHistory) {
return std::make_unique<browsing_data::HistoryCounter>(
ios::HistoryServiceFactory::GetForBrowserStateIfExists(
browser_state, ServiceAccessType::EXPLICIT_ACCESS),
base::BindRepeating(&ios::WebHistoryServiceFactory::GetForBrowserState,
base::Unretained(browser_state)),
IOSChromeProfileSyncServiceFactory::GetForBrowserState(browser_state));
}
if (pref_name == browsing_data::prefs::kDeleteCache) {
return std::make_unique<CacheCounter>(browser_state);
}
if (pref_name == browsing_data::prefs::kDeletePasswords) {
return std::make_unique<browsing_data::PasswordsCounter>(
IOSChromePasswordStoreFactory::GetForBrowserState(
browser_state, ServiceAccessType::EXPLICIT_ACCESS),
IOSChromeProfileSyncServiceFactory::GetForBrowserState(browser_state));
}
if (pref_name == browsing_data::prefs::kDeleteFormData) {
return std::make_unique<browsing_data::AutofillCounter>(
ios::WebDataServiceFactory::GetAutofillWebDataForBrowserState(
browser_state, ServiceAccessType::EXPLICIT_ACCESS),
IOSChromeProfileSyncServiceFactory::GetForBrowserState(browser_state));
}
return nullptr;
}
} // namespace
// static
std::unique_ptr<BrowsingDataCounterWrapper>
BrowsingDataCounterWrapper::CreateCounterWrapper(
base::StringPiece pref_name,
ios::ChromeBrowserState* browser_state,
PrefService* pref_service,
UpdateUICallback update_ui_callback) {
std::unique_ptr<browsing_data::BrowsingDataCounter> counter =
CreateCounterForBrowserStateAndPref(browser_state, pref_name);
if (!counter)
return nullptr;
return base::WrapUnique<BrowsingDataCounterWrapper>(
new BrowsingDataCounterWrapper(std::move(counter), pref_service,
std::move(update_ui_callback)));
}
BrowsingDataCounterWrapper::~BrowsingDataCounterWrapper() = default;
void BrowsingDataCounterWrapper::RestartCounter() {
counter_->Restart();
}
BrowsingDataCounterWrapper::BrowsingDataCounterWrapper(
std::unique_ptr<browsing_data::BrowsingDataCounter> counter,
PrefService* pref_service,
UpdateUICallback update_ui_callback)
: counter_(std::move(counter)),
update_ui_callback_(std::move(update_ui_callback)) {
DCHECK(counter_);
DCHECK(update_ui_callback_);
counter_->Init(
pref_service, browsing_data::ClearBrowsingDataTab::ADVANCED,
base::BindRepeating(&BrowsingDataCounterWrapper::UpdateWithResult,
base::Unretained(this)));
}
void BrowsingDataCounterWrapper::UpdateWithResult(
std::unique_ptr<browsing_data::BrowsingDataCounter::Result> result) {
DCHECK(result);
update_ui_callback_.Run(*result.get());
}
// 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.
#ifndef IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_COUNTER_WRAPPER_H_
#define IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_COUNTER_WRAPPER_H_
#include <memory>
#include "base/callback_forward.h"
#include "base/strings/string_piece.h"
#include "components/browsing_data/core/counters/browsing_data_counter.h"
class PrefService;
namespace ios {
class ChromeBrowserState;
}
// Wrapper around a browsing data volume counter that bridges the update counter
// UI callback to the UI.
class BrowsingDataCounterWrapper {
public:
using UpdateUICallback = base::RepeatingCallback<void(
const browsing_data::BrowsingDataCounter::Result&)>;
// This method returns the counter corresponding to the data type specified by
// |pref_name| or null if there is no such counter.
static std::unique_ptr<BrowsingDataCounterWrapper> CreateCounterWrapper(
base::StringPiece pref_name,
ios::ChromeBrowserState* browser_state,
PrefService* pref_service,
UpdateUICallback update_ui_callback);
~BrowsingDataCounterWrapper();
void RestartCounter();
private:
BrowsingDataCounterWrapper(
std::unique_ptr<browsing_data::BrowsingDataCounter> counter,
PrefService* pref_service,
UpdateUICallback update_ui_callback);
// Method to be passed as callback to the counter. This will be invoked when
// the result is ready.
void UpdateWithResult(
std::unique_ptr<browsing_data::BrowsingDataCounter::Result> result);
// The counter for which the interaction is managed by this wrapper.
std::unique_ptr<browsing_data::BrowsingDataCounter> counter_;
// Callback that updates the UI once the counter result is ready. This is
// invoked by UpdateWithResult.
UpdateUICallback update_ui_callback_;
DISALLOW_COPY_AND_ASSIGN(BrowsingDataCounterWrapper);
};
#endif // IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_COUNTER_WRAPPER_H_
// Copyright 2018 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 "ios/chrome/browser/browsing_data/browsing_data_features.h"
const base::Feature kNewClearBrowsingDataUI{"NewClearBrowsingDataUI",
base::FEATURE_DISABLED_BY_DEFAULT};
// Copyright 2018 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.
#ifndef IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_FEATURES_H_
#define IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_FEATURES_H_
#include "base/feature_list.h"
// Feature flag to enable new Clear Browsing Data UI.
extern const base::Feature kNewClearBrowsingDataUI;
#endif // IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_FEATURES_H_
// 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 "ios/chrome/browser/browsing_data/cache_counter.h"
#include "base/bind.h"
#include "components/browsing_data/core/pref_names.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#include "ios/web/public/browser_state.h"
#include "ios/web/public/web_thread.h"
#include "net/base/completion_callback.h"
#include "net/base/net_errors.h"
#include "net/disk_cache/disk_cache.h"
#include "net/http/http_cache.h"
#include "net/http/http_transaction_factory.h"
#include "net/url_request/url_request_context.h"
#include "net/url_request/url_request_context_getter.h"
namespace {
class IOThreadCacheCounter {
public:
IOThreadCacheCounter(
const scoped_refptr<net::URLRequestContextGetter>& context_getter,
const net::CompletionCallback& result_callback)
: next_step_(STEP_GET_BACKEND),
context_getter_(context_getter),
result_callback_(result_callback),
result_(0),
backend_(nullptr) {}
void Count() {
web::WebThread::PostTask(
web::WebThread::IO, FROM_HERE,
base::BindRepeating(&IOThreadCacheCounter::CountInternal,
base::Unretained(this), net::OK));
}
private:
enum Step {
STEP_GET_BACKEND, // Get the disk_cache::Backend instance.
STEP_COUNT, // Run CalculateSizeOfAllEntries() on it.
STEP_CALLBACK, // Respond on the UI thread.
STEP_DONE // Calculation completed.
};
void CountInternal(int rv) {
DCHECK_CURRENTLY_ON(web::WebThread::IO);
while (rv != net::ERR_IO_PENDING && next_step_ != STEP_DONE) {
// In case of an error, skip to the last step.
if (rv < 0)
next_step_ = STEP_CALLBACK;
// Process the counting in three steps: STEP_GET_BACKEND -> STEP_COUNT ->
// -> STEP_CALLBACK.
switch (next_step_) {
case STEP_GET_BACKEND: {
next_step_ = STEP_COUNT;
net::HttpCache* http_cache = context_getter_->GetURLRequestContext()
->http_transaction_factory()
->GetCache();
rv = http_cache->GetBackend(
&backend_,
base::BindRepeating(&IOThreadCacheCounter::CountInternal,
base::Unretained(this)));
break;
}
case STEP_COUNT: {
next_step_ = STEP_CALLBACK;
DCHECK(backend_);
rv = backend_->CalculateSizeOfAllEntries(base::BindRepeating(
&IOThreadCacheCounter::CountInternal, base::Unretained(this)));
break;
}
case STEP_CALLBACK: {
next_step_ = STEP_DONE;
result_ = rv;
web::WebThread::PostTask(
web::WebThread::UI, FROM_HERE,
base::BindOnce(&IOThreadCacheCounter::OnCountingFinished,
base::Unretained(this)));
break;
}
case STEP_DONE: {
NOTREACHED();
}
}
}
}
void OnCountingFinished() {
DCHECK_CURRENTLY_ON(web::WebThread::UI);
result_callback_.Run(result_);
delete this;
}
Step next_step_;
scoped_refptr<net::URLRequestContextGetter> context_getter_;
net::CompletionCallback result_callback_;
int result_;
disk_cache::Backend* backend_;
};
} // namespace
CacheCounter::CacheCounter(ios::ChromeBrowserState* browser_state)
: browser_state_(browser_state), weak_ptr_factory_(this) {}
CacheCounter::~CacheCounter() = default;
const char* CacheCounter::GetPrefName() const {
return browsing_data::prefs::kDeleteCache;
}
void CacheCounter::Count() {
// disk_cache::Backend currently does not implement counting for subsets of
// cache, only for the entire cache. Thus, ignore the time period setting and
// always request counting for the unbounded time interval. It is up to the
// UI to interpret the results for finite time intervals as upper estimates.
// IOThreadCacheCounter deletes itself when done.
(new IOThreadCacheCounter(
browser_state_->GetRequestContext(),
base::BindRepeating(&CacheCounter::OnCacheSizeCalculated,
weak_ptr_factory_.GetWeakPtr())))
->Count();
}
void CacheCounter::OnCacheSizeCalculated(int result_bytes) {
// A value less than 0 means a net error code.
if (result_bytes < 0)
return;
ReportResult(result_bytes);
}
// 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.
#ifndef IOS_CHROME_BROWSER_BROWSING_DATA_CACHE_COUNTER_H_
#define IOS_CHROME_BROWSER_BROWSING_DATA_CACHE_COUNTER_H_
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "components/browsing_data/core/counters/browsing_data_counter.h"
namespace ios {
class ChromeBrowserState;
}
// CacheCounter is a BrowsingDataCounter used to compute the cache size.
class CacheCounter : public browsing_data::BrowsingDataCounter {
public:
explicit CacheCounter(ios::ChromeBrowserState* browser_state);
~CacheCounter() override;
// browsing_data::BrowsingDataCounter implementation.
const char* GetPrefName() const override;
void Count() override;
private:
// Invoked when cache size has been computed.
void OnCacheSizeCalculated(int cache_size);
ios::ChromeBrowserState* browser_state_;
base::WeakPtrFactory<CacheCounter> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(CacheCounter);
};
#endif // IOS_CHROME_BROWSER_BROWSING_DATA_CACHE_COUNTER_H_
This diff is collapsed.
...@@ -48,6 +48,9 @@ bool IsMemoryDebuggingEnabled(); ...@@ -48,6 +48,9 @@ bool IsMemoryDebuggingEnabled();
// Whether startup crash is enabled. // Whether startup crash is enabled.
bool IsStartupCrashEnabled(); bool IsStartupCrashEnabled();
// Whether the new Clear Browsing Data UI is enabled.
bool IsNewClearBrowsingDataUIEnabled();
// Whether a new version of FeedbackKit is the preferred feedback UI provider. // Whether a new version of FeedbackKit is the preferred feedback UI provider.
bool IsNewFeedbackKitEnabled(); bool IsNewFeedbackKitEnabled();
......
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include "components/password_manager/core/common/password_manager_features.h" #include "components/password_manager/core/common/password_manager_features.h"
#include "components/signin/core/browser/signin_switches.h" #include "components/signin/core/browser/signin_switches.h"
#include "components/variations/variations_associated_data.h" #include "components/variations/variations_associated_data.h"
#include "ios/chrome/browser/browsing_data/browsing_data_features.h"
#include "ios/chrome/browser/chrome_switches.h" #include "ios/chrome/browser/chrome_switches.h"
#import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_feature.h" #import "ios/chrome/browser/ui/ntp/recent_tabs/recent_tabs_feature.h"
#include "ios/chrome/browser/ui/user_feedback_features.h" #include "ios/chrome/browser/ui/user_feedback_features.h"
...@@ -108,6 +109,10 @@ bool MustClearApplicationGroupSandbox() { ...@@ -108,6 +109,10 @@ bool MustClearApplicationGroupSandbox() {
return value; return value;
} }
bool IsNewClearBrowsingDataUIEnabled() {
return base::FeatureList::IsEnabled(kNewClearBrowsingDataUI);
}
bool IsNewFeedbackKitEnabled() { bool IsNewFeedbackKitEnabled() {
return base::FeatureList::IsEnabled(kFeedbackKitV2); return base::FeatureList::IsEnabled(kFeedbackKitV2);
} }
......
...@@ -44,6 +44,10 @@ const char kContextMenuElementPostMessageDescription[] = ...@@ -44,6 +44,10 @@ const char kContextMenuElementPostMessageDescription[] =
const char kDragAndDropName[] = "Drag and Drop"; const char kDragAndDropName[] = "Drag and Drop";
const char kDragAndDropDescription[] = "Enable support for drag and drop."; const char kDragAndDropDescription[] = "Enable support for drag and drop.";
const char kNewClearBrowsingDataUIName[] = "Clear Browsing Data UI";
const char kNewClearBrowsingDataUIDescription[] =
"Enable new Clear Browsing Data UI.";
const char kExternalSearchName[] = "External Search"; const char kExternalSearchName[] = "External Search";
const char kExternalSearchDescription[] = "Enable support for External Search."; const char kExternalSearchDescription[] = "Enable support for External Search.";
......
...@@ -37,6 +37,10 @@ extern const char kContextMenuElementPostMessageDescription[]; ...@@ -37,6 +37,10 @@ extern const char kContextMenuElementPostMessageDescription[];
extern const char kDragAndDropName[]; extern const char kDragAndDropName[];
extern const char kDragAndDropDescription[]; extern const char kDragAndDropDescription[];
// Title and description for the flag to enable new Clear Browsing Data UI.
extern const char kNewClearBrowsingDataUIName[];
extern const char kNewClearBrowsingDataUIDescription[];
// Title and description for the flag to enable External Search. // Title and description for the flag to enable External Search.
extern const char kExternalSearchName[]; extern const char kExternalSearchName[];
extern const char kExternalSearchDescription[]; extern const char kExternalSearchDescription[];
......
...@@ -281,6 +281,7 @@ source_set("unit_tests") { ...@@ -281,6 +281,7 @@ source_set("unit_tests") {
"//ios/chrome/browser/browser_state", "//ios/chrome/browser/browser_state",
"//ios/chrome/browser/browser_state:test_support", "//ios/chrome/browser/browser_state:test_support",
"//ios/chrome/browser/browsing_data", "//ios/chrome/browser/browsing_data",
"//ios/chrome/browser/browsing_data:counters",
"//ios/chrome/browser/content_settings", "//ios/chrome/browser/content_settings",
"//ios/chrome/browser/passwords", "//ios/chrome/browser/passwords",
"//ios/chrome/browser/prefs:browser_prefs", "//ios/chrome/browser/prefs:browser_prefs",
...@@ -353,6 +354,7 @@ source_set("eg_tests") { ...@@ -353,6 +354,7 @@ source_set("eg_tests") {
"//ios/chrome/app/theme", "//ios/chrome/app/theme",
"//ios/chrome/browser", "//ios/chrome/browser",
"//ios/chrome/browser/browser_state", "//ios/chrome/browser/browser_state",
"//ios/chrome/browser/browsing_data:features",
"//ios/chrome/browser/content_settings", "//ios/chrome/browser/content_settings",
"//ios/chrome/browser/ntp_snippets", "//ios/chrome/browser/ntp_snippets",
"//ios/chrome/browser/passwords:passwords", "//ios/chrome/browser/passwords:passwords",
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include "components/sync_preferences/pref_service_syncable.h" #include "components/sync_preferences/pref_service_syncable.h"
#include "ios/chrome/browser/application_context.h" #include "ios/chrome/browser/application_context.h"
#include "ios/chrome/browser/browser_state/test_chrome_browser_state.h" #include "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
#include "ios/chrome/browser/browsing_data/cache_counter.h"
#include "ios/chrome/browser/experimental_flags.h" #include "ios/chrome/browser/experimental_flags.h"
#include "ios/chrome/browser/pref_names.h" #include "ios/chrome/browser/pref_names.h"
#include "ios/chrome/browser/prefs/browser_prefs.h" #include "ios/chrome/browser/prefs/browser_prefs.h"
...@@ -118,26 +119,38 @@ TEST_F(ClearBrowsingDataCollectionViewControllerTest, TestModel) { ...@@ -118,26 +119,38 @@ TEST_F(ClearBrowsingDataCollectionViewControllerTest, TestModel) {
CreateController(); CreateController();
CheckController(); CheckController();
EXPECT_EQ(3, NumberOfSections()); int section_offset = 0;
if (experimental_flags::IsNewClearBrowsingDataUIEnabled()) {
EXPECT_EQ(4, NumberOfSections());
EXPECT_EQ(1, NumberOfItemsInSection(0));
section_offset = 1;
} else {
EXPECT_EQ(3, NumberOfSections());
}
EXPECT_EQ(5, NumberOfItemsInSection(0)); EXPECT_EQ(5, NumberOfItemsInSection(0 + section_offset));
CheckTextCellTitleWithId(IDS_IOS_CLEAR_BROWSING_HISTORY, 0, 0); CheckTextCellTitleWithId(IDS_IOS_CLEAR_BROWSING_HISTORY, 0 + section_offset,
CheckAccessoryType(MDCCollectionViewCellAccessoryCheckmark, 0, 0); 0);
CheckTextCellTitleWithId(IDS_IOS_CLEAR_COOKIES, 0, 1); CheckAccessoryType(MDCCollectionViewCellAccessoryCheckmark,
CheckAccessoryType(MDCCollectionViewCellAccessoryCheckmark, 0, 1); 0 + section_offset, 0);
CheckTextCellTitleWithId(IDS_IOS_CLEAR_CACHE, 0, 2); CheckTextCellTitleWithId(IDS_IOS_CLEAR_COOKIES, 0 + section_offset, 1);
CheckAccessoryType(MDCCollectionViewCellAccessoryCheckmark, 0, 2); CheckAccessoryType(MDCCollectionViewCellAccessoryCheckmark,
CheckTextCellTitleWithId(IDS_IOS_CLEAR_SAVED_PASSWORDS, 0, 3); 0 + section_offset, 1);
CheckAccessoryType(MDCCollectionViewCellAccessoryNone, 0, 3); CheckTextCellTitleWithId(IDS_IOS_CLEAR_CACHE, 0 + section_offset, 2);
CheckTextCellTitleWithId(IDS_IOS_CLEAR_AUTOFILL, 0, 4); CheckAccessoryType(MDCCollectionViewCellAccessoryCheckmark,
CheckAccessoryType(MDCCollectionViewCellAccessoryNone, 0, 4); 0 + section_offset, 2);
CheckTextCellTitleWithId(IDS_IOS_CLEAR_SAVED_PASSWORDS, 0 + section_offset,
3);
CheckAccessoryType(MDCCollectionViewCellAccessoryNone, 0 + section_offset, 3);
CheckTextCellTitleWithId(IDS_IOS_CLEAR_AUTOFILL, 0 + section_offset, 4);
CheckAccessoryType(MDCCollectionViewCellAccessoryNone, 0 + section_offset, 4);
EXPECT_EQ(1, NumberOfItemsInSection(1)); EXPECT_EQ(1, NumberOfItemsInSection(1 + section_offset));
CheckTextCellTitleWithId(IDS_IOS_CLEAR_BUTTON, 1, 0); CheckTextCellTitleWithId(IDS_IOS_CLEAR_BUTTON, 1 + section_offset, 0);
EXPECT_EQ(1, NumberOfItemsInSection(2)); EXPECT_EQ(1, NumberOfItemsInSection(2 + section_offset));
CheckSectionFooterWithId(IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_SAVED_SITE_DATA, CheckSectionFooterWithId(IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_SAVED_SITE_DATA,
2); 2 + section_offset);
} }
TEST_F(ClearBrowsingDataCollectionViewControllerTest, TEST_F(ClearBrowsingDataCollectionViewControllerTest,
...@@ -148,17 +161,24 @@ TEST_F(ClearBrowsingDataCollectionViewControllerTest, ...@@ -148,17 +161,24 @@ TEST_F(ClearBrowsingDataCollectionViewControllerTest,
CreateController(); CreateController();
CheckController(); CheckController();
EXPECT_EQ(4, NumberOfSections()); int section_offset = 0;
if (experimental_flags::IsNewClearBrowsingDataUIEnabled()) {
EXPECT_EQ(5, NumberOfSections());
EXPECT_EQ(1, NumberOfItemsInSection(0));
section_offset = 1;
} else {
EXPECT_EQ(4, NumberOfSections());
}
EXPECT_EQ(5, NumberOfItemsInSection(0)); EXPECT_EQ(5, NumberOfItemsInSection(0 + section_offset));
EXPECT_EQ(1, NumberOfItemsInSection(1)); EXPECT_EQ(1, NumberOfItemsInSection(1 + section_offset));
EXPECT_EQ(1, NumberOfItemsInSection(2)); EXPECT_EQ(1, NumberOfItemsInSection(2 + section_offset));
CheckSectionFooterWithId(IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_ACCOUNT, 2); CheckSectionFooterWithId(IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_ACCOUNT, 2);
EXPECT_EQ(1, NumberOfItemsInSection(3)); EXPECT_EQ(1, NumberOfItemsInSection(3 + section_offset));
CheckSectionFooterWithId(IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_SAVED_SITE_DATA, CheckSectionFooterWithId(IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_SAVED_SITE_DATA,
3); 3 + section_offset);
} }
TEST_F(ClearBrowsingDataCollectionViewControllerTest, TEST_F(ClearBrowsingDataCollectionViewControllerTest,
...@@ -173,17 +193,26 @@ TEST_F(ClearBrowsingDataCollectionViewControllerTest, ...@@ -173,17 +193,26 @@ TEST_F(ClearBrowsingDataCollectionViewControllerTest,
CreateController(); CreateController();
CheckController(); CheckController();
EXPECT_EQ(4, NumberOfSections()); int section_offset = 0;
if (experimental_flags::IsNewClearBrowsingDataUIEnabled()) {
EXPECT_EQ(5, NumberOfSections());
EXPECT_EQ(1, NumberOfItemsInSection(0));
section_offset = 1;
} else {
EXPECT_EQ(4, NumberOfSections());
}
EXPECT_EQ(5, NumberOfItemsInSection(0)); EXPECT_EQ(5, NumberOfItemsInSection(0 + section_offset));
EXPECT_EQ(1, NumberOfItemsInSection(1)); EXPECT_EQ(1, NumberOfItemsInSection(1 + section_offset));
EXPECT_EQ(1, NumberOfItemsInSection(2)); EXPECT_EQ(1, NumberOfItemsInSection(2 + section_offset));
CheckSectionFooterWithId(IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_ACCOUNT, 2); CheckSectionFooterWithId(IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_ACCOUNT,
2 + section_offset);
EXPECT_EQ(1, NumberOfItemsInSection(3)); EXPECT_EQ(1, NumberOfItemsInSection(3 + section_offset));
CheckSectionFooterWithId( CheckSectionFooterWithId(
IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_CLEAR_SYNC_AND_SAVED_SITE_DATA, 3); IDS_IOS_CLEAR_BROWSING_DATA_FOOTER_CLEAR_SYNC_AND_SAVED_SITE_DATA,
3 + section_offset);
} }
TEST_F(ClearBrowsingDataCollectionViewControllerTest, TestUpdatePrefWithValue) { TEST_F(ClearBrowsingDataCollectionViewControllerTest, TestUpdatePrefWithValue) {
...@@ -191,16 +220,93 @@ TEST_F(ClearBrowsingDataCollectionViewControllerTest, TestUpdatePrefWithValue) { ...@@ -191,16 +220,93 @@ TEST_F(ClearBrowsingDataCollectionViewControllerTest, TestUpdatePrefWithValue) {
CheckController(); CheckController();
PrefService* prefs = browser_state_->GetPrefs(); PrefService* prefs = browser_state_->GetPrefs();
SelectItem(kDeleteBrowsingHistoryItem, 0); const int section_offset =
experimental_flags::IsNewClearBrowsingDataUIEnabled() ? 1 : 0;
SelectItem(kDeleteBrowsingHistoryItem, 0 + section_offset);
EXPECT_FALSE(prefs->GetBoolean(browsing_data::prefs::kDeleteBrowsingHistory)); EXPECT_FALSE(prefs->GetBoolean(browsing_data::prefs::kDeleteBrowsingHistory));
SelectItem(kDeleteCookiesItem, 0); SelectItem(kDeleteCookiesItem, 0 + section_offset);
EXPECT_FALSE(prefs->GetBoolean(browsing_data::prefs::kDeleteCookies)); EXPECT_FALSE(prefs->GetBoolean(browsing_data::prefs::kDeleteCookies));
SelectItem(kDeleteCacheItem, 0); SelectItem(kDeleteCacheItem, 0 + section_offset);
EXPECT_FALSE(prefs->GetBoolean(browsing_data::prefs::kDeleteCache)); EXPECT_FALSE(prefs->GetBoolean(browsing_data::prefs::kDeleteCache));
SelectItem(kDeletePasswordsItem, 0); SelectItem(kDeletePasswordsItem, 0 + section_offset);
EXPECT_TRUE(prefs->GetBoolean(browsing_data::prefs::kDeletePasswords)); EXPECT_TRUE(prefs->GetBoolean(browsing_data::prefs::kDeletePasswords));
SelectItem(kDeleteFormDataItem, 0); SelectItem(kDeleteFormDataItem, 0 + section_offset);
EXPECT_TRUE(prefs->GetBoolean(browsing_data::prefs::kDeleteFormData)); EXPECT_TRUE(prefs->GetBoolean(browsing_data::prefs::kDeleteFormData));
} }
TEST_F(ClearBrowsingDataCollectionViewControllerTest,
TestCacheCounterFormattingForAllTime) {
ASSERT_EQ("en", GetApplicationContext()->GetApplicationLocale());
PrefService* prefs = browser_state_->GetPrefs();
prefs->SetInteger(browsing_data::prefs::kDeleteTimePeriod,
static_cast<int>(browsing_data::TimePeriod::ALL_TIME));
CacheCounter counter(browser_state_.get());
// Test multiple possible types of formatting.
// clang-format off
const struct TestCase {
int cache_size;
NSString* expected_output;
} kTestCases[] = {
{0, @"Less than 1 MB"},
{(1 << 20) - 1, @"Less than 1 MB"},
{(1 << 20), @"1 MB"},
{(1 << 20) + (1 << 19), @"1.5 MB"},
{(1 << 21), @"2 MB"},
{(1 << 30), @"1 GB"}
};
// clang-format on
ClearBrowsingDataCollectionViewController* viewController =
base::mac::ObjCCastStrict<ClearBrowsingDataCollectionViewController>(
controller());
for (const TestCase& test_case : kTestCases) {
browsing_data::BrowsingDataCounter::FinishedResult result(
&counter, test_case.cache_size);
NSString* output = [viewController getCounterTextFromResult:result];
EXPECT_NSEQ(test_case.expected_output, output);
}
}
TEST_F(ClearBrowsingDataCollectionViewControllerTest,
TestCacheCounterFormattingForLessThanAllTime) {
ASSERT_EQ("en", GetApplicationContext()->GetApplicationLocale());
// If the new UI is not enabled then the pref value for the time period
// is ignored and the time period defaults to ALL_TIME.
if (!experimental_flags::IsNewClearBrowsingDataUIEnabled()) {
return;
}
PrefService* prefs = browser_state_->GetPrefs();
prefs->SetInteger(browsing_data::prefs::kDeleteTimePeriod,
static_cast<int>(browsing_data::TimePeriod::LAST_HOUR));
CacheCounter counter(browser_state_.get());
// Test multiple possible types of formatting.
// clang-format off
const struct TestCase {
int cache_size;
NSString* expected_output;
} kTestCases[] = {
{0, @"Less than 1 MB"},
{(1 << 20) - 1, @"Less than 1 MB"},
{(1 << 20), @"Less than 1 MB"},
{(1 << 20) + (1 << 19), @"Less than 1.5 MB"},
{(1 << 21), @"Less than 2 MB"},
{(1 << 30), @"Less than 1 GB"}
};
// clang-format on
ClearBrowsingDataCollectionViewController* viewController =
base::mac::ObjCCastStrict<ClearBrowsingDataCollectionViewController>(
controller());
for (const TestCase& test_case : kTestCases) {
browsing_data::BrowsingDataCounter::FinishedResult result(
&counter, test_case.cache_size);
NSString* output = [viewController getCounterTextFromResult:result];
EXPECT_NSEQ(test_case.expected_output, output);
}
}
} // namespace } // namespace
...@@ -4,7 +4,9 @@ ...@@ -4,7 +4,9 @@
#import <XCTest/XCTest.h> #import <XCTest/XCTest.h>
#include "base/test/scoped_feature_list.h"
#include "components/strings/grit/components_strings.h" #include "components/strings/grit/components_strings.h"
#include "ios/chrome/browser/browsing_data/browsing_data_features.h"
#include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h" #include "ios/chrome/browser/ui/tools_menu/public/tools_menu_constants.h"
#include "ios/chrome/grit/ios_strings.h" #include "ios/chrome/grit/ios_strings.h"
#import "ios/chrome/test/earl_grey/chrome_earl_grey.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h"
...@@ -18,12 +20,15 @@ ...@@ -18,12 +20,15 @@
#endif #endif
using chrome_test_util::ButtonWithAccessibilityLabel; using chrome_test_util::ButtonWithAccessibilityLabel;
using chrome_test_util::NavigationBarDoneButton;
using chrome_test_util::SettingsMenuPrivacyButton; using chrome_test_util::SettingsMenuPrivacyButton;
@interface ClearBrowsingDataSettingsTestCase : ChromeTestCase @interface ClearBrowsingDataSettingsTestCase : ChromeTestCase
@end @end
@implementation ClearBrowsingDataSettingsTestCase @implementation ClearBrowsingDataSettingsTestCase {
base::test::ScopedFeatureList _featureList;
}
- (void)openClearBrowsingDataDialog { - (void)openClearBrowsingDataDialog {
[ChromeEarlGreyUI openSettingsMenu]; [ChromeEarlGreyUI openSettingsMenu];
...@@ -36,4 +41,24 @@ using chrome_test_util::SettingsMenuPrivacyButton; ...@@ -36,4 +41,24 @@ using chrome_test_util::SettingsMenuPrivacyButton;
performAction:grey_tap()]; performAction:grey_tap()];
} }
// Test that opening the clear browsing data dialog does not cause a crash
// with the old UI.
- (void)testOpenClearBrowsingDataDialogOldUI {
_featureList.InitAndDisableFeature(kNewClearBrowsingDataUI);
[self openClearBrowsingDataDialog];
[[EarlGrey selectElementWithMatcher:NavigationBarDoneButton()]
performAction:grey_tap()];
}
// Test that opening the clear browsing data dialog does not cause a crash
// with the new UI.
- (void)testOpenClearBrowsingDataDialogNewUI {
_featureList.InitAndEnableFeature(kNewClearBrowsingDataUI);
[self openClearBrowsingDataDialog];
[[EarlGrey selectElementWithMatcher:NavigationBarDoneButton()]
performAction:grey_tap()];
}
@end @end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment