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 
23 namespace OHOS::NWeb {
24 namespace {
25 const HiviewDFX::HiSysEvent::EventType EVENT_TYPES[] = {
26     OHOS::HiviewDFX::HiSysEvent::EventType::FAULT,
27     OHOS::HiviewDFX::HiSysEvent::EventType::STATISTIC,
28     OHOS::HiviewDFX::HiSysEvent::EventType::SECURITY,
29     OHOS::HiviewDFX::HiSysEvent::EventType::BEHAVIOR,
30 };
31 }
32 
33 static std::string g_currentBundleName = "";
34 static std::string g_versionCode = "";
GetInstance()35 HiSysEventAdapterImpl& HiSysEventAdapterImpl::GetInstance()
36 {
37     static HiSysEventAdapterImpl instance;
38     return instance;
39 }
40 
41 template<typename... Args>
ForwardToHiSysEvent(const std::string & eventName,HiSysEventAdapter::EventType type,const std::tuple<Args...> & tp)42 static int ForwardToHiSysEvent(const std::string& eventName, HiSysEventAdapter::EventType type,
43     const std::tuple<Args...>& tp)
44 {
45     if (g_currentBundleName.empty()) {
46         auto appInfo = AbilityRuntime::ApplicationContext::GetInstance()->GetApplicationInfo();
47         if (appInfo != nullptr) {
48             g_currentBundleName = appInfo->bundleName.c_str();
49         }
50     }
51 
52     if (g_versionCode.empty()) {
53         g_versionCode = OhosResourceAdapterImpl::GetArkWebVersion();
54     }
55     std::tuple<const std::string, const std::string, const std::string, const std::string> sysData(
56         "BUNDLE_NAME", g_currentBundleName.c_str(),
57         "VERSION_CODE", g_versionCode.c_str()
58     );
59     auto mergeData = std::tuple_cat(sysData, tp);
60 
61     return std::apply(
62         [&](auto&&... args) {
63             return HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::WEBVIEW, eventName, EVENT_TYPES[type], args...);
64         },
65         mergeData);
66 }
67 
Write(const std::string & eventName,EventType type,const std::tuple<const std::string,const std::string> & data)68 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
69     const std::tuple<const std::string, const std::string>& data)
70 {
71     return ForwardToHiSysEvent(eventName, type, data);
72 }
73 
Write(const std::string & eventName,EventType type,const std::tuple<const std::string,const std::string,const std::string,const std::string> & data)74 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
75     const std::tuple<const std::string, const std::string, const std::string, const std::string>& data)
76 {
77     return ForwardToHiSysEvent(eventName, type, data);
78 }
79 
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)80 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
81     const std::tuple<const std::string, const std::string, const std::string, const std::string,
82                      const std::string, const std::string>& data)
83 {
84     return ForwardToHiSysEvent(eventName, type, data);
85 }
86 
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)87 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
88     const std::tuple<const std::string, const std::string, const std::string, const std::string,
89                      const std::string, const std::string, const std::string, const std::string>& data)
90 {
91     return ForwardToHiSysEvent(eventName, type, data);
92 }
93 
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)94 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
95     const std::tuple<const std::string, const std::string, const std::string, const std::string,
96                      const std::string, const std::string, const std::string, const std::string,
97                      const std::string, const std::string>& data)
98 {
99     return ForwardToHiSysEvent(eventName, type, data);
100 }
101 
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)102 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
103     const std::tuple<const std::string, const std::string, const std::string, const std::string,
104                      const std::string, const std::string, const std::string, const std::string,
105                      const std::string, const std::string, const std::string, const std::string>& data)
106 {
107     return ForwardToHiSysEvent(eventName, type, data);
108 }
109 
110 using systemData = std::tuple<const std::string, const int, const std::string, const std::string,
111                               const std::string, const std::string>;
112 
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)113 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
114     const std::tuple<const std::string, const int64_t, const std::string, const int,
115     const std::string, const std::vector<uint16_t>, const std::string, const int>& data)
116 {
117     auto appInfo = AbilityRuntime::ApplicationContext::GetInstance()->GetApplicationInfo();
118 
119     AppExecFwk::ElementName elementName = AAFwk::AbilityManagerClient::GetInstance()->GetTopAbility();
120 
121     systemData sysData = {
122         "VERSION_CODE", appInfo->versionCode,
123         "VERSION_NAME", appInfo->versionName.c_str(),
124         "ABILITY_NAME", elementName.GetAbilityName()
125     };
126 
127     auto mergeData = std::tuple_cat(data, sysData);
128     return ForwardToHiSysEvent(eventName, type, mergeData);
129 }
130 
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)131 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
132     const std::tuple<const std::string, const int64_t, const std::string, const int64_t,
133     const std::string, const int, const std::string, const int,
134     const std::string, const int64_t, const std::string, const int>& data)
135 {
136     auto appInfo = AbilityRuntime::ApplicationContext::GetInstance()->GetApplicationInfo();
137 
138     AppExecFwk::ElementName elementName = AAFwk::AbilityManagerClient::GetInstance()->GetTopAbility();
139 
140     std::tuple<const std::string, const std::string, const std::string, const std::string,
141         const std::string, const std::string> sysData = {
142         "SCENE_ID", "WEB_LIST_FLING",
143         "ABILITY_NAME", elementName.GetAbilityName(),
144         "PAGE_URL", ""
145     };
146 
147     auto mergeData = std::tuple_cat(data, sysData);
148     return ForwardToHiSysEvent(eventName, type, mergeData);
149 }
150 
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)151 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
152     const std::tuple<const std::string, const int64_t,
153     const std::string, const int64_t, const std::string, const uint32_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,
162     const std::string, const int64_t, const std::string, const int64_t,
163     const std::string, const int64_t, const std::string, const int64_t>& data)
164 {
165     auto appInfo = AbilityRuntime::ApplicationContext::GetInstance()->GetApplicationInfo();
166 
167     AppExecFwk::ElementName elementName = AAFwk::AbilityManagerClient::GetInstance()->GetTopAbility();
168 
169     std::tuple<const std::string, const std::string> sysData = {
170         "ABILITY_NAME", elementName.GetAbilityName(),
171     };
172 
173     auto mergeData = std::tuple_cat(data, sysData);
174     return ForwardToHiSysEvent(eventName, type, mergeData);
175 }
176 
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)177 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
178     const std::tuple<const std::string, const std::string, const std::string, const std::string,
179                      const std::string, const std::string, const std::string, const std::string,
180                      const std::string, const std::string, const std::string, const std::string,
181                      const std::string, const std::string>& data)
182 {
183     return ForwardToHiSysEvent(eventName, type, data);
184 }
185 
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)186 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
187     const std::tuple<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,
189                      const std::string, const std::string, const std::string, const std::string,
190                      const std::string, const std::string, const std::string, const std::string>& data)
191 {
192     std::string versionCode = OhosResourceAdapterImpl::GetArkWebVersion();
193     auto extendedData = std::tuple_cat(
194         std::make_tuple("VERSION_CODE", versionCode),
195         data);
196 
197     return std::apply(
198         [&](auto&&... args) {
199             return HiSysEventWrite(OHOS::HiviewDFX::HiSysEvent::Domain::WEBVIEW, eventName, EVENT_TYPES[type], args...);
200         },
201         extendedData);
202 }
203 
Write(const std::string & eventName,EventType type,const std::tuple<const std::string,const uint32_t,const std::string,const uint64_t> & data)204 int HiSysEventAdapterImpl::Write(const std::string& eventName, EventType type,
205     const std::tuple<const std::string, const uint32_t, const std::string, const uint64_t>& data)
206 {
207     return ForwardToHiSysEvent(eventName, type, data);
208 }
209 } // namespace OHOS::NWeb
210