blob: 5feda6d21f531dad0b65ff37ca50458e47a37cfd [file] [log] [blame]
// Copyright 2015 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_IMPL_H_
#define IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_IMPL_H_
#include <memory>
#include "base/callback.h"
#include "base/containers/queue.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "base/task/cancelable_task_tracker.h"
#include "base/time/time.h"
#include "components/browsing_data/core/browsing_data_utils.h"
#include "components/prefs/pref_member.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_remover.h"
@class SessionServiceIOS;
@class WKWebView;
namespace ios {
class ChromeBrowserState;
}
namespace net {
class URLRequestContextGetter;
}
// BrowsingDataRemoverImpl is the concrete implementation of the
// BrowsingDataRemover abstract interface.
class BrowsingDataRemoverImpl : public BrowsingDataRemover {
public:
// Creates a BrowsingDataRemoverImpl to remove browser data from the
// specified ChromeBrowserstate. Use Remove to initiate the removal.
BrowsingDataRemoverImpl(ios::ChromeBrowserState* browser_state,
SessionServiceIOS* session_service);
~BrowsingDataRemoverImpl() override;
// KeyedService implementation.
void Shutdown() override;
// BrowsingDataRemover implementation.
bool IsRemoving() const override;
void Remove(browsing_data::TimePeriod time_period,
BrowsingDataRemoveMask remove_mask,
base::OnceClosure callback) override;
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;
base::Time task_started;
};
// Setter for |is_removing_|; DCHECKs that we can only start removing if we're
// not already removing, and vice-versa.
void SetRemoving(bool is_removing);
// Callback for when TemplateURLService has finished loading. Clears the data,
// and invoke the callback.
void OnKeywordsLoaded(base::Time delete_begin,
base::Time delete_end,
base::OnceClosure callback);
// Execute the next removal task. Called after the previous task was finished
// or directly from Remove.
void RunNextTask();
// Removes the specified items related to browsing.
void RemoveImpl(base::Time delete_begin,
base::Time delete_end,
BrowsingDataRemoveMask mask);
// Removes the browsing data stored in WKWebsiteDataStore if needed.
void RemoveDataFromWKWebsiteDataStore(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().
// Checks if all tasks have completed, and if so, calls Notify().
void OnTaskComplete();
// Increments the number of pending tasks by one, and returns a OnceClosure
// that calls OnTaskComplete(). The Remover is complete once all the closures
// created by this method have been invoked.
base::OnceClosure CreatePendingTaskCompletionClosure();
// Returns a weak pointer to BrowsingDataRemoverImpl for internal
// purposes.
base::WeakPtr<BrowsingDataRemoverImpl> GetWeakPtr();
// This object is sequence affine.
SEQUENCE_CHECKER(sequence_checker_);
// ChromeBrowserState we're to remove from.
ios::ChromeBrowserState* browser_state_ = nullptr;
// SessionService to use (allow injection of a specific instance for testing).
SessionServiceIOS* session_service_ = nil;
// Dummy WKWebView. A WKWebView object is created before deleting cookies. and
// is deleted after deleting cookies is completed. this is a workaround that
// makes sure that there is a WKWebView object alive while accessing
// WKHTTPCookieStore.
WKWebView* dummy_web_view_ = nil;
// Used to delete data from HTTP cache.
scoped_refptr<net::URLRequestContextGetter> context_getter_;
// Is the object currently in the process of removing data?
bool is_removing_ = false;
// Number of pending tasks.
int pending_tasks_count_ = 0;
// Removal tasks to be processed.
base::queue<RemovalTask> removal_queue_;
// Used if we need to clear history.
base::CancelableTaskTracker history_task_tracker_;
std::unique_ptr<TemplateURLService::Subscription> template_url_subscription_;
base::WeakPtrFactory<BrowsingDataRemoverImpl> weak_ptr_factory_;
DISALLOW_COPY_AND_ASSIGN(BrowsingDataRemoverImpl);
};
#endif // IOS_CHROME_BROWSER_BROWSING_DATA_BROWSING_DATA_REMOVER_IMPL_H_