blob: 6708519017efb2517887ded0a20c407bb7383c69 [file] [log] [blame]
// 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 CONTENT_PUBLIC_BROWSER_BROWSING_DATA_REMOVER_H_
#define CONTENT_PUBLIC_BROWSER_BROWSING_DATA_REMOVER_H_
#include <memory>
#include "base/callback_forward.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
#include "build/build_config.h"
namespace storage {
class SpecialStoragePolicy;
}
namespace url {
class Origin;
}
namespace content {
class BrowsingDataFilterBuilder;
class BrowsingDataRemoverDelegate;
////////////////////////////////////////////////////////////////////////////////
// BrowsingDataRemover is responsible for removing data related to browsing:
// visits in url database, downloads, cookies ...
//
// USAGE:
//
// 0. Instantiation.
//
// content::BrowsingDataRemover* remover =
// content::BrowserContext::GetBrowsingDataRemover(browser_context);
//
// 1. No observer.
//
// remover->Remove(base::Time(), base::Time::Max(), REMOVE_COOKIES, ALL);
//
// 2. Using an observer to report when one's own removal task is finished.
//
// class CookiesDeleter : public content::BrowsingDataRemover::Observer {
// CookiesDeleter() { remover->AddObserver(this); }
// ~CookiesDeleter() { remover->RemoveObserver(this); }
//
// void DeleteCookies() {
// remover->RemoveAndReply(base::Time(), base::Time::Max(),
// REMOVE_COOKIES, ALL, this);
// }
//
// void OnBrowsingDataRemoverDone() {
// LOG(INFO) << "Cookies were deleted.";
// }
// }
//
////////////////////////////////////////////////////////////////////////////////
//
// TODO(crbug.com/668114): BrowsingDataRemover does not currently support plugin
// data deletion. Use PluginDataRemover instead.
class BrowsingDataRemover {
public:
// Mask used for Remove.
enum DataType {
// Storage datatypes.
DATA_TYPE_APP_CACHE = 1 << 0,
DATA_TYPE_FILE_SYSTEMS = 1 << 1,
DATA_TYPE_INDEXED_DB = 1 << 2,
DATA_TYPE_LOCAL_STORAGE = 1 << 3,
DATA_TYPE_WEB_SQL = 1 << 4,
DATA_TYPE_SERVICE_WORKERS = 1 << 5,
DATA_TYPE_CACHE_STORAGE = 1 << 6,
// This is also persisted, keep with storage datatypes.
DATA_TYPE_BACKGROUND_FETCH = 1 << 14,
// Used to request the deletion of embedder-specific storage datatypes.
DATA_TYPE_EMBEDDER_DOM_STORAGE = 1 << 7,
// DOM-accessible storage (https://www.w3.org/TR/clear-site-data/#storage).
// Has the same effect as selecting all storage datatypes listed above
// and ones defined by the embedder.
DATA_TYPE_DOM_STORAGE =
DATA_TYPE_APP_CACHE | DATA_TYPE_FILE_SYSTEMS | DATA_TYPE_INDEXED_DB |
DATA_TYPE_LOCAL_STORAGE | DATA_TYPE_WEB_SQL |
DATA_TYPE_SERVICE_WORKERS | DATA_TYPE_CACHE_STORAGE |
DATA_TYPE_EMBEDDER_DOM_STORAGE | DATA_TYPE_BACKGROUND_FETCH,
// Other datatypes.
DATA_TYPE_COOKIES = 1 << 8,
DATA_TYPE_CHANNEL_IDS = 1 << 9,
DATA_TYPE_CACHE = 1 << 10,
DATA_TYPE_DOWNLOADS = 1 << 11,
DATA_TYPE_MEDIA_LICENSES = 1 << 12,
// REMOVE_NOCHECKS intentionally does not check if the browser context is
// prohibited from deleting history or downloads.
DATA_TYPE_NO_CHECKS = 1 << 13,
// AVOID_CLOSING_CONNECTIONS is a pseudo-datatype indicating that when
// deleting COOKIES and CHANNEL IDs, BrowsingDataRemover should skip
// storage backends whose deletion would cause closing network connections.
// TODO(crbug.com/798760): Remove when fixed.
DATA_TYPE_AVOID_CLOSING_CONNECTIONS = 1 << 15,
// Embedders can add more datatypes beyond this point.
DATA_TYPE_CONTENT_END = DATA_TYPE_AVOID_CLOSING_CONNECTIONS,
};
enum OriginType {
// Web storage origins that StoragePartition recognizes as NOT protected
// according to its special storage policy.
ORIGIN_TYPE_UNPROTECTED_WEB = 1 << 0,
// Web storage origins that StoragePartition recognizes as protected
// according to its special storage policy.
ORIGIN_TYPE_PROTECTED_WEB = 1 << 1,
// Embedders can add more origin types beyond this point.
ORIGIN_TYPE_CONTENT_END = ORIGIN_TYPE_PROTECTED_WEB,
};
// A helper enum to report the deletion of cookies and/or cache. Do not
// reorder the entries, as this enum is passed to UMA.
// A Java counterpart will be generated for this enum so that it can be
// logged on Android.
// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.chrome.browser.browsing_data
enum CookieOrCacheDeletionChoice {
NEITHER_COOKIES_NOR_CACHE,
ONLY_COOKIES,
ONLY_CACHE,
BOTH_COOKIES_AND_CACHE,
MAX_CHOICE_VALUE
};
// Observer is notified when its own removal task is done.
class Observer {
public:
// Called when a removal task is finished. Note that every removal task can
// only have one observer attached to it, and only that one is called.
virtual void OnBrowsingDataRemoverDone() = 0;
protected:
virtual ~Observer() {}
};
// A delegate that will take care of deleting embedder-specific data.
virtual void SetEmbedderDelegate(
BrowsingDataRemoverDelegate* embedder_delegate) = 0;
// Determines whether |origin| matches the |origin_type_mask| according to
// the |special_storage_policy|.
virtual bool DoesOriginMatchMask(
int origin_type_mask,
const url::Origin& origin,
storage::SpecialStoragePolicy* special_storage_policy) const = 0;
// Removes browsing data within the given |time_range|, with datatypes being
// specified by |remove_mask| and origin types by |origin_type_mask|.
virtual void Remove(const base::Time& delete_begin,
const base::Time& delete_end,
int remove_mask,
int origin_type_mask) = 0;
// A version of the above that in addition informs the |observer| when the
// removal task is finished.
virtual void RemoveAndReply(const base::Time& delete_begin,
const base::Time& delete_end,
int remove_mask,
int origin_type_mask,
Observer* observer) = 0;
// Like Remove(), but in case of URL-keyed only removes data whose URL match
// |filter_builder| (e.g. are on certain origin or domain).
// RemoveWithFilter() currently only works with FILTERABLE_DATA_TYPES.
virtual void RemoveWithFilter(
const base::Time& delete_begin,
const base::Time& delete_end,
int remove_mask,
int origin_type_mask,
std::unique_ptr<BrowsingDataFilterBuilder> filter_builder) = 0;
// A version of the above that in addition informs the |observer| when the
// removal task is finished.
virtual void RemoveWithFilterAndReply(
const base::Time& delete_begin,
const base::Time& delete_end,
int remove_mask,
int origin_type_mask,
std::unique_ptr<BrowsingDataFilterBuilder> filter_builder,
Observer* observer) = 0;
// Observers.
virtual void AddObserver(Observer* observer) = 0;
virtual void RemoveObserver(Observer* observer) = 0;
// A |callback| that will be called just before a deletion task is completed
// and observers are notified. The receiver must respond by calling
// |continue_to_completion| to finish the task. Used in tests to artificially
// prolong execution.
virtual void SetWouldCompleteCallbackForTesting(
const base::Callback<void(const base::Closure& continue_to_completion)>&
callback) = 0;
// Parameters of the last call are exposed to be used by tests. Removal and
// origin type masks equal to -1 mean that no removal has ever been executed.
// TODO(msramek): If other consumers than tests are interested in this,
// consider returning them in OnBrowsingDataRemoverDone() callback. If not,
// consider simplifying this interface by removing these methods and changing
// the tests to record the parameters using GMock instead.
virtual const base::Time& GetLastUsedBeginTime() = 0;
virtual const base::Time& GetLastUsedEndTime() = 0;
virtual int GetLastUsedRemovalMask() = 0;
virtual int GetLastUsedOriginTypeMask() = 0;
};
} // namespace content
#endif // CONTENT_PUBLIC_BROWSER_BROWSING_DATA_REMOVER_H_