1 /*
2 * Copyright (c) 2022-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 "js_application_context_utils.h"
17
18 #include <cstdint>
19 #include <map>
20
21 #include "ability_business_error.h"
22 #include "ability_manager_client.h"
23 #include "ability_manager_interface.h"
24 #include "ability_runtime_error_util.h"
25 #include "application_context.h"
26 #include "application_info.h"
27 #include "application_context_manager.h"
28 #include "hilog_tag_wrapper.h"
29 #include "ipc_skeleton.h"
30 #include "js_ability_auto_startup_callback.h"
31 #include "js_ability_auto_startup_manager_utils.h"
32 #include "js_context_utils.h"
33 #include "js_data_struct_converter.h"
34 #include "js_error_utils.h"
35 #include "js_resource_manager_utils.h"
36 #include "js_runtime_utils.h"
37 #include "napi_common_want.h"
38 #include "tokenid_kit.h"
39
40 namespace OHOS {
41 namespace AbilityRuntime {
42 namespace {
43 constexpr char APPLICATION_CONTEXT_NAME[] = "__application_context_ptr__";
44 constexpr size_t ARGC_ZERO = 0;
45 constexpr size_t ARGC_ONE = 1;
46 constexpr size_t ARGC_TWO = 2;
47 constexpr size_t ARGC_THREE = 3;
48 constexpr size_t INDEX_ZERO = 0;
49 constexpr size_t INDEX_ONE = 1;
50 constexpr size_t INDEX_TWO = 2;
51 constexpr int32_t ERROR_CODE_ONE = 1;
52 constexpr double FOUNT_SIZE = 0.0;
53 const char* MD_NAME = "JsApplicationContextUtils";
54 } // namespace
55
CreateBundleContext(napi_env env,napi_callback_info info)56 napi_value JsApplicationContextUtils::CreateBundleContext(napi_env env, napi_callback_info info)
57 {
58 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils,
59 OnCreateBundleContext, APPLICATION_CONTEXT_NAME);
60 }
61
OnCreateBundleContext(napi_env env,NapiCallbackInfo & info)62 napi_value JsApplicationContextUtils::OnCreateBundleContext(napi_env env, NapiCallbackInfo& info)
63 {
64 if (!CheckCallerIsSystemApp()) {
65 TAG_LOGE(AAFwkTag::APPKIT, "not system-app");
66 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_NOT_SYSTEM_APP);
67 return CreateJsUndefined(env);
68 }
69 if (info.argc == 0) {
70 TAG_LOGE(AAFwkTag::APPKIT, "Not enough arguments");
71 ThrowInvalidParamError(env, "Not enough params.");
72 return CreateJsUndefined(env);
73 }
74 auto applicationContext = applicationContext_.lock();
75 if (!applicationContext) {
76 TAG_LOGW(AAFwkTag::APPKIT, "null applicationContext");
77 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
78 return CreateJsUndefined(env);
79 }
80 std::string bundleName;
81 if (!ConvertFromJsValue(env, info.argv[0], bundleName)) {
82 TAG_LOGE(AAFwkTag::APPKIT, "Parse bundleName failed");
83 ThrowInvalidParamError(env, "Parse param bundleName failed, bundleName must be string.");
84 return CreateJsUndefined(env);
85 }
86 auto bundleContext = applicationContext->CreateBundleContext(bundleName);
87 if (!bundleContext) {
88 TAG_LOGE(AAFwkTag::APPKIT, "null bundleContext");
89 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
90 return CreateJsUndefined(env);
91 }
92 napi_value value = CreateJsBaseContext(env, bundleContext, true);
93 auto systemModule = JsRuntime::LoadSystemModuleByEngine(env, "application.Context", &value, 1);
94 if (systemModule == nullptr) {
95 TAG_LOGW(AAFwkTag::APPKIT, "null systemModule");
96 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
97 return CreateJsUndefined(env);
98 }
99 napi_value contextObj = systemModule->GetNapiValue();
100 if (!CheckTypeForNapiValue(env, contextObj, napi_object)) {
101 TAG_LOGE(AAFwkTag::APPKIT, "get object failed");
102 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
103 return CreateJsUndefined(env);
104 }
105 auto workContext = new (std::nothrow) std::weak_ptr<Context>(bundleContext);
106 napi_coerce_to_native_binding_object(env, contextObj, DetachCallbackFunc, AttachBaseContext, workContext, nullptr);
107 auto res = napi_wrap(env, contextObj, workContext,
108 [](napi_env, void *data, void *) {
109 TAG_LOGD(AAFwkTag::APPKIT, "Finalizer for weak_ptr bundle context is called");
110 delete static_cast<std::weak_ptr<Context> *>(data);
111 },
112 nullptr, nullptr);
113 if (res != napi_ok && workContext != nullptr) {
114 TAG_LOGE(AAFwkTag::APPKIT, "napi_wrap failed:%{public}d", res);
115 delete workContext;
116 return CreateJsUndefined(env);
117 }
118 return contextObj;
119 }
120
SwitchArea(napi_env env,napi_callback_info info)121 napi_value JsApplicationContextUtils::SwitchArea(napi_env env, napi_callback_info info)
122 {
123 TAG_LOGD(AAFwkTag::APPKIT, "called");
124 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils, OnSwitchArea, APPLICATION_CONTEXT_NAME);
125 }
126
OnSwitchArea(napi_env env,NapiCallbackInfo & info)127 napi_value JsApplicationContextUtils::OnSwitchArea(napi_env env, NapiCallbackInfo& info)
128 {
129 if (info.argc == 0) {
130 TAG_LOGE(AAFwkTag::APPKIT, "Not enough params");
131 return CreateJsUndefined(env);
132 }
133
134 auto applicationContext = applicationContext_.lock();
135 if (!applicationContext) {
136 TAG_LOGW(AAFwkTag::APPKIT, "null applicationContext");
137 return CreateJsUndefined(env);
138 }
139
140 int mode = 0;
141 if (!ConvertFromJsValue(env, info.argv[0], mode)) {
142 TAG_LOGE(AAFwkTag::APPKIT, "Parse mode failed");
143 return CreateJsUndefined(env);
144 }
145
146 applicationContext->SwitchArea(mode);
147
148 napi_value object = info.thisVar;
149 if (!CheckTypeForNapiValue(env, object, napi_object)) {
150 TAG_LOGE(AAFwkTag::APPKIT, "Check type failed");
151 return CreateJsUndefined(env);
152 }
153 BindNativeProperty(env, object, "cacheDir", GetCacheDir);
154 BindNativeProperty(env, object, "tempDir", GetTempDir);
155 BindNativeProperty(env, object, "resourceDir", GetResourceDir);
156 BindNativeProperty(env, object, "filesDir", GetFilesDir);
157 BindNativeProperty(env, object, "distributedFilesDir", GetDistributedFilesDir);
158 BindNativeProperty(env, object, "databaseDir", GetDatabaseDir);
159 BindNativeProperty(env, object, "preferencesDir", GetPreferencesDir);
160 BindNativeProperty(env, object, "bundleCodeDir", GetBundleCodeDir);
161 BindNativeProperty(env, object, "cloudFileDir", GetCloudFileDir);
162 return CreateJsUndefined(env);
163 }
164
165
CreateModuleContext(napi_env env,napi_callback_info info)166 napi_value JsApplicationContextUtils::CreateModuleContext(napi_env env, napi_callback_info info)
167 {
168 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils,
169 OnCreateModuleContext, APPLICATION_CONTEXT_NAME);
170 }
171
OnCreateModuleContext(napi_env env,NapiCallbackInfo & info)172 napi_value JsApplicationContextUtils::OnCreateModuleContext(napi_env env, NapiCallbackInfo& info)
173 {
174 auto applicationContext = applicationContext_.lock();
175 if (!applicationContext) {
176 TAG_LOGW(AAFwkTag::APPKIT, "null applicationContext");
177 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
178 return CreateJsUndefined(env);
179 }
180
181 std::string moduleName;
182 std::shared_ptr<Context> moduleContext = nullptr;
183 if (!ConvertFromJsValue(env, info.argv[1], moduleName)) {
184 TAG_LOGD(AAFwkTag::APPKIT, "Parse inner module name.");
185 if (!ConvertFromJsValue(env, info.argv[0], moduleName)) {
186 TAG_LOGE(AAFwkTag::APPKIT, "Parse moduleName failed");
187 ThrowInvalidParamError(env, "Parse param moduleName failed, moduleName must be string.");
188 return CreateJsUndefined(env);
189 }
190 moduleContext = applicationContext->CreateModuleContext(moduleName);
191 } else {
192 std::string bundleName;
193 if (!ConvertFromJsValue(env, info.argv[0], bundleName)) {
194 TAG_LOGE(AAFwkTag::APPKIT, "Parse bundleName failed");
195 ThrowInvalidParamError(env, "Parse param bundleName failed, bundleName must be string.");
196 return CreateJsUndefined(env);
197 }
198 if (!CheckCallerIsSystemApp()) {
199 TAG_LOGE(AAFwkTag::APPKIT, "not system-app");
200 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_NOT_SYSTEM_APP);
201 return CreateJsUndefined(env);
202 }
203 TAG_LOGI(AAFwkTag::APPKIT, "parse outer module name");
204 moduleContext = applicationContext->CreateModuleContext(bundleName, moduleName);
205 }
206
207 if (!moduleContext) {
208 TAG_LOGE(AAFwkTag::APPKIT, "null moduleContext");
209 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
210 return CreateJsUndefined(env);
211 }
212 return CreateJsModuleContext(env, moduleContext);
213 }
214
CreateJsModuleContext(napi_env env,const std::shared_ptr<Context> & moduleContext)215 napi_value JsApplicationContextUtils::CreateJsModuleContext(napi_env env, const std::shared_ptr<Context>& moduleContext)
216 {
217 napi_value value = CreateJsBaseContext(env, moduleContext, true);
218 auto systemModule = JsRuntime::LoadSystemModuleByEngine(env, "application.Context", &value, 1);
219 if (systemModule == nullptr) {
220 TAG_LOGW(AAFwkTag::APPKIT, "null systemModule");
221 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
222 return CreateJsUndefined(env);
223 }
224 napi_value contextObj = systemModule->GetNapiValue();
225 if (!CheckTypeForNapiValue(env, contextObj, napi_object)) {
226 TAG_LOGE(AAFwkTag::APPKIT, "get object failed");
227 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
228 return CreateJsUndefined(env);
229 }
230 auto workContext = new (std::nothrow) std::weak_ptr<Context>(moduleContext);
231 napi_coerce_to_native_binding_object(env, contextObj, DetachCallbackFunc, AttachBaseContext, workContext, nullptr);
232 auto res = napi_wrap(env, contextObj, workContext,
233 [](napi_env, void *data, void *) {
234 TAG_LOGD(AAFwkTag::APPKIT, "Finalizer for weak_ptr module context is called");
235 delete static_cast<std::weak_ptr<Context> *>(data);
236 },
237 nullptr, nullptr);
238 if (res != napi_ok && workContext != nullptr) {
239 TAG_LOGE(AAFwkTag::APPKIT, "napi_wrap failed:%{public}d", res);
240 delete workContext;
241 return CreateJsUndefined(env);
242 }
243 return contextObj;
244 }
245
CreateSystemHspModuleResourceManager(napi_env env,napi_callback_info info)246 napi_value JsApplicationContextUtils::CreateSystemHspModuleResourceManager(napi_env env, napi_callback_info info)
247 {
248 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils,
249 OnCreateSystemHspModuleResourceManager, APPLICATION_CONTEXT_NAME);
250 }
251
OnCreateSystemHspModuleResourceManager(napi_env env,NapiCallbackInfo & info)252 napi_value JsApplicationContextUtils::OnCreateSystemHspModuleResourceManager(napi_env env, NapiCallbackInfo& info)
253 {
254 auto applicationContext = applicationContext_.lock();
255 if (!applicationContext) {
256 TAG_LOGW(AAFwkTag::APPKIT, "null applicationContext");
257 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
258 return CreateJsUndefined(env);
259 }
260
261 std::string bundleName = "";
262 if (!ConvertFromJsValue(env, info.argv[0], bundleName)) {
263 TAG_LOGE(AAFwkTag::APPKIT, "Parse bundleName failed");
264 ThrowInvalidParamError(env, "Parse param bundleName failed, bundleName must be string.");
265 return CreateJsUndefined(env);
266 }
267 std::string moduleName = "";
268 if (!ConvertFromJsValue(env, info.argv[1], moduleName)) {
269 TAG_LOGD(AAFwkTag::APPKIT, "Parse module name failed.");
270 ThrowInvalidParamError(env, "Parse param moduleName failed, moduleName must be string.");
271 return CreateJsUndefined(env);
272 }
273
274 std::shared_ptr<Global::Resource::ResourceManager> resourceManager = nullptr;
275 int32_t retCode = applicationContext->CreateSystemHspModuleResourceManager(bundleName, moduleName, resourceManager);
276 if (resourceManager == nullptr && retCode == ERR_ABILITY_RUNTIME_EXTERNAL_NOT_SYSTEM_HSP) {
277 TAG_LOGE(AAFwkTag::APPKIT, "null resourceManager");
278 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_NOT_SYSTEM_HSP);
279 return CreateJsUndefined(env);
280 }
281 if (resourceManager == nullptr) {
282 TAG_LOGE(AAFwkTag::APPKIT, "null resourceManager");
283 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
284 return CreateJsUndefined(env);
285 }
286 return CreateJsResourceManager(env, resourceManager, nullptr);
287 }
288
CreateModuleResourceManager(napi_env env,napi_callback_info info)289 napi_value JsApplicationContextUtils::CreateModuleResourceManager(napi_env env, napi_callback_info info)
290 {
291 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils,
292 OnCreateModuleResourceManager, APPLICATION_CONTEXT_NAME);
293 }
294
OnCreateModuleResourceManager(napi_env env,NapiCallbackInfo & info)295 napi_value JsApplicationContextUtils::OnCreateModuleResourceManager(napi_env env, NapiCallbackInfo& info)
296 {
297 auto applicationContext = applicationContext_.lock();
298 if (!applicationContext) {
299 TAG_LOGW(AAFwkTag::APPKIT, "null applicationContext");
300 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
301 return CreateJsUndefined(env);
302 }
303
304 std::string bundleName;
305 if (!ConvertFromJsValue(env, info.argv[0], bundleName)) {
306 TAG_LOGE(AAFwkTag::APPKIT, "Parse bundleName failed");
307 ThrowInvalidParamError(env, "Parse param bundleName failed, bundleName must be string.");
308 return CreateJsUndefined(env);
309 }
310 std::string moduleName;
311 if (!ConvertFromJsValue(env, info.argv[1], moduleName)) {
312 TAG_LOGE(AAFwkTag::APPKIT, "Parse moduleName failed");
313 ThrowInvalidParamError(env, "Parse param moduleName failed, moduleName must be string.");
314 return CreateJsUndefined(env);
315 }
316 if (!CheckCallerIsSystemApp()) {
317 TAG_LOGE(AAFwkTag::APPKIT, "not system-app");
318 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_NOT_SYSTEM_APP);
319 return CreateJsUndefined(env);
320 }
321 auto resourceManager = applicationContext->CreateModuleResourceManager(bundleName, moduleName);
322 if (resourceManager == nullptr) {
323 TAG_LOGE(AAFwkTag::APPKIT, "null resourceManager");
324 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
325 return CreateJsUndefined(env);
326 }
327 auto jsResourceManager = CreateJsResourceManager(env, resourceManager, nullptr);
328 return jsResourceManager;
329 }
330
GetArea(napi_env env,napi_callback_info info)331 napi_value JsApplicationContextUtils::GetArea(napi_env env, napi_callback_info info)
332 {
333 TAG_LOGD(AAFwkTag::APPKIT, "called");
334 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils, OnGetArea, APPLICATION_CONTEXT_NAME);
335 }
336
OnGetArea(napi_env env,NapiCallbackInfo & info)337 napi_value JsApplicationContextUtils::OnGetArea(napi_env env, NapiCallbackInfo& info)
338 {
339 auto applicationContext = applicationContext_.lock();
340 if (!applicationContext) {
341 TAG_LOGW(AAFwkTag::APPKIT, "null applicationContext");
342 return CreateJsUndefined(env);
343 }
344 int area = applicationContext->GetArea();
345 return CreateJsValue(env, area);
346 }
347
GetCacheDir(napi_env env,napi_callback_info info)348 napi_value JsApplicationContextUtils::GetCacheDir(napi_env env, napi_callback_info info)
349 {
350 TAG_LOGD(AAFwkTag::APPKIT, "called");
351 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils, OnGetCacheDir, APPLICATION_CONTEXT_NAME);
352 }
353
OnGetCacheDir(napi_env env,NapiCallbackInfo & info)354 napi_value JsApplicationContextUtils::OnGetCacheDir(napi_env env, NapiCallbackInfo& info)
355 {
356 auto applicationContext = applicationContext_.lock();
357 if (!applicationContext) {
358 TAG_LOGW(AAFwkTag::APPKIT, "null applicationContext");
359 return CreateJsUndefined(env);
360 }
361 std::string path = applicationContext->GetCacheDir();
362 return CreateJsValue(env, path);
363 }
364
GetTempDir(napi_env env,napi_callback_info info)365 napi_value JsApplicationContextUtils::GetTempDir(napi_env env, napi_callback_info info)
366 {
367 TAG_LOGD(AAFwkTag::APPKIT, "called");
368 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils, OnGetTempDir, APPLICATION_CONTEXT_NAME);
369 }
370
OnGetTempDir(napi_env env,NapiCallbackInfo & info)371 napi_value JsApplicationContextUtils::OnGetTempDir(napi_env env, NapiCallbackInfo& info)
372 {
373 auto applicationContext = applicationContext_.lock();
374 if (!applicationContext) {
375 TAG_LOGW(AAFwkTag::APPKIT, "null applicationContext");
376 return CreateJsUndefined(env);
377 }
378 std::string path = applicationContext->GetTempDir();
379 return CreateJsValue(env, path);
380 }
381
GetResourceDir(napi_env env,napi_callback_info info)382 napi_value JsApplicationContextUtils::GetResourceDir(napi_env env, napi_callback_info info)
383 {
384 TAG_LOGD(AAFwkTag::APPKIT, "called");
385 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils, OnGetResourceDir, APPLICATION_CONTEXT_NAME);
386 }
387
OnGetResourceDir(napi_env env,NapiCallbackInfo & info)388 napi_value JsApplicationContextUtils::OnGetResourceDir(napi_env env, NapiCallbackInfo& info)
389 {
390 auto applicationContext = applicationContext_.lock();
391 if (!applicationContext) {
392 TAG_LOGW(AAFwkTag::APPKIT, "null applicationContext");
393 return CreateJsUndefined(env);
394 }
395 std::string path = applicationContext->GetResourceDir();
396 return CreateJsValue(env, path);
397 }
398
GetFilesDir(napi_env env,napi_callback_info info)399 napi_value JsApplicationContextUtils::GetFilesDir(napi_env env, napi_callback_info info)
400 {
401 TAG_LOGD(AAFwkTag::APPKIT, "called");
402 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils, OnGetFilesDir, APPLICATION_CONTEXT_NAME);
403 }
404
OnGetFilesDir(napi_env env,NapiCallbackInfo & info)405 napi_value JsApplicationContextUtils::OnGetFilesDir(napi_env env, NapiCallbackInfo& info)
406 {
407 auto applicationContext = applicationContext_.lock();
408 if (!applicationContext) {
409 TAG_LOGW(AAFwkTag::APPKIT, "null applicationContext");
410 return CreateJsUndefined(env);
411 }
412 std::string path = applicationContext->GetFilesDir();
413 return CreateJsValue(env, path);
414 }
415
GetDistributedFilesDir(napi_env env,napi_callback_info info)416 napi_value JsApplicationContextUtils::GetDistributedFilesDir(napi_env env, napi_callback_info info)
417 {
418 TAG_LOGD(AAFwkTag::APPKIT, "called");
419 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils,
420 OnGetDistributedFilesDir, APPLICATION_CONTEXT_NAME);
421 }
422
OnGetDistributedFilesDir(napi_env env,NapiCallbackInfo & info)423 napi_value JsApplicationContextUtils::OnGetDistributedFilesDir(napi_env env, NapiCallbackInfo& info)
424 {
425 auto applicationContext = applicationContext_.lock();
426 if (!applicationContext) {
427 TAG_LOGW(AAFwkTag::APPKIT, "null applicationContext");
428 return CreateJsUndefined(env);
429 }
430 std::string path = applicationContext->GetDistributedFilesDir();
431 return CreateJsValue(env, path);
432 }
433
GetCloudFileDir(napi_env env,napi_callback_info info)434 napi_value JsApplicationContextUtils::GetCloudFileDir(napi_env env, napi_callback_info info)
435 {
436 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils,
437 OnGetCloudFileDir, APPLICATION_CONTEXT_NAME);
438 }
439
OnGetCloudFileDir(napi_env env,NapiCallbackInfo & info)440 napi_value JsApplicationContextUtils::OnGetCloudFileDir(napi_env env, NapiCallbackInfo& info)
441 {
442 auto applicationContext = applicationContext_.lock();
443 if (!applicationContext) {
444 TAG_LOGW(AAFwkTag::APPKIT, "null applicationContext");
445 return CreateJsUndefined(env);
446 }
447 std::string path = applicationContext->GetCloudFileDir();
448 return CreateJsValue(env, path);
449 }
450
GetProcessName(napi_env env,napi_callback_info info)451 napi_value JsApplicationContextUtils::GetProcessName(napi_env env, napi_callback_info info)
452 {
453 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils, OnGetProcessName, APPLICATION_CONTEXT_NAME);
454 }
455
OnGetProcessName(napi_env env,NapiCallbackInfo & info)456 napi_value JsApplicationContextUtils::OnGetProcessName(napi_env env, NapiCallbackInfo &info)
457 {
458 auto applicationContext = applicationContext_.lock();
459 if (applicationContext == nullptr) {
460 TAG_LOGE(AAFwkTag::APPKIT, "applicationContext is already released");
461 return CreateJsUndefined(env);
462 }
463 std::string name = applicationContext->GetProcessName();
464 return CreateJsValue(env, name);
465 }
466
GetDatabaseDir(napi_env env,napi_callback_info info)467 napi_value JsApplicationContextUtils::GetDatabaseDir(napi_env env, napi_callback_info info)
468 {
469 TAG_LOGD(AAFwkTag::APPKIT, "called");
470 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils, OnGetDatabaseDir, APPLICATION_CONTEXT_NAME);
471 }
472
OnGetDatabaseDir(napi_env env,NapiCallbackInfo & info)473 napi_value JsApplicationContextUtils::OnGetDatabaseDir(napi_env env, NapiCallbackInfo& info)
474 {
475 auto applicationContext = applicationContext_.lock();
476 if (!applicationContext) {
477 TAG_LOGW(AAFwkTag::APPKIT, "null applicationContext");
478 return CreateJsUndefined(env);
479 }
480 std::string path = applicationContext->GetDatabaseDir();
481 return CreateJsValue(env, path);
482 }
483
GetPreferencesDir(napi_env env,napi_callback_info info)484 napi_value JsApplicationContextUtils::GetPreferencesDir(napi_env env, napi_callback_info info)
485 {
486 TAG_LOGD(AAFwkTag::APPKIT, "called");
487 GET_NAPI_INFO_WITH_NAME_AND_CALL(
488 env, info, JsApplicationContextUtils, OnGetPreferencesDir, APPLICATION_CONTEXT_NAME);
489 }
490
GetGroupDir(napi_env env,napi_callback_info info)491 napi_value JsApplicationContextUtils::GetGroupDir(napi_env env, napi_callback_info info)
492 {
493 TAG_LOGD(AAFwkTag::APPKIT, "called");
494 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils, OnGetGroupDir, APPLICATION_CONTEXT_NAME);
495 }
496
OnGetPreferencesDir(napi_env env,NapiCallbackInfo & info)497 napi_value JsApplicationContextUtils::OnGetPreferencesDir(napi_env env, NapiCallbackInfo& info)
498 {
499 auto applicationContext = applicationContext_.lock();
500 if (!applicationContext) {
501 TAG_LOGW(AAFwkTag::APPKIT, "null applicationContext");
502 return CreateJsUndefined(env);
503 }
504 std::string path = applicationContext->GetPreferencesDir();
505 return CreateJsValue(env, path);
506 }
507
OnGetGroupDir(napi_env env,NapiCallbackInfo & info)508 napi_value JsApplicationContextUtils::OnGetGroupDir(napi_env env, NapiCallbackInfo& info)
509 {
510 if (info.argc != ARGC_ONE && info.argc != ARGC_TWO) {
511 TAG_LOGE(AAFwkTag::APPKIT, "Not enough params");
512 ThrowInvalidParamError(env, "Not enough params.");
513 return CreateJsUndefined(env);
514 }
515
516 std::string groupId;
517 if (!ConvertFromJsValue(env, info.argv[0], groupId)) {
518 TAG_LOGE(AAFwkTag::APPKIT, "Parse groupId failed");
519 ThrowInvalidParamError(env, "Parse param groupId failed, groupId must be string.");
520 return CreateJsUndefined(env);
521 }
522
523 TAG_LOGD(AAFwkTag::APPKIT, "Get Group Dir");
524 auto innerErrCode = std::make_shared<ErrCode>(ERR_OK);
525 auto path = std::make_shared<std::string>("");
526 NapiAsyncTask::ExecuteCallback execute =
527 [applicationContext = applicationContext_, groupId, innerErrCode, path]() {
528 auto context = applicationContext.lock();
529 if (!context) {
530 TAG_LOGE(AAFwkTag::APPKIT, "null Context");
531 *innerErrCode = ERR_ABILITY_RUNTIME_EXTERNAL_CONTEXT_NOT_EXIST;
532 return;
533 }
534 *path = context->GetGroupDir(groupId);
535 };
536 auto complete = [innerErrCode, path](napi_env env, NapiAsyncTask& task, int32_t status) {
537 if (*innerErrCode == ERR_OK) {
538 task.ResolveWithNoError(env, CreateJsValue(env, *path));
539 } else {
540 task.Reject(env, CreateJsError(env, *innerErrCode,
541 "applicationContext if already released"));
542 }
543 };
544 napi_value lastParam = (info.argc == ARGC_TWO) ? info.argv[INDEX_ONE] : nullptr;
545 napi_value result = nullptr;
546 NapiAsyncTask::ScheduleHighQos("JsApplicationContextUtils::OnGetGroupDir",
547 env, CreateAsyncTaskWithLastParam(env, lastParam, std::move(execute), std::move(complete), &result));
548 return result;
549 }
550
RestartApp(napi_env env,napi_callback_info info)551 napi_value JsApplicationContextUtils::RestartApp(napi_env env, napi_callback_info info)
552 {
553 TAG_LOGD(AAFwkTag::APPKIT, "called");
554 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils, OnRestartApp, APPLICATION_CONTEXT_NAME);
555 }
556
OnRestartApp(napi_env env,NapiCallbackInfo & info)557 napi_value JsApplicationContextUtils::OnRestartApp(napi_env env, NapiCallbackInfo& info)
558 {
559 // only support one params
560 if (info.argc == ARGC_ZERO) {
561 TAG_LOGE(AAFwkTag::APPKIT, "Not enough params");
562 ThrowInvalidParamError(env, "Not enough params");
563 return CreateJsUndefined(env);
564 }
565 auto applicationContext = applicationContext_.lock();
566 if (!applicationContext) {
567 TAG_LOGW(AAFwkTag::APPKIT, "null applicationContext");
568 return CreateJsUndefined(env);
569 }
570 AAFwk::Want want;
571 if (!AppExecFwk::UnwrapWant(env, info.argv[INDEX_ZERO], want)) {
572 TAG_LOGE(AAFwkTag::APPKIT, "Parse want failed");
573 ThrowInvalidParamError(env, "Parse param want failed, want must be Want.");
574 return CreateJsUndefined(env);
575 }
576
577 auto errCode = applicationContext->RestartApp(want);
578 if (errCode == ERR_OK) {
579 return CreateJsUndefined(env);
580 }
581 if (errCode == ERR_INVALID_VALUE) {
582 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
583 } else if (errCode == AAFwk::ERR_RESTART_APP_INCORRECT_ABILITY) {
584 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_RESTART_APP_INCORRECT_ABILITY);
585 } else if (errCode == AAFwk::ERR_RESTART_APP_FREQUENT) {
586 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_RESTART_APP_FREQUENT);
587 } else if (errCode == AAFwk::NOT_TOP_ABILITY) {
588 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_NOT_TOP_ABILITY);
589 } else {
590 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INTERNAL_ERROR);
591 }
592 TAG_LOGE(AAFwkTag::APPKIT, "errCode:%{public}d.", errCode);
593 return CreateJsUndefined(env);
594 }
595
GetBundleCodeDir(napi_env env,napi_callback_info info)596 napi_value JsApplicationContextUtils::GetBundleCodeDir(napi_env env, napi_callback_info info)
597 {
598 TAG_LOGD(AAFwkTag::APPKIT, "called");
599 GET_NAPI_INFO_WITH_NAME_AND_CALL(
600 env, info, JsApplicationContextUtils, OnGetBundleCodeDir, APPLICATION_CONTEXT_NAME);
601 }
602
OnGetBundleCodeDir(napi_env env,NapiCallbackInfo & info)603 napi_value JsApplicationContextUtils::OnGetBundleCodeDir(napi_env env, NapiCallbackInfo& info)
604 {
605 auto applicationContext = applicationContext_.lock();
606 if (!applicationContext) {
607 TAG_LOGW(AAFwkTag::APPKIT, "null applicationContext");
608 return CreateJsUndefined(env);
609 }
610 std::string path = applicationContext->GetBundleCodeDir();
611 return CreateJsValue(env, path);
612 }
613
KillProcessBySelf(napi_env env,napi_callback_info info)614 napi_value JsApplicationContextUtils::KillProcessBySelf(napi_env env, napi_callback_info info)
615 {
616 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils,
617 OnKillProcessBySelf, APPLICATION_CONTEXT_NAME);
618 }
619
OnKillProcessBySelf(napi_env env,NapiCallbackInfo & info)620 napi_value JsApplicationContextUtils::OnKillProcessBySelf(napi_env env, NapiCallbackInfo& info)
621 {
622 // only support 0 or 1 or 2 params
623 if (info.argc != ARGC_ZERO && info.argc != ARGC_ONE && info.argc != ARGC_TWO) {
624 TAG_LOGE(AAFwkTag::APPKIT, "Not enough params");
625 ThrowInvalidParamError(env, "Not enough params.");
626 return CreateJsUndefined(env);
627 }
628
629 bool clearPageStack = true;
630 bool hasClearPageStack = false;
631 if (info.argc > ARGC_ZERO && ConvertFromJsValue(env, info.argv[0], clearPageStack)) {
632 hasClearPageStack = true;
633 }
634
635 TAG_LOGD(AAFwkTag::APPKIT, "kill self process");
636 auto innerErrCode = std::make_shared<ErrCode>(ERR_OK);
637 NapiAsyncTask::ExecuteCallback execute =
638 [applicationContext = applicationContext_, clearPageStack, innerErrCode]() {
639 auto context = applicationContext.lock();
640 if (!context) {
641 TAG_LOGE(AAFwkTag::APPKIT, "null context");
642 *innerErrCode = ERR_ABILITY_RUNTIME_EXTERNAL_CONTEXT_NOT_EXIST;
643 return;
644 }
645 context->KillProcessBySelf(clearPageStack);
646 };
647 NapiAsyncTask::CompleteCallback complete = [innerErrCode](napi_env env, NapiAsyncTask& task, int32_t status) {
648 if (*innerErrCode != ERR_OK) {
649 task.Reject(env, CreateJsError(env, *innerErrCode, "applicationContext is already released."));
650 return;
651 }
652 task.ResolveWithNoError(env, CreateJsUndefined(env));
653 };
654 napi_value lastParam = (info.argc == ARGC_ONE && !hasClearPageStack) ? info.argv[INDEX_ZERO] : nullptr;
655 napi_value result = nullptr;
656 NapiAsyncTask::ScheduleHighQos("JsApplicationContextUtils::OnkillProcessBySelf",
657 env, CreateAsyncTaskWithLastParam(env, lastParam, std::move(execute), std::move(complete), &result));
658 return result;
659 }
660
SetColorMode(napi_env env,napi_callback_info info)661 napi_value JsApplicationContextUtils::SetColorMode(napi_env env, napi_callback_info info)
662 {
663 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils, OnSetColorMode, APPLICATION_CONTEXT_NAME);
664 }
665
OnSetColorMode(napi_env env,NapiCallbackInfo & info)666 napi_value JsApplicationContextUtils::OnSetColorMode(napi_env env, NapiCallbackInfo& info)
667 {
668 TAG_LOGD(AAFwkTag::APPKIT, "called");
669 // only support one params
670 if (info.argc == ARGC_ZERO) {
671 TAG_LOGE(AAFwkTag::APPKIT, "Not enough params");
672 ThrowInvalidParamError(env, "Not enough params.");
673 return CreateJsUndefined(env);
674 }
675 auto applicationContext = applicationContext_.lock();
676 if (applicationContext == nullptr) {
677 TAG_LOGW(AAFwkTag::APPKIT, "null applicationContext");
678 return CreateJsUndefined(env);
679 }
680
681 int32_t colorMode = 0;
682 if (!ConvertFromJsValue(env, info.argv[INDEX_ZERO], colorMode)) {
683 ThrowInvalidParamError(env, "Parse param colorMode failed, colorMode must be number.");
684 TAG_LOGE(AAFwkTag::APPKIT, "Parse colorMode failed");
685 return CreateJsUndefined(env);
686 }
687 applicationContext->SetColorMode(colorMode);
688 return CreateJsUndefined(env);
689 }
690
SetLanguage(napi_env env,napi_callback_info info)691 napi_value JsApplicationContextUtils::SetLanguage(napi_env env, napi_callback_info info)
692 {
693 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils, OnSetLanguage, APPLICATION_CONTEXT_NAME);
694 }
695
OnSetLanguage(napi_env env,NapiCallbackInfo & info)696 napi_value JsApplicationContextUtils::OnSetLanguage(napi_env env, NapiCallbackInfo& info)
697 {
698 // only support one params
699 if (info.argc == ARGC_ZERO) {
700 TAG_LOGE(AAFwkTag::APPKIT, "Not enough params");
701 ThrowInvalidParamError(env, "Not enough params.");
702 return CreateJsUndefined(env);
703 }
704 auto applicationContext = applicationContext_.lock();
705 if (!applicationContext) {
706 TAG_LOGW(AAFwkTag::APPKIT, "null applicationContext");
707 return CreateJsUndefined(env);
708 }
709 std::string language;
710 if (!ConvertFromJsValue(env, info.argv[INDEX_ZERO], language)) {
711 TAG_LOGE(AAFwkTag::APPKIT, "Parse language failed");
712 ThrowInvalidParamError(env, "Parse param language failed, language must be string.");
713 return CreateJsUndefined(env);
714 }
715 applicationContext->SetLanguage(language);
716 return CreateJsUndefined(env);
717 }
718
SetFontSizeScale(napi_env env,napi_callback_info info)719 napi_value JsApplicationContextUtils::SetFontSizeScale(napi_env env, napi_callback_info info)
720 {
721 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils,
722 OnSetFontSizeScale, APPLICATION_CONTEXT_NAME);
723 }
724
OnSetFontSizeScale(napi_env env,NapiCallbackInfo & info)725 napi_value JsApplicationContextUtils::OnSetFontSizeScale(napi_env env, NapiCallbackInfo& info)
726 {
727 if (info.argc == ARGC_ZERO) {
728 TAG_LOGE(AAFwkTag::APPKIT, "Not enough params");
729 ThrowInvalidParamError(env, "Not enough params.");
730 return CreateJsUndefined(env);
731 }
732
733 auto applicationContext = applicationContext_.lock();
734 if (applicationContext == nullptr) {
735 TAG_LOGE(AAFwkTag::APPKIT, "null applicationContext");
736 ThrowError(env, AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT);
737 return CreateJsUndefined(env);
738 }
739
740 double fontSizeScale = 1;
741 if (!ConvertFromJsNumber(env, info.argv[INDEX_ZERO], fontSizeScale)) {
742 TAG_LOGE(AAFwkTag::APPKIT, "Parse fontSizeScale failed");
743 ThrowInvalidParamError(env, "Parse fontSizeScale failed, fontSizeScale must be number.");
744 return CreateJsUndefined(env);
745 }
746 TAG_LOGD(AAFwkTag::APPKIT, "fontSizeScale: %{public}f", fontSizeScale);
747 if (fontSizeScale < FOUNT_SIZE) {
748 TAG_LOGE(AAFwkTag::APPKIT, "invalid size");
749 ThrowInvalidParamError(env, "Invalid font size.");
750 return CreateJsUndefined(env);
751 }
752
753 applicationContext->SetFontSizeScale(fontSizeScale);
754 return CreateJsUndefined(env);
755 }
756
SetFont(napi_env env,napi_callback_info info)757 napi_value JsApplicationContextUtils::SetFont(napi_env env, napi_callback_info info)
758 {
759 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils, OnSetFont, APPLICATION_CONTEXT_NAME);
760 }
761
OnSetFont(napi_env env,NapiCallbackInfo & info)762 napi_value JsApplicationContextUtils::OnSetFont(napi_env env, NapiCallbackInfo& info)
763 {
764 // only support one params
765 if (info.argc == ARGC_ZERO) {
766 TAG_LOGE(AAFwkTag::APPKIT, "Not enough params");
767 ThrowInvalidParamError(env, "Not enough params.");
768 return CreateJsUndefined(env);
769 }
770 auto applicationContext = applicationContext_.lock();
771 if (!applicationContext) {
772 TAG_LOGW(AAFwkTag::APPKIT, "null applicationContext");
773 return CreateJsUndefined(env);
774 }
775 std::string font;
776 if (!ConvertFromJsValue(env, info.argv[INDEX_ZERO], font)) {
777 TAG_LOGE(AAFwkTag::APPKIT, "Parse font failed");
778 ThrowInvalidParamError(env, "Parse param font failed, font must be string.");
779 return CreateJsUndefined(env);
780 }
781 applicationContext->SetFont(font);
782 return CreateJsUndefined(env);
783 }
784
PreloadUIExtensionAbility(napi_env env,napi_callback_info info)785 napi_value JsApplicationContextUtils::PreloadUIExtensionAbility(napi_env env, napi_callback_info info)
786 {
787 GET_NAPI_INFO_WITH_NAME_AND_CALL(
788 env, info, JsApplicationContextUtils, OnPreloadUIExtensionAbility, APPLICATION_CONTEXT_NAME);
789 }
790
OnPreloadUIExtensionAbility(napi_env env,NapiCallbackInfo & info)791 napi_value JsApplicationContextUtils::OnPreloadUIExtensionAbility(napi_env env, NapiCallbackInfo& info)
792 {
793 TAG_LOGD(AAFwkTag::APPKIT, "called");
794 if (info.argc < ARGC_ONE) {
795 TAG_LOGW(AAFwkTag::APPKIT, "params error");
796 ThrowTooFewParametersError(env);
797 return CreateJsUndefined(env);
798 }
799
800 AAFwk::Want want;
801 if (!AppExecFwk::UnwrapWant(env, info.argv[INDEX_ZERO], want)) {
802 TAG_LOGW(AAFwkTag::APPKIT, "Parse want failed");
803 ThrowInvalidParamError(env,
804 "Parse param want failed, want must be Want.");
805 return CreateJsUndefined(env);
806 }
807
808 auto innerErrCode = std::make_shared<ErrCode>(ERR_OK);
809 NapiAsyncTask::ExecuteCallback execute = [applicationContext = applicationContext_, want, innerErrCode]() {
810 auto context = applicationContext.lock();
811 if (!context) {
812 TAG_LOGE(AAFwkTag::APPKIT, "null context");
813 *innerErrCode = static_cast<int>(AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT);
814 return;
815 }
816 auto hostBundleName = context->GetBundleName();
817 TAG_LOGD(AAFwkTag::APPKIT, "HostBundleName is %{public}s", hostBundleName.c_str());
818 *innerErrCode = AAFwk::AbilityManagerClient::GetInstance()->PreloadUIExtensionAbility(want, hostBundleName);
819 };
820 NapiAsyncTask::CompleteCallback complete = [innerErrCode](napi_env env, NapiAsyncTask& task, int32_t status) {
821 if (*innerErrCode == ERR_OK) {
822 task.Resolve(env, CreateJsUndefined(env));
823 } else {
824 TAG_LOGE(AAFwkTag::APPKIT, "OnPreloadUIExtensionAbility failed %{public}d", *innerErrCode);
825 task.Reject(env, CreateJsErrorByNativeErr(env, *innerErrCode));
826 }
827 };
828 napi_value result = nullptr;
829 NapiAsyncTask::ScheduleHighQos("JsApplicationContextUtils::OnPreloadUIExtensionAbility",
830 env, CreateAsyncTaskWithLastParam(env, nullptr, std::move(execute), std::move(complete), &result));
831 return result;
832 }
833
ClearUpApplicationData(napi_env env,napi_callback_info info)834 napi_value JsApplicationContextUtils::ClearUpApplicationData(napi_env env, napi_callback_info info)
835 {
836 GET_NAPI_INFO_WITH_NAME_AND_CALL(
837 env, info, JsApplicationContextUtils, OnClearUpApplicationData, APPLICATION_CONTEXT_NAME);
838 }
839
OnClearUpApplicationData(napi_env env,NapiCallbackInfo & info)840 napi_value JsApplicationContextUtils::OnClearUpApplicationData(napi_env env, NapiCallbackInfo &info)
841 {
842 // only support 0 or 1 params
843 if (info.argc != ARGC_ZERO && info.argc != ARGC_ONE) {
844 TAG_LOGE(AAFwkTag::APPKIT, "Not enough params");
845 ThrowInvalidParamError(env, "Not enough params.");
846 return CreateJsUndefined(env);
847 }
848 auto innerErrCode = std::make_shared<ErrCode>(ERR_OK);
849 NapiAsyncTask::ExecuteCallback execute = [applicationContext = applicationContext_, innerErrCode]() {
850 auto context = applicationContext.lock();
851 if (!context) {
852 TAG_LOGE(AAFwkTag::APPKIT, "null context");
853 *innerErrCode = ERR_ABILITY_RUNTIME_EXTERNAL_CONTEXT_NOT_EXIST;
854 return;
855 }
856 context->ClearUpApplicationData();
857 };
858 NapiAsyncTask::CompleteCallback complete =
859 [applicationContext = applicationContext_, innerErrCode](napi_env env, NapiAsyncTask& task, int32_t status) {
860 if (*innerErrCode == ERR_OK) {
861 task.ResolveWithNoError(env, CreateJsUndefined(env));
862 } else {
863 task.Reject(env, CreateJsError(env, *innerErrCode, "applicationContext if already released."));
864 }
865 };
866 napi_value lastParam = (info.argc == ARGC_ONE) ? info.argv[INDEX_ZERO] : nullptr;
867 napi_value result = nullptr;
868 NapiAsyncTask::ScheduleHighQos("JsApplicationContextUtils::OnClearUpApplicationData",
869 env, CreateAsyncTaskWithLastParam(env, lastParam, std::move(execute), std::move(complete), &result));
870 return result;
871 }
872
GetRunningProcessInformation(napi_env env,napi_callback_info info)873 napi_value JsApplicationContextUtils::GetRunningProcessInformation(napi_env env, napi_callback_info info)
874 {
875 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils,
876 OnGetRunningProcessInformation, APPLICATION_CONTEXT_NAME);
877 }
878
OnGetRunningProcessInformation(napi_env env,NapiCallbackInfo & info)879 napi_value JsApplicationContextUtils::OnGetRunningProcessInformation(napi_env env, NapiCallbackInfo& info)
880 {
881 // only support 0 or 1 params
882 if (info.argc != ARGC_ZERO && info.argc != ARGC_ONE) {
883 TAG_LOGE(AAFwkTag::APPKIT, "Not enough params");
884 ThrowInvalidParamError(env, "Not enough params.");
885 return CreateJsUndefined(env);
886 }
887 TAG_LOGD(AAFwkTag::APPKIT, "Get Process Info");
888 auto innerErrCode = std::make_shared<ErrCode>(ERR_OK);
889 auto processInfo = std::make_shared<AppExecFwk::RunningProcessInfo>();
890 NapiAsyncTask::ExecuteCallback execute = [applicationContext = applicationContext_, innerErrCode, processInfo]() {
891 auto context = applicationContext.lock();
892 if (!context) {
893 TAG_LOGE(AAFwkTag::APPKIT, "null context");
894 *innerErrCode = ERR_ABILITY_RUNTIME_EXTERNAL_CONTEXT_NOT_EXIST;
895 return;
896 }
897 *innerErrCode = context->GetProcessRunningInformation(*processInfo);
898 };
899 auto complete = [innerErrCode, processInfo](napi_env env, NapiAsyncTask& task, int32_t status) {
900 if (*innerErrCode == ERR_ABILITY_RUNTIME_EXTERNAL_CONTEXT_NOT_EXIST) {
901 task.Reject(env, CreateJsError(env, *innerErrCode,
902 "applicationContext if already released."));
903 return;
904 }
905 if (*innerErrCode == ERR_OK) {
906 napi_value object = nullptr;
907 napi_create_object(env, &object);
908 napi_set_named_property(env, object, "processName", CreateJsValue(env, processInfo->processName_));
909 napi_set_named_property(env, object, "pid", CreateJsValue(env, processInfo->pid_));
910 napi_set_named_property(env, object, "uid", CreateJsValue(env, processInfo->uid_));
911 napi_set_named_property(env, object, "bundleNames", CreateNativeArray(env, processInfo->bundleNames));
912 napi_set_named_property(env, object,
913 "state", CreateJsValue(env, ConvertToJsAppProcessState(processInfo->state_, processInfo->isFocused)));
914 if (processInfo->appCloneIndex != -1) {
915 napi_set_named_property(env, object, "appCloneIndex", CreateJsValue(env, processInfo->appCloneIndex));
916 }
917 napi_value array = nullptr;
918 napi_create_array_with_length(env, 1, &array);
919 if (array == nullptr) {
920 TAG_LOGE(AAFwkTag::APPKIT, "null array");
921 task.Reject(env, CreateJsError(env, ERR_ABILITY_RUNTIME_EXTERNAL_INTERNAL_ERROR,
922 "Initiate array failed."));
923 } else {
924 napi_set_element(env, array, 0, object);
925 task.ResolveWithNoError(env, array);
926 }
927 } else {
928 task.Reject(env, CreateJsError(env, ERR_ABILITY_RUNTIME_EXTERNAL_INTERNAL_ERROR,
929 "Get process infos failed."));
930 }
931 };
932 napi_value lastParam = (info.argc == ARGC_ONE) ? info.argv[INDEX_ZERO] : nullptr;
933 napi_value result = nullptr;
934 NapiAsyncTask::Schedule("JsApplicationContextUtils::OnGetRunningProcessInformation",
935 env, CreateAsyncTaskWithLastParam(env, lastParam, std::move(execute), std::move(complete), &result));
936 return result;
937 }
938
GetCurrentAppCloneIndex(napi_env env,napi_callback_info info)939 napi_value JsApplicationContextUtils::GetCurrentAppCloneIndex(napi_env env, napi_callback_info info)
940 {
941 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils,
942 OnGetCurrentAppCloneIndex, APPLICATION_CONTEXT_NAME);
943 }
944
OnGetCurrentAppCloneIndex(napi_env env,NapiCallbackInfo & info)945 napi_value JsApplicationContextUtils::OnGetCurrentAppCloneIndex(napi_env env, NapiCallbackInfo& info)
946 {
947 TAG_LOGD(AAFwkTag::APPKIT, "Get App Index");
948 auto context = applicationContext_.lock();
949 if (context == nullptr) {
950 TAG_LOGE(AAFwkTag::APPKIT, "null context");
951 ThrowError(env, AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT);
952 return CreateJsUndefined(env);
953 }
954 if (context->GetCurrentAppMode() != static_cast<int32_t>(AppExecFwk::MultiAppModeType::APP_CLONE)) {
955 ThrowError(env, AbilityErrorCode::ERROR_NOT_APP_CLONE);
956 return CreateJsUndefined(env);
957 }
958 int32_t appIndex = context->GetCurrentAppCloneIndex();
959 return CreateJsValue(env, appIndex);
960 }
961
GetCurrentInstanceKey(napi_env env,napi_callback_info info)962 napi_value JsApplicationContextUtils::GetCurrentInstanceKey(napi_env env, napi_callback_info info)
963 {
964 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils,
965 OnGetCurrentInstanceKey, APPLICATION_CONTEXT_NAME);
966 }
967
OnGetCurrentInstanceKey(napi_env env,NapiCallbackInfo & info)968 napi_value JsApplicationContextUtils::OnGetCurrentInstanceKey(napi_env env, NapiCallbackInfo& info)
969 {
970 TAG_LOGD(AAFwkTag::APPKIT, "Get current instance key");
971 auto context = applicationContext_.lock();
972 if (context == nullptr) {
973 TAG_LOGE(AAFwkTag::APPKIT, "null context");
974 ThrowError(env, AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT);
975 return CreateJsUndefined(env);
976 }
977 if (context->GetCurrentAppMode() != static_cast<int32_t>(AppExecFwk::MultiAppModeType::MULTI_INSTANCE)) {
978 ThrowError(env, AbilityErrorCode::ERROR_MULTI_INSTANCE_NOT_SUPPORTED);
979 return CreateJsUndefined(env);
980 }
981 std::string instanceKey = context->GetCurrentInstanceKey();
982 return CreateJsValue(env, instanceKey);
983 }
984
GetAllRunningInstanceKeys(napi_env env,napi_callback_info info)985 napi_value JsApplicationContextUtils::GetAllRunningInstanceKeys(napi_env env, napi_callback_info info)
986 {
987 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils,
988 OnGetAllRunningInstanceKeys, APPLICATION_CONTEXT_NAME);
989 }
990
OnGetAllRunningInstanceKeys(napi_env env,NapiCallbackInfo & info)991 napi_value JsApplicationContextUtils::OnGetAllRunningInstanceKeys(napi_env env, NapiCallbackInfo& info)
992 {
993 TAG_LOGD(AAFwkTag::APPKIT, "Get all running instance keys");
994 auto innerErrCode = std::make_shared<ErrCode>(ERR_OK);
995 std::shared_ptr<std::vector<std::string>> instanceKeys = std::make_shared<std::vector<std::string>>();
996 NapiAsyncTask::ExecuteCallback execute =
997 [applicationContext = applicationContext_, innerErrCode, instanceKeys]() {
998 auto context = applicationContext.lock();
999 if (!context) {
1000 TAG_LOGE(AAFwkTag::APPKIT, "null context");
1001 *innerErrCode = ERR_ABILITY_RUNTIME_EXTERNAL_CONTEXT_NOT_EXIST;
1002 return;
1003 }
1004 if (context->GetCurrentAppMode() != static_cast<int32_t>(AppExecFwk::MultiAppModeType::MULTI_INSTANCE)) {
1005 TAG_LOGE(AAFwkTag::APPKIT, "not supported");
1006 *innerErrCode = static_cast<int>(AbilityErrorCode::ERROR_MULTI_INSTANCE_NOT_SUPPORTED);
1007 return;
1008 }
1009 *innerErrCode = context->GetAllRunningInstanceKeys(*instanceKeys);
1010 };
1011 auto complete = [applicationContext = applicationContext_, innerErrCode, instanceKeys](
1012 napi_env env, NapiAsyncTask& task, int32_t status) {
1013 if (*innerErrCode != ERR_OK) {
1014 TAG_LOGE(AAFwkTag::APPKIT, "innerErrCode=%{public}d", *innerErrCode);
1015 task.Reject(env, CreateJsErrorByNativeErr(env, *innerErrCode));
1016 return;
1017 }
1018 task.ResolveWithNoError(env, CreateNativeArray(env, *instanceKeys));
1019 };
1020
1021 napi_value result = nullptr;
1022 NapiAsyncTask::Schedule("JsApplicationContextUtils::OnGetAllRunningInstanceKeys",
1023 env, CreateAsyncTaskWithLastParam(env, nullptr, std::move(execute), std::move(complete), &result));
1024 return result;
1025 }
1026
CreateAreaModeContext(napi_env env,napi_callback_info info)1027 napi_value JsApplicationContextUtils::CreateAreaModeContext(napi_env env, napi_callback_info info)
1028 {
1029 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils,
1030 OnCreateAreaModeContext, APPLICATION_CONTEXT_NAME);
1031 }
1032
OnCreateAreaModeContext(napi_env env,NapiCallbackInfo & info)1033 napi_value JsApplicationContextUtils::OnCreateAreaModeContext(napi_env env, NapiCallbackInfo &info)
1034 {
1035 if (info.argc == ARGC_ZERO) {
1036 TAG_LOGE(AAFwkTag::APPKIT, "not enough params");
1037 ThrowTooFewParametersError(env);
1038 return CreateJsUndefined(env);
1039 }
1040
1041 auto applicationContext = applicationContext_.lock();
1042 if (applicationContext == nullptr) {
1043 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
1044 TAG_LOGE(AAFwkTag::APPKIT, "applicationContext is already released");
1045 return CreateJsUndefined(env);
1046 }
1047
1048 int areaMode = 0;
1049 if (!ConvertFromJsValue(env, info.argv[0], areaMode)) {
1050 TAG_LOGE(AAFwkTag::APPKIT, "parse areaMode failed");
1051 ThrowInvalidParamError(env, "parse param areaMode failed, areaMode must be number.");
1052 return CreateJsUndefined(env);
1053 }
1054
1055 auto areaContext = applicationContext->CreateAreaModeContext(areaMode);
1056 if (areaContext == nullptr) {
1057 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
1058 TAG_LOGE(AAFwkTag::APPKIT, "failed to create areaContext");
1059 return CreateJsUndefined(env);
1060 }
1061
1062 return CreateJsContext(env, areaContext);
1063 }
1064
CreateDisplayContext(napi_env env,napi_callback_info info)1065 napi_value JsApplicationContextUtils::CreateDisplayContext(napi_env env, napi_callback_info info)
1066 {
1067 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils,
1068 OnCreateDisplayContext, APPLICATION_CONTEXT_NAME);
1069 }
1070
OnCreateDisplayContext(napi_env env,NapiCallbackInfo & info)1071 napi_value JsApplicationContextUtils::OnCreateDisplayContext(napi_env env, NapiCallbackInfo &info)
1072 {
1073 #ifdef SUPPORT_GRAPHICS
1074 if (info.argc == ARGC_ZERO) {
1075 TAG_LOGE(AAFwkTag::APPKIT, "not enough params");
1076 ThrowTooFewParametersError(env);
1077 return CreateJsUndefined(env);
1078 }
1079
1080 auto applicationContext = applicationContext_.lock();
1081 if (applicationContext == nullptr) {
1082 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
1083 TAG_LOGE(AAFwkTag::APPKIT, "applicationContext is already released");
1084 return CreateJsUndefined(env);
1085 }
1086
1087 int64_t displayId = -1;
1088 if (!ConvertFromJsValue(env, info.argv[0], displayId)) {
1089 TAG_LOGE(AAFwkTag::APPKIT, "parse displayId failed");
1090 ThrowInvalidParamError(env, "parse param displayId failed, displayId must be number.");
1091 return CreateJsUndefined(env);
1092 }
1093 if (displayId < 0) {
1094 TAG_LOGE(AAFwkTag::APPKIT, "displayId is invalid, less than 0");
1095 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
1096 return CreateJsUndefined(env);
1097 }
1098 uint64_t validDisplayId = static_cast<uint64_t>(displayId);
1099
1100 auto context = applicationContext->CreateDisplayContext(validDisplayId);
1101 if (context == nullptr) {
1102 TAG_LOGE(AAFwkTag::APPKIT, "failed to create context");
1103 return CreateJsUndefined(env);
1104 }
1105 return CreateJsContext(env, context);
1106 #else
1107 return CreateJsUndefined(env);
1108 #endif
1109 }
1110
CreateJsContext(napi_env env,const std::shared_ptr<Context> & context)1111 napi_value JsApplicationContextUtils::CreateJsContext(napi_env env, const std::shared_ptr<Context> &context)
1112 {
1113 napi_value value = CreateJsBaseContext(env, context, true);
1114 auto systemModule = JsRuntime::LoadSystemModuleByEngine(env, "application.Context", &value, 1);
1115 if (systemModule == nullptr) {
1116 TAG_LOGE(AAFwkTag::APPKIT, "invalid systemModule");
1117 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
1118 return CreateJsUndefined(env);
1119 }
1120 napi_value contextObj = systemModule->GetNapiValue();
1121 if (!CheckTypeForNapiValue(env, contextObj, napi_object)) {
1122 TAG_LOGE(AAFwkTag::APPKIT, "failed to get context native object");
1123 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
1124 return CreateJsUndefined(env);
1125 }
1126 auto workContext = new (std::nothrow) std::weak_ptr<Context>(context);
1127 auto status = napi_coerce_to_native_binding_object(env, contextObj, DetachCallbackFunc, AttachBaseContext,
1128 workContext, nullptr);
1129 if (status != napi_ok) {
1130 TAG_LOGE(AAFwkTag::APPKIT, "coerce context failed: %{public}d", status);
1131 delete workContext;
1132 return CreateJsUndefined(env);
1133 }
1134 auto res = napi_wrap(env, contextObj, workContext,
1135 [](napi_env, void *data, void *) {
1136 TAG_LOGD(AAFwkTag::APPKIT, "Finalizer for weak_ptr module context is called");
1137 delete static_cast<std::weak_ptr<Context> *>(data);
1138 },
1139 nullptr, nullptr);
1140 if (res != napi_ok && workContext != nullptr) {
1141 TAG_LOGE(AAFwkTag::APPKIT, "napi_wrap failed:%{public}d", res);
1142 delete workContext;
1143 return CreateJsUndefined(env);
1144 }
1145 return contextObj;
1146 }
1147
Finalizer(napi_env env,void * data,void * hint)1148 void JsApplicationContextUtils::Finalizer(napi_env env, void *data, void *hint)
1149 {
1150 TAG_LOGD(AAFwkTag::APPKIT, "called");
1151 std::unique_ptr<JsApplicationContextUtils>(static_cast<JsApplicationContextUtils *>(data));
1152 }
1153
RegisterAbilityLifecycleCallback(napi_env env,napi_callback_info info)1154 napi_value JsApplicationContextUtils::RegisterAbilityLifecycleCallback(napi_env env, napi_callback_info info)
1155 {
1156 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils,
1157 OnRegisterAbilityLifecycleCallback, APPLICATION_CONTEXT_NAME);
1158 }
1159
UnregisterAbilityLifecycleCallback(napi_env env,napi_callback_info info)1160 napi_value JsApplicationContextUtils::UnregisterAbilityLifecycleCallback(
1161 napi_env env, napi_callback_info info)
1162 {
1163 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils,
1164 OnUnregisterAbilityLifecycleCallback, APPLICATION_CONTEXT_NAME);
1165 }
1166
OnRegisterAbilityLifecycleCallback(napi_env env,NapiCallbackInfo & info)1167 napi_value JsApplicationContextUtils::OnRegisterAbilityLifecycleCallback(
1168 napi_env env, NapiCallbackInfo& info)
1169 {
1170 TAG_LOGD(AAFwkTag::APPKIT, "called");
1171 // only support one params
1172 if (info.argc != ARGC_ONE) {
1173 TAG_LOGE(AAFwkTag::APPKIT, "Not enough params");
1174 return CreateJsUndefined(env);
1175 }
1176
1177 auto applicationContext = applicationContext_.lock();
1178 if (applicationContext == nullptr) {
1179 TAG_LOGE(AAFwkTag::APPKIT, "null applicationContext");
1180 return CreateJsUndefined(env);
1181 }
1182 if (callback_ != nullptr) {
1183 TAG_LOGD(AAFwkTag::APPKIT, "callback_ is not nullptr");
1184 return CreateJsValue(env, callback_->Register(info.argv[0]));
1185 }
1186 callback_ = std::make_shared<JsAbilityLifecycleCallback>(env);
1187 int32_t callbackId = callback_->Register(info.argv[INDEX_ZERO]);
1188 applicationContext->RegisterAbilityLifecycleCallback(callback_);
1189 return CreateJsValue(env, callbackId);
1190 }
1191
OnUnregisterAbilityLifecycleCallback(napi_env env,NapiCallbackInfo & info)1192 napi_value JsApplicationContextUtils::OnUnregisterAbilityLifecycleCallback(
1193 napi_env env, NapiCallbackInfo& info)
1194 {
1195 TAG_LOGD(AAFwkTag::APPKIT, "called");
1196 int32_t errCode = 0;
1197 auto applicationContext = applicationContext_.lock();
1198 if (applicationContext == nullptr) {
1199 TAG_LOGE(AAFwkTag::APPKIT, "null ApplicationContext");
1200 errCode = ERROR_CODE_ONE;
1201 }
1202 int32_t callbackId = -1;
1203 if (info.argc != ARGC_ONE && info.argc != ARGC_TWO) {
1204 TAG_LOGE(AAFwkTag::APPKIT, "not enough params");
1205 errCode = ERROR_CODE_ONE;
1206 } else {
1207 napi_get_value_int32(env, info.argv[INDEX_ZERO], &callbackId);
1208 TAG_LOGD(AAFwkTag::APPKIT, "callbackId is %{public}d.", callbackId);
1209 }
1210 std::weak_ptr<JsAbilityLifecycleCallback> callbackWeak(callback_);
1211
1212 NapiAsyncTask::CompleteCallback complete = [callbackWeak, callbackId, errCode](
1213 napi_env env, NapiAsyncTask &task, int32_t status) {
1214 if (errCode != 0) {
1215 task.Reject(env, CreateJsError(env, errCode, "Invalidate params."));
1216 return;
1217 }
1218 auto callback = callbackWeak.lock();
1219 if (callback == nullptr) {
1220 TAG_LOGE(AAFwkTag::APPKIT, "null callback");
1221 task.Reject(env, CreateJsError(env, ERROR_CODE_ONE, "callback is nullptr"));
1222 return;
1223 }
1224
1225 TAG_LOGD(AAFwkTag::APPKIT, "OnUnregisterAbilityLifecycleCallback begin");
1226 if (!callback->UnRegister(callbackId)) {
1227 TAG_LOGE(AAFwkTag::APPKIT, "call UnRegister failed");
1228 task.Reject(env, CreateJsError(env, ERROR_CODE_ONE, "call UnRegister failed!"));
1229 return;
1230 }
1231
1232 task.Resolve(env, CreateJsUndefined(env));
1233 };
1234 napi_value lastParam = (info.argc <= ARGC_ONE) ? nullptr : info.argv[INDEX_ONE];
1235 napi_value result = nullptr;
1236 NapiAsyncTask::Schedule("JsApplicationContextUtils::OnUnregisterAbilityLifecycleCallback", env,
1237 CreateAsyncTaskWithLastParam(env, lastParam, nullptr, std::move(complete), &result));
1238 return result;
1239 }
1240
RegisterEnvironmentCallback(napi_env env,napi_callback_info info)1241 napi_value JsApplicationContextUtils::RegisterEnvironmentCallback(napi_env env, napi_callback_info info)
1242 {
1243 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils,
1244 OnRegisterEnvironmentCallback, APPLICATION_CONTEXT_NAME);
1245 }
1246
UnregisterEnvironmentCallback(napi_env env,napi_callback_info info)1247 napi_value JsApplicationContextUtils::UnregisterEnvironmentCallback(
1248 napi_env env, napi_callback_info info)
1249 {
1250 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils,
1251 OnUnregisterEnvironmentCallback, APPLICATION_CONTEXT_NAME);
1252 }
1253
OnRegisterEnvironmentCallback(napi_env env,NapiCallbackInfo & info)1254 napi_value JsApplicationContextUtils::OnRegisterEnvironmentCallback(
1255 napi_env env, NapiCallbackInfo& info)
1256 {
1257 TAG_LOGD(AAFwkTag::APPKIT, "called");
1258 // only support one params
1259 if (info.argc != ARGC_ONE) {
1260 TAG_LOGE(AAFwkTag::APPKIT, "Not enough params");
1261 return CreateJsUndefined(env);
1262 }
1263
1264 auto applicationContext = applicationContext_.lock();
1265 if (applicationContext == nullptr) {
1266 TAG_LOGE(AAFwkTag::APPKIT, "null applicationContext");
1267 return CreateJsUndefined(env);
1268 }
1269 if (envCallback_ != nullptr) {
1270 TAG_LOGD(AAFwkTag::APPKIT, "envCallback_ is not nullptr");
1271 return CreateJsValue(env, envCallback_->Register(info.argv[0]));
1272 }
1273 envCallback_ = std::make_shared<JsEnvironmentCallback>(env);
1274 int32_t callbackId = envCallback_->Register(info.argv[INDEX_ZERO]);
1275 applicationContext->RegisterEnvironmentCallback(envCallback_);
1276 return CreateJsValue(env, callbackId);
1277 }
1278
OnUnregisterEnvironmentCallback(napi_env env,NapiCallbackInfo & info)1279 napi_value JsApplicationContextUtils::OnUnregisterEnvironmentCallback(
1280 napi_env env, NapiCallbackInfo& info)
1281 {
1282 int32_t errCode = 0;
1283 auto applicationContext = applicationContext_.lock();
1284 if (applicationContext == nullptr) {
1285 TAG_LOGE(AAFwkTag::APPKIT, "null applicationContext");
1286 errCode = ERROR_CODE_ONE;
1287 }
1288 int32_t callbackId = -1;
1289 if (info.argc != ARGC_ONE && info.argc != ARGC_TWO) {
1290 TAG_LOGE(AAFwkTag::APPKIT, "Not enough params");
1291 errCode = ERROR_CODE_ONE;
1292 } else {
1293 napi_get_value_int32(env, info.argv[INDEX_ZERO], &callbackId);
1294 TAG_LOGD(AAFwkTag::APPKIT, "callbackId is %{public}d", callbackId);
1295 }
1296 std::weak_ptr<JsEnvironmentCallback> envCallbackWeak(envCallback_);
1297 NapiAsyncTask::CompleteCallback complete = [envCallbackWeak, callbackId, errCode](
1298 napi_env env, NapiAsyncTask &task, int32_t status) {
1299 if (errCode != 0) {
1300 task.Reject(env, CreateJsError(env, errCode, "Invalidate params."));
1301 return;
1302 }
1303 auto env_callback = envCallbackWeak.lock();
1304 if (env_callback == nullptr) {
1305 TAG_LOGE(AAFwkTag::APPKIT, "null env_callback");
1306 task.Reject(env, CreateJsError(env, ERROR_CODE_ONE, "env_callback is nullptr"));
1307 return;
1308 }
1309
1310 if (!env_callback->UnRegister(callbackId)) {
1311 TAG_LOGE(AAFwkTag::APPKIT, "call UnRegister failed");
1312 task.Reject(env, CreateJsError(env, ERROR_CODE_ONE, "call UnRegister failed!"));
1313 return;
1314 }
1315
1316 task.Resolve(env, CreateJsUndefined(env));
1317 };
1318 napi_value lastParam = (info.argc <= ARGC_ONE) ? nullptr : info.argv[INDEX_ONE];
1319 napi_value result = nullptr;
1320 NapiAsyncTask::Schedule("JsApplicationContextUtils::OnUnregisterEnvironmentCallback", env,
1321 CreateAsyncTaskWithLastParam(env, lastParam, nullptr, std::move(complete), &result));
1322 return result;
1323 }
1324
On(napi_env env,napi_callback_info info)1325 napi_value JsApplicationContextUtils::On(napi_env env, napi_callback_info info)
1326 {
1327 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils, OnOn, APPLICATION_CONTEXT_NAME);
1328 }
1329
Off(napi_env env,napi_callback_info info)1330 napi_value JsApplicationContextUtils::Off(napi_env env, napi_callback_info info)
1331 {
1332 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils, OnOff, APPLICATION_CONTEXT_NAME);
1333 }
1334
OnOn(napi_env env,NapiCallbackInfo & info)1335 napi_value JsApplicationContextUtils::OnOn(napi_env env, NapiCallbackInfo& info)
1336 {
1337 TAG_LOGD(AAFwkTag::APPKIT, "called");
1338
1339 if (info.argc != ARGC_TWO) {
1340 TAG_LOGE(AAFwkTag::APPKIT, "Not enough params");
1341 ThrowInvalidParamError(env, "Not enough params.");
1342 return CreateJsUndefined(env);
1343 }
1344
1345 if (!CheckTypeForNapiValue(env, info.argv[0], napi_string)) {
1346 TAG_LOGE(AAFwkTag::APPKIT, "param invalid");
1347 ThrowInvalidParamError(env, "Parse param type failed, type must be string.");
1348 return CreateJsUndefined(env);
1349 }
1350 std::string type;
1351 if (!ConvertFromJsValue(env, info.argv[0], type)) {
1352 TAG_LOGE(AAFwkTag::APPKIT, "convert type failed");
1353 ThrowInvalidParamError(env,
1354 "Parse param type failed, type must be string.");
1355 return CreateJsUndefined(env);
1356 }
1357
1358 if (type == "abilityLifecycle") {
1359 return OnOnAbilityLifecycle(env, info, false);
1360 }
1361 if (type == "abilityLifecycleEvent") {
1362 return OnOnAbilityLifecycle(env, info, true);
1363 }
1364 if (type == "environment") {
1365 return OnOnEnvironment(env, info, false);
1366 }
1367 if (type == "environmentEvent") {
1368 return OnOnEnvironment(env, info, true);
1369 }
1370 if (type == "applicationStateChange") {
1371 return OnOnApplicationStateChange(env, info);
1372 }
1373 TAG_LOGE(AAFwkTag::APPKIT, "on function type not match");
1374 ThrowInvalidParamError(env, "Parse param callback failed, callback must be function.");
1375 return CreateJsUndefined(env);
1376 }
1377
OnOff(napi_env env,NapiCallbackInfo & info)1378 napi_value JsApplicationContextUtils::OnOff(napi_env env, NapiCallbackInfo& info)
1379 {
1380 TAG_LOGD(AAFwkTag::APPKIT, "called");
1381 if (info.argc < ARGC_ONE) {
1382 TAG_LOGE(AAFwkTag::APPKIT, "Not enough params");
1383 ThrowInvalidParamError(env, "Not enough params.");
1384 return CreateJsUndefined(env);
1385 }
1386
1387 if (!CheckTypeForNapiValue(env, info.argv[0], napi_string)) {
1388 TAG_LOGE(AAFwkTag::APPKIT, "param invalid");
1389 ThrowInvalidParamError(env, "Parse param type failed, type must be string.");
1390 return CreateJsUndefined(env);
1391 }
1392 std::string type;
1393 if (!ConvertFromJsValue(env, info.argv[0], type)) {
1394 TAG_LOGE(AAFwkTag::APPKIT, "convert type failed");
1395 ThrowInvalidParamError(env,
1396 "Parse param type failed, type must be string.");
1397 return CreateJsUndefined(env);
1398 }
1399
1400 if (type == "applicationStateChange") {
1401 return OnOffApplicationStateChange(env, info);
1402 }
1403
1404 if (info.argc != ARGC_TWO && info.argc != ARGC_THREE) {
1405 TAG_LOGE(AAFwkTag::APPKIT, "Not enough params");
1406 ThrowInvalidParamError(env, "Not enough params.");
1407 return CreateJsUndefined(env);
1408 }
1409
1410 int32_t callbackId = -1;
1411 if (CheckTypeForNapiValue(env, info.argv[1], napi_number)) {
1412 napi_get_value_int32(env, info.argv[1], &callbackId);
1413 TAG_LOGD(AAFwkTag::APPKIT, "callbackId is %{public}d.", callbackId);
1414 }
1415
1416 if (type == "abilityLifecycle") {
1417 return OnOffAbilityLifecycle(env, info, callbackId);
1418 }
1419 if (type == "abilityLifecycleEvent") {
1420 return OnOffAbilityLifecycleEventSync(env, info, callbackId);
1421 }
1422 if (type == "environment") {
1423 return OnOffEnvironment(env, info, callbackId);
1424 }
1425 if (type == "environmentEvent") {
1426 return OnOffEnvironmentEventSync(env, info, callbackId);
1427 }
1428 TAG_LOGE(AAFwkTag::APPKIT, "off function type not match");
1429 ThrowInvalidParamError(env, "Parse param callback failed, callback must be function.");
1430 return CreateJsUndefined(env);
1431 }
1432
OnOnAbilityLifecycle(napi_env env,NapiCallbackInfo & info,bool isSync)1433 napi_value JsApplicationContextUtils::OnOnAbilityLifecycle(
1434 napi_env env, NapiCallbackInfo& info, bool isSync)
1435 {
1436 auto applicationContext = applicationContext_.lock();
1437 if (applicationContext == nullptr) {
1438 TAG_LOGE(AAFwkTag::APPKIT, "null applicationContext");
1439 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
1440 return CreateJsUndefined(env);
1441 }
1442
1443 if (callback_ != nullptr) {
1444 TAG_LOGD(AAFwkTag::APPKIT, "callback_ is not nullptr");
1445 return CreateJsValue(env, callback_->Register(info.argv[1], isSync));
1446 }
1447 callback_ = std::make_shared<JsAbilityLifecycleCallback>(env);
1448 int32_t callbackId = callback_->Register(info.argv[1], isSync);
1449 applicationContext->RegisterAbilityLifecycleCallback(callback_);
1450 return CreateJsValue(env, callbackId);
1451 }
1452
OnOffAbilityLifecycle(napi_env env,NapiCallbackInfo & info,int32_t callbackId)1453 napi_value JsApplicationContextUtils::OnOffAbilityLifecycle(
1454 napi_env env, NapiCallbackInfo& info, int32_t callbackId)
1455 {
1456 auto applicationContext = applicationContext_.lock();
1457 if (applicationContext == nullptr) {
1458 TAG_LOGE(AAFwkTag::APPKIT, "null applicationContext");
1459 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
1460 return CreateJsUndefined(env);
1461 }
1462
1463 std::weak_ptr<JsAbilityLifecycleCallback> callbackWeak(callback_);
1464 NapiAsyncTask::CompleteCallback complete = [callbackWeak, callbackId](
1465 napi_env env, NapiAsyncTask &task, int32_t status) {
1466 auto callback = callbackWeak.lock();
1467 if (callback == nullptr) {
1468 TAG_LOGE(AAFwkTag::APPKIT, "null callback");
1469 task.Reject(env, CreateJsError(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER,
1470 "callback is nullptr"));
1471 return;
1472 }
1473
1474 if (!callback->UnRegister(callbackId, false)) {
1475 TAG_LOGE(AAFwkTag::APPKIT, "call UnRegister failed");
1476 task.Reject(env, CreateJsError(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER,
1477 "call UnRegister failed!"));
1478 return;
1479 }
1480
1481 task.ResolveWithNoError(env, CreateJsUndefined(env));
1482 };
1483 napi_value lastParam = (info.argc <= ARGC_TWO) ? nullptr : info.argv[INDEX_TWO];
1484 napi_value result = nullptr;
1485 NapiAsyncTask::Schedule("JsApplicationContextUtils::OnOffAbilityLifecycle", env,
1486 CreateAsyncTaskWithLastParam(env, lastParam, nullptr, std::move(complete), &result));
1487 return result;
1488 }
1489
OnOffAbilityLifecycleEventSync(napi_env env,NapiCallbackInfo & info,int32_t callbackId)1490 napi_value JsApplicationContextUtils::OnOffAbilityLifecycleEventSync(
1491 napi_env env, NapiCallbackInfo& info, int32_t callbackId)
1492 {
1493 TAG_LOGD(AAFwkTag::APPKIT, "called");
1494
1495 auto applicationContext = applicationContext_.lock();
1496 if (applicationContext == nullptr) {
1497 TAG_LOGE(AAFwkTag::APPKIT, "null applicationContext");
1498 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INTERNAL_ERROR);
1499 return CreateJsUndefined(env);
1500 }
1501 if (callback_ == nullptr) {
1502 TAG_LOGE(AAFwkTag::APPKIT, "null callback");
1503 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INTERNAL_ERROR);
1504 return CreateJsUndefined(env);
1505 }
1506 if (!callback_->UnRegister(callbackId, true)) {
1507 TAG_LOGE(AAFwkTag::APPKIT, "call UnRegister failed");
1508 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INTERNAL_ERROR);
1509 return CreateJsUndefined(env);
1510 }
1511 return CreateJsUndefined(env);
1512 }
1513
OnOnEnvironment(napi_env env,NapiCallbackInfo & info,bool isSync)1514 napi_value JsApplicationContextUtils::OnOnEnvironment(
1515 napi_env env, NapiCallbackInfo& info, bool isSync)
1516 {
1517 TAG_LOGD(AAFwkTag::APPKIT, "called");
1518
1519 auto applicationContext = applicationContext_.lock();
1520 if (applicationContext == nullptr) {
1521 TAG_LOGE(AAFwkTag::APPKIT, "null applicationContext");
1522 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INTERNAL_ERROR);
1523 return CreateJsUndefined(env);
1524 }
1525
1526 if (envCallback_ != nullptr) {
1527 TAG_LOGD(AAFwkTag::APPKIT, "envCallback_ is not nullptr.");
1528 return CreateJsValue(env, envCallback_->Register(info.argv[1], isSync));
1529 }
1530 envCallback_ = std::make_shared<JsEnvironmentCallback>(env);
1531 int32_t callbackId = envCallback_->Register(info.argv[1], isSync);
1532 applicationContext->RegisterEnvironmentCallback(envCallback_);
1533 TAG_LOGD(AAFwkTag::APPKIT, "OnOnEnvironment is end");
1534 return CreateJsValue(env, callbackId);
1535 }
1536
OnOffEnvironment(napi_env env,NapiCallbackInfo & info,int32_t callbackId)1537 napi_value JsApplicationContextUtils::OnOffEnvironment(
1538 napi_env env, NapiCallbackInfo& info, int32_t callbackId)
1539 {
1540 TAG_LOGD(AAFwkTag::APPKIT, "called");
1541
1542 auto applicationContext = applicationContext_.lock();
1543 if (applicationContext == nullptr) {
1544 TAG_LOGE(AAFwkTag::APPKIT, "null applicationContext");
1545 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
1546 return CreateJsUndefined(env);
1547 }
1548
1549 std::weak_ptr<JsEnvironmentCallback> envCallbackWeak(envCallback_);
1550 NapiAsyncTask::CompleteCallback complete = [envCallbackWeak, callbackId](
1551 napi_env env, NapiAsyncTask &task, int32_t status) {
1552 auto env_callback = envCallbackWeak.lock();
1553 if (env_callback == nullptr) {
1554 TAG_LOGE(AAFwkTag::APPKIT, "null env_callback");
1555 task.Reject(env,
1556 CreateJsError(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER,
1557 "env_callback is nullptr"));
1558 return;
1559 }
1560
1561 TAG_LOGD(AAFwkTag::APPKIT, "OnOffEnvironment begin");
1562 if (!env_callback->UnRegister(callbackId, false)) {
1563 TAG_LOGE(AAFwkTag::APPKIT, "call UnRegister failed");
1564 task.Reject(env, CreateJsError(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER,
1565 "call UnRegister failed!"));
1566 return;
1567 }
1568
1569 task.ResolveWithNoError(env, CreateJsUndefined(env));
1570 };
1571 napi_value lastParam = (info.argc <= ARGC_TWO) ? nullptr : info.argv[INDEX_TWO];
1572 napi_value result = nullptr;
1573 NapiAsyncTask::Schedule("JsApplicationContextUtils::OnOffEnvironment", env,
1574 CreateAsyncTaskWithLastParam(env, lastParam, nullptr, std::move(complete), &result));
1575 return result;
1576 }
1577
OnOffEnvironmentEventSync(napi_env env,NapiCallbackInfo & info,int32_t callbackId)1578 napi_value JsApplicationContextUtils::OnOffEnvironmentEventSync(
1579 napi_env env, NapiCallbackInfo& info, int32_t callbackId)
1580 {
1581 TAG_LOGD(AAFwkTag::APPKIT, "called");
1582
1583 auto applicationContext = applicationContext_.lock();
1584 if (applicationContext == nullptr) {
1585 TAG_LOGE(AAFwkTag::APPKIT, "null applicationContext");
1586 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INTERNAL_ERROR);
1587 return CreateJsUndefined(env);
1588 }
1589 if (envCallback_ == nullptr) {
1590 TAG_LOGE(AAFwkTag::APPKIT, "null envCallback");
1591 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INTERNAL_ERROR);
1592 return CreateJsUndefined(env);
1593 }
1594 if (!envCallback_->UnRegister(callbackId, true)) {
1595 TAG_LOGE(AAFwkTag::APPKIT, "call UnRegister failed");
1596 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INTERNAL_ERROR);
1597 return CreateJsUndefined(env);
1598 }
1599 return CreateJsUndefined(env);
1600 }
1601
OnOnApplicationStateChange(napi_env env,NapiCallbackInfo & info)1602 napi_value JsApplicationContextUtils::OnOnApplicationStateChange(
1603 napi_env env, NapiCallbackInfo& info)
1604 {
1605 TAG_LOGD(AAFwkTag::APPKIT, "called");
1606 auto applicationContext = applicationContext_.lock();
1607 if (applicationContext == nullptr) {
1608 TAG_LOGE(AAFwkTag::APPKIT, "null applicationContext");
1609 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
1610 return CreateJsUndefined(env);
1611 }
1612
1613 std::lock_guard<std::mutex> lock(applicationStateCallbackLock_);
1614 if (applicationStateCallback_ != nullptr) {
1615 applicationStateCallback_->Register(info.argv[INDEX_ONE]);
1616 return CreateJsUndefined(env);
1617 }
1618
1619 applicationStateCallback_ = std::make_shared<JsApplicationStateChangeCallback>(env);
1620 applicationStateCallback_->Register(info.argv[INDEX_ONE]);
1621 applicationContext->RegisterApplicationStateChangeCallback(applicationStateCallback_);
1622 return CreateJsUndefined(env);
1623 }
1624
OnOffApplicationStateChange(napi_env env,NapiCallbackInfo & info)1625 napi_value JsApplicationContextUtils::OnOffApplicationStateChange(
1626 napi_env env, NapiCallbackInfo& info)
1627 {
1628 TAG_LOGD(AAFwkTag::APPKIT, "called");
1629 auto applicationContext = applicationContext_.lock();
1630 if (applicationContext == nullptr) {
1631 TAG_LOGE(AAFwkTag::APPKIT, "null applicationContext");
1632 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
1633 return CreateJsUndefined(env);
1634 }
1635
1636 std::lock_guard<std::mutex> lock(applicationStateCallbackLock_);
1637 if (applicationStateCallback_ == nullptr) {
1638 TAG_LOGE(AAFwkTag::APPKIT, "null applicationStateCallback_");
1639 ThrowInvalidParamError(env,
1640 "Parse applicationStateCallback failed, applicationStateCallback must be function.");
1641 return CreateJsUndefined(env);
1642 }
1643
1644 if (info.argc == ARGC_ONE || !CheckTypeForNapiValue(env, info.argv[INDEX_ONE], napi_object)) {
1645 applicationStateCallback_->UnRegister();
1646 } else if (!applicationStateCallback_->UnRegister(info.argv[INDEX_ONE])) {
1647 TAG_LOGE(AAFwkTag::APPKIT, "call UnRegister failed");
1648 ThrowInvalidParamError(env, "Parse param call UnRegister failed, call UnRegister must be function.");
1649 return CreateJsUndefined(env);
1650 }
1651
1652 if (applicationStateCallback_->IsEmpty()) {
1653 applicationStateCallback_.reset();
1654 }
1655 return CreateJsUndefined(env);
1656 }
1657
GetApplicationContext(napi_env env,napi_callback_info info)1658 napi_value JsApplicationContextUtils::GetApplicationContext(napi_env env, napi_callback_info info)
1659 {
1660 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils,
1661 OnGetApplicationContext, APPLICATION_CONTEXT_NAME);
1662 }
1663
OnGetApplicationContext(napi_env env,NapiCallbackInfo & info)1664 napi_value JsApplicationContextUtils::OnGetApplicationContext(napi_env env, NapiCallbackInfo& info)
1665 {
1666 TAG_LOGD(AAFwkTag::APPKIT, "called");
1667 auto applicationContext = applicationContext_.lock();
1668 if (!applicationContext) {
1669 TAG_LOGW(AAFwkTag::APPKIT, "null applicationContext");
1670 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
1671 return CreateJsUndefined(env);
1672 }
1673
1674 if (!applicationContext->GetApplicationInfoUpdateFlag()) {
1675 auto appContextObj = ApplicationContextManager::GetApplicationContextManager().GetGlobalObject(env);
1676 if (appContextObj != nullptr) {
1677 return appContextObj->GetNapiValue();
1678 }
1679 }
1680
1681 napi_value value = CreateJsApplicationContext(env);
1682 auto systemModule = JsRuntime::LoadSystemModuleByEngine(env, "application.ApplicationContext", &value, 1);
1683 if (systemModule == nullptr) {
1684 TAG_LOGW(AAFwkTag::APPKIT, "null systemModule");
1685 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
1686 return CreateJsUndefined(env);
1687 }
1688 napi_value contextObj = systemModule->GetNapiValue();
1689 if (!CheckTypeForNapiValue(env, contextObj, napi_object)) {
1690 TAG_LOGE(AAFwkTag::APPKIT, "get object failed");
1691 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER);
1692 return CreateJsUndefined(env);
1693 }
1694 auto workContext = new (std::nothrow) std::weak_ptr<ApplicationContext>(applicationContext);
1695 napi_coerce_to_native_binding_object(
1696 env, contextObj, DetachCallbackFunc, AttachApplicationContext, workContext, nullptr);
1697 if (workContext != nullptr) {
1698 auto res = napi_wrap(env, contextObj, workContext,
1699 [](napi_env, void *data, void *) {
1700 TAG_LOGD(AAFwkTag::APPKIT, "Finalizer for weak_ptr application context is called");
1701 delete static_cast<std::weak_ptr<ApplicationContext> *>(data);
1702 data = nullptr;
1703 },
1704 nullptr, nullptr);
1705 if (res != napi_ok && workContext != nullptr) {
1706 TAG_LOGE(AAFwkTag::APPKIT, "napi_wrap failed:%{public}d", res);
1707 delete workContext;
1708 return CreateJsUndefined(env);
1709 }
1710 }
1711 return contextObj;
1712 }
1713
CheckCallerIsSystemApp()1714 bool JsApplicationContextUtils::CheckCallerIsSystemApp()
1715 {
1716 auto selfToken = IPCSkeleton::GetSelfTokenID();
1717 if (!Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(selfToken)) {
1718 return false;
1719 }
1720 return true;
1721 }
1722
CreateJsApplicationContext(napi_env env)1723 napi_value JsApplicationContextUtils::CreateJsApplicationContext(napi_env env)
1724 {
1725 TAG_LOGD(AAFwkTag::APPKIT, "start");
1726 napi_value object = nullptr;
1727 napi_create_object(env, &object);
1728 if (object == nullptr) {
1729 return nullptr;
1730 }
1731
1732 std::shared_ptr<ApplicationContext> applicationContext = ApplicationContext::GetInstance();
1733 if (applicationContext == nullptr) {
1734 return object;
1735 }
1736
1737 auto jsApplicationContextUtils = std::make_unique<JsApplicationContextUtils>(applicationContext);
1738 SetNamedNativePointer(env, object, APPLICATION_CONTEXT_NAME, jsApplicationContextUtils.release(),
1739 JsApplicationContextUtils::Finalizer);
1740
1741 auto appInfo = applicationContext->GetApplicationInfo();
1742 if (appInfo != nullptr) {
1743 napi_set_named_property(env, object, "applicationInfo", CreateJsApplicationInfo(env, *appInfo));
1744 }
1745 auto resourceManager = applicationContext->GetResourceManager();
1746 std::shared_ptr<Context> context = std::dynamic_pointer_cast<Context>(applicationContext);
1747 if (resourceManager != nullptr) {
1748 napi_set_named_property(env, object, "resourceManager", CreateJsResourceManager(env, resourceManager, context));
1749 }
1750
1751 BindNativeApplicationContextOne(env, object);
1752 BindNativeApplicationContextTwo(env, object);
1753 return object;
1754 }
1755
SetSupportedProcessCacheSelf(napi_env env,napi_callback_info info)1756 napi_value JsApplicationContextUtils::SetSupportedProcessCacheSelf(napi_env env, napi_callback_info info)
1757 {
1758 GET_NAPI_INFO_WITH_NAME_AND_CALL(env, info, JsApplicationContextUtils,
1759 OnSetSupportedProcessCacheSelf, APPLICATION_CONTEXT_NAME);
1760 }
1761
OnSetSupportedProcessCacheSelf(napi_env env,NapiCallbackInfo & info)1762 napi_value JsApplicationContextUtils::OnSetSupportedProcessCacheSelf(napi_env env, NapiCallbackInfo& info)
1763 {
1764 TAG_LOGD(AAFwkTag::APPKIT, "called");
1765
1766 // only support one params
1767 if (info.argc == ARGC_ZERO) {
1768 TAG_LOGE(AAFwkTag::APPKIT, "Not enough params");
1769 ThrowInvalidParamError(env, "Not enough params.");
1770 return CreateJsUndefined(env);
1771 }
1772 auto applicationContext = applicationContext_.lock();
1773 if (applicationContext == nullptr) {
1774 TAG_LOGW(AAFwkTag::APPKIT, "null applicationContext");
1775 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_CONTEXT_NOT_EXIST);
1776 return CreateJsUndefined(env);
1777 }
1778
1779 bool isSupport = false;
1780 if (!ConvertFromJsValue(env, info.argv[INDEX_ZERO], isSupport)) {
1781 TAG_LOGE(AAFwkTag::APPKIT, "Parse isSupport failed");
1782 ThrowInvalidParamError(env,
1783 "Parse param isSupport failed, isSupport must be boolean.");
1784 return CreateJsUndefined(env);
1785 }
1786
1787 int32_t errCode = applicationContext->SetSupportedProcessCacheSelf(isSupport);
1788 if (errCode == AAFwk::ERR_CAPABILITY_NOT_SUPPORT) {
1789 TAG_LOGE(AAFwkTag::APPKIT, "process cache feature disabled");
1790 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_NO_SUCH_SYSCAP);
1791 } else if (errCode != ERR_OK) {
1792 TAG_LOGE(AAFwkTag::APPKIT, "set failed");
1793 AbilityRuntimeErrorUtil::Throw(env, ERR_ABILITY_RUNTIME_EXTERNAL_INTERNAL_ERROR);
1794 }
1795 return CreateJsUndefined(env);
1796 }
1797
BindNativeApplicationContextOne(napi_env env,napi_value object)1798 void JsApplicationContextUtils::BindNativeApplicationContextOne(napi_env env, napi_value object)
1799 {
1800 BindNativeProperty(env, object, "cacheDir", JsApplicationContextUtils::GetCacheDir);
1801 BindNativeProperty(env, object, "tempDir", JsApplicationContextUtils::GetTempDir);
1802 BindNativeProperty(env, object, "resourceDir", JsApplicationContextUtils::GetResourceDir);
1803 BindNativeProperty(env, object, "filesDir", JsApplicationContextUtils::GetFilesDir);
1804 BindNativeProperty(env, object, "distributedFilesDir", JsApplicationContextUtils::GetDistributedFilesDir);
1805 BindNativeProperty(env, object, "databaseDir", JsApplicationContextUtils::GetDatabaseDir);
1806 BindNativeProperty(env, object, "preferencesDir", JsApplicationContextUtils::GetPreferencesDir);
1807 BindNativeProperty(env, object, "bundleCodeDir", JsApplicationContextUtils::GetBundleCodeDir);
1808 BindNativeProperty(env, object, "cloudFileDir", JsApplicationContextUtils::GetCloudFileDir);
1809 BindNativeProperty(env, object, "processName", JsApplicationContextUtils::GetProcessName);
1810 BindNativeFunction(env, object, "registerAbilityLifecycleCallback", MD_NAME,
1811 JsApplicationContextUtils::RegisterAbilityLifecycleCallback);
1812 BindNativeFunction(env, object, "unregisterAbilityLifecycleCallback", MD_NAME,
1813 JsApplicationContextUtils::UnregisterAbilityLifecycleCallback);
1814 BindNativeFunction(env, object, "registerEnvironmentCallback", MD_NAME,
1815 JsApplicationContextUtils::RegisterEnvironmentCallback);
1816 BindNativeFunction(env, object, "unregisterEnvironmentCallback", MD_NAME,
1817 JsApplicationContextUtils::UnregisterEnvironmentCallback);
1818 BindNativeFunction(env, object, "createBundleContext", MD_NAME, JsApplicationContextUtils::CreateBundleContext);
1819 BindNativeFunction(env, object, "switchArea", MD_NAME, JsApplicationContextUtils::SwitchArea);
1820 BindNativeFunction(env, object, "getArea", MD_NAME, JsApplicationContextUtils::GetArea);
1821 BindNativeFunction(env, object, "createModuleContext", MD_NAME, JsApplicationContextUtils::CreateModuleContext);
1822 BindNativeFunction(env, object, "createSystemHspModuleResourceManager", MD_NAME,
1823 JsApplicationContextUtils::CreateSystemHspModuleResourceManager);
1824 BindNativeFunction(env, object, "createModuleResourceManager", MD_NAME,
1825 JsApplicationContextUtils::CreateModuleResourceManager);
1826 BindNativeFunction(env, object, "on", MD_NAME, JsApplicationContextUtils::On);
1827 BindNativeFunction(env, object, "off", MD_NAME, JsApplicationContextUtils::Off);
1828 BindNativeFunction(env, object, "getApplicationContext", MD_NAME,
1829 JsApplicationContextUtils::GetApplicationContext);
1830 BindNativeFunction(env, object, "killAllProcesses", MD_NAME, JsApplicationContextUtils::KillProcessBySelf);
1831 BindNativeFunction(env, object, "setColorMode", MD_NAME, JsApplicationContextUtils::SetColorMode);
1832 BindNativeFunction(env, object, "setLanguage", MD_NAME, JsApplicationContextUtils::SetLanguage);
1833 BindNativeFunction(env, object, "setFont", MD_NAME, JsApplicationContextUtils::SetFont);
1834 BindNativeFunction(env, object, "clearUpApplicationData", MD_NAME,
1835 JsApplicationContextUtils::ClearUpApplicationData);
1836 BindNativeFunction(env, object, "createAreaModeContext", MD_NAME, JsApplicationContextUtils::CreateAreaModeContext);
1837 BindNativeFunction(env, object, "createDisplayContext", MD_NAME,
1838 JsApplicationContextUtils::CreateDisplayContext);
1839 }
1840
BindNativeApplicationContextTwo(napi_env env,napi_value object)1841 void JsApplicationContextUtils::BindNativeApplicationContextTwo(napi_env env, napi_value object)
1842 {
1843 BindNativeFunction(env, object, "preloadUIExtensionAbility", MD_NAME,
1844 JsApplicationContextUtils::PreloadUIExtensionAbility);
1845 BindNativeFunction(env, object, "getProcessRunningInformation", MD_NAME,
1846 JsApplicationContextUtils::GetRunningProcessInformation);
1847 BindNativeFunction(env, object, "getRunningProcessInformation", MD_NAME,
1848 JsApplicationContextUtils::GetRunningProcessInformation);
1849 BindNativeFunction(env, object, "getCurrentAppCloneIndex", MD_NAME,
1850 JsApplicationContextUtils::GetCurrentAppCloneIndex);
1851 BindNativeFunction(env, object, "getCurrentInstanceKey", MD_NAME,
1852 JsApplicationContextUtils::GetCurrentInstanceKey);
1853 BindNativeFunction(env, object, "getAllRunningInstanceKeys", MD_NAME,
1854 JsApplicationContextUtils::GetAllRunningInstanceKeys);
1855 BindNativeFunction(env, object, "getGroupDir", MD_NAME, JsApplicationContextUtils::GetGroupDir);
1856 BindNativeFunction(env, object, "restartApp", MD_NAME, JsApplicationContextUtils::RestartApp);
1857 BindNativeFunction(env, object, "setSupportedProcessCache", MD_NAME,
1858 JsApplicationContextUtils::SetSupportedProcessCacheSelf);
1859 BindNativeFunction(env, object, "setFontSizeScale", MD_NAME,
1860 JsApplicationContextUtils::SetFontSizeScale);
1861 }
1862
ConvertToJsAppProcessState(const AppExecFwk::AppProcessState & appProcessState,const bool & isFocused)1863 JsAppProcessState JsApplicationContextUtils::ConvertToJsAppProcessState(
1864 const AppExecFwk::AppProcessState &appProcessState, const bool &isFocused)
1865 {
1866 JsAppProcessState processState;
1867 switch (appProcessState) {
1868 case AppExecFwk::AppProcessState::APP_STATE_CREATE:
1869 case AppExecFwk::AppProcessState::APP_STATE_READY:
1870 processState = STATE_CREATE;
1871 break;
1872 case AppExecFwk::AppProcessState::APP_STATE_FOREGROUND:
1873 processState = isFocused ? STATE_ACTIVE : STATE_FOREGROUND;
1874 break;
1875 case AppExecFwk::AppProcessState::APP_STATE_BACKGROUND:
1876 processState = STATE_BACKGROUND;
1877 break;
1878 case AppExecFwk::AppProcessState::APP_STATE_TERMINATED:
1879 case AppExecFwk::AppProcessState::APP_STATE_END:
1880 processState = STATE_DESTROY;
1881 break;
1882 default:
1883 TAG_LOGE(AAFwkTag::APPKIT, "process state invalid");
1884 processState = STATE_DESTROY;
1885 break;
1886 }
1887 return processState;
1888 }
1889 } // namespace AbilityRuntime
1890 } // namespace OHOS
1891