1 /*
2 * Copyright (c) 2022 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 "system_properties_adapter_impl.h"
17
18 #include <securec.h>
19
20 #include "init_param.h"
21 #include "nweb_config_helper.h"
22 #include "nweb_log.h"
23 #include "parameter.h"
24 #include "parameters.h"
25 #include "sysversion.h"
26 #include "hitrace_adapter_impl.h"
27
28 namespace OHOS::NWeb {
29 const std::string FACTORY_CONFIG_VALUE = "factoryConfig";
30 const std::string FACTORY_LEVEL_VALUE = "factoryLevel";
31 const std::string FACTORY_LEVEL_WATCH = "16";
32 const std::string FACTORY_LEVEL_PC = "8";
33 const std::string FACTORY_LEVEL_TABLET = "4";
34 const std::string FACTORY_LEVEL_PHONE = "2";
35 const std::string FACTORY_LEVEL_DEFAULT = "1";
36
37 const std::string PROP_RENDER_DUMP = "web.render.dump";
38 const std::string PROP_DEBUG_TRACE = "web.debug.trace";
39 const std::unordered_map<std::string, PropertiesKey> PROP_KEY_MAP = {
40 {PROP_RENDER_DUMP, PropertiesKey::PROP_RENDER_DUMP},
41 {PROP_DEBUG_TRACE, PropertiesKey::PROP_DEBUG_TRACE}};
42
SystemPropertiesChangeCallback(const char * key,const char * value,void * context)43 void SystemPropertiesChangeCallback(const char* key, const char* value, void* context)
44 {
45 WVLOG_D("sys prop change key: %{public}s ,value : %{public}s ", key, value);
46 SystemPropertiesAdapterImpl::GetInstance().DispatchAllWatcherInfo(key, value);
47 }
48
49 // static
GetInstance()50 SystemPropertiesAdapterImpl& SystemPropertiesAdapterImpl::GetInstance()
51 {
52 static SystemPropertiesAdapterImpl instance;
53 return instance;
54 }
55
SystemPropertiesAdapterImpl()56 SystemPropertiesAdapterImpl::SystemPropertiesAdapterImpl()
57 {
58 std::string osFullName =
59 OHOS::system::GetParameter("const.ohos.fullname", "");
60 if (osFullName.empty()) {
61 WVLOG_E("get os full name failed");
62 return;
63 }
64 int versionPartOne;
65 int versionPartTwo;
66 int versionPartThree;
67 int versionPartFour;
68 const char* tmp = strstr(osFullName.c_str(), "-");
69 if (tmp == NULL) {
70 return;
71 }
72 tmp++;
73 int ret = sscanf_s(tmp, "%d.%d.%d.%d",
74 &versionPartOne, &versionPartTwo, &versionPartThree, &versionPartFour);
75 if (ret <= 0) {
76 WVLOG_E("paser os full name failed");
77 return;
78 }
79 softwareMajorVersion_ = versionPartOne;
80 softwareSeniorVersion_ = versionPartTwo;
81 AddAllSysPropWatchers();
82 }
83
~SystemPropertiesAdapterImpl()84 SystemPropertiesAdapterImpl::~SystemPropertiesAdapterImpl()
85 {
86 RemoveAllSysPropWatchers();
87 }
88
GetResourceUseHapPathEnable()89 bool SystemPropertiesAdapterImpl::GetResourceUseHapPathEnable()
90 {
91 return OHOS::system::GetBoolParameter("compress", false);
92 }
93
GetDeviceInfoProductModel()94 std::string SystemPropertiesAdapterImpl::GetDeviceInfoProductModel()
95 {
96 return GetProductModel();
97 }
98
GetDeviceInfoBrand()99 std::string SystemPropertiesAdapterImpl::GetDeviceInfoBrand()
100 {
101 return GetBrand();
102 }
103
GetDeviceInfoMajorVersion()104 int32_t SystemPropertiesAdapterImpl::GetDeviceInfoMajorVersion()
105 {
106 return GetMajorVersion();
107 }
108
GetProductDeviceType()109 ProductDeviceType SystemPropertiesAdapterImpl::GetProductDeviceType()
110 {
111 ProductDeviceType factoryLevel = AnalysisFromConfig();
112 if (factoryLevel != ProductDeviceType::DEVICE_TYPE_UNKNOWN) {
113 return factoryLevel;
114 }
115 WVLOG_W("read config factoryLevel: fail");
116 // RK or other device cant read config,need read from system deviceType
117 std::string deviceType = OHOS::system::GetDeviceType();
118 if (deviceType == "phone" || deviceType == "default") {
119 return ProductDeviceType::DEVICE_TYPE_MOBILE;
120 } else if (deviceType == "tablet") {
121 return ProductDeviceType::DEVICE_TYPE_TABLET;
122 } else if (deviceType == "2in1") {
123 return ProductDeviceType::DEVICE_TYPE_2IN1;
124 }
125 return ProductDeviceType::DEVICE_TYPE_UNKNOWN;
126 }
127
AnalysisFromConfig()128 ProductDeviceType SystemPropertiesAdapterImpl::AnalysisFromConfig()
129 {
130 std::string factoryLevel = NWebConfigHelper::Instance()
131 .ParsePerfConfig(FACTORY_CONFIG_VALUE, FACTORY_LEVEL_VALUE);
132 if (factoryLevel.empty()) {
133 NWebConfigHelper::Instance().ReadConfigIfNeeded();
134 factoryLevel = NWebConfigHelper::Instance().
135 ParsePerfConfig(FACTORY_CONFIG_VALUE, FACTORY_LEVEL_VALUE);
136 }
137 WVLOG_D("read config factoryLevel: %{public}s ", factoryLevel.c_str());
138 if (factoryLevel == FACTORY_LEVEL_PHONE || factoryLevel == FACTORY_LEVEL_DEFAULT) {
139 return ProductDeviceType::DEVICE_TYPE_MOBILE;
140 } else if (factoryLevel == FACTORY_LEVEL_TABLET) {
141 return ProductDeviceType::DEVICE_TYPE_TABLET;
142 } else if (factoryLevel == FACTORY_LEVEL_PC) {
143 return ProductDeviceType::DEVICE_TYPE_2IN1;
144 }
145 return ProductDeviceType::DEVICE_TYPE_UNKNOWN;
146 }
147
GetWebOptimizationValue()148 bool SystemPropertiesAdapterImpl::GetWebOptimizationValue()
149 {
150 return OHOS::system::GetBoolParameter("web.optimization", true);
151 }
152
IsAdvancedSecurityMode()153 bool SystemPropertiesAdapterImpl::IsAdvancedSecurityMode()
154 {
155 char buffer[32] = { 0 };
156 uint32_t buffSize = sizeof(buffer);
157
158 if (SystemGetParameter("ohos.boot.advsecmode.state", buffer, &buffSize) == 0 && strcmp(buffer, "0") != 0) {
159 return true;
160 }
161 return false;
162 }
163
GetUserAgentOSName()164 std::string SystemPropertiesAdapterImpl::GetUserAgentOSName()
165 {
166 return OHOS::system::GetParameter("const.product.os.dist.name", "");
167 }
168
GetSoftwareMajorVersion()169 int32_t SystemPropertiesAdapterImpl::GetSoftwareMajorVersion()
170 {
171 return softwareMajorVersion_;
172 }
173
GetSoftwareSeniorVersion()174 int32_t SystemPropertiesAdapterImpl::GetSoftwareSeniorVersion()
175 {
176 return softwareSeniorVersion_;
177 }
178
GetNetlogMode()179 std::string SystemPropertiesAdapterImpl::GetNetlogMode()
180 {
181 return OHOS::system::GetParameter("web.debug.netlog", "");
182 }
183
GetTraceDebugEnable()184 bool SystemPropertiesAdapterImpl::GetTraceDebugEnable()
185 {
186 return OHOS::system::GetBoolParameter("web.debug.trace", false);
187 }
188
GetSiteIsolationMode()189 std::string SystemPropertiesAdapterImpl::GetSiteIsolationMode()
190 {
191 return OHOS::system::GetParameter("web.debug.strictsiteIsolation.enable", "");
192 }
193
GetFlowBufMaxFd()194 int32_t SystemPropertiesAdapterImpl::GetFlowBufMaxFd()
195 {
196 return OHOS::system::GetIntParameter("web.flowbuffer.maxfd", -1);
197 }
198
GetOOPGPUEnable()199 bool SystemPropertiesAdapterImpl::GetOOPGPUEnable()
200 {
201 if (GetDeviceInfoProductModel() == "emulator") {
202 return false;
203 }
204 if (OHOS::system::GetParameter("web.oop.gpu", "") == "true") {
205 return true;
206 }
207
208 return false;
209 }
210
SetOOPGPUDisable()211 void SystemPropertiesAdapterImpl::SetOOPGPUDisable()
212 {
213 if (OHOS::system::GetParameter("web.oop.gpu", "") == "None") {
214 OHOS::system::SetParameter("web.oop.gpu", "false");
215 }
216 return;
217 }
218
AddAllSysPropWatchers()219 void SystemPropertiesAdapterImpl::AddAllSysPropWatchers()
220 {
221 for (auto &item : PROP_KEY_MAP) {
222 auto errNo = WatchParameter(item.first.c_str(), SystemPropertiesChangeCallback, nullptr);
223 if (errNo == 0) {
224 sysPropObserver_[item.second];
225 sysPropMutex_[item.second];
226 } else {
227 WVLOG_I("add watch error result: %{public}d", errNo);
228 }
229 }
230 }
231
RemoveAllSysPropWatchers()232 void SystemPropertiesAdapterImpl::RemoveAllSysPropWatchers()
233 {
234 for (auto &item : PROP_KEY_MAP) {
235 auto errNo = RemoveParameterWatcher(item.first.c_str(), nullptr, nullptr);
236 if (errNo != 0) {
237 WVLOG_I("remove watch error result: %{public}d", errNo);
238 }
239 }
240 }
241
DispatchAllWatcherInfo(const char * key,const char * value)242 void SystemPropertiesAdapterImpl::DispatchAllWatcherInfo(const char* key, const char* value)
243 {
244 auto propKeyIt = PROP_KEY_MAP.find(key);
245 if (propKeyIt == PROP_KEY_MAP.end()) {
246 WVLOG_I("sys prop change key is invalid: %{public}s", key);
247 return;
248 }
249
250 PropertiesKey propkey = propKeyIt->second;
251 auto& keyObservers = sysPropObserver_[propkey];
252
253 if (keyObservers.size() == 0) {
254 WVLOG_I("no observers in this key: %{public}s", key);
255 return;
256 }
257
258 std::shared_lock lock(sysPropMutex_[propkey]);
259 for (auto &item : keyObservers) {
260 item->PropertiesUpdate(value);
261 }
262 }
263
AttachSysPropObserver(PropertiesKey key,SystemPropertiesObserver * observer)264 void SystemPropertiesAdapterImpl::AttachSysPropObserver(PropertiesKey key, SystemPropertiesObserver* observer)
265 {
266 auto observerIt = sysPropObserver_.find(key);
267 if (observerIt == sysPropObserver_.end()) {
268 WVLOG_I("properties key invalid in attach");
269 return;
270 }
271
272 if (observer == nullptr) {
273 WVLOG_I("properties key observer invalid in attach");
274 return;
275 }
276
277 std::vector<SystemPropertiesObserver*>& observerVec = observerIt->second;
278 std::unique_lock lock(sysPropMutex_[key]);
279 observerVec.push_back(observer);
280 }
281
DetachSysPropObserver(PropertiesKey key,SystemPropertiesObserver * observer)282 void SystemPropertiesAdapterImpl::DetachSysPropObserver(PropertiesKey key, SystemPropertiesObserver* observer)
283 {
284 auto observerIt = sysPropObserver_.find(key);
285 if (observerIt == sysPropObserver_.end()) {
286 WVLOG_I("properties key invalid in detach");
287 return;
288 }
289
290 if (observer == nullptr) {
291 WVLOG_I("properties key observer invalid in detach");
292 return;
293 }
294
295 std::vector<SystemPropertiesObserver*>& observerVec = observerIt->second;
296 std::unique_lock lock(sysPropMutex_[key]);
297
298 auto it = std::find(observerVec.begin(), observerVec.end(), observer);
299 if (it != observerVec.end()) {
300 observerVec.erase(it);
301 }
302 }
303
GetBoolParameter(const std::string & key,bool defaultValue)304 bool SystemPropertiesAdapterImpl::GetBoolParameter(const std::string& key, bool defaultValue)
305 {
306 return OHOS::system::GetBoolParameter(key, defaultValue);
307 }
308
GetLTPOConfig(const std::string & settingName)309 std::vector<FrameRateSetting> SystemPropertiesAdapterImpl::GetLTPOConfig(const std::string& settingName)
310 {
311 return NWebConfigHelper::Instance().GetPerfConfig(settingName);
312 }
313
GetOOPGPUStatus()314 std::string SystemPropertiesAdapterImpl::GetOOPGPUStatus()
315 {
316 if (GetDeviceInfoProductModel() == "emulator") {
317 return "false";
318 }
319 return OHOS::system::GetParameter("web.oop.gpu", "");
320 }
321 } // namespace OHOS::NWeb
322