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