blob: 71d48e494526610c95880160dea5db52db7e2eec [file] [log] [blame]
// Copyright 2023 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_STORAGE_ACCESS_API_STORAGE_ACCESS_API_SERVICE_IMPL_H_
#define CHROME_BROWSER_STORAGE_ACCESS_API_STORAGE_ACCESS_API_SERVICE_IMPL_H_
#include "base/memory/weak_ptr.h"
#include "base/sequence_checker.h"
#include "base/thread_annotations.h"
#include "base/timer/timer.h"
#include "chrome/browser/storage_access_api/site_pair_cache.h"
#include "chrome/browser/storage_access_api/storage_access_api_service.h"
#include "components/keyed_service/core/keyed_service.h"
namespace content {
class BrowserContext;
} // namespace content
namespace url {
class Origin;
} // namespace url
// A profile keyed service for Storage Access API state.
//
// This service always exists for a Profile, regardless of whether the Storage
// Access API feature is enabled.
class StorageAccessAPIServiceImpl : public StorageAccessAPIService,
public KeyedService {
public:
explicit StorageAccessAPIServiceImpl(content::BrowserContext* context);
StorageAccessAPIServiceImpl(const StorageAccessAPIServiceImpl&) = delete;
StorageAccessAPIServiceImpl& operator=(const StorageAccessAPIServiceImpl&) =
delete;
~StorageAccessAPIServiceImpl() override;
// StorageAccessAPIService:
std::optional<base::TimeDelta> RenewPermissionGrant(
const url::Origin& embedded_origin,
const url::Origin& top_frame_origin) override;
// KeyedService:
void Shutdown() override;
// Returns whether or not the repeating timer is running, for the purpose of
// testing.
bool IsTimerRunningForTesting() const;
private:
// Handles state updates due to the passage of time.
void OnPeriodicTimerFired();
// The BrowserContext this service instance is associated with.
const raw_ref<content::BrowserContext> browser_context_
GUARDED_BY_CONTEXT(sequence_checker_);
// The grants that have already been updated.
SitePairCache updated_grants_ GUARDED_BY_CONTEXT(sequence_checker_);
// Timer to periodically update state for the associated profile.
base::RepeatingTimer periodic_timer_ GUARDED_BY_CONTEXT(sequence_checker_);
SEQUENCE_CHECKER(sequence_checker_);
base::WeakPtrFactory<StorageAccessAPIServiceImpl> weak_ptr_factory_{this};
};
#endif // CHROME_BROWSER_STORAGE_ACCESS_API_STORAGE_ACCESS_API_SERVICE_IMPL_H_