1 // Copyright 2018 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.
5 #include "components/ukm/app_source_url_recorder.h"
7 #include "base/atomic_sequence_num.h"
8 #include "components/crx_file/id_util.h"
9 #include "services/metrics/public/cpp/delegating_ukm_recorder.h"
10 #include "services/metrics/public/cpp/ukm_source_id.h"
15 SourceId AssignNewAppId() {
16 static base::AtomicSequenceNumber seq;
17 return ConvertToSourceId(seq.GetNext() + 1, SourceIdType::APP_ID);
20 SourceId AppSourceUrlRecorder::GetSourceIdForChromeApp(
21 const std::string& app_id) {
22 DCHECK(!app_id.empty());
23 GURL url("app://" + app_id);
24 return GetSourceIdForUrl(url, AppType::kChromeApp);
27 SourceId AppSourceUrlRecorder::GetSourceIdForChromeExtension(
28 const std::string& id) {
29 GURL url("chrome-extension://" + id);
30 return GetSourceIdForUrl(url, AppType::kExtension);
33 SourceId AppSourceUrlRecorder::GetSourceIdForArcPackageName(
34 const std::string& package_name) {
35 DCHECK(!package_name.empty());
36 GURL url("app://" + package_name);
37 return GetSourceIdForUrl(url, AppType::kArc);
40 SourceId AppSourceUrlRecorder::GetSourceIdForArc(
41 const std::string& package_name) {
42 const std::string package_name_hash =
43 crx_file::id_util::GenerateId(package_name);
44 GURL url("app://play/" + package_name_hash);
45 return GetSourceIdForUrl(url, AppType::kArc);
48 SourceId AppSourceUrlRecorder::GetSourceIdForPWA(const GURL& url) {
49 return GetSourceIdForUrl(url, AppType::kPWA);
52 SourceId AppSourceUrlRecorder::GetSourceIdForBorealis(const std::string& app) {
53 GURL url("app://borealis/" + app);
54 return GetSourceIdForUrl(url, AppType::kBorealis);
57 SourceId AppSourceUrlRecorder::GetSourceIdForCrostini(
58 const std::string& desktop_id,
59 const std::string& app_name) {
60 GURL url("app://" + desktop_id + "/" + app_name);
61 return GetSourceIdForUrl(url, AppType::kCrostini);
64 SourceId AppSourceUrlRecorder::GetSourceIdForUrl(const GURL& url,
66 ukm::DelegatingUkmRecorder* const recorder =
67 ukm::DelegatingUkmRecorder::Get();
69 return kInvalidSourceId;
71 const SourceId source_id = AssignNewAppId();
72 if (base::FeatureList::IsEnabled(kUkmAppLogging)) {
73 recorder->UpdateAppURL(source_id, url, app_type);
78 void AppSourceUrlRecorder::MarkSourceForDeletion(SourceId source_id) {
79 if (GetSourceIdType(source_id) != SourceIdType::APP_ID) {
80 DLOG(FATAL) << "AppSourceUrlRecorder::MarkSourceForDeletion invoked on "
81 << "non-APP_ID type SourceId: " << source_id;
85 ukm::DelegatingUkmRecorder* const recorder =
86 ukm::DelegatingUkmRecorder::Get();
88 recorder->MarkSourceForDeletion(source_id);