1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122
|
// 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.
#include "chrome/browser/enterprise/reporting/legacy_tech/legacy_tech_service.h"
#include <optional>
#include "base/functional/bind.h"
#include "base/logging.h"
#include "base/no_destructor.h"
#include "base/time/time.h"
#include "chrome/browser/enterprise/reporting/legacy_tech/legacy_tech_report_generator.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_selections.h"
#include "content/public/browser/legacy_tech_cookie_issue_details.h"
namespace enterprise_reporting {
LegacyTechService::LegacyTechService(Profile* profile,
LegacyTechReportTrigger trigger)
: url_matcher_(profile), trigger_(trigger) {
DCHECK(trigger_);
}
LegacyTechService::~LegacyTechService() = default;
void LegacyTechService::ReportEvent(
const std::string& type,
const GURL& url,
const GURL& frame_url,
const std::string& filename,
uint64_t line,
uint64_t column,
std::optional<content::LegacyTechCookieIssueDetails> cookie_issue_details)
const {
std::optional<std::string> matched_url = url_matcher_.GetMatchedURL(url);
VLOG(2) << "Get report for URL " << url
<< (matched_url ? " that matches a policy."
: " without matching any policies.");
if (!matched_url) {
matched_url = url_matcher_.GetMatchedURL(frame_url);
VLOG(2) << "Get report for Frame URL " << url
<< (matched_url ? " that matches a policy."
: " without matching any policies.");
}
if (!matched_url) {
return;
}
LegacyTechReportGenerator::LegacyTechData data = {
type,
url,
frame_url,
*matched_url,
filename,
line,
column,
cookie_issue_details};
trigger_.Run(std::move(data));
}
// static
LegacyTechServiceFactory* LegacyTechServiceFactory::GetInstance() {
static base::NoDestructor<LegacyTechServiceFactory> instance;
return instance.get();
}
// static
LegacyTechService* LegacyTechServiceFactory::GetForProfile(Profile* profile) {
return static_cast<LegacyTechService*>(
GetInstance()->GetServiceForBrowserContext(profile, /*create=*/true));
}
std::unique_ptr<KeyedService>
LegacyTechServiceFactory::BuildServiceInstanceForBrowserContext(
content::BrowserContext* context) const {
Profile* profile = Profile::FromBrowserContext(context);
// Legacy tech report is always enabled and the callback must be set before
// any report created.
// Report uploading will be decided individually for every single report.
// Use base::Unretained as the factory is base::NoDestructor.
return std::make_unique<LegacyTechService>(
profile, base::BindRepeating(&LegacyTechServiceFactory::ReportEventImpl,
base::Unretained(GetInstance())));
}
void LegacyTechServiceFactory::SetReportTrigger(
LegacyTechReportTrigger&& trigger) {
trigger_ = std::move(trigger);
for (auto& data : pending_data_) {
trigger_.Run(std::move(data));
}
pending_data_.clear();
}
void LegacyTechServiceFactory::ReportEventImpl(
LegacyTechReportGenerator::LegacyTechData data) {
if (!trigger_) {
// CBCM initialization is async, in case a report is triggered before.
pending_data_.push_back(std::move(data));
return;
}
trigger_.Run(std::move(data));
}
LegacyTechServiceFactory::LegacyTechServiceFactory()
: ProfileKeyedServiceFactory(
"LegacyTechReporting",
ProfileSelections::Builder()
.WithRegular(ProfileSelection::kRedirectedToOriginal)
// TODO(crbug.com/41488885): Check if this service is needed for
// Ash Internals.
.WithAshInternals(ProfileSelection::kRedirectedToOriginal)
.Build()) {}
LegacyTechServiceFactory::~LegacyTechServiceFactory() = default;
} // namespace enterprise_reporting
|