#ifndef CONTENT_BROWSER_NOTIFICATIONS_PLATFORM_NOTIFICATION_CONTEXT_IMPL_H_
#define CONTENT_BROWSER_NOTIFICATIONS_PLATFORM_NOTIFICATION_CONTEXT_IMPL_H_
#include <stdint.h>
#include <memory>
#include <optional>
#include <set>
#include <string>
#include <vector>
#include "base/files/file_path.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/scoped_refptr.h"
#include "base/time/time.h"
#include "content/browser/notifications/notification_database.h"
#include "content/browser/notifications/notification_id_generator.h"
#include "content/browser/service_worker/service_worker_context_core_observer.h"
#include "content/common/content_export.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/platform_notification_context.h"
#include "content/public/browser/render_process_host.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "third_party/blink/public/mojom/notifications/notification_service.mojom.h"
class GURL;
namespace base {
class SequencedTaskRunner;
}
namespace blink {
class StorageKey;
}
namespace content {
class BlinkNotificationServiceImpl;
class BrowserContext;
struct NotificationDatabaseData;
class PlatformNotificationServiceProxy;
class RenderProcessHost;
class ServiceWorkerContextWrapper;
class WeakDocumentPtr;
class CONTENT_EXPORT PlatformNotificationContextImpl
: public PlatformNotificationContext,
public ServiceWorkerContextCoreObserver {
public:
PlatformNotificationContextImpl(
const base::FilePath& path,
BrowserContext* browser_context,
const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context);
PlatformNotificationContextImpl(const PlatformNotificationContextImpl&) =
delete;
PlatformNotificationContextImpl& operator=(
const PlatformNotificationContextImpl&) = delete;
void Initialize();
void Shutdown();
void CreateService(
RenderProcessHost* render_process_host,
const blink::StorageKey& storage_key,
const GURL& document_url,
const WeakDocumentPtr& weak_document_ptr,
const RenderProcessHost::NotificationServiceCreatorType creator_type,
mojo::PendingReceiver<blink::mojom::NotificationService> receiver);
void RemoveService(BlinkNotificationServiceImpl* service);
NotificationIdGenerator* notification_id_generator() {
return ¬ification_id_generator_;
}
void ReadNotificationDataAndRecordInteraction(
const std::string& notification_id,
const GURL& origin,
Interaction interaction,
ReadResultCallback callback) override;
void ReadNotificationResources(const std::string& notification_id,
const GURL& origin,
ReadResourcesResultCallback callback) override;
void WriteNotificationData(int64_t persistent_notification_id,
int64_t service_worker_registration_id,
const GURL& origin,
const NotificationDatabaseData& database_data,
WriteResultCallback callback) override;
void DeleteNotificationData(const std::string& notification_id,
const GURL& origin,
bool close_notification,
DeleteResultCallback callback) override;
void DeleteAllNotificationDataWithTag(
const std::string& tag,
std::optional<bool> is_shown_by_browser,
const GURL& origin,
DeleteAllResultCallback callback) override;
void DeleteAllNotificationDataForBlockedOrigins(
DeleteAllResultCallback callback) override;
void ReadAllNotificationDataForServiceWorkerRegistration(
const GURL& origin,
int64_t service_worker_registration_id,
ReadAllResultCallback callback) override;
void CountVisibleNotificationsForServiceWorkerRegistration(
const GURL& origin,
int64_t service_worker_registration_id,
CountResultCallback callback) override;
void TriggerNotifications() override;
void WriteNotificationResources(
std::vector<NotificationResourceData> resource_data,
WriteResourcesResultCallback callback) override;
void ReDisplayNotifications(
std::vector<GURL> origins,
ReDisplayNotificationsResultCallback callback) override;
void WriteNotificationMetadata(
const std::string& notification_id,
const GURL& origin,
const std::string& metadata_key,
const std::string& metadata_value,
WriteResourcesResultCallback callback) override;
void OnRegistrationDeleted(int64_t registration_id,
const GURL& pattern,
const blink::StorageKey& key) override;
void OnStorageWiped() override;
private:
friend class PlatformNotificationContextTest;
friend class PlatformNotificationContextTriggerTest;
~PlatformNotificationContextImpl() override;
void DidGetNotifications(std::set<std::string> displayed_notifications,
bool supports_synchronization);
using InitializeResultCallback = base::OnceCallback<void(bool)>;
using ReadAllOriginsResultCallback =
base::OnceCallback<void(bool ,
std::set<GURL> )>;
using InitializeGetDisplayedCallback = base::OnceCallback<void(
std::set<std::string> ,
bool ,
bool )>;
void InitializeDatabase(InitializeResultCallback callback, bool lazy = false);
void DoTriggerNotification(const NotificationDatabaseData& database_data);
void OpenDatabase(InitializeResultCallback callback, bool create_if_missing);
void DoReadNotificationData(const std::string& notification_id,
const GURL& origin,
Interaction interaction,
ReadResultCallback callback,
bool initialized);
void DoReadNotificationResources(const std::string& notification_id,
const GURL& origin,
ReadResourcesResultCallback callback,
bool initialized);
void DoSyncNotificationData(bool supports_synchronization,
std::set<std::string> displayed_notifications,
bool initialized);
void DoHandleSyncNotification(
bool supports_synchronization,
const std::set<std::string>& displayed_notifications,
std::set<std::string>* close_notification_ids,
const NotificationDatabaseData& data);
void TryGetDisplayedNotifications(const GURL& origin,
InitializeGetDisplayedCallback callback);
void OnGetDisplayedNotifications(
InitializeGetDisplayedCallback callback,
std::set<std::string> displayed_notifications,
bool supports_synchronization);
void DoReadAllNotificationDataForServiceWorkerRegistration(
base::Time start_time,
const GURL& origin,
int64_t service_worker_registration_id,
ReadAllResultCallback callback,
std::set<std::string> displayed_notifications,
bool supports_synchronization,
bool initialized);
void DoCountVisibleNotificationsForServiceWorkerRegistration(
base::Time start_time,
const GURL& origin,
int64_t service_worker_registration_id,
CountResultCallback callback,
std::set<std::string> displayed_notifications,
bool supports_synchronization,
bool initialized);
bool DoCheckNotificationTriggerQuota(const GURL& origin);
void DoWriteNotificationData(int64_t persistent_notification_id,
int64_t service_worker_registration_id,
const GURL& origin,
const NotificationDatabaseData& database_data,
WriteResultCallback callback,
bool initialized);
void DoDeleteNotificationData(const std::string& notification_id,
const GURL& origin,
DeleteResultCallback callback,
bool should_log_close,
bool initialized);
void DoReadAllNotificationOrigins(ReadAllOriginsResultCallback callback,
bool initialized);
void CheckPermissionsAndDeleteBlocked(DeleteAllResultCallback callback,
bool success,
std::set<GURL> origins);
void DoDeleteAllNotificationDataForOrigins(
std::set<GURL> origins,
const std::string& tag,
std::optional<bool> is_shown_by_browser,
DeleteAllResultCallback callback,
bool initialized);
void DoWriteNotificationResources(
std::vector<NotificationResourceData> resource_data,
WriteResourcesResultCallback callback,
bool initialized);
void DoReDisplayNotifications(std::vector<GURL> origins,
ReDisplayNotificationsResultCallback callback,
bool initialized);
void DoWriteNotificationMetadata(const std::string& notification_id,
const GURL& origin,
const std::string& metadata_key,
const std::string& metadata_value,
WriteResourcesResultCallback callback,
bool initialized);
void OnStorageWipedInitialized(bool initialized);
void DoDeleteNotificationsForServiceWorkerRegistration(
const GURL& origin,
int64_t service_worker_registration_id,
bool initialized);
bool DestroyDatabase();
base::FilePath GetDatabasePath() const;
void SetTaskRunnerForTesting(
const scoped_refptr<base::SequencedTaskRunner>& task_runner);
void DisplayNotification(const NotificationDatabaseData& data,
WriteResultCallback callback);
void CloseNotifications(const std::set<std::string>& notification_ids);
void ScheduleTrigger(base::Time timestamp);
void ScheduleNotification(const NotificationDatabaseData& data);
void LogClose(const NotificationDatabaseData& data);
base::FilePath path_;
raw_ptr<BrowserContext> browser_context_;
scoped_refptr<ServiceWorkerContextWrapper> service_worker_context_;
scoped_refptr<base::SequencedTaskRunner> task_runner_;
std::unique_ptr<NotificationDatabase> database_;
NotificationIdGenerator notification_id_generator_;
std::optional<base::Time> next_trigger_;
std::unique_ptr<PlatformNotificationServiceProxy> service_proxy_;
std::vector<std::unique_ptr<BlinkNotificationServiceImpl>> services_;
NotificationDatabase::UkmCallback ukm_callback_;
std::atomic_bool has_shutdown_;
};
}
#endif