Upload upstream chromium 114.0.5735.31
[platform/framework/web/chromium-efl.git] / components / ukm / app_source_url_recorder.cc
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.
4
5 #include "components/ukm/app_source_url_recorder.h"
6
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"
11 #include "url/gurl.h"
12
13 namespace ukm {
14
15 SourceId AssignNewAppId() {
16   static base::AtomicSequenceNumber seq;
17   return ConvertToSourceId(seq.GetNext() + 1, SourceIdType::APP_ID);
18 }
19
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);
25 }
26
27 SourceId AppSourceUrlRecorder::GetSourceIdForChromeExtension(
28     const std::string& id) {
29   GURL url("chrome-extension://" + id);
30   return GetSourceIdForUrl(url, AppType::kExtension);
31 }
32
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);
38 }
39
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);
46 }
47
48 SourceId AppSourceUrlRecorder::GetSourceIdForPWA(const GURL& url) {
49   return GetSourceIdForUrl(url, AppType::kPWA);
50 }
51
52 SourceId AppSourceUrlRecorder::GetSourceIdForBorealis(const std::string& app) {
53   GURL url("app://borealis/" + app);
54   return GetSourceIdForUrl(url, AppType::kBorealis);
55 }
56
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);
62 }
63
64 SourceId AppSourceUrlRecorder::GetSourceIdForUrl(const GURL& url,
65                                                  AppType app_type) {
66   ukm::DelegatingUkmRecorder* const recorder =
67       ukm::DelegatingUkmRecorder::Get();
68   if (!recorder)
69     return kInvalidSourceId;
70
71   const SourceId source_id = AssignNewAppId();
72   if (base::FeatureList::IsEnabled(kUkmAppLogging)) {
73     recorder->UpdateAppURL(source_id, url, app_type);
74   }
75   return source_id;
76 }
77
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;
82     return;
83   }
84
85   ukm::DelegatingUkmRecorder* const recorder =
86       ukm::DelegatingUkmRecorder::Get();
87   if (recorder)
88     recorder->MarkSourceForDeletion(source_id);
89 }
90
91 }  // namespace ukm