• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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