1 /*
2 * Copyright (c) 2021-2023 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 <cstdlib>
17 #include <regex>
18
19 #include "system_ability_definition.h"
20 #include "if_system_ability_manager.h"
21 #include "ability_delegator_registry.h"
22 #include "ability_runtime/js_ability.h"
23
24 #include "ability_runtime/js_ability_context.h"
25 #include "ability_recovery.h"
26 #include "ability_start_setting.h"
27 #include "app_recovery.h"
28 #include "connection_manager.h"
29 #include "hilog_wrapper.h"
30 #include "js_data_struct_converter.h"
31 #include "js_runtime.h"
32 #include "js_runtime_utils.h"
33 #include "napi_common_configuration.h"
34 #ifdef SUPPORT_GRAPHICS
35 #include "js_window_stage.h"
36 #endif
37 #include "napi_common_want.h"
38 #include "napi_remote_object.h"
39 #include "scene_board_judgement.h"
40 #include "string_wrapper.h"
41 #include "context/context.h"
42 #include "context/application_context.h"
43 #include "hitrace_meter.h"
44
45 namespace OHOS {
46 namespace AbilityRuntime {
47 namespace {
PromiseCallback(NativeEngine * engine,NativeCallbackInfo * info)48 NativeValue *PromiseCallback(NativeEngine *engine, NativeCallbackInfo *info)
49 {
50 if (info == nullptr || info->functionInfo == nullptr || info->functionInfo->data == nullptr) {
51 HILOG_ERROR("Invalid input info.");
52 return nullptr;
53 }
54 void *data = info->functionInfo->data;
55 auto *callbackInfo = static_cast<AppExecFwk::AbilityTransactionCallbackInfo<> *>(data);
56 callbackInfo->Call();
57 AppExecFwk::AbilityTransactionCallbackInfo<>::Destroy(callbackInfo);
58 info->functionInfo->data = nullptr;
59 return nullptr;
60 }
61 }
62
AttachJsAbilityContext(NativeEngine * engine,void * value,void *)63 NativeValue *AttachJsAbilityContext(NativeEngine *engine, void *value, void *)
64 {
65 HILOG_DEBUG("AttachJsAbilityContext");
66 if (value == nullptr) {
67 HILOG_WARN("invalid parameter.");
68 return nullptr;
69 }
70 auto ptr = reinterpret_cast<std::weak_ptr<AbilityRuntime::AbilityContext>*>(value)->lock();
71 if (ptr == nullptr) {
72 HILOG_WARN("invalid context.");
73 return nullptr;
74 }
75 NativeValue *object = CreateJsAbilityContext(*engine, ptr);
76 auto systemModule = JsRuntime::LoadSystemModuleByEngine(engine, "application.AbilityContext", &object, 1);
77 if (systemModule == nullptr) {
78 HILOG_WARN("invalid systemModule.");
79 return nullptr;
80 }
81 auto contextObj = systemModule->Get();
82 NativeObject *nObject = ConvertNativeValueTo<NativeObject>(contextObj);
83 nObject->ConvertToNativeBindingObject(engine, DetachCallbackFunc, AttachJsAbilityContext, value, nullptr);
84 auto workContext = new (std::nothrow) std::weak_ptr<AbilityRuntime::AbilityContext>(ptr);
85 nObject->SetNativePointer(workContext,
86 [](NativeEngine *, void * data, void *) {
87 HILOG_DEBUG("Finalizer for weak_ptr ability context is called");
88 delete static_cast<std::weak_ptr<AbilityRuntime::AbilityContext> *>(data);
89 }, nullptr);
90 return contextObj;
91 }
92
Create(const std::unique_ptr<Runtime> & runtime)93 Ability *JsAbility::Create(const std::unique_ptr<Runtime> &runtime)
94 {
95 return new JsAbility(static_cast<JsRuntime &>(*runtime));
96 }
97
JsAbility(JsRuntime & jsRuntime)98 JsAbility::JsAbility(JsRuntime &jsRuntime) : jsRuntime_(jsRuntime)
99 {}
~JsAbility()100 JsAbility::~JsAbility()
101 {
102 HILOG_DEBUG("Js ability destructor.");
103 auto context = GetAbilityContext();
104 if (context) {
105 context->Unbind();
106 }
107
108 jsRuntime_.FreeNativeReference(std::move(jsAbilityObj_));
109 jsRuntime_.FreeNativeReference(std::move(shellContextRef_));
110 #ifdef SUPPORT_GRAPHICS
111 jsRuntime_.FreeNativeReference(std::move(jsWindowStageObj_));
112 #endif
113 }
114
Init(const std::shared_ptr<AbilityInfo> & abilityInfo,const std::shared_ptr<OHOSApplication> application,std::shared_ptr<AbilityHandler> & handler,const sptr<IRemoteObject> & token)115 void JsAbility::Init(const std::shared_ptr<AbilityInfo> &abilityInfo,
116 const std::shared_ptr<OHOSApplication> application, std::shared_ptr<AbilityHandler> &handler,
117 const sptr<IRemoteObject> &token)
118 {
119 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
120 Ability::Init(abilityInfo, application, handler, token);
121
122 if (!abilityInfo) {
123 HILOG_ERROR("abilityInfo is nullptr");
124 return;
125 }
126 #ifdef SUPPORT_GRAPHICS
127 if (abilityInfo->type == AppExecFwk::AbilityType::PAGE && abilityInfo->isStageBasedModel &&
128 abilityContext_ != nullptr) {
129 AppExecFwk::AppRecovery::GetInstance().AddAbility(shared_from_this(), abilityContext_->GetAbilityInfo(),
130 abilityContext_->GetToken());
131 }
132 #endif
133 std::string srcPath(abilityInfo->package);
134 if (!abilityInfo->isModuleJson) {
135 /* temporary compatibility api8 + config.json */
136 srcPath.append("/assets/js/");
137 if (!abilityInfo->srcPath.empty()) {
138 srcPath.append(abilityInfo->srcPath);
139 }
140 srcPath.append("/").append(abilityInfo->name).append(".abc");
141 } else {
142 if (abilityInfo->srcEntrance.empty()) {
143 HILOG_ERROR("abilityInfo srcEntrance is empty");
144 return;
145 }
146 srcPath.append("/");
147 srcPath.append(abilityInfo->srcEntrance);
148 srcPath.erase(srcPath.rfind("."));
149 srcPath.append(".abc");
150 HILOG_INFO("JsAbility srcPath is %{public}s", srcPath.c_str());
151 }
152
153 std::string moduleName(abilityInfo->moduleName);
154 moduleName.append("::").append(abilityInfo->name);
155
156 HandleScope handleScope(jsRuntime_);
157 auto &engine = jsRuntime_.GetNativeEngine();
158
159 jsAbilityObj_ = jsRuntime_.LoadModule(
160 moduleName, srcPath, abilityInfo->hapPath, abilityInfo->compileMode == AppExecFwk::CompileMode::ES_MODULE);
161 if (jsAbilityObj_ == nullptr) {
162 HILOG_ERROR("Failed to get AbilityStage object");
163 return;
164 }
165
166 NativeObject *obj = ConvertNativeValueTo<NativeObject>(jsAbilityObj_->Get());
167 if (obj == nullptr) {
168 HILOG_ERROR("Failed to convert AbilityStage object");
169 return;
170 }
171
172 auto context = GetAbilityContext();
173 NativeValue *contextObj = CreateJsAbilityContext(engine, context);
174 shellContextRef_ = std::shared_ptr<NativeReference>(
175 JsRuntime::LoadSystemModuleByEngine(&engine, "application.AbilityContext", &contextObj, 1).release());
176 contextObj = shellContextRef_->Get();
177 auto nativeObj = ConvertNativeValueTo<NativeObject>(contextObj);
178 if (nativeObj == nullptr) {
179 HILOG_ERROR("Failed to get ability native object");
180 return;
181 }
182 auto workContext = new (std::nothrow) std::weak_ptr<AbilityRuntime::AbilityContext>(context);
183 nativeObj->ConvertToNativeBindingObject(&engine, DetachCallbackFunc, AttachJsAbilityContext,
184 workContext, nullptr);
185 context->Bind(jsRuntime_, shellContextRef_.get());
186 obj->SetProperty("context", contextObj);
187 HILOG_DEBUG("Set ability context");
188
189 if (abilityRecovery_ != nullptr) {
190 abilityRecovery_->SetJsAbility(reinterpret_cast<uintptr_t>(workContext));
191 }
192
193 nativeObj->SetNativePointer(
194 workContext,
195 [](NativeEngine *, void *data, void *) {
196 HILOG_DEBUG("Finalizer for weak_ptr ability context is called");
197 delete static_cast<std::weak_ptr<AbilityRuntime::AbilityContext> *>(data);
198 },
199 nullptr);
200 }
201
OnStart(const Want & want,sptr<AAFwk::SessionInfo> sessionInfo)202 void JsAbility::OnStart(const Want &want, sptr<AAFwk::SessionInfo> sessionInfo)
203 {
204 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
205 HILOG_DEBUG("OnStart begin, ability is %{public}s.", GetAbilityName().c_str());
206 Ability::OnStart(want, sessionInfo);
207
208 if (!jsAbilityObj_) {
209 HILOG_WARN("Not found Ability.js");
210 return;
211 }
212 auto applicationContext = AbilityRuntime::Context::GetApplicationContext();
213 if (applicationContext != nullptr) {
214 applicationContext->DispatchOnAbilityCreate(jsAbilityObj_);
215 }
216
217 HandleScope handleScope(jsRuntime_);
218 auto &nativeEngine = jsRuntime_.GetNativeEngine();
219
220 NativeValue *value = jsAbilityObj_->Get();
221 NativeObject *obj = ConvertNativeValueTo<NativeObject>(value);
222 if (obj == nullptr) {
223 HILOG_ERROR("Failed to get Ability object");
224 return;
225 }
226
227 napi_value napiWant = OHOS::AppExecFwk::WrapWant(reinterpret_cast<napi_env>(&nativeEngine), want);
228 NativeValue *jsWant = reinterpret_cast<NativeValue *>(napiWant);
229 if (jsWant == nullptr) {
230 HILOG_ERROR("jsWant is nullptr");
231 return;
232 }
233
234 obj->SetProperty("launchWant", jsWant);
235 obj->SetProperty("lastRequestWant", jsWant);
236
237 NativeValue *argv[] = {
238 jsWant,
239 CreateJsLaunchParam(nativeEngine, GetLaunchParam()),
240 };
241 CallObjectMethod("onCreate", argv, ArraySize(argv));
242
243 auto delegator = AppExecFwk::AbilityDelegatorRegistry::GetAbilityDelegator();
244 if (delegator) {
245 HILOG_DEBUG("Call AbilityDelegator::PostPerformStart");
246 delegator->PostPerformStart(CreateADelegatorAbilityProperty());
247 }
248 HILOG_DEBUG("OnStart end, ability is %{public}s.", GetAbilityName().c_str());
249 }
250
OnShare(WantParams & wantParam)251 int32_t JsAbility::OnShare(WantParams &wantParam)
252 {
253 HILOG_DEBUG("%{public}s begin", __func__);
254 HandleScope handleScope(jsRuntime_);
255 auto &nativeEngine = jsRuntime_.GetNativeEngine();
256 if (jsAbilityObj_ == nullptr) {
257 HILOG_ERROR("Failed to get AbilityStage object");
258 return ERR_INVALID_VALUE;
259 }
260 NativeValue *value = jsAbilityObj_->Get();
261 NativeObject *obj = ConvertNativeValueTo<NativeObject>(value);
262 if (obj == nullptr) {
263 HILOG_ERROR("Failed to get Ability object");
264 return ERR_INVALID_VALUE;
265 }
266
267 napi_value napiWantParams = OHOS::AppExecFwk::WrapWantParams(reinterpret_cast<napi_env>(&nativeEngine), wantParam);
268 NativeValue *jsWantParams = reinterpret_cast<NativeValue *>(napiWantParams);
269 NativeValue *argv[] = {
270 jsWantParams,
271 };
272 CallObjectMethod("onShare", argv, ArraySize(argv));
273 napi_value new_napiWantParams = reinterpret_cast<napi_value>(jsWantParams);
274 OHOS::AppExecFwk::UnwrapWantParams(reinterpret_cast<napi_env>(&nativeEngine), new_napiWantParams, wantParam);
275 HILOG_DEBUG("%{public}s end", __func__);
276 return ERR_OK;
277 }
278
OnStop()279 void JsAbility::OnStop()
280 {
281 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
282 HILOG_DEBUG("OnStop begin.");
283 if (abilityContext_) {
284 HILOG_DEBUG("OnStop, set terminating true.");
285 abilityContext_->SetTerminating(true);
286 }
287 Ability::OnStop();
288 CallObjectMethod("onDestroy");
289 OnStopCallback();
290 HILOG_DEBUG("OnStop end.");
291 }
292
OnStop(AppExecFwk::AbilityTransactionCallbackInfo<> * callbackInfo,bool & isAsyncCallback)293 void JsAbility::OnStop(AppExecFwk::AbilityTransactionCallbackInfo<> *callbackInfo, bool &isAsyncCallback)
294 {
295 if (callbackInfo == nullptr) {
296 isAsyncCallback = false;
297 OnStop();
298 return;
299 }
300
301 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
302 HILOG_DEBUG("OnStop begin.");
303 if (abilityContext_) {
304 HILOG_DEBUG("OnStop, set terminating true.");
305 abilityContext_->SetTerminating(true);
306 }
307
308 Ability::OnStop();
309
310 HandleScope handleScope(jsRuntime_);
311 NativeValue *result = CallObjectMethod("onDestroy", nullptr, 0, true);
312 if (!CheckPromise(result)) {
313 OnStopCallback();
314 isAsyncCallback = false;
315 return;
316 }
317
318 std::weak_ptr<Ability> weakPtr = shared_from_this();
319 auto asyncCallback = [abilityWeakPtr = weakPtr]() {
320 auto ability = abilityWeakPtr.lock();
321 if (ability == nullptr) {
322 HILOG_ERROR("ability is nullptr.");
323 return;
324 }
325 ability->OnStopCallback();
326 };
327 callbackInfo->Push(asyncCallback);
328 isAsyncCallback = CallPromise(result, callbackInfo);
329 if (!isAsyncCallback) {
330 HILOG_ERROR("Failed to call promise.");
331 OnStopCallback();
332 }
333 HILOG_DEBUG("OnStop end.");
334 }
335
OnStopCallback()336 void JsAbility::OnStopCallback()
337 {
338 auto delegator = AppExecFwk::AbilityDelegatorRegistry::GetAbilityDelegator();
339 if (delegator) {
340 HILOG_DEBUG("Call AbilityDelegator::PostPerformStop");
341 delegator->PostPerformStop(CreateADelegatorAbilityProperty());
342 }
343
344 bool ret = ConnectionManager::GetInstance().DisconnectCaller(AbilityContext::token_);
345 if (ret) {
346 ConnectionManager::GetInstance().ReportConnectionLeakEvent(getpid(), gettid());
347 HILOG_DEBUG("The service connection is not disconnected.");
348 }
349
350 auto applicationContext = AbilityRuntime::Context::GetApplicationContext();
351 if (applicationContext != nullptr) {
352 applicationContext->DispatchOnAbilityDestroy(jsAbilityObj_);
353 }
354 }
355
356 #ifdef SUPPORT_GRAPHICS
357 const std::string PAGE_STACK_PROPERTY_NAME = "pageStack";
358 const std::string SUPPORT_CONTINUE_PAGE_STACK_PROPERTY_NAME = "ohos.extra.param.key.supportContinuePageStack";
359
OnSceneCreated()360 void JsAbility::OnSceneCreated()
361 {
362 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
363 HILOG_DEBUG("OnSceneCreated begin, ability is %{public}s.", GetAbilityName().c_str());
364 Ability::OnSceneCreated();
365 auto jsAppWindowStage = CreateAppWindowStage();
366 if (jsAppWindowStage == nullptr) {
367 HILOG_ERROR("Failed to create jsAppWindowStage object by LoadSystemModule");
368 return;
369 }
370
371 HandleScope handleScope(jsRuntime_);
372 NativeValue *argv[] = {jsAppWindowStage->Get()};
373 {
374 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, "onWindowStageCreate");
375 CallObjectMethod("onWindowStageCreate", argv, ArraySize(argv));
376 }
377
378 auto delegator = AppExecFwk::AbilityDelegatorRegistry::GetAbilityDelegator();
379 if (delegator) {
380 HILOG_DEBUG("Call AbilityDelegator::PostPerformScenceCreated");
381 delegator->PostPerformScenceCreated(CreateADelegatorAbilityProperty());
382 }
383
384 jsWindowStageObj_ = std::shared_ptr<NativeReference>(jsAppWindowStage.release());
385 auto applicationContext = AbilityRuntime::Context::GetApplicationContext();
386 if (applicationContext != nullptr) {
387 applicationContext->DispatchOnWindowStageCreate(jsAbilityObj_, jsWindowStageObj_);
388 }
389
390 HILOG_DEBUG("OnSceneCreated end, ability is %{public}s.", GetAbilityName().c_str());
391 }
392
OnSceneRestored()393 void JsAbility::OnSceneRestored()
394 {
395 Ability::OnSceneRestored();
396 HILOG_DEBUG("OnSceneRestored");
397 auto jsAppWindowStage = CreateAppWindowStage();
398 if (jsAppWindowStage == nullptr) {
399 HILOG_ERROR("Failed to create jsAppWindowStage object by LoadSystemModule");
400 return;
401 }
402 NativeValue *argv[] = {jsAppWindowStage->Get()};
403 CallObjectMethod("onWindowStageRestore", argv, ArraySize(argv));
404
405 auto delegator = AppExecFwk::AbilityDelegatorRegistry::GetAbilityDelegator();
406 if (delegator) {
407 HILOG_DEBUG("Call AbilityDelegator::PostPerformScenceRestored");
408 delegator->PostPerformScenceRestored(CreateADelegatorAbilityProperty());
409 }
410
411 jsWindowStageObj_ = std::shared_ptr<NativeReference>(jsAppWindowStage.release());
412 }
413
onSceneDestroyed()414 void JsAbility::onSceneDestroyed()
415 {
416 HILOG_DEBUG("onSceneDestroyed begin, ability is %{public}s.", GetAbilityName().c_str());
417 Ability::onSceneDestroyed();
418
419 CallObjectMethod("onWindowStageDestroy");
420
421 if (scene_ != nullptr) {
422 auto window = scene_->GetMainWindow();
423 if (window != nullptr) {
424 HILOG_DEBUG("Call UnregisterDisplayMoveListener");
425 window->UnregisterDisplayMoveListener(abilityDisplayMoveListener_);
426 }
427 }
428
429 auto delegator = AppExecFwk::AbilityDelegatorRegistry::GetAbilityDelegator();
430 if (delegator) {
431 HILOG_DEBUG("Call AbilityDelegator::PostPerformScenceDestroyed");
432 delegator->PostPerformScenceDestroyed(CreateADelegatorAbilityProperty());
433 }
434
435 auto applicationContext = AbilityRuntime::Context::GetApplicationContext();
436 if (applicationContext != nullptr) {
437 applicationContext->DispatchOnWindowStageDestroy(jsAbilityObj_, jsWindowStageObj_);
438 }
439 HILOG_DEBUG("onSceneDestroyed end, ability is %{public}s.", GetAbilityName().c_str());
440 }
441
OnForeground(const Want & want)442 void JsAbility::OnForeground(const Want &want)
443 {
444 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
445 HILOG_DEBUG("OnForeground begin, ability is %{public}s.", GetAbilityName().c_str());
446 if (abilityInfo_) {
447 jsRuntime_.UpdateModuleNameAndAssetPath(abilityInfo_->moduleName);
448 }
449
450 Ability::OnForeground(want);
451
452 HandleScope handleScope(jsRuntime_);
453 auto &nativeEngine = jsRuntime_.GetNativeEngine();
454 if (jsAbilityObj_ == nullptr) {
455 HILOG_ERROR("Failed to get AbilityStage object");
456 return;
457 }
458 NativeValue *value = jsAbilityObj_->Get();
459 NativeObject *obj = ConvertNativeValueTo<NativeObject>(value);
460 if (obj == nullptr) {
461 HILOG_ERROR("Failed to get Ability object");
462 return;
463 }
464
465 napi_value napiWant = OHOS::AppExecFwk::WrapWant(reinterpret_cast<napi_env>(&nativeEngine), want);
466 NativeValue *jsWant = reinterpret_cast<NativeValue *>(napiWant);
467 if(jsWant == nullptr) {
468 HILOG_ERROR("jsWant is nullptr");
469 return;
470 }
471
472 obj->SetProperty("lastRequestWant", jsWant);
473
474 CallObjectMethod("onForeground", &jsWant, 1);
475
476 auto delegator = AppExecFwk::AbilityDelegatorRegistry::GetAbilityDelegator();
477 if (delegator) {
478 HILOG_DEBUG("Call AbilityDelegator::PostPerformForeground");
479 delegator->PostPerformForeground(CreateADelegatorAbilityProperty());
480 }
481
482 auto applicationContext = AbilityRuntime::Context::GetApplicationContext();
483 if (applicationContext != nullptr) {
484 applicationContext->DispatchOnAbilityForeground(jsAbilityObj_);
485 }
486 HILOG_DEBUG("OnForeground end, ability is %{public}s.", GetAbilityName().c_str());
487 }
488
OnBackground()489 void JsAbility::OnBackground()
490 {
491 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
492 HILOG_DEBUG("OnBackground begin, ability is %{public}s.", GetAbilityName().c_str());
493 CallObjectMethod("onBackground");
494
495 Ability::OnBackground();
496
497 auto delegator = AppExecFwk::AbilityDelegatorRegistry::GetAbilityDelegator();
498 if (delegator) {
499 HILOG_DEBUG("Call AbilityDelegator::PostPerformBackground");
500 delegator->PostPerformBackground(CreateADelegatorAbilityProperty());
501 }
502
503 auto applicationContext = AbilityRuntime::Context::GetApplicationContext();
504 if (applicationContext != nullptr) {
505 applicationContext->DispatchOnAbilityBackground(jsAbilityObj_);
506 }
507 HILOG_DEBUG("OnBackground end, ability is %{public}s.", GetAbilityName().c_str());
508 }
509
OnBackPress()510 bool JsAbility::OnBackPress()
511 {
512 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
513 HILOG_DEBUG("call, ability: %{public}s.", GetAbilityName().c_str());
514 Ability::OnBackPress();
515
516 NativeValue *jsValue = CallObjectMethod("onBackPressed", nullptr, 0, true);
517 auto numberValue = ConvertNativeValueTo<NativeBoolean>(jsValue);
518 if (numberValue == nullptr) {
519 HILOG_ERROR("numberValue is nullptr.");
520 return false;
521 }
522 bool ret = (bool)(*numberValue);
523 HILOG_DEBUG("end, ret = %{public}d", ret);
524 return ret;
525 }
526
OnPrepareTerminate()527 bool JsAbility::OnPrepareTerminate()
528 {
529 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
530 HILOG_DEBUG("call, ability: %{public}s.", GetAbilityName().c_str());
531 Ability::OnPrepareTerminate();
532
533 NativeValue *jsValue = CallObjectMethod("onPrepareToTerminate", nullptr, 0, true);
534 auto numberValue = ConvertNativeValueTo<NativeBoolean>(jsValue);
535 if (numberValue == nullptr) {
536 HILOG_ERROR("numberValue is nullptr.");
537 return false;
538 }
539 bool ret = (bool)(*numberValue);
540 HILOG_DEBUG("end, ret = %{public}d", ret);
541 return ret;
542 }
543
CreateAppWindowStage()544 std::unique_ptr<NativeReference> JsAbility::CreateAppWindowStage()
545 {
546 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
547 HandleScope handleScope(jsRuntime_);
548 auto &engine = jsRuntime_.GetNativeEngine();
549 NativeValue *jsWindowStage = Rosen::CreateJsWindowStage(engine, GetScene());
550 if (jsWindowStage == nullptr) {
551 HILOG_ERROR("Failed to create jsWindowSatge object");
552 return nullptr;
553 }
554 return JsRuntime::LoadSystemModuleByEngine(&engine, "application.WindowStage", &jsWindowStage, 1);
555 }
556
GetPageStackFromWant(const Want & want,std::string & pageStack)557 void JsAbility::GetPageStackFromWant(const Want &want, std::string &pageStack)
558 {
559 auto stringObj = AAFwk::IString::Query(want.GetParams().GetParam(PAGE_STACK_PROPERTY_NAME));
560 if (stringObj != nullptr) {
561 pageStack = AAFwk::String::Unbox(stringObj);
562 }
563 }
564
IsRestorePageStack(const Want & want)565 bool JsAbility::IsRestorePageStack(const Want &want)
566 {
567 return want.GetBoolParam(SUPPORT_CONTINUE_PAGE_STACK_PROPERTY_NAME, true);
568 }
569
RestorePageStack(const Want & want)570 void JsAbility::RestorePageStack(const Want &want)
571 {
572 if (IsRestorePageStack(want)) {
573 std::string pageStack;
574 GetPageStackFromWant(want, pageStack);
575 HandleScope handleScope(jsRuntime_);
576 auto &engine = jsRuntime_.GetNativeEngine();
577 if (abilityContext_->GetContentStorage()) {
578 scene_->GetMainWindow()->SetUIContent(pageStack, &engine,
579 abilityContext_->GetContentStorage()->Get(), true);
580 } else {
581 HILOG_ERROR("restore: content storage is nullptr");
582 }
583 }
584 }
585
AbilityContinuationOrRecover(const Want & want)586 void JsAbility::AbilityContinuationOrRecover(const Want &want)
587 {
588 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
589 // multi-instance ability continuation
590 HILOG_DEBUG("launch reason = %{public}d", launchParam_.launchReason);
591 if (IsRestoredInContinuation()) {
592 RestorePageStack(want);
593 OnSceneRestored();
594 NotifyContinuationResult(want, true);
595 } else if (ShouldRecoverState(want)) {
596 std::string pageStack = abilityRecovery_->GetSavedPageStack(AppExecFwk::StateReason::DEVELOPER_REQUEST);
597 HandleScope handleScope(jsRuntime_);
598 auto &engine = jsRuntime_.GetNativeEngine();
599 auto mainWindow = scene_->GetMainWindow();
600 if (mainWindow != nullptr) {
601 mainWindow->SetUIContent(pageStack, &engine, abilityContext_->GetContentStorage()->Get(), true);
602 } else {
603 HILOG_ERROR("AppRecovery:AbilityContinuationOrRecover mainWindow nullptr");
604 }
605 OnSceneRestored();
606 } else {
607 OnSceneCreated();
608 }
609 }
610
DoOnForeground(const Want & want)611 void JsAbility::DoOnForeground(const Want &want)
612 {
613 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
614 if (scene_ == nullptr) {
615 if ((abilityContext_ == nullptr) || (sceneListener_ == nullptr)) {
616 HILOG_ERROR("Ability::OnForeground error. abilityContext_ or sceneListener_ is nullptr!");
617 return;
618 }
619 scene_ = std::make_shared<Rosen::WindowScene>();
620 int32_t displayId = Rosen::WindowScene::DEFAULT_DISPLAY_ID;
621 if (setting_ != nullptr) {
622 std::string strDisplayId =
623 setting_->GetProperty(OHOS::AppExecFwk::AbilityStartSetting::WINDOW_DISPLAY_ID_KEY);
624 std::regex formatRegex("[0-9]{0,9}$");
625 std::smatch sm;
626 bool flag = std::regex_match(strDisplayId, sm, formatRegex);
627 if (flag && !strDisplayId.empty()) {
628 int base = 10; // Numerical base (radix) that determines the valid characters and their interpretation.
629 displayId = strtol(strDisplayId.c_str(), nullptr, base);
630 HILOG_DEBUG("%{public}s success. displayId is %{public}d", __func__, displayId);
631 } else {
632 HILOG_WARN("%{public}s failed to formatRegex:[%{public}s]", __func__, strDisplayId.c_str());
633 }
634 }
635 auto option = GetWindowOption(want);
636 Rosen::WMError ret = Rosen::WMError::WM_OK;
637 if (Rosen::SceneBoardJudgement::IsSceneBoardEnabled() && sessionInfo_ != nullptr) {
638 abilityContext_->SetWeakSessionToken(sessionInfo_->sessionToken);
639 ret = scene_->Init(displayId, abilityContext_, sceneListener_, option, sessionInfo_->sessionToken);
640 } else {
641 ret = scene_->Init(displayId, abilityContext_, sceneListener_, option);
642 }
643 if (ret != Rosen::WMError::WM_OK) {
644 HILOG_ERROR("%{public}s error. failed to init window scene!", __func__);
645 return;
646 }
647
648 AbilityContinuationOrRecover(want);
649 auto window = scene_->GetMainWindow();
650 if (window) {
651 HILOG_DEBUG("Call RegisterDisplayMoveListener, windowId: %{public}d", window->GetWindowId());
652 abilityDisplayMoveListener_ = new AbilityDisplayMoveListener(weak_from_this());
653 window->RegisterDisplayMoveListener(abilityDisplayMoveListener_);
654 }
655 } else {
656 auto window = scene_->GetMainWindow();
657 if (window != nullptr && want.HasParameter(Want::PARAM_RESV_WINDOW_MODE)) {
658 auto windowMode = want.GetIntParam(Want::PARAM_RESV_WINDOW_MODE,
659 AAFwk::AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_UNDEFINED);
660 window->SetWindowMode(static_cast<Rosen::WindowMode>(windowMode));
661 HILOG_DEBUG("set window mode = %{public}d.", windowMode);
662 }
663 }
664
665 auto window = scene_->GetMainWindow();
666 if (window != nullptr && securityFlag_) {
667 window->SetSystemPrivacyMode(true);
668 }
669
670 HILOG_DEBUG("%{public}s begin scene_->GoForeground, sceneFlag_:%{public}d.", __func__, Ability::sceneFlag_);
671 scene_->GoForeground(Ability::sceneFlag_);
672 HILOG_DEBUG("%{public}s end scene_->GoForeground.", __func__);
673 }
674
RequestFocus(const Want & want)675 void JsAbility::RequestFocus(const Want &want)
676 {
677 HILOG_DEBUG("%{public}s called.", __func__);
678 if (scene_ == nullptr) {
679 return;
680 }
681 auto window = scene_->GetMainWindow();
682 if (window != nullptr && want.HasParameter(Want::PARAM_RESV_WINDOW_MODE)) {
683 auto windowMode = want.GetIntParam(Want::PARAM_RESV_WINDOW_MODE,
684 AAFwk::AbilityWindowConfiguration::MULTI_WINDOW_DISPLAY_UNDEFINED);
685 window->SetWindowMode(static_cast<Rosen::WindowMode>(windowMode));
686 HILOG_DEBUG("set window mode = %{public}d.", windowMode);
687 }
688 scene_->GoForeground(Ability::sceneFlag_);
689 }
690
ContinuationRestore(const Want & want)691 void JsAbility::ContinuationRestore(const Want &want)
692 {
693 HILOG_DEBUG("%{public}s called.", __func__);
694 if (!IsRestoredInContinuation() || scene_ == nullptr) {
695 return;
696 }
697 RestorePageStack(want);
698 OnSceneRestored();
699 NotifyContinuationResult(want, true);
700 }
701
GetJsWindowStage()702 std::shared_ptr<NativeReference> JsAbility::GetJsWindowStage()
703 {
704 HILOG_DEBUG("%{public}s called.", __func__);
705 if (jsWindowStageObj_ == nullptr) {
706 HILOG_ERROR("jsWindowSatge is nullptr");
707 }
708 return jsWindowStageObj_;
709 }
710
GetJsRuntime()711 const JsRuntime& JsAbility::GetJsRuntime()
712 {
713 return jsRuntime_;
714 }
715
716 #endif
717
OnContinue(WantParams & wantParams)718 int32_t JsAbility::OnContinue(WantParams &wantParams)
719 {
720 HandleScope handleScope(jsRuntime_);
721 auto &nativeEngine = jsRuntime_.GetNativeEngine();
722 if (jsAbilityObj_ == nullptr) {
723 HILOG_ERROR("Failed to get AbilityStage object");
724 return AppExecFwk::ContinuationManager::OnContinueResult::REJECT;
725 }
726 NativeValue *value = jsAbilityObj_->Get();
727 NativeObject *obj = ConvertNativeValueTo<NativeObject>(value);
728 if (obj == nullptr) {
729 HILOG_ERROR("Failed to get Ability object");
730 return AppExecFwk::ContinuationManager::OnContinueResult::REJECT;
731 }
732
733 NativeValue *methodOnCreate = obj->GetProperty("onContinue");
734 if (methodOnCreate == nullptr) {
735 HILOG_ERROR("Failed to get 'onContinue' from Ability object");
736 return AppExecFwk::ContinuationManager::OnContinueResult::REJECT;
737 }
738
739 napi_value napiWantParams = OHOS::AppExecFwk::WrapWantParams(reinterpret_cast<napi_env>(&nativeEngine), wantParams);
740 NativeValue *jsWantParams = reinterpret_cast<NativeValue *>(napiWantParams);
741
742 NativeValue *result = nativeEngine.CallFunction(value, methodOnCreate, &jsWantParams, 1);
743
744 napi_value new_napiWantParams = reinterpret_cast<napi_value>(jsWantParams);
745 OHOS::AppExecFwk::UnwrapWantParams(reinterpret_cast<napi_env>(&nativeEngine), new_napiWantParams, wantParams);
746
747 NativeNumber *numberResult = ConvertNativeValueTo<NativeNumber>(result);
748 if (numberResult == nullptr) {
749 HILOG_ERROR("'onContinue' is not implemented");
750 return AppExecFwk::ContinuationManager::OnContinueResult::REJECT;
751 }
752
753 auto applicationContext = AbilityRuntime::Context::GetApplicationContext();
754 if (applicationContext != nullptr) {
755 applicationContext->DispatchOnAbilityContinue(jsAbilityObj_);
756 }
757
758 return *numberResult;
759 }
760
OnSaveState(int32_t reason,WantParams & wantParams)761 int32_t JsAbility::OnSaveState(int32_t reason, WantParams &wantParams)
762 {
763 HandleScope handleScope(jsRuntime_);
764 auto &nativeEngine = jsRuntime_.GetNativeEngine();
765 if (jsAbilityObj_ == nullptr) {
766 HILOG_ERROR("AppRecoveryFailed to get AbilityStage object");
767 return -1;
768 }
769 NativeValue *value = jsAbilityObj_->Get();
770 NativeObject *obj = ConvertNativeValueTo<NativeObject>(value);
771 if (obj == nullptr) {
772 HILOG_ERROR("AppRecovery Failed to get Ability object");
773 return -1;
774 }
775
776 NativeValue *methodOnSaveState = obj->GetProperty("onSaveState");
777 if (methodOnSaveState == nullptr) {
778 HILOG_ERROR("AppRecovery Failed to get 'onSaveState' from Ability object");
779 return -1;
780 }
781
782 napi_value napiWantParams = OHOS::AppExecFwk::WrapWantParams(reinterpret_cast<napi_env>(&nativeEngine), wantParams);
783 NativeValue* jsReason = CreateJsValue(nativeEngine, reason);
784 NativeValue* jsWantParams = reinterpret_cast<NativeValue *>(napiWantParams);
785 NativeValue* args[] = { jsReason, jsWantParams };
786 NativeValue* result = nativeEngine.CallFunction(value, methodOnSaveState, args, 2); // 2:args size
787 napi_value newNapiWantParams = reinterpret_cast<napi_value>(jsWantParams);
788 OHOS::AppExecFwk::UnwrapWantParams(reinterpret_cast<napi_env>(&nativeEngine), newNapiWantParams, wantParams);
789
790 NativeNumber *numberResult = ConvertNativeValueTo<NativeNumber>(result);
791 if (numberResult == nullptr) {
792 HILOG_ERROR("AppRecovery no result return from onSaveState");
793 return -1;
794 }
795 return *numberResult;
796 }
797
OnConfigurationUpdated(const Configuration & configuration)798 void JsAbility::OnConfigurationUpdated(const Configuration &configuration)
799 {
800 Ability::OnConfigurationUpdated(configuration);
801 HILOG_DEBUG("%{public}s called.", __func__);
802
803 HandleScope handleScope(jsRuntime_);
804 auto& nativeEngine = jsRuntime_.GetNativeEngine();
805 auto fullConfig = GetAbilityContext()->GetConfiguration();
806 if (!fullConfig) {
807 HILOG_ERROR("configuration is nullptr.");
808 return;
809 }
810
811 napi_value napiConfiguration = OHOS::AppExecFwk::WrapConfiguration(
812 reinterpret_cast<napi_env>(&nativeEngine), configuration);
813 NativeValue* jsConfiguration = reinterpret_cast<NativeValue*>(napiConfiguration);
814 CallObjectMethod("onConfigurationUpdated", &jsConfiguration, 1);
815 CallObjectMethod("onConfigurationUpdate", &jsConfiguration, 1);
816 JsAbilityContext::ConfigurationUpdated(&nativeEngine, shellContextRef_, fullConfig);
817 }
818
OnMemoryLevel(int level)819 void JsAbility::OnMemoryLevel(int level)
820 {
821 Ability::OnMemoryLevel(level);
822 HILOG_DEBUG("%{public}s called.", __func__);
823
824 HandleScope handleScope(jsRuntime_);
825 auto &nativeEngine = jsRuntime_.GetNativeEngine();
826 if (jsAbilityObj_ == nullptr) {
827 HILOG_ERROR("Failed to get AbilityStage object");
828 return;
829 }
830 NativeValue *value = jsAbilityObj_->Get();
831 NativeObject *obj = ConvertNativeValueTo<NativeObject>(value);
832 if (obj == nullptr) {
833 HILOG_ERROR("Failed to get Ability object");
834 return;
835 }
836
837 NativeValue *jslevel = CreateJsValue(nativeEngine, level);
838 NativeValue *argv[] = {
839 jslevel,
840 };
841 CallObjectMethod("onMemoryLevel", argv, ArraySize(argv));
842 }
843
UpdateContextConfiguration()844 void JsAbility::UpdateContextConfiguration()
845 {
846 HILOG_DEBUG("%{public}s called.", __func__);
847 HandleScope handleScope(jsRuntime_);
848 auto& nativeEngine = jsRuntime_.GetNativeEngine();
849 JsAbilityContext::ConfigurationUpdated(&nativeEngine, shellContextRef_, GetAbilityContext()->GetConfiguration());
850 }
851
OnNewWant(const Want & want)852 void JsAbility::OnNewWant(const Want &want)
853 {
854 HILOG_DEBUG("%{public}s begin.", __func__);
855 Ability::OnNewWant(want);
856
857 #ifdef SUPPORT_GRAPHICS
858 if (scene_) {
859 scene_->OnNewWant(want);
860 }
861 #endif
862
863 HandleScope handleScope(jsRuntime_);
864 auto &nativeEngine = jsRuntime_.GetNativeEngine();
865 if (jsAbilityObj_ == nullptr) {
866 HILOG_ERROR("Failed to get AbilityStage object");
867 return;
868 }
869 NativeValue *value = jsAbilityObj_->Get();
870 NativeObject *obj = ConvertNativeValueTo<NativeObject>(value);
871 if (obj == nullptr) {
872 HILOG_ERROR("Failed to get Ability object");
873 return;
874 }
875
876 napi_value napiWant = OHOS::AppExecFwk::WrapWant(reinterpret_cast<napi_env>(&nativeEngine), want);
877 NativeValue *jsWant = reinterpret_cast<NativeValue *>(napiWant);
878 if (jsWant == nullptr) {
879 HILOG_ERROR("Failed to get want");
880 return;
881 }
882
883 obj->SetProperty("lastRequestWant", jsWant);
884
885 NativeValue *argv[] = {
886 jsWant,
887 CreateJsLaunchParam(nativeEngine, GetLaunchParam()),
888 };
889 CallObjectMethod("onNewWant", argv, ArraySize(argv));
890
891 HILOG_DEBUG("%{public}s end.", __func__);
892 }
893
OnAbilityResult(int requestCode,int resultCode,const Want & resultData)894 void JsAbility::OnAbilityResult(int requestCode, int resultCode, const Want &resultData)
895 {
896 HILOG_DEBUG("%{public}s begin.", __func__);
897 Ability::OnAbilityResult(requestCode, resultCode, resultData);
898 std::shared_ptr<AbilityRuntime::AbilityContext> context = GetAbilityContext();
899 if (context == nullptr) {
900 HILOG_WARN("JsAbility not attached to any runtime context!");
901 return;
902 }
903 context->OnAbilityResult(requestCode, resultCode, resultData);
904 HILOG_DEBUG("%{public}s end.", __func__);
905 }
906
CallRequest()907 sptr<IRemoteObject> JsAbility::CallRequest()
908 {
909 HILOG_DEBUG("JsAbility::CallRequest begin.");
910 if (jsAbilityObj_ == nullptr) {
911 HILOG_WARN("JsAbility::CallRequest Obj is nullptr");
912 return nullptr;
913 }
914
915 if (remoteCallee_ != nullptr) {
916 HILOG_DEBUG("JsAbility::CallRequest get Callee remoteObj.");
917 return remoteCallee_;
918 }
919
920 HandleScope handleScope(jsRuntime_);
921 HILOG_DEBUG("JsAbility::CallRequest set runtime scope.");
922 auto &nativeEngine = jsRuntime_.GetNativeEngine();
923 auto value = jsAbilityObj_->Get();
924 if (value == nullptr) {
925 HILOG_ERROR("JsAbility::CallRequest value is nullptr");
926 return nullptr;
927 }
928
929 NativeObject *obj = ConvertNativeValueTo<NativeObject>(value);
930 if (obj == nullptr) {
931 HILOG_ERROR("JsAbility::CallRequest obj is nullptr");
932 return nullptr;
933 }
934
935 auto method = obj->GetProperty("onCallRequest");
936 if (method == nullptr || !method->IsCallable()) {
937 HILOG_ERROR("JsAbility::CallRequest method is %{public}s", method == nullptr ? "nullptr" : "not func");
938 return nullptr;
939 }
940
941 auto remoteJsObj = nativeEngine.CallFunction(value, method, nullptr, 0);
942 if (remoteJsObj == nullptr) {
943 HILOG_ERROR("JsAbility::CallRequest JsObj is nullptr");
944 return nullptr;
945 }
946
947 remoteCallee_ = SetNewRuleFlagToCallee(nativeEngine, remoteJsObj);
948 HILOG_DEBUG("JsAbility::CallRequest end.");
949 return remoteCallee_;
950 }
951
CallObjectMethod(const char * name,NativeValue * const * argv,size_t argc,bool withResult)952 NativeValue *JsAbility::CallObjectMethod(const char *name, NativeValue *const *argv, size_t argc, bool withResult)
953 {
954 HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__);
955 HILOG_DEBUG("JsAbility::CallObjectMethod(%{public}s", name);
956
957 if (!jsAbilityObj_) {
958 HILOG_WARN("Not found Ability.js");
959 return nullptr;
960 }
961
962 HandleEscape handleEscape(jsRuntime_);
963 auto &nativeEngine = jsRuntime_.GetNativeEngine();
964
965 NativeValue *value = jsAbilityObj_->Get();
966 NativeObject *obj = ConvertNativeValueTo<NativeObject>(value);
967 if (obj == nullptr) {
968 HILOG_ERROR("Failed to get Ability object");
969 return nullptr;
970 }
971
972 NativeValue *methodOnCreate = obj->GetProperty(name);
973 if (methodOnCreate == nullptr) {
974 HILOG_ERROR("Failed to get '%{public}s' from Ability object", name);
975 return nullptr;
976 }
977 if (withResult) {
978 return handleEscape.Escape(nativeEngine.CallFunction(value, methodOnCreate, argv, argc));
979 }
980 nativeEngine.CallFunction(value, methodOnCreate, argv, argc);
981 return nullptr;
982 }
983
CheckPromise(NativeValue * result)984 bool JsAbility::CheckPromise(NativeValue *result)
985 {
986 if (result == nullptr) {
987 HILOG_DEBUG("result is null, no need to call promise.");
988 return false;
989 }
990 if (!result->IsPromise()) {
991 HILOG_DEBUG("result is not promise, no need to call promise.");
992 return false;
993 }
994 return true;
995 }
996
CallPromise(NativeValue * result,AppExecFwk::AbilityTransactionCallbackInfo<> * callbackInfo)997 bool JsAbility::CallPromise(NativeValue *result, AppExecFwk::AbilityTransactionCallbackInfo<> *callbackInfo)
998 {
999 auto *retObj = ConvertNativeValueTo<NativeObject>(result);
1000 if (retObj == nullptr) {
1001 HILOG_ERROR("Failed to convert native value to NativeObject.");
1002 return false;
1003 }
1004 NativeValue *then = retObj->GetProperty("then");
1005 if (then == nullptr) {
1006 HILOG_ERROR("Failed to get property: then.");
1007 return false;
1008 }
1009 if (!then->IsCallable()) {
1010 HILOG_ERROR("property then is not callable.");
1011 return false;
1012 }
1013 HandleScope handleScope(jsRuntime_);
1014 auto &nativeEngine = jsRuntime_.GetNativeEngine();
1015 auto promiseCallback = nativeEngine.CreateFunction("promiseCallback", strlen("promiseCallback"), PromiseCallback,
1016 callbackInfo);
1017 NativeValue *argv[1] = { promiseCallback };
1018 nativeEngine.CallFunction(result, then, argv, 1);
1019 return true;
1020 }
1021
CreateADelegatorAbilityProperty()1022 std::shared_ptr<AppExecFwk::ADelegatorAbilityProperty> JsAbility::CreateADelegatorAbilityProperty()
1023 {
1024 auto property = std::make_shared<AppExecFwk::ADelegatorAbilityProperty>();
1025 property->token_ = GetAbilityContext()->GetToken();
1026 property->name_ = GetAbilityName();
1027 property->moduleName_ = GetModuleName();
1028 if (GetApplicationInfo() == nullptr || GetApplicationInfo()->bundleName.empty()) {
1029 property->fullName_ = GetAbilityName();
1030 } else {
1031 std::string::size_type pos = GetAbilityName().find(GetApplicationInfo()->bundleName);
1032 if (pos == std::string::npos || pos != 0) {
1033 property->fullName_ = GetApplicationInfo()->bundleName + "." + GetAbilityName();
1034 } else {
1035 property->fullName_ = GetAbilityName();
1036 }
1037 }
1038 property->lifecycleState_ = GetState();
1039 property->object_ = jsAbilityObj_;
1040
1041 return property;
1042 }
1043
Dump(const std::vector<std::string> & params,std::vector<std::string> & info)1044 void JsAbility::Dump(const std::vector<std::string> ¶ms, std::vector<std::string> &info)
1045 {
1046 Ability::Dump(params, info);
1047 HILOG_DEBUG("%{public}s called.", __func__);
1048 HandleScope handleScope(jsRuntime_);
1049 auto& nativeEngine = jsRuntime_.GetNativeEngine();
1050 // create js array object of params
1051 NativeValue* argv[] = { CreateNativeArray(nativeEngine, params) };
1052
1053 if (!jsAbilityObj_) {
1054 HILOG_WARN("Not found .js");
1055 return;
1056 }
1057
1058 NativeValue* value = jsAbilityObj_->Get();
1059 NativeObject* obj = ConvertNativeValueTo<NativeObject>(value);
1060 if (obj == nullptr) {
1061 HILOG_ERROR("Failed to get object");
1062 return;
1063 }
1064
1065 NativeValue* method = obj->GetProperty("dump");
1066 NativeValue* onDumpMethod = obj->GetProperty("onDump");
1067
1068 NativeValue* dumpInfo = nullptr;
1069 if (method != nullptr) {
1070 dumpInfo = nativeEngine.CallFunction(value, method, argv, 1);
1071 }
1072
1073 NativeValue* onDumpInfo = nullptr;
1074 if (onDumpMethod != nullptr) {
1075 onDumpInfo = nativeEngine.CallFunction(value, onDumpMethod, argv, 1);
1076 }
1077
1078 NativeArray* dumpInfoNative = nullptr;
1079 if (dumpInfo != nullptr) {
1080 dumpInfoNative = ConvertNativeValueTo<NativeArray>(dumpInfo);
1081 }
1082
1083 NativeArray* onDumpInfoNative = nullptr;
1084 if (onDumpInfo != nullptr) {
1085 onDumpInfoNative = ConvertNativeValueTo<NativeArray>(onDumpInfo);
1086 }
1087
1088 if (dumpInfoNative != nullptr) {
1089 for (uint32_t i = 0; i < dumpInfoNative->GetLength(); i++) {
1090 std::string dumpInfoStr;
1091 if (!ConvertFromJsValue(nativeEngine, dumpInfoNative->GetElement(i), dumpInfoStr)) {
1092 HILOG_ERROR("Parse dumpInfoStr failed");
1093 return;
1094 }
1095 info.push_back(dumpInfoStr);
1096 }
1097 }
1098
1099 if (onDumpInfoNative != nullptr) {
1100 for (uint32_t i = 0; i < onDumpInfoNative->GetLength(); i++) {
1101 std::string dumpInfoStr;
1102 if (!ConvertFromJsValue(nativeEngine, onDumpInfoNative->GetElement(i), dumpInfoStr)) {
1103 HILOG_ERROR("Parse dumpInfoStr from onDumpInfoNative failed");
1104 return;
1105 }
1106 info.push_back(dumpInfoStr);
1107 }
1108 }
1109
1110 HILOG_DEBUG("Dump info size: %{public}zu", info.size());
1111 }
1112
GetJsAbility()1113 std::shared_ptr<NativeReference> JsAbility::GetJsAbility()
1114 {
1115 HILOG_DEBUG("%{public}s called.", __func__);
1116 if (jsAbilityObj_ == nullptr) {
1117 HILOG_ERROR("jsAbility object is nullptr");
1118 }
1119 return jsAbilityObj_;
1120 }
1121
SetNewRuleFlagToCallee(NativeEngine & nativeEngine,NativeValue * remoteJsObj)1122 sptr<IRemoteObject> JsAbility::SetNewRuleFlagToCallee(NativeEngine &nativeEngine, NativeValue* remoteJsObj)
1123 {
1124 NativeObject* calleeObj = ConvertNativeValueTo<NativeObject>(remoteJsObj);
1125 if (calleeObj == nullptr) {
1126 HILOG_ERROR("JsAbility::SetNewRuleFlagToCallee calleeObj is nullptr");
1127 return nullptr;
1128 }
1129 auto setFlagMethod = calleeObj->GetProperty("setNewRuleFlag");
1130 if (setFlagMethod == nullptr || !setFlagMethod->IsCallable()) {
1131 HILOG_ERROR("JsAbility::SetNewRuleFlagToCallee setFlagMethod is %{public}s",
1132 setFlagMethod == nullptr ? "nullptr" : "not func");
1133 return nullptr;
1134 }
1135 auto flag = nativeEngine.CreateBoolean(IsUseNewStartUpRule());
1136 NativeValue *argv[1] = { flag };
1137 nativeEngine.CallFunction(remoteJsObj, setFlagMethod, argv, 1);
1138
1139 auto remoteObj = NAPI_ohos_rpc_getNativeRemoteObject(
1140 reinterpret_cast<napi_env>(&nativeEngine), reinterpret_cast<napi_value>(remoteJsObj));
1141 if (remoteObj == nullptr) {
1142 HILOG_ERROR("JsAbility::CallRequest obj is nullptr");
1143 return nullptr;
1144 }
1145 return remoteObj;
1146 }
1147 } // namespace AbilityRuntime
1148 } // namespace OHOS
1149