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