blob: 6510d284688859192fda0e2ae5eb96300bf62ed1 [file] [log] [blame]
// Copyright 2021 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_SESSIONS_SESSION_DATA_SERVICE_H_
#define CHROME_BROWSER_SESSIONS_SESSION_DATA_SERVICE_H_
#include <memory>
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "chrome/browser/ui/browser_list_observer.h"
#include "components/keyed_service/core/keyed_service.h"
class Profile;
class SessionDataDeleter;
namespace user_prefs {
class PrefRegistrySyncable;
}
// SessionDataService is responsible for deleting SessionOnly cookies and
// site data when the browser or all windows of a profile are closed.
class SessionDataService : public BrowserListObserver, public KeyedService {
public:
// These values are persisted to logs. Entries should not be renumbered and
// numeric values should never be reused.
enum class Status {
kUninitialized = 0,
kInitialized = 1,
kDeletionStarted = 2,
kDeletionFinished = 3,
kNoDeletionDueToForceKeepSessionData = 4,
kNoDeletionDueToShutdown = 5,
kMaxValue = kNoDeletionDueToShutdown,
};
explicit SessionDataService(Profile* profile,
std::unique_ptr<SessionDataDeleter> deleter);
SessionDataService(const SessionDataService&) = delete;
SessionDataService& operator=(const SessionDataService&) = delete;
~SessionDataService() override;
static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
// Starts a deletion of session only cookies and storage unless the deletion
// is already running or the browser is already shutting down. Called at
// shutdown.
void StartCleanup();
// Instructs this class not to delete session state on shutdown.
void SetForceKeepSessionState();
private:
// BrowserListObserver:
void OnBrowserAdded(Browser* browser) override;
void OnBrowserRemoved(Browser* browser) override;
// Starts a deletion of session only cookies and storage unless the deletion
// is already running or the browser is already shutting down.
// If |skip_session_cookies| is set to true, only cookies with session-only
// content setting are removed.
void StartCleanupInternal(bool skip_session_cookies);
// Starts another data deletion if the deletion at the end of the last session
// did not finish.
void MaybeContinueDeletionFromLastSesssion(Status last_status);
void SetStatusPref(Status status);
void OnCleanupAtStartupFinished();
void OnCleanupAtSessionEndFinished();
raw_ptr<Profile> profile_;
std::unique_ptr<SessionDataDeleter> deleter_;
// A flag that is set to skip session data deletion on restarts.
bool force_keep_session_state_ = false;
// A flag to indicate that a deletion was started and further requests for
// cleanup should be ignored.
bool cleanup_started_ = false;
base::WeakPtrFactory<SessionDataService> weak_factory_{this};
};
#endif // CHROME_BROWSER_SESSIONS_SESSION_DATA_SERVICE_H_