blob: b73958185d117b5a900c1a505638e8a9a7f83c1d [file] [log] [blame]
Sophie Chang647ee3a2023-06-06 15:43:431// Copyright 2023 The Chromium Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "components/page_image_service/image_service_consent_helper.h"
6
7#include "base/feature_list.h"
8#include "components/page_image_service/features.h"
Sophie Changaae45dfc2023-09-11 18:42:219#include "components/page_image_service/metrics_util.h"
Sophie Chang647ee3a2023-06-06 15:43:4310#include "components/sync/service/sync_service.h"
11#include "components/unified_consent/consent_throttle.h"
12#include "components/unified_consent/url_keyed_data_collection_consent_helper.h"
13
14namespace page_image_service {
15
16namespace {
17
18constexpr base::TimeDelta kTimeout = base::Seconds(10);
19
Sophie Changaae45dfc2023-09-11 18:42:2120void RunConsentThrottleCallback(
21 base::OnceCallback<void(PageImageServiceConsentStatus)> callback,
22 bool success) {
23 std::move(callback).Run(success ? PageImageServiceConsentStatus::kSuccess
24 : PageImageServiceConsentStatus::kFailure);
25}
26
Sophie Chang647ee3a2023-06-06 15:43:4327} // namespace
28
29ImageServiceConsentHelper::ImageServiceConsentHelper(
30 syncer::SyncService* sync_service,
31 syncer::ModelType model_type)
32 : sync_service_(sync_service), model_type_(model_type) {
33 if (base::FeatureList::IsEnabled(kImageServiceObserveSyncDownloadStatus)) {
34 sync_service_observer_.Observe(sync_service);
35 } else if (model_type == syncer::ModelType::BOOKMARKS) {
36 consent_throttle_ = std::make_unique<unified_consent::ConsentThrottle>(
37 unified_consent::UrlKeyedDataCollectionConsentHelper::
38 NewPersonalizedBookmarksDataCollectionConsentHelper(sync_service),
39 kTimeout);
40 } else if (model_type == syncer::ModelType::HISTORY_DELETE_DIRECTIVES) {
41 consent_throttle_ = std::make_unique<unified_consent::ConsentThrottle>(
42 unified_consent::UrlKeyedDataCollectionConsentHelper::
43 NewPersonalizedDataCollectionConsentHelper(sync_service),
44 kTimeout);
45 } else {
46 NOTREACHED();
47 }
48}
49
50ImageServiceConsentHelper::~ImageServiceConsentHelper() = default;
51
52void ImageServiceConsentHelper::EnqueueRequest(
Sophie Changaae45dfc2023-09-11 18:42:2153 base::OnceCallback<void(PageImageServiceConsentStatus)> callback) {
Sophie Chang647ee3a2023-06-06 15:43:4354 if (consent_throttle_) {
Sophie Changaae45dfc2023-09-11 18:42:2155 consent_throttle_->EnqueueRequest(
56 base::BindOnce(&RunConsentThrottleCallback, std::move(callback)));
Sophie Chang647ee3a2023-06-06 15:43:4357 return;
58 }
59
60 absl::optional<bool> consent_status = GetConsentStatus();
61 if (consent_status.has_value()) {
Sophie Changaae45dfc2023-09-11 18:42:2162 std::move(callback).Run(*consent_status
63 ? PageImageServiceConsentStatus::kSuccess
64 : PageImageServiceConsentStatus::kFailure);
Sophie Chang647ee3a2023-06-06 15:43:4365 return;
66 }
67
68 enqueued_request_callbacks_.emplace_back(std::move(callback));
69 if (!request_processing_timer_.IsRunning()) {
70 request_processing_timer_.Start(
71 FROM_HERE, kTimeout,
Sophie Chang9fabf702023-08-11 22:19:0172 base::BindOnce(&ImageServiceConsentHelper::OnTimeoutExpired,
73 weak_ptr_factory_.GetWeakPtr()));
Sophie Chang647ee3a2023-06-06 15:43:4374 }
75}
76
77void ImageServiceConsentHelper::OnStateChanged(
78 syncer::SyncService* sync_service) {
79 CHECK_EQ(sync_service_, sync_service);
80 CHECK(base::FeatureList::IsEnabled(kImageServiceObserveSyncDownloadStatus));
81
82 absl::optional<bool> consent_status = GetConsentStatus();
83 if (!consent_status.has_value()) {
84 return;
85 }
86
87 for (auto& request_callback : enqueued_request_callbacks_) {
Sophie Changaae45dfc2023-09-11 18:42:2188 std::move(request_callback)
89 .Run(*consent_status ? PageImageServiceConsentStatus::kSuccess
90 : PageImageServiceConsentStatus::kFailure);
Sophie Chang647ee3a2023-06-06 15:43:4391 }
92
93 enqueued_request_callbacks_.clear();
94 request_processing_timer_.Stop();
95}
96
97void ImageServiceConsentHelper::OnSyncShutdown(
98 syncer::SyncService* sync_service) {
99 CHECK_EQ(sync_service_, sync_service);
100 CHECK(base::FeatureList::IsEnabled(kImageServiceObserveSyncDownloadStatus));
101
102 sync_service_observer_.Reset();
103}
104
105absl::optional<bool> ImageServiceConsentHelper::GetConsentStatus() {
106 CHECK(base::FeatureList::IsEnabled(kImageServiceObserveSyncDownloadStatus));
107