| // 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. |
| |
| #ifndef CHROME_BROWSER_BROWSING_DATA_CHROME_BROWSING_DATA_REMOVER_DELEGATE_H_ |
| #define CHROME_BROWSER_BROWSING_DATA_CHROME_BROWSING_DATA_REMOVER_DELEGATE_H_ |
| |
| #include <memory> |
| |
| #include "base/cancelable_callback.h" |
| #include "base/functional/callback_forward.h" |
| #include "base/memory/raw_ptr.h" |
| #include "base/memory/weak_ptr.h" |
| #include "base/synchronization/waitable_event_watcher.h" |
| #include "base/task/cancelable_task_tracker.h" |
| #include "base/time/time.h" |
| #include "build/build_config.h" |
| #include "chrome/common/buildflags.h" |
| #include "components/browsing_data/core/browsing_data_utils.h" |
| #include "components/keyed_service/core/keyed_service.h" |
| #include "components/offline_pages/core/offline_page_model.h" |
| #include "content/public/browser/browsing_data_remover.h" |
| #include "content/public/browser/browsing_data_remover_delegate.h" |
| #include "content/public/common/buildflags.h" |
| #include "device/fido/platform_credential_store.h" |
| #include "extensions/buildflags/buildflags.h" |
| #include "media/media_buildflags.h" |
| #include "services/network/public/mojom/network_context.mojom.h" |
| |
| class Profile; |
| class ScopedProfileKeepAlive; |
| class WebappRegistry; |
| |
| namespace base { |
| class WaitableEvent; |
| } |
| |
| namespace content { |
| class BrowserContext; |
| class StoragePartition; |
| } |
| |
| namespace webrtc_event_logging { |
| class WebRtcEventLogManager; |
| } // namespace webrtc_event_logging |
| |
| // A delegate used by BrowsingDataRemover to delete data specific to Chrome |
| // as the embedder. |
| class ChromeBrowsingDataRemoverDelegate |
| : public content::BrowsingDataRemoverDelegate, |
| public KeyedService { |
| public: |
| explicit ChromeBrowsingDataRemoverDelegate( |
| content::BrowserContext* browser_context); |
| |
| ChromeBrowsingDataRemoverDelegate(const ChromeBrowsingDataRemoverDelegate&) = |
| delete; |
| ChromeBrowsingDataRemoverDelegate& operator=( |
| const ChromeBrowsingDataRemoverDelegate&) = delete; |
| |
| ~ChromeBrowsingDataRemoverDelegate() override; |
| |
| // KeyedService: |
| void Shutdown() override; |
| |
| // BrowsingDataRemoverDelegate: |
| content::BrowsingDataRemoverDelegate::EmbedderOriginTypeMatcher |
| GetOriginTypeMatcher() override; |
| bool MayRemoveDownloadHistory() override; |
| std::vector<std::string> GetDomainsForDeferredCookieDeletion( |
| content::StoragePartition* storage_partition, |
| uint64_t remove_mask) override; |
| void RemoveEmbedderData( |
| const base::Time& delete_begin, |
| const base::Time& delete_end, |
| uint64_t remove_mask, |
| content::BrowsingDataFilterBuilder* filter_builder, |
| uint64_t origin_type_mask, |
| base::OnceCallback<void(/*failed_data_types=*/uint64_t)> callback) |
| override; |
| void OnStartRemoving() override; |
| void OnDoneRemoving() override; |
| |
| #if BUILDFLAG(IS_ANDROID) |
| void OverrideWebappRegistryForTesting( |
| std::unique_ptr<WebappRegistry> webapp_registry); |
| #endif |
| |
| using DomainReliabilityClearer = base::RepeatingCallback<void( |
| content::BrowsingDataFilterBuilder* filter_builder, |
| network::mojom::NetworkContext_DomainReliabilityClearMode, |
| network::mojom::NetworkContext::ClearDomainReliabilityCallback)>; |
| void OverrideDomainReliabilityClearerForTesting( |
| DomainReliabilityClearer clearer); |
| |
| private: |
| using WebRtcEventLogManager = webrtc_event_logging::WebRtcEventLogManager; |
| |
| // For debugging purposes. Please add new deletion tasks at the end. |
| // This enum is recorded in a histogram, so don't change or reuse ids. |
| // LINT.IfChange(TracingDataType) |
| enum class TracingDataType { |
| kSynchronous = 1, |
| kHistory = 2, |
| // kHostNameResolution = 3, deprecated |
| // kNaclCache = 4, deprecated |
| // kPnaclCache = 5, deprecated |
| kAutofillData = 6, |
| kAutofillOrigins = 7, |
| // kPluginData = 8, deprecated |
| // kFlashLsoHelper = 9, deprecated |
| kDomainReliability = 10, |
| // kNetworkPredictor = 11, deprecated |
| kWebrtcLogs = 12, |
| kVideoDecodeHistory = 13, |
| kCookies = 14, |
| kPasswords = 15, |
| kHttpAuthCache = 16, |
| // See also kDisableAutoSigninForAccountPasswords. |
| kDisableAutoSigninForProfilePasswords = 17, |
| kPasswordsStatistics = 18, |
| // kKeywordsModel = 19, deprecated |
| kReportingCache = 20, |
| kNetworkErrorLogging = 21, |
| // kFlashDeauthorization = 22, deprecated |
| kOfflinePages = 23, |
| // kPrecache = 24, deprecated |
| // kExploreSites = 25, deprecated |
| // kLegacyStrikes = 26, deprecated |
| kWebrtcEventLogs = 27, |
| kCdmLicenses = 28, |
| kHostCache = 29, |
| kTpmAttestationKeys = 30, |
| // kStrikes = 31, deprecated |
| // kLeakedCredentials = 32, deprecated |
| // kFieldInfo = 33, deprecated |
| // kCompromisedCredentials = 34, deprecated |
| kUserDataSnapshot = 35, |
| // kMediaFeeds = 36, deprecated |
| kAccountPasswords = 37, |
| kAccountPasswordsSynced = 38, |
| // kAccountCompromisedCredentials = 39, deprecated |
| kFaviconCacheExpiration = 40, |
| kSecurePaymentConfirmationCredentials = 41, |
| kWebAppHistory = 42, |
| kWebAuthnCredentials = 43, |
| kWebrtcVideoPerfHistory = 44, |
| kMediaDeviceSalts = 45, |
| // See also kDisableAutoSigninForProfilePasswords. |
| kDisableAutoSigninForAccountPasswords = 46, |
| |
| kMaxValue = kDisableAutoSigninForAccountPasswords, |
| }; |
| // LINT.ThenChange(//tools/metrics/histograms/metadata/history/enums.xml:ChromeBrowsingDataRemoverTasks) |
| |
| // Returns the suffix for the |
| // History.ClearBrowsingData.Duration.ChromeTask.{Task} histogram |
| const char* GetHistogramSuffix(TracingDataType task); |
| |
| // Called by CreateTaskCompletionClosure(). |
| void OnTaskStarted(TracingDataType data_type); |
| |
| // Called by the closures returned by CreateTaskCompletionClosure(). |
| // Checks if all tasks have completed, and if so, calls callback_. |
| void OnTaskComplete(TracingDataType data_type, |
| uint64_t data_type_mask, |
| base::TimeTicks started, |
| bool success); |
| |
| // 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 CreateTaskCompletionClosure(TracingDataType data_type); |
| // Like CreateTaskCompletionClosure(), but allows tracking success/failure of |
| // the task. If |success = false| is passed to the callback, |data_type_mask| |
| // will be added to |failed_data_types_|. |
| base::OnceCallback<void(bool /* success */)> CreateTaskCompletionCallback( |
| TracingDataType data_type, |
| uint64_t data_type_mask); |
| |
| // Same as CreateTaskCompletionClosure() but guarantees that |
| // OnTaskComplete() is called if the task is dropped. That can typically |
| // happen when the connection is closed while an interface call is made. |
| base::OnceClosure CreateTaskCompletionClosureForMojo( |
| TracingDataType data_type); |
| |
| // Records unfinished tasks from |pending_sub_tasks_| after a delay. |
| void RecordUnfinishedSubTasks(); |
| |
| // A helper method that checks if time period is for "all time". |
| bool IsForAllTime() const; |
| |
| #if BUILDFLAG(IS_CHROMEOS) |
| void OnClearPlatformKeys(base::OnceClosure done, bool); |
| #endif |
| |
| #if BUILDFLAG(ENABLE_PLUGINS) |
| // Called when plugin data has been cleared. Invokes NotifyIfDone. |
| void OnWaitableEventSignaled(base::OnceClosure done, |
| base::WaitableEvent* waitable_event); |
| #endif |
| |
| std::unique_ptr<device::fido::PlatformCredentialStore> MakeCredentialStore(); |
| |
| // See `deferred_disable_passwords_auto_signin_cb_`. |
| void DisablePasswordsAutoSignin( |
| const base::RepeatingCallback<bool(const GURL&)>& url_filter); |
| |
| // The profile for which the data will be deleted. |
| raw_ptr<Profile> profile_; |
| |
| // Prevents |profile_| from getting deleted. Only active between |
| // OnStartRemoving() and OnDoneRemoving(), i.e. while there are tasks in |
| // progress. |
| std::unique_ptr<ScopedProfileKeepAlive> profile_keep_alive_; |
| |
| // Start time to delete from. |
| base::Time delete_begin_; |
| |
| // End time to delete to. |
| base::Time delete_end_; |
| |
| // Completion callback to call when all data are deleted. |
| base::OnceCallback<void(uint64_t)> callback_; |
| |
| // Records which tasks of a deletion are currently active. |
| std::set<TracingDataType> pending_sub_tasks_; |
| |
| uint64_t failed_data_types_ = 0; |
| |
| // Fires after some time to track slow tasks. Cancelled when all tasks |
| // are finished. |
| base::CancelableOnceClosure slow_pending_tasks_closure_; |
| |
| DomainReliabilityClearer domain_reliability_clearer_; |
| |
| // Used if we need to clear history. |
| base::CancelableTaskTracker history_task_tracker_; |
| |
| #if BUILDFLAG(IS_ANDROID) |
| // WebappRegistry makes calls across the JNI. In unit tests, the Java side is |
| // not initialised, so the registry must be mocked out. |
| std::unique_ptr<WebappRegistry> webapp_registry_; |
| #endif |
| |
| // PasswordStore::DisableAutoSignInForOrigins() is required when wiping |
| // DATA_TYPE_COOKIES, but that must be deferred until any password deletions |
| // have completed, to avoid resurrecting passwords (c.f. crbug.com/325323180). |
| // This field serves that: it'll be executed in OnTasksComplete() when all |
| // other tasks are done. Executing it adds to `pending_sub_tasks_` again. |
| // OnBrowsingDataRemoverDone() is only called after the (async) auto-signin |
| // disabling has completed. |
| // Note disabling auto sign-in is asynchronous. |
| base::OnceClosure deferred_disable_passwords_auto_signin_cb_; |
| |
| std::unique_ptr<device::fido::PlatformCredentialStore> credential_store_; |
| |
| base::WeakPtrFactory<ChromeBrowsingDataRemoverDelegate> weak_ptr_factory_{ |
| this}; |
| }; |
| |
| #endif // CHROME_BROWSER_BROWSING_DATA_CHROME_BROWSING_DATA_REMOVER_DELEGATE_H_ |