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