1 /*
2  * Copyright (c) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "ability_manager_client.h"
17 #include "application_context.h"
18 #include "hisysevent_adapter_impl.h"
19 #include "hisysevent.h"
20 #include "ohos_resource_adapter_impl.h"
21 
22 namespace OHOS::NWeb {
23 namespace {
24 const HiviewDFX::HiSysEvent::EventType EVENT_TYPES[] = {
25     OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
26     OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC,
27     OHOS::HiviewDFX::HiSysEvent::EventType::SECURITY,
28     OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
29 };
30 }
31 
32 static std::string g_currentBundleName = "";
33 static std::string g_versionCode = "";
GetInstance()34 HiSysEventAdapterImpl& HiSysEventAdapterImpl::GetInstance()
35 {
36     static HiSysEventAdapterImpl instance;
37     return instance;
38 }
39 
40 template<typename... Args>
ForwardToHiSysEvent(const std::string& eventName, HiSysEventAdapter::EventType type, const std::tuple<Args...>& tp)41 static int ForwardToHiSysEvent(const std::string& eventName, HiSysEventAdapter::EventType type,
42     const std::tuple<Args...>& tp)
43 {
44     if (g_currentBundleName.empty()) {
45         auto appInfo = AbilityRuntime::ApplicationContext::GetInstance()->GetApplicationInfo();
46         if (appInfo != nullptr) {
47             g_currentBundleName = appInfo->bundleName.c_str();
48         }
49     }
50     if (g_versionCode.empty()) {
51         g_versionCode = OhosResourceAdapterImpl::GetArkWebVersion();
52     }
53     std::tuple<const std::string, const std::string, const std::string, const std::string> sysData(
54         "BUNDLE_NAME", g_currentBundleName.c_str(),
55         "VERSION_CODE", g_versionCode.c_str()
56     );
57     auto mergeData = std::tuple_cat(sysData, tp);
58 
59     return std::apply(
60         [&](auto&&... args) {
61             return HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::WEBVIEW, eventName, EVENT_TYPES[type], args...);
62         },
63         mergeData);
64 }
65 
Write(const std::string& eventName, EventType type, const std::tuple<const std::string, const std::string>& data)66 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
67     const std::tuple<const std::string, const std::string>& data)
68 {
69     return ForwardToHiSysEvent(eventName, type, data);
70 }
71 
Write(const std::string& eventName, EventType type, const std::tuple<const std::string, const std::string, const std::string, const std::string>& data)72 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
73     const std::tuple<const std::string, const std::string, const std::string, const std::string>& data)
74 {
75     return ForwardToHiSysEvent(eventName, type, data);
76 }
77 
Write(const std::string& eventName, EventType type, const std::tuple<const std::string, const std::string, const std::string, const std::string, const std::string, const std::string>& data)78 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
79     const std::tuple<const std::string, const std::string, const std::string, const std::string,
80                      const std::string, const std::string>& data)
81 {
82     return ForwardToHiSysEvent(eventName, type, data);
83 }
84 
Write(const std::string& eventName, EventType type, const std::tuple<const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string>& data)85 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
86     const std::tuple<const std::string, const std::string, const std::string, const std::string,
87                      const std::string, const std::string, const std::string, const std::string>& data)
88 {
89     return ForwardToHiSysEvent(eventName, type, data);
90 }
91 
Write(const std::string& eventName, EventType type, const std::tuple<const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string>& data)92 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
93     const std::tuple<const std::string, const std::string, const std::string, const std::string,
94                      const std::string, const std::string, const std::string, const std::string,
95                      const std::string, const std::string>& data)
96 {
97     return ForwardToHiSysEvent(eventName, type, data);
98 }
99 
Write(const std::string& eventName, EventType type, const std::tuple<const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string>& data)100 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
101     const std::tuple<const std::string, const std::string, const std::string, const std::string,
102                      const std::string, const std::string, const std::string, const std::string,
103                      const std::string, const std::string, const std::string, const std::string>& data)
104 {
105     return ForwardToHiSysEvent(eventName, type, data);
106 }
107 
108 using systemData = std::tuple<const std::string, const int, const std::string, const std::string,
109                               const std::string, const std::string>;
110 
Write(const std::string& eventName, EventType type, const std::tuple<const std::string, const int64_t, const std::string, const int, const std::string, const std::vector<uint16_t>, const std::string, const int>& data)111 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
112     const std::tuple<const std::string, const int64_t, const std::string, const int,
113     const std::string, const std::vector<uint16_t>, const std::string, const int>& data)
114 {
115     auto appInfo = AbilityRuntime::ApplicationContext::GetInstance()->GetApplicationInfo();
116 
117     AppExecFwk::ElementName elementName = AAFwk::AbilityManagerClient::GetInstance()->GetTopAbility();
118 
119     systemData sysData = {
120         "VERSION_CODE", appInfo->versionCode,
121         "VERSION_NAME", appInfo->versionName.c_str(),
122         "ABILITY_NAME", elementName.GetAbilityName()
123     };
124 
125     auto mergeData = std::tuple_cat(data, sysData);
126     return ForwardToHiSysEvent(eventName, type, mergeData);
127 }
128 
Write(const std::string& eventName, EventType type, const std::tuple<const std::string, const int64_t, const std::string, const int64_t, const std::string, const int, const std::string, const int, const std::string, const int64_t, const std::string, const int>& data)129 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
130     const std::tuple<const std::string, const int64_t, const std::string, const int64_t,
131     const std::string, const int, const std::string, const int,
132     const std::string, const int64_t, const std::string, const int>& data)
133 {
134     auto appInfo = AbilityRuntime::ApplicationContext::GetInstance()->GetApplicationInfo();
135 
136     AppExecFwk::ElementName elementName = AAFwk::AbilityManagerClient::GetInstance()->GetTopAbility();
137 
138     std::tuple<const std::string, const std::string, const std::string, const std::string,
139         const std::string, const std::string> sysData = {
140         "SCENE_ID", "WEB_LIST_FLING",
141         "ABILITY_NAME", elementName.GetAbilityName(),
142         "PAGE_URL", ""
143     };
144 
145     auto mergeData = std::tuple_cat(data, sysData);
146     return ForwardToHiSysEvent(eventName, type, mergeData);
147 }
148 
Write(const std::string& eventName, EventType type, const std::tuple<const std::string, const int64_t, const std::string, const int64_t, const std::string, const uint32_t, const std::string, const int64_t, const std::string, const int64_t, const std::string, const int64_t, const std::string, const int64_t, const std::string, const int64_t, const std::string, const int64_t, const std::string, const int64_t, const std::string, const int64_t, const std::string, const int64_t, const std::string, const int64_t, const std::string, const int64_t, const std::string, const int64_t, const std::string, const int64_t, const std::string, const int64_t, const std::string, const int64_t, const std::string, const int64_t, const std::string, const int64_t, const std::string, const int64_t, const std::string, const int64_t, const std::string, const int64_t>& data)149 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
150     const std::tuple<const std::string, const int64_t,
151     const std::string, const int64_t, const std::string, const uint32_t,
152     const std::string, const int64_t, const std::string, const int64_t,
153     const std::string, const int64_t, const std::string, const int64_t,
154     const std::string, const int64_t, const std::string, const int64_t,
155     const std::string, const int64_t, const std::string, const int64_t,
156     const std::string, const int64_t, const std::string, const int64_t,
157     const std::string, const int64_t, const std::string, const int64_t,
158     const std::string, const int64_t, const std::string, const int64_t,
159     const std::string, const int64_t, const std::string, const int64_t,
160     const std::string, const int64_t, const std::string, const int64_t,
161     const std::string, const int64_t, const std::string, const int64_t>& data)
162 {
163     auto appInfo = AbilityRuntime::ApplicationContext::GetInstance()->GetApplicationInfo();
164 
165     AppExecFwk::ElementName elementName = AAFwk::AbilityManagerClient::GetInstance()->GetTopAbility();
166 
167     std::tuple<const std::string, const std::string> sysData = {
168         "ABILITY_NAME", elementName.GetAbilityName(),
169     };
170 
171     auto mergeData = std::tuple_cat(data, sysData);
172     return ForwardToHiSysEvent(eventName, type, mergeData);
173 }
174 
Write(const std::string& eventName, EventType type, const std::tuple<const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string>& data)175 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
176     const std::tuple<const std::string, const std::string, const std::string, const std::string,
177                      const std::string, const std::string, const std::string, const std::string,
178                      const std::string, const std::string, const std::string, const std::string,
179                      const std::string, const std::string>& data)
180 {
181     return ForwardToHiSysEvent(eventName, type, data);
182 }
183 
Write(const std::string& eventName, EventType type, const std::tuple<const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string, const std::string>& data)184 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
185     const std::tuple<const std::string, const std::string, const std::string, const std::string,
186                      const std::string, const std::string, const std::string, const std::string,
187                      const std::string, const std::string, const std::string, const std::string,
188                      const std::string, const std::string, const std::string, const std::string>& data)
189 {
190     std::string versionCode = OhosResourceAdapterImpl::GetArkWebVersion();
191     auto extendedData = std::tuple_cat(
192         std::make_tuple("VERSION_CODE", versionCode.c_str()),
193         data
194     );
195 
196     return std::apply(
197         [&](auto&&... args) {
198             return HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::WEBVIEW, eventName, EVENT_TYPES[type], args...);
199         },
200         extendedData);
201 }
202 } // namespace OHOS::NWeb
203