#include "content/browser/notifications/platform_notification_context_impl.h"
#include <set>
#include <utility>
#include "base/feature_list.h"
#include "base/files/file_util.h"
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/task/sequenced_task_runner.h"
#include "base/task/thread_pool.h"
#include "content/browser/notifications/blink_notification_service_impl.h"
#include "content/browser/notifications/notification_database.h"
#include "content/browser/notifications/notification_trigger_constants.h"
#include "content/browser/notifications/platform_notification_service_proxy.h"
#include "content/browser/service_worker/service_worker_context_wrapper.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/browser_task_traits.h"
#include "content/public/browser/browser_thread.h"
#include "content/public/browser/notification_database_data.h"
#include "content/public/browser/permission_controller.h"
#include "content/public/browser/permission_result.h"
#include "content/public/browser/platform_notification_service.h"
#include "content/public/common/content_client.h"
#include "content/public/common/content_features.h"
#include "third_party/blink/public/common/notifications/notification_resources.h"
#include "third_party/blink/public/common/permissions/permission_utils.h"
namespace content {
namespace {
const base::FilePath::CharType kPlatformNotificationsDirectory[] = …);
constexpr base::TimeDelta kMaxDisplayedNotificationAge = …;
bool CanTrigger(const NotificationDatabaseData& data) { … }
void RecordOldestNotificationTimeUMA(base::Time oldest_notification_time) { … }
bool IsVisibleNotification(base::Time start_time,
const std::set<std::string>& displayed_notifications,
bool supports_synchronization,
const NotificationDatabaseData& data) { … }
void CountVisibleNotifications(
base::Time start_time,
const std::set<std::string>& displayed_notifications,
bool supports_synchronization,
int* count,
base::Time* oldest_notification_time,
const NotificationDatabaseData& data) { … }
}
PlatformNotificationContextImpl::PlatformNotificationContextImpl(
const base::FilePath& path,
BrowserContext* browser_context,
const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context)
: … { … }
PlatformNotificationContextImpl::~PlatformNotificationContextImpl() { … }
void PlatformNotificationContextImpl::Initialize() { … }
void PlatformNotificationContextImpl::DidGetNotifications(
std::set<std::string> displayed_notifications,
bool supports_synchronization) { … }
void PlatformNotificationContextImpl::DoSyncNotificationData(
bool supports_synchronization,
std::set<std::string> displayed_notifications,
bool initialized) { … }
void PlatformNotificationContextImpl::DoHandleSyncNotification(
bool supports_synchronization,
const std::set<std::string>& displayed_notifications,
std::set<std::string>* close_notification_ids,
const NotificationDatabaseData& data) { … }
void PlatformNotificationContextImpl::Shutdown() { … }
void PlatformNotificationContextImpl::CreateService(
RenderProcessHost* render_process_host,
const blink::StorageKey& storage_key,
const GURL& document_url,
const WeakDocumentPtr& weak_document_ptr,
RenderProcessHost::NotificationServiceCreatorType creator_type,
mojo::PendingReceiver<blink::mojom::NotificationService> receiver) { … }
void PlatformNotificationContextImpl::RemoveService(
BlinkNotificationServiceImpl* service) { … }
void PlatformNotificationContextImpl::
DeleteAllNotificationDataForBlockedOrigins(
DeleteAllResultCallback callback) { … }
void PlatformNotificationContextImpl::DoReadAllNotificationOrigins(
ReadAllOriginsResultCallback callback,
bool initialized) { … }
void PlatformNotificationContextImpl::CheckPermissionsAndDeleteBlocked(
DeleteAllResultCallback callback,
bool success,
std::set<GURL> origins) { … }
void PlatformNotificationContextImpl::DoDeleteAllNotificationDataForOrigins(
std::set<GURL> origins,
const std::string& tag,
std::optional<bool> is_shown_by_browser,
DeleteAllResultCallback callback,
bool initialized) { … }
void PlatformNotificationContextImpl::DeleteAllNotificationDataWithTag(
const std::string& tag,
std::optional<bool> is_shown_by_browser,
const GURL& origin,
DeleteAllResultCallback callback) { … }
void PlatformNotificationContextImpl::ReadNotificationDataAndRecordInteraction(
const std::string& notification_id,
const GURL& origin,
const PlatformNotificationContext::Interaction interaction,
ReadResultCallback callback) { … }
void PlatformNotificationContextImpl::DoReadNotificationData(
const std::string& notification_id,
const GURL& origin,
Interaction interaction,
ReadResultCallback callback,
bool initialized) { … }
void PlatformNotificationContextImpl::TriggerNotifications() { … }
void PlatformNotificationContextImpl::DoTriggerNotification(
const NotificationDatabaseData& database_data) { … }
void PlatformNotificationContextImpl::WriteNotificationResources(
std::vector<NotificationResourceData> resource_data,
WriteResourcesResultCallback callback) { … }
void PlatformNotificationContextImpl::DoWriteNotificationResources(
std::vector<NotificationResourceData> resource_data,
WriteResourcesResultCallback callback,
bool initialized) { … }
void PlatformNotificationContextImpl::ReDisplayNotifications(
std::vector<GURL> origins,
ReDisplayNotificationsResultCallback callback) { … }
void PlatformNotificationContextImpl::DoReDisplayNotifications(
std::vector<GURL> origins,
ReDisplayNotificationsResultCallback callback,
bool initialized) { … }
void PlatformNotificationContextImpl::ReadNotificationResources(
const std::string& notification_id,
const GURL& origin,
ReadResourcesResultCallback callback) { … }
void PlatformNotificationContextImpl::DoReadNotificationResources(
const std::string& notification_id,
const GURL& origin,
ReadResourcesResultCallback callback,
bool initialized) { … }
void PlatformNotificationContextImpl::OnGetDisplayedNotifications(
InitializeGetDisplayedCallback callback,
std::set<std::string> notification_ids,
bool supports_synchronization) { … }
void PlatformNotificationContextImpl::TryGetDisplayedNotifications(
const GURL& origin,
InitializeGetDisplayedCallback callback) { … }
void PlatformNotificationContextImpl::
ReadAllNotificationDataForServiceWorkerRegistration(
const GURL& origin,
int64_t service_worker_registration_id,
ReadAllResultCallback callback) { … }
void PlatformNotificationContextImpl::
CountVisibleNotificationsForServiceWorkerRegistration(
const GURL& origin,
int64_t service_worker_registration_id,
CountResultCallback callback) { … }
void PlatformNotificationContextImpl::
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 PlatformNotificationContextImpl::
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) { … }
void PlatformNotificationContextImpl::WriteNotificationData(
int64_t persistent_notification_id,
int64_t service_worker_registration_id,
const GURL& origin,
const NotificationDatabaseData& database_data,
WriteResultCallback callback) { … }
bool PlatformNotificationContextImpl::DoCheckNotificationTriggerQuota(
const GURL& origin) { … }
void PlatformNotificationContextImpl::DoWriteNotificationData(
int64_t service_worker_registration_id,
int64_t persistent_notification_id,
const GURL& origin,
const NotificationDatabaseData& database_data,
WriteResultCallback callback,
bool initialized) { … }
void PlatformNotificationContextImpl::DeleteNotificationData(
const std::string& notification_id,
const GURL& origin,
bool close_notification,
DeleteResultCallback callback) { … }
void PlatformNotificationContextImpl::DoDeleteNotificationData(
const std::string& notification_id,
const GURL& origin,
DeleteResultCallback callback,
bool should_log_close,
bool initialized) { … }
void PlatformNotificationContextImpl::OnRegistrationDeleted(
int64_t registration_id,
const GURL& pattern,
const blink::StorageKey& key) { … }
void PlatformNotificationContextImpl::
DoDeleteNotificationsForServiceWorkerRegistration(
const GURL& origin,
int64_t service_worker_registration_id,
bool initialized) { … }
void PlatformNotificationContextImpl::OnStorageWiped() { … }
void PlatformNotificationContextImpl::OnStorageWipedInitialized(
bool initialized) { … }
void PlatformNotificationContextImpl::InitializeDatabase(
InitializeResultCallback callback,
bool lazy) { … }
void PlatformNotificationContextImpl::OpenDatabase(
InitializeResultCallback callback,
bool create_if_missing) { … }
bool PlatformNotificationContextImpl::DestroyDatabase() { … }
base::FilePath PlatformNotificationContextImpl::GetDatabasePath() const { … }
void PlatformNotificationContextImpl::SetTaskRunnerForTesting(
const scoped_refptr<base::SequencedTaskRunner>& task_runner) { … }
void PlatformNotificationContextImpl::DisplayNotification(
const NotificationDatabaseData& data,
WriteResultCallback callback) { … }
void PlatformNotificationContextImpl::CloseNotifications(
const std::set<std::string>& notification_ids) { … }
void PlatformNotificationContextImpl::ScheduleTrigger(base::Time timestamp) { … }
void PlatformNotificationContextImpl::ScheduleNotification(
const NotificationDatabaseData& data) { … }
void PlatformNotificationContextImpl::LogClose(
const NotificationDatabaseData& data) { … }
}