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