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

Make IOSChromeBrowsingDataRemover re-entrant

Refactor IOSChromeBrowsingDataRemover to have a queue of
pending removals (based on similar refactor that happened
to BrowsingDataRemover in //content).

Remove helper class BrowsingDataRemoverHelper as it is
now redundant (it implemented the pending removal tasks
queue).

Change IOSChromeBrowsingDataRemover from thread-affinity
to sequence-affinity (as is recommended).

Fix references to old enumeration RemoveDataMask.

Bug: none
Change-Id: I4d18b2d0db59954af723e72af034b57acdc7e85d
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/918666
Commit-Queue: Sylvain Defresne <sdefresne@chromium.org>
Reviewed-by: default avatarOlivier Robin <olivierrobin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#537313}
parent a394896c
...@@ -11,8 +11,6 @@ source_set("browsing_data_remove_mask") { ...@@ -11,8 +11,6 @@ source_set("browsing_data_remove_mask") {
source_set("browsing_data") { source_set("browsing_data") {
sources = [ sources = [
"browsing_data_remover_helper.cc",
"browsing_data_remover_helper.h",
"ios_chrome_browsing_data_remover.h", "ios_chrome_browsing_data_remover.h",
"ios_chrome_browsing_data_remover.mm", "ios_chrome_browsing_data_remover.mm",
] ]
......
...@@ -21,9 +21,9 @@ class ChromeBrowserState; ...@@ -21,9 +21,9 @@ class ChromeBrowserState;
// ChromeBrowserState. // ChromeBrowserState.
@interface BrowsingDataRemovalController : NSObject @interface BrowsingDataRemovalController : NSObject
// Removes browsing data from |browserState| for datatypes in |mask|. // Removes browsing data from |browserState| for datatypes in |mask|. |mask| is
// |mask| is obtained from IOSChromeBrowsingDataRemover::RemoveDataMask. // obtained from BrowsingDataRemoveMask. |browserState| cannot be null and must
// |browserState| cannot be null and must not be off the record. // not be off the record.
- (void)removeBrowsingDataFromBrowserState: - (void)removeBrowsingDataFromBrowserState:
(ios::ChromeBrowserState*)browserState (ios::ChromeBrowserState*)browserState
mask:(BrowsingDataRemoveMask)mask mask:(BrowsingDataRemoveMask)mask
...@@ -31,11 +31,10 @@ class ChromeBrowserState; ...@@ -31,11 +31,10 @@ class ChromeBrowserState;
completionHandler:(ProceduralBlock)completionHandler; completionHandler:(ProceduralBlock)completionHandler;
// Removes browsing data that iOS has associated with |browserState| and which // Removes browsing data that iOS has associated with |browserState| and which
// is not removed when the |browserState| is destroyed. // is not removed when the |browserState| is destroyed. |mask| is obtained from
// |mask| is obtained from IOSChromeBrowsingDataRemover::RemoveDataMask // BrowsingDataRemoveMask. |browserState| cannot be null. |completionHandler| is
// |browserState| cannot be null. |completionHandler| is called when this // called when this operation finishes. This method finishes removal of the
// operation finishes. This method finishes removal of the browsing data even if // browsing data even if |browserState| is destroyed after this method call.
// |browserState| is destroyed after this method call.
- (void) - (void)
removeIOSSpecificIncognitoBrowsingDataFromBrowserState: removeIOSSpecificIncognitoBrowsingDataFromBrowserState:
(ios::ChromeBrowserState*)browserState (ios::ChromeBrowserState*)browserState
......
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
#include "components/signin/ios/browser/account_consistency_service.h" #include "components/signin/ios/browser/account_consistency_service.h"
#include "ios/chrome/browser/browser_state/chrome_browser_state.h" #include "ios/chrome/browser/browser_state/chrome_browser_state.h"
#include "ios/chrome/browser/browsing_data/browsing_data_remove_mask.h" #include "ios/chrome/browser/browsing_data/browsing_data_remove_mask.h"
#include "ios/chrome/browser/browsing_data/browsing_data_remover_helper.h"
#include "ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h" #include "ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h"
#include "ios/chrome/browser/sessions/session_util.h" #include "ios/chrome/browser/sessions/session_util.h"
#include "ios/chrome/browser/signin/account_consistency_service_factory.h" #include "ios/chrome/browser/signin/account_consistency_service_factory.h"
...@@ -48,12 +47,11 @@ void DoNothing(uint32_t n) {} ...@@ -48,12 +47,11 @@ void DoNothing(uint32_t n) {}
@interface BrowsingDataRemovalController () @interface BrowsingDataRemovalController ()
// Removes browsing data that is created by web views associated with // Removes browsing data that is created by web views associated with
// |browserState|. |mask| is obtained from // |browserState|. |mask| is obtained from BrowsingDataRemoveMask. |deleteBegin|
// IOSChromeBrowsingDataRemover::RemoveDataMask. |deleteBegin| defines the begin // defines the begin time from which the data has to be removed, up to the
// time from which the data has to be removed, up to the present time. // present time. |completionHandler| is called when this operation finishes.
// |completionHandler| is called when this operation finishes. This method // This method finishes removal of the browsing data even if |browserState| is
// finishes removal of the browsing data even if |browserState| is destroyed // destroyed after this method call.
// after this method call.
- (void) - (void)
removeWebViewCreatedBrowsingDataFromBrowserState: removeWebViewCreatedBrowsingDataFromBrowserState:
(ios::ChromeBrowserState*)browserState (ios::ChromeBrowserState*)browserState
...@@ -63,12 +61,10 @@ removeWebViewCreatedBrowsingDataFromBrowserState: ...@@ -63,12 +61,10 @@ removeWebViewCreatedBrowsingDataFromBrowserState:
(ProceduralBlock)completionHandler; (ProceduralBlock)completionHandler;
// Removes browsing data that is created by WKWebViews associated with // Removes browsing data that is created by WKWebViews associated with
// |browserState|. |browserState| must not be off the record. |mask| is obtained // |browserState|. |browserState| must not be off the record. |mask| is obtained
// from IOSChromeBrowsingDataRemover::RemoveDataMask. |deleteBegin| defines the // from BrowsingDataRemoveMask. |deleteBegin| defines the begin time from which
// begin time from which the data has to be removed, up to the present time. // the data has to be removed, up to the present time. |completionHandler| is
// |completionHandler| is called when this operation finishes. This method // called when this operation finishes. This method finishes removal of the
// finishes removal of the browsing data even if |browserState| is destroyed // browsing data even if |browserState| is destroyed after this method call.
// after this method call.
// Note: This method works only on iOS9+.
- (void) - (void)
removeWKWebViewCreatedBrowsingDataFromBrowserState: removeWKWebViewCreatedBrowsingDataFromBrowserState:
(ios::ChromeBrowserState*)browserState (ios::ChromeBrowserState*)browserState
...@@ -78,12 +74,11 @@ removeWKWebViewCreatedBrowsingDataFromBrowserState: ...@@ -78,12 +74,11 @@ removeWKWebViewCreatedBrowsingDataFromBrowserState:
(ProceduralBlock)completionHandler; (ProceduralBlock)completionHandler;
// Removes browsing data associated with |browserState| that is specific to iOS // Removes browsing data associated with |browserState| that is specific to iOS
// and not removed when the |browserState| is destroyed. // and not removed when the |browserState| is destroyed. |mask| is obtained from
// |mask| is obtained from IOSChromeBrowsingDataRemover::RemoveDataMask // BrowsingDataRemoveMask |deleteBegin| defines the begin time from which the
// |deleteBegin| defines the begin time from which the data has to be removed. // data has to be removed. |browserState| cannot be null. |completionHandler|
// |browserState| cannot be null. |completionHandler| is called when // is called when this operation finishes. This method finishes removal of the
// this operation finishes. This method finishes removal of the browsing data // browsing data even if |browserState| is destroyed after this method call.
// even if |browserState| is destroyed after this method call.
- (void) - (void)
removeIOSSpecificBrowsingDataFromBrowserState: removeIOSSpecificBrowsingDataFromBrowserState:
(ios::ChromeBrowserState*)browserState (ios::ChromeBrowserState*)browserState
...@@ -91,11 +86,10 @@ removeIOSSpecificBrowsingDataFromBrowserState: ...@@ -91,11 +86,10 @@ removeIOSSpecificBrowsingDataFromBrowserState:
deleteBegin:(base::Time)deleteBegin deleteBegin:(base::Time)deleteBegin
completionHandler: completionHandler:
(ProceduralBlock)completionHandler; (ProceduralBlock)completionHandler;
// Removes browsing data from |browserState| that is persisted on disk. // Removes browsing data from |browserState| that is persisted on disk. |mask|
// |mask| is obtained from IOSChromeBrowsingDataRemover::RemoveDataMask. // is obtained from BrowsingDataRemoveMask. |browserState| cannot be null and
// |browserState| cannot be null and must be off the record. // must be off the record. This method finishes removal of the browsing data
// This method finishes removal of the browsing data even if |browserState| is // even if |browserState| is destroyed after this method call.
// destroyed after this method call.
- (void) - (void)
removeIOSSpecificPersistentIncognitoDataFromBrowserState: removeIOSSpecificPersistentIncognitoDataFromBrowserState:
(ios::ChromeBrowserState*)browserState (ios::ChromeBrowserState*)browserState
...@@ -120,19 +114,14 @@ removeIOSSpecificPersistentIncognitoDataFromBrowserState: ...@@ -120,19 +114,14 @@ removeIOSSpecificPersistentIncognitoDataFromBrowserState:
@end @end
@implementation BrowsingDataRemovalController { @implementation BrowsingDataRemovalController {
// Wrapper around IOSChromeBrowsingDataRemover that serializes removal // Mapping from ChromeBrowserState to the IOSChromeBrowsingDataRemover used
// operations. // for removal of the data on that instance.
std::unique_ptr<BrowsingDataRemoverHelper> _browsingDataRemoverHelper; base::flat_map<ios::ChromeBrowserState*,
std::unique_ptr<IOSChromeBrowsingDataRemover>>
_browingDataRemovers;
// A map that tracks the number of pending removals for a given // A map that tracks the number of pending removals for a given
// ChromeBrowserState. // ChromeBrowserState.
base::hash_map<ios::ChromeBrowserState*, int> _pendingRemovalCount; base::flat_map<ios::ChromeBrowserState*, int> _pendingRemovalCount;
}
- (instancetype)init {
if ((self = [super init])) {
_browsingDataRemoverHelper.reset(new BrowsingDataRemoverHelper());
}
return self;
} }
- (void)removeBrowsingDataFromBrowserState: - (void)removeBrowsingDataFromBrowserState:
...@@ -189,10 +178,19 @@ removeIOSSpecificPersistentIncognitoDataFromBrowserState: ...@@ -189,10 +178,19 @@ removeIOSSpecificPersistentIncognitoDataFromBrowserState:
if (!browserState->IsOffTheRecord()) { if (!browserState->IsOffTheRecord()) {
callbackCounter->IncrementCount(); callbackCounter->IncrementCount();
_browsingDataRemoverHelper->Remove(browserState, mask, timePeriod, auto iterator = _browingDataRemovers.find(browserState);
base::BindBlockArc(^{ if (iterator == _browingDataRemovers.end()) {
callbackCounter->DecrementCount(); iterator =
})); _browingDataRemovers
.emplace(
browserState,
std::make_unique<IOSChromeBrowsingDataRemover>(browserState))
.first;
DCHECK(iterator != _browingDataRemovers.end());
}
iterator->second->Remove(timePeriod, mask, base::BindBlockArc(^{
callbackCounter->DecrementCount();
}));
} }
} }
...@@ -301,8 +299,7 @@ removeWKWebViewCreatedBrowsingDataFromBrowserState: ...@@ -301,8 +299,7 @@ removeWKWebViewCreatedBrowsingDataFromBrowserState:
callbackCounter->DecrementCount(); callbackCounter->DecrementCount();
}; };
// Converts browsing data types from // Converts browsing data types from BrowsingDataRemoveMask to
// IOSChromeBrowsingDataRemover::RemoveDataMask to
// WKWebsiteDataStore strings. // WKWebsiteDataStore strings.
NSMutableSet* dataTypesToRemove = [[NSMutableSet alloc] init]; NSMutableSet* dataTypesToRemove = [[NSMutableSet alloc] init];
if (IsRemoveDataMaskSet(mask, BrowsingDataRemoveMask::REMOVE_CACHE_STORAGE)) { if (IsRemoveDataMaskSet(mask, BrowsingDataRemoveMask::REMOVE_CACHE_STORAGE)) {
...@@ -444,6 +441,7 @@ removeIOSSpecificPersistentIncognitoDataFromBrowserState: ...@@ -444,6 +441,7 @@ removeIOSSpecificPersistentIncognitoDataFromBrowserState:
} }
- (void)browserStateDestroyed:(ios::ChromeBrowserState*)browserState { - (void)browserStateDestroyed:(ios::ChromeBrowserState*)browserState {
_browingDataRemovers.erase(browserState);
_pendingRemovalCount.erase(browserState); _pendingRemovalCount.erase(browserState);
} }
......
// 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_remover_helper.h"
#include <utility>
#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
BrowsingDataRemoverHelper::BrowsingDataRemoverHelper()
: current_remover_(nullptr) {}
BrowsingDataRemoverHelper::~BrowsingDataRemoverHelper() {
DCHECK(pending_removals_.empty());
}
BrowsingDataRemoverHelper::BrowsingDataRemovalInfo::BrowsingDataRemovalInfo(
BrowsingDataRemoveMask remove_mask,
browsing_data::TimePeriod time_period,
const base::Closure& callback)
: remove_mask(remove_mask), time_period(time_period) {
callbacks.push_back(callback);
}
BrowsingDataRemoverHelper::BrowsingDataRemovalInfo::~BrowsingDataRemovalInfo() {
}
void BrowsingDataRemoverHelper::Remove(ios::ChromeBrowserState* browser_state,
BrowsingDataRemoveMask remove_mask,
browsing_data::TimePeriod time_period,
const base::Closure& callback) {
DCHECK(browser_state);
DCHECK(!browser_state->IsOffTheRecord());
// IOSChromeBrowsingDataRemover::Callbacks are called before
// OnIOSChromeBrowsingDataRemoverDone() and after
// IOSChromeBrowsingDataRemover::is_removing() is set to false. In this
// window, |current_remover_| needs to be checked as well.
if (current_remover_ || IOSChromeBrowsingDataRemover::is_removing()) {
// IOSChromeBrowsingDataRemover is not re-entrant. If it is already running,
// add the browser_state to |pending_removals_| for later deletion. If the
// browser_state is already scheduled for removal of browsing data, update
// the remove mask and callbacks.
DCHECK(current_remover_);
auto pending_removals_iter = pending_removals_.find(browser_state);
if (pending_removals_iter == pending_removals_.end()) {
std::unique_ptr<BrowsingDataRemovalInfo> removal_info(
new BrowsingDataRemovalInfo(remove_mask, time_period, callback));
pending_removals_[browser_state] = std::move(removal_info);
} else {
pending_removals_iter->second->remove_mask |= remove_mask;
pending_removals_iter->second->callbacks.push_back(callback);
}
} else {
std::unique_ptr<BrowsingDataRemovalInfo> removal_info(
new BrowsingDataRemovalInfo(remove_mask, time_period, callback));
DoRemove(browser_state, std::move(removal_info));
}
}
void BrowsingDataRemoverHelper::OnIOSChromeBrowsingDataRemoverDone() {
current_remover_ = nullptr;
DCHECK(current_removal_info_);
// Inform clients of the currently finished removal operation that browsing
// data was removed.
for (const auto& callback : current_removal_info_->callbacks) {
if (!callback.is_null()) {
callback.Run();
}
}
current_removal_info_.reset();
if (pending_removals_.empty())
return;
ios::ChromeBrowserState* next_browser_state =
pending_removals_.begin()->first;
std::unique_ptr<BrowsingDataRemovalInfo> removal_info =
std::move(pending_removals_[next_browser_state]);
pending_removals_.erase(next_browser_state);
DoRemove(next_browser_state, std::move(removal_info));
}
void BrowsingDataRemoverHelper::DoRemove(
ios::ChromeBrowserState* browser_state,
std::unique_ptr<BrowsingDataRemovalInfo> removal_info) {
DCHECK(!current_remover_ && !IOSChromeBrowsingDataRemover::is_removing());
current_removal_info_ = std::move(removal_info);
// IOSChromeBrowsingDataRemover deletes itself.
IOSChromeBrowsingDataRemover* remover =
IOSChromeBrowsingDataRemover::CreateForPeriod(
browser_state, current_removal_info_->time_period);
remover->AddObserver(this);
current_remover_ = remover;
BrowsingDataRemoveMask remove_mask = current_removal_info_->remove_mask;
remover->Remove(remove_mask);
}
// 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_REMOVER_HELPER_H_
#define IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_HELPER_H_
#include <map>
#include <memory>
#include <vector>
#include "base/callback.h"
#include "ios/chrome/browser/browsing_data/browsing_data_remove_mask.h"
#include "ios/chrome/browser/browsing_data/ios_chrome_browsing_data_remover.h"
namespace ios {
class ChromeBrowserState;
}
// A helper class that serializes execution of IOSChromeBrowsingDataRemover
// methods since the IOSChromeBrowsingDataRemover APIs are not re-entrant.
class BrowsingDataRemoverHelper
: public IOSChromeBrowsingDataRemover::Observer {
public:
BrowsingDataRemoverHelper();
~BrowsingDataRemoverHelper() override;
// Removes the specified browsing data associated with |browser_state|. Calls
// |callback| when the browsing data is actually removed. |browser_state|
// cannot be null and must not be off the record.
// |callback| is called on the main thread.
// Note: Removal operations are not necessarily processed in the sequence that
// they are received in.
void Remove(ios::ChromeBrowserState* browser_state,
BrowsingDataRemoveMask remove_mask,
browsing_data::TimePeriod time_period,
const base::Closure& callback);
private:
// Encapsulates the information that is needed to remove browsing data from
// a ChromeBrowserState.
struct BrowsingDataRemovalInfo {
// Creates a BrowsingDataRemovalInfo with a single callback |callback|.
BrowsingDataRemovalInfo(BrowsingDataRemoveMask remove_mask,
browsing_data::TimePeriod time_period,
const base::Closure& callback);
~BrowsingDataRemovalInfo();
// The mask of all the types of browsing data that needs to be removed.
BrowsingDataRemoveMask remove_mask;
// Time period for which the user wants to remove the data.
browsing_data::TimePeriod time_period;
// The vector of callbacks that need to be run when browsing data is
// actually removed.
std::vector<base::Closure> callbacks;
};
// IOSChromeBrowsingDataRemover::Observer methods.
void OnIOSChromeBrowsingDataRemoverDone() override;
// Removes the browsing data using IOSChromeBrowsingDataRemover.
// IOSChromeBrowsingDataRemover
// must not be running.
void DoRemove(ios::ChromeBrowserState* browser_state,
std::unique_ptr<BrowsingDataRemovalInfo> removal_info);
// A map that contains the all the ChromeBrowserStates that have a removal
// operation pending along with their associated BrowsingDataRemovalInfo.
std::map<ios::ChromeBrowserState*, std::unique_ptr<BrowsingDataRemovalInfo>>
pending_removals_;
// The BrowsingDataRemovalInfo of the currently enqueued removal operation.
std::unique_ptr<BrowsingDataRemovalInfo> current_removal_info_;
// The actual object that perfoms the removal of browsing data.
IOSChromeBrowsingDataRemover* current_remover_;
};
#endif // IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_HELPER_H_
...@@ -5,24 +5,19 @@ ...@@ -5,24 +5,19 @@
#ifndef IOS_CHROME_BROWSER_BROWSING_DATA_IOS_CHROME_BROWSING_DATA_REMOVER_H_ #ifndef IOS_CHROME_BROWSER_BROWSING_DATA_IOS_CHROME_BROWSING_DATA_REMOVER_H_
#define IOS_CHROME_BROWSER_BROWSING_DATA_IOS_CHROME_BROWSING_DATA_REMOVER_H_ #define IOS_CHROME_BROWSER_BROWSING_DATA_IOS_CHROME_BROWSING_DATA_REMOVER_H_
#include <stdint.h>
#include <memory> #include <memory>
#include <set>
#include "base/callback.h" #include "base/callback.h"
#include "base/containers/queue.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/weak_ptr.h" #include "base/memory/weak_ptr.h"
#include "base/observer_list.h" #include "base/sequence_checker.h"
#include "base/sequenced_task_runner_helpers.h"
#include "base/task/cancelable_task_tracker.h" #include "base/task/cancelable_task_tracker.h"
#include "base/time/time.h" #include "base/time/time.h"
#include "components/browsing_data/core/browsing_data_utils.h" #include "components/browsing_data/core/browsing_data_utils.h"
#include "components/prefs/pref_member.h" #include "components/prefs/pref_member.h"
#include "components/search_engines/template_url_service.h" #include "components/search_engines/template_url_service.h"
#include "ios/chrome/browser/browsing_data/browsing_data_remove_mask.h" #include "ios/chrome/browser/browsing_data/browsing_data_remove_mask.h"
#include "url/gurl.h"
#include "url/origin.h"
namespace ios { namespace ios {
class ChromeBrowserState; class ChromeBrowserState;
...@@ -34,73 +29,60 @@ class URLRequestContextGetter; ...@@ -34,73 +29,60 @@ class URLRequestContextGetter;
// IOSChromeBrowsingDataRemover is responsible for removing data related to // IOSChromeBrowsingDataRemover is responsible for removing data related to
// browsing: visits in url database, downloads, cookies ... // browsing: visits in url database, downloads, cookies ...
class IOSChromeBrowsingDataRemover { class IOSChromeBrowsingDataRemover {
public: public:
// This value is here to allow compilation of downstream code. It will be // Creates a IOSChromeBrowsingDataRemover to remove browser data from the
// removed once downstream code has been fixed to use BrowsingDataRemoveMask. // specified ChromeBrowserstate. Use Remove to initiate the removal.
const BrowsingDataRemoveMask REMOVE_ALL = BrowsingDataRemoveMask::REMOVE_ALL; explicit IOSChromeBrowsingDataRemover(ios::ChromeBrowserState* browser_state);
~IOSChromeBrowsingDataRemover();
// Observer is notified when the removal is done. Done means keywords have
// been deleted, cache cleared and all other tasks scheduled.
class Observer {
public:
virtual void OnIOSChromeBrowsingDataRemoverDone() = 0;
protected:
virtual ~Observer() {}
};
// Creates a IOSChromeBrowsingDataRemover bound to a specific period of time
// (as defined via a TimePeriod). Returns a raw pointer, as
// IOSChromeBrowsingDataRemover retains ownership of itself, and deletes
// itself once finished.
static IOSChromeBrowsingDataRemover* CreateForPeriod(
ios::ChromeBrowserState* browser_state,
browsing_data::TimePeriod period);
// Is the IOSChromeBrowsingDataRemover currently in the process of removing
// data?
static bool is_removing() { return is_removing_; }
// Removes the specified items related to browsing for all origins. // Is the object currently in the process of removing data?
void Remove(BrowsingDataRemoveMask mask); bool is_removing() { return is_removing_; }
void AddObserver(Observer* observer); // Removes browsing data for the given |time_range| with data types specified
void RemoveObserver(Observer* observer); // by |remove_mask|. The |callback| is invoked asynchronously when the data
// has been removed.
void Remove(browsing_data::TimePeriod time_period,
BrowsingDataRemoveMask remove_mask,
base::OnceClosure callback);
private: private:
// Represents a single removal task. Contains all parameters to execute it.
struct RemovalTask {
RemovalTask(base::Time delete_begin,
base::Time delete_end,
BrowsingDataRemoveMask mask,
base::OnceClosure callback);
RemovalTask(RemovalTask&& other) noexcept;
~RemovalTask();
base::Time delete_begin;
base::Time delete_end;
BrowsingDataRemoveMask mask;
base::OnceClosure callback;
};
// Setter for |is_removing_|; DCHECKs that we can only start removing if we're // Setter for |is_removing_|; DCHECKs that we can only start removing if we're
// not already removing, and vice-versa. // not already removing, and vice-versa.
static void set_removing(bool is_removing); void SetRemoving(bool is_removing);
// Creates a IOSChromeBrowsingDataRemover to remove browser data from the
// specified profile in the specified time range. Use Remove to initiate the
// removal.
IOSChromeBrowsingDataRemover(ios::ChromeBrowserState* browser_state,
base::Time delete_begin,
base::Time delete_end);
// IOSChromeBrowsingDataRemover deletes itself (using DeleteHelper) and is
// not supposed to be deleted by other objects so make destructor private and
// DeleteHelper a friend.
friend class base::DeleteHelper<IOSChromeBrowsingDataRemover>;
~IOSChromeBrowsingDataRemover();
// Callback for when TemplateURLService has finished loading. Clears the data, // Callback for when TemplateURLService has finished loading. Clears the data,
// and invoke the callback. // and invoke the callback.
void OnKeywordsLoaded(base::OnceClosure callback); void OnKeywordsLoaded(base::Time delete_begin,
base::Time delete_end,
base::OnceClosure callback);
// Removes the specified items related to browsing for a specific host. If the // Execute the next removal task. Called after the previous task was finished
// provided |remove_url| is empty, data is removed for all origins. // or directly from Remove.
// TODO(mkwst): The current implementation relies on unique (empty) origins to void RunNextTask();
// signal removal of all origins. Reconsider this behavior if/when we build
// a "forget this site" feature.
void RemoveImpl(BrowsingDataRemoveMask mask);
// Notifies observers and deletes this object. // Removes the specified items related to browsing.
void NotifyAndDelete(); void RemoveImpl(base::Time delete_begin,
base::Time delete_end,
BrowsingDataRemoveMask mask);
// Invokes the current task callback that the removal has completed.
void NotifyRemovalComplete();
// Called by the closures returned by CreatePendingTaskCompletionClosure(). // Called by the closures returned by CreatePendingTaskCompletionClosure().
// Checks if all tasks have completed, and if so, calls Notify(). // Checks if all tasks have completed, and if so, calls Notify().
...@@ -115,28 +97,23 @@ class IOSChromeBrowsingDataRemover { ...@@ -115,28 +97,23 @@ class IOSChromeBrowsingDataRemover {
// purposes. // purposes.
base::WeakPtr<IOSChromeBrowsingDataRemover> GetWeakPtr(); base::WeakPtr<IOSChromeBrowsingDataRemover> GetWeakPtr();
// ChromeBrowserState we're to remove from. // This object is sequence affine.
ios::ChromeBrowserState* browser_state_; SEQUENCE_CHECKER(sequence_checker_);
// Start time to delete from.
const base::Time delete_begin_;
// End time to delete to.
base::Time delete_end_;
// True if Remove has been invoked. // ChromeBrowserState we're to remove from.
static bool is_removing_; ios::ChromeBrowserState* browser_state_ = nullptr;
// Used to delete data from HTTP cache. // Used to delete data from HTTP cache.
scoped_refptr<net::URLRequestContextGetter> main_context_getter_; scoped_refptr<net::URLRequestContextGetter> context_getter_;
// Is the object currently in the process of removing data?
bool is_removing_ = false;
// Number of pending tasks. // Number of pending tasks.
int pending_tasks_count_ = 0; int pending_tasks_count_ = 0;
// The removal mask for the current removal operation. // Removal tasks to be processed.
BrowsingDataRemoveMask remove_mask_ = BrowsingDataRemoveMask::REMOVE_NOTHING; base::queue<RemovalTask> removal_queue_;
base::ObserverList<Observer> observer_list_;
// Used if we need to clear history. // Used if we need to clear history.
base::CancelableTaskTracker history_task_tracker_; base::CancelableTaskTracker history_task_tracker_;
......
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