blob: 6e01bba8eda002171cdf9dd167a71a8ff5d5f446 [file] [log] [blame]
// Copyright 2021 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_FEDERATED_LEARNING_FLOC_EVENT_LOGGER_H_
#define CHROME_BROWSER_FEDERATED_LEARNING_FLOC_EVENT_LOGGER_H_
#include <stddef.h>
#include "base/callback_forward.h"
#include "base/gtest_prod_util.h"
#include "base/memory/weak_ptr.h"
#include "components/sync/driver/sync_service_observer.h"
namespace syncer {
class UserEventService;
class SyncService;
} // namespace syncer
namespace federated_learning {
class FlocRemotePermissionService;
// Provide an interface to log the FlocIdComputed event after each time floc is
// computed. For each logging request, a floc is eligible to be logged if the
// following conditons are met:
// 1) Sync & sync-history are enabled.
// 2) Supplemental Web and App Activity is enabled.
// 3) Supplemental Ad Personalization is enabled.
// 4) The account type is NOT a child account.
//
// Given that the sync service is often ready a few moments after the browser
// start, but the floc may already have been computed before then, for practical
// purposes, each request that fails the initial sync-history check will be
// given a second chance 10 seconds later.
class FlocEventLogger {
public:
struct Event {
bool sim_hash_computed = false;
uint64_t sim_hash = 0;
base::Time time;
};
using CanLogEventCallback = base::OnceCallback<void(bool)>;
FlocEventLogger(syncer::SyncService* sync_service,
FlocRemotePermissionService* floc_remote_permission_service,
syncer::UserEventService* user_event_service);
virtual ~FlocEventLogger();
// Log a user event. It'll first go though a few permission checks to
// determine whether the logging is allowed (see class comments). If
// sync-history is not enabled in particular, it will do a second attempt 10
// seconds later.
virtual void LogFlocComputedEvent(Event event);
private:
friend class FlocEventLoggerUnitTest;
friend class MockFlocEventLogger;
void CheckCanLogEvent(CanLogEventCallback callback);
void OnCanLogEventDecided(Event event, bool can_log_event);
bool IsSyncHistoryEnabled() const;
void IsSwaaNacAccountEnabled(CanLogEventCallback callback);
// The following raw pointer references are guaranteed to outlive this object.
syncer::SyncService* sync_service_;
FlocRemotePermissionService* floc_remote_permission_service_;
syncer::UserEventService* user_event_service_;
base::WeakPtrFactory<FlocEventLogger> weak_ptr_factory_{this};
};
} // namespace federated_learning
#endif // CHROME_BROWSER_FEDERATED_LEARNING_FLOC_EVENT_LOGGER_H_