From 4388b8e025922cda413b49baf34b062713f27d99 Mon Sep 17 00:00:00 2001 From: wangxiao0610 Date: Mon, 28 Aug 2023 14:05:50 +0000 Subject: [PATCH 1/5] test_async_ok Signed-off-by: wangxiao0610 Change-Id: I84dcd5b1920385bd6f66c3b9663f965bc381235b --- .../native/ability/native/extension.cpp | 10 ++ .../native/ability/native/extension_impl.cpp | 51 ++++++- .../ui_extension_ability/js_ui_extension.cpp | 137 ++++++++++++++++-- .../kits/native/ability/native/extension.h | 16 ++ .../native/ability/native/extension_impl.h | 7 + .../ui_extension_ability/js_ui_extension.h | 12 +- .../ui_extension_ability/ui_extension.h | 3 +- 7 files changed, 218 insertions(+), 18 deletions(-) diff --git a/frameworks/native/ability/native/extension.cpp b/frameworks/native/ability/native/extension.cpp index 4d9445623a7..5f0f9fb5bea 100644 --- a/frameworks/native/ability/native/extension.cpp +++ b/frameworks/native/ability/native/extension.cpp @@ -59,6 +59,16 @@ void Extension::OnStop() HILOG_DEBUG("extension:%{public}s.", abilityInfo_->name.c_str()); } +void Extension::OnStop(AppExecFwk::AbilityTransactionCallbackInfo<> *callbackInfo, bool &isAsyncCallback) +{ + isAsyncCallback = false; + OnStop(); +} + +void Extension::OnStopCallBack() +{ +} + sptr Extension::OnConnect(const AAFwk::Want &want) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); diff --git a/frameworks/native/ability/native/extension_impl.cpp b/frameworks/native/ability/native/extension_impl.cpp index 4cccd5e70af..081f79361ed 100644 --- a/frameworks/native/ability/native/extension_impl.cpp +++ b/frameworks/native/ability/native/extension_impl.cpp @@ -74,8 +74,13 @@ void ExtensionImpl::HandleExtensionTransaction(const Want &want, const AAFwk::Li switch (targetState.state) { case AAFwk::ABILITY_STATE_INITIAL: { + bool isAsyncCallback = false; if (lifecycleState_ != AAFwk::ABILITY_STATE_INITIAL) { - Stop(); + Stop(isAsyncCallback); + } + if (isAsyncCallback) { + // AMS will be notified after async callback + ret = false; } break; } @@ -176,6 +181,50 @@ void ExtensionImpl::Stop() HILOG_INFO("ok"); } +void ExtensionImpl::Stop(bool &isAsyncCallback) +{ + HILOG_INFO("call"); + if (extension_ == nullptr) { + HILOG_ERROR("ExtensionImpl::Stop extension_ is nullptr"); + isAsyncCallback = false; + return; + } + + auto *callbackInfo = AppExecFwk::AbilityTransactionCallbackInfo<>::Create(); + if (callbackInfo == nullptr) { + extension_->OnStop(); + lifecycleState_ = AAFwk::ABILITY_STATE_INITIAL; + isAsyncCallback = false; + return; + } + std::weak_ptr weakPtr = shared_from_this(); + auto asyncCallback = [ExtensionImplWeakPtr = weakPtr, state = AAFwk::ABILITY_STATE_INITIAL,this]() { + auto extensionImpl = ExtensionImplWeakPtr.lock(); + if (extensionImpl == nullptr) { + HILOG_ERROR("extensionImpl is nullptr."); + return; + } + lifecycleState_ = AAFwk::ABILITY_STATE_INITIAL; + extensionImpl->AbilityTransactionCallback(state); + }; + callbackInfo->Push(asyncCallback); + + extension_->OnStop(callbackInfo, isAsyncCallback); + if (!isAsyncCallback) { + lifecycleState_ = AAFwk::ABILITY_STATE_INITIAL; + AppExecFwk::AbilityTransactionCallbackInfo<>::Destroy(callbackInfo); + } + // else: callbackInfo will be destroyed after the async callback + HILOG_DEBUG("%{public}s end.", __func__); +} + +void ExtensionImpl::AbilityTransactionCallback(const AAFwk::AbilityLifeCycleState &state) +{ + HILOG_INFO("call abilityms"); + AAFwk::PacMap restoreData; + AAFwk::AbilityManagerClient::GetInstance()->AbilityTransitionDone(token_, state, restoreData); +} + /** * @brief Connect the extension. and Calling information back to Extension. * diff --git a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp index f420e388372..20522b70080 100755 --- a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp +++ b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp @@ -14,9 +14,13 @@ */ #include "js_ui_extension.h" - +#include "ability_context.h" +#include "ability_delegator_registry.h" #include "ability_info.h" #include "ability_manager_client.h" +#include "ability_start_setting.h" +#include "connection_manager.h" +#include "context.h" #include "hitrace_meter.h" #include "hilog_wrapper.h" #include "js_extension_common.h" @@ -217,8 +221,110 @@ void JsUIExtension::OnStop() HILOG_DEBUG("JsUIExtension OnStop begin."); HandleScope handleScope(jsRuntime_); CallObjectMethod("onDestroy"); + OnStopCallBack(); HILOG_DEBUG("JsUIExtension OnStop end."); } +void JsUIExtension::OnStop(AppExecFwk::AbilityTransactionCallbackInfo<> *callbackInfo, bool &isAsyncCallback) +{ + if (callbackInfo == nullptr) { + isAsyncCallback = false; + OnStop(); + return; + } + HILOG_DEBUG("OnStop begin."); + UIExtension::OnStop(); + HandleScope handleScope(jsRuntime_); + NativeValue *result = CallObjectMethod("onDestroy", nullptr, 0, true); + if (!CheckPromise(result)) { + OnStopCallBack(); + isAsyncCallback = false; + return; + } + + std::weak_ptr weakPtr = shared_from_this(); + auto asyncCallback = [extensionWeakPtr = weakPtr]() { + auto js_ui_extension = extensionWeakPtr.lock(); + if (js_ui_extension == nullptr) { + HILOG_ERROR("extension is nullptr."); + return; + } + js_ui_extension->OnStopCallBack(); + }; + callbackInfo->Push(asyncCallback); + isAsyncCallback = CallPromise(result, callbackInfo); + if (!isAsyncCallback) { + HILOG_ERROR("Failed to call promise."); + OnStopCallBack(); + } + HILOG_DEBUG("OnStop end."); +} + +void JsUIExtension::OnStopCallBack() +{ + bool ret = ConnectionManager::GetInstance().DisconnectCaller(GetContext()->GetToken()); + if (ret) { + ConnectionManager::GetInstance().ReportConnectionLeakEvent(getpid(), gettid()); + HILOG_DEBUG("The service connection is not disconnected."); + } + + auto applicationContext = Context::GetApplicationContext(); + if (applicationContext != nullptr) { + std::shared_ptr shared_jsObj_ = std::move(jsObj_); + applicationContext->DispatchOnAbilityDestroy(shared_jsObj_); + } +} + +bool JsUIExtension::CheckPromise(NativeValue *result) +{ + if (result == nullptr) { + HILOG_DEBUG("result is null, no need to call promise."); + return false; + } + if (!result->IsPromise()) { + HILOG_DEBUG("result is not promise, no need to call promise."); + return false; + } + return true; +} + +NativeValue *PromiseCallback(NativeEngine *engine, NativeCallbackInfo *info) +{ + if (info == nullptr || info->functionInfo == nullptr || info->functionInfo->data == nullptr) { + HILOG_ERROR("Invalid input info."); + return nullptr; + } + void *data = info->functionInfo->data; + auto *callbackInfo = static_cast *>(data); + callbackInfo->Call(); + AppExecFwk::AbilityTransactionCallbackInfo<>::Destroy(callbackInfo); + info->functionInfo->data = nullptr; + return nullptr; +} + +bool JsUIExtension::CallPromise(NativeValue *result, AppExecFwk::AbilityTransactionCallbackInfo<> *callbackInfo) +{ + auto *retObj = ConvertNativeValueTo(result); + if (retObj == nullptr) { + HILOG_ERROR("Failed to convert native value to NativeObject."); + return false; + } + NativeValue *then = retObj->GetProperty("then"); + if (then == nullptr) { + HILOG_ERROR("Failed to get property: then."); + return false; + } + if (!then->IsCallable()) { + HILOG_ERROR("property then is not callable."); + return false; + } + HandleScope handleScope(jsRuntime_); + auto &nativeEngine = jsRuntime_.GetNativeEngine(); + auto promiseCallback = nativeEngine.CreateFunction("promiseCallback", strlen("promiseCallback"), PromiseCallback, + callbackInfo); + NativeValue *argv[1] = { promiseCallback }; + nativeEngine.CallFunction(result, then, argv, 1); + return true; +} sptr JsUIExtension::OnConnect(const AAFwk::Want &want) { @@ -418,30 +524,35 @@ void JsUIExtension::DestroyWindow(const sptr &sessionInfo) HILOG_DEBUG("end."); } -NativeValue* JsUIExtension::CallObjectMethod(const char* name, NativeValue* const* argv, size_t argc) +NativeValue *JsUIExtension::CallObjectMethod(const char *name, NativeValue *const *argv, size_t argc, bool withResult) { - HILOG_DEBUG("JsUIExtension CallObjectMethod(%{public}s), begin", name); + HILOG_DEBUG("JsAbility::CallObjectMethod(%{public}s", name); if (!jsObj_) { - HILOG_ERROR("Not found UIExtension.js"); + HILOG_WARN("Not found Ability.js"); return nullptr; } - auto& nativeEngine = jsRuntime_.GetNativeEngine(); - NativeValue* value = jsObj_->Get(); - NativeObject* obj = ConvertNativeValueTo(value); + HandleEscape handleEscape(jsRuntime_); + auto &nativeEngine = jsRuntime_.GetNativeEngine(); + + NativeValue *value = jsObj_->Get(); + NativeObject *obj = ConvertNativeValueTo(value); if (obj == nullptr) { - HILOG_ERROR("Failed to get UIExtension object"); + HILOG_ERROR("Failed to get Ability object"); return nullptr; } - NativeValue* method = obj->GetProperty(name); - if (method == nullptr || method->TypeOf() != NATIVE_FUNCTION) { - HILOG_ERROR("Failed to get '%{public}s' from UIExtension object", name); + NativeValue *methodOnCreate = obj->GetProperty(name); + if (methodOnCreate == nullptr) { + HILOG_ERROR("Failed to get '%{public}s' from Ability object", name); return nullptr; } - HILOG_DEBUG("JsUIExtension CallFunction(%{public}s), success", name); - return nativeEngine.CallFunction(value, method, argv, argc); + if (withResult) { + return handleEscape.Escape(nativeEngine.CallFunction(value, methodOnCreate, argv, argc)); + } + nativeEngine.CallFunction(value, methodOnCreate, argv, argc); + return nullptr; } NativeValue *JsUIExtension::CallOnConnect(const AAFwk::Want &want) diff --git a/interfaces/kits/native/ability/native/extension.h b/interfaces/kits/native/ability/native/extension.h index a97343e3eb8..40ac0fb0cc4 100644 --- a/interfaces/kits/native/ability/native/extension.h +++ b/interfaces/kits/native/ability/native/extension.h @@ -165,12 +165,28 @@ public: * You can override this function to implement your own processing logic. */ virtual void OnStop(); + /** + * @brief Called when this extension enters the STATE_STOP state. + * + * The ability in the STATE_STOP is being destroyed. + * You can override this function to implement your own processing logic. + * + * @param callbackInfo Indicates the lifecycle transaction callback information + * @param isAsyncCallback Indicates whether it is an asynchronous lifecycle callback + */ + virtual void OnStop(AppExecFwk::AbilityTransactionCallbackInfo<> *callbackInfo, bool &isAsyncCallback); /** * @brief Called when the system configuration is updated. * * @param configuration Indicates the updated configuration information. */ + + /** + * @brief The callback of OnStop. + */ + virtual void OnStopCallBack(); + virtual void OnConfigurationUpdated(const AppExecFwk::Configuration& configuration); /** diff --git a/interfaces/kits/native/ability/native/extension_impl.h b/interfaces/kits/native/ability/native/extension_impl.h index da545ecc798..475dcc483df 100644 --- a/interfaces/kits/native/ability/native/extension_impl.h +++ b/interfaces/kits/native/ability/native/extension_impl.h @@ -161,6 +161,13 @@ protected: * */ void Stop(); + /** + * @brief Toggles the lifecycle status of Extension to AAFwk::ABILITY_STATE_INITIAL. And notifies the application + * that it belongs to of the lifecycle status. + * @param isAsyncCallback Indicates whether it is an asynchronous lifecycle callback + */ + void Stop(bool &isAsyncCallback); + void AbilityTransactionCallback(const AAFwk::AbilityLifeCycleState &state); /** * @brief Toggles the lifecycle status of Extension to AAFwk::ABILITY_STATE_INACTIVE. And notifies the application diff --git a/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension.h b/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension.h index 93c456c934c..6496aece293 100755 --- a/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension.h +++ b/interfaces/kits/native/ability/native/ui_extension_ability/js_ui_extension.h @@ -53,7 +53,7 @@ private: std::map, std::shared_ptr> listeners_; }; -class JsUIExtension : public UIExtension, public std::enable_shared_from_this { +class JsUIExtension : public UIExtension { public: explicit JsUIExtension(JsRuntime& jsRuntime); virtual ~JsUIExtension() override; @@ -133,6 +133,11 @@ public: * You can override this function to implement your own processing logic. */ virtual void OnStop() override; + virtual void OnStop(AppExecFwk::AbilityTransactionCallbackInfo<> *callbackInfo, bool &isAsyncCallback) override; + /** + * @brief The callback of OnStop. + */ + virtual void OnStopCallBack() override; /** * @brief Called when the system configuration is updated. @@ -182,7 +187,10 @@ public: private: virtual void BindContext(NativeEngine& engine, NativeObject* obj); - NativeValue* CallObjectMethod(const char* name, NativeValue* const *argv = nullptr, size_t argc = 0); + NativeValue *CallObjectMethod(const char *name, NativeValue *const *argv = nullptr, size_t argc = 0, + bool withResult = false); + bool CheckPromise(NativeValue* result); + bool CallPromise(NativeValue* result, AppExecFwk::AbilityTransactionCallbackInfo<> *callbackInfo); NativeValue* CallOnConnect(const AAFwk::Want &want); diff --git a/interfaces/kits/native/ability/native/ui_extension_ability/ui_extension.h b/interfaces/kits/native/ability/native/ui_extension_ability/ui_extension.h index 30fce0248df..5f14369e4d6 100755 --- a/interfaces/kits/native/ability/native/ui_extension_ability/ui_extension.h +++ b/interfaces/kits/native/ability/native/ui_extension_ability/ui_extension.h @@ -25,8 +25,7 @@ class Runtime; /** * @brief Basic ui extension components. */ -class UIExtension : public ExtensionBase, - public std::enable_shared_from_this { +class UIExtension : public ExtensionBase { public: UIExtension() = default; virtual ~UIExtension() = default; -- Gitee From 707b063a362cb16e4f01ba2a508dccd35ed5387e Mon Sep 17 00:00:00 2001 From: wangxiao0610 Date: Tue, 29 Aug 2023 03:03:54 +0000 Subject: [PATCH 2/5] solve_codecheck Signed-off-by: wangxiao0610 Change-Id: If26e3f528c84c95b33d09a05c5ae5ca3affe7f6e --- frameworks/native/ability/native/extension.cpp | 2 +- frameworks/native/ability/native/extension_impl.cpp | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/frameworks/native/ability/native/extension.cpp b/frameworks/native/ability/native/extension.cpp index 5f0f9fb5bea..a29abed0ccf 100644 --- a/frameworks/native/ability/native/extension.cpp +++ b/frameworks/native/ability/native/extension.cpp @@ -66,7 +66,7 @@ void Extension::OnStop(AppExecFwk::AbilityTransactionCallbackInfo<> *callbackInf } void Extension::OnStopCallBack() -{ +{ } sptr Extension::OnConnect(const AAFwk::Want &want) diff --git a/frameworks/native/ability/native/extension_impl.cpp b/frameworks/native/ability/native/extension_impl.cpp index 081f79361ed..f834a0d4292 100644 --- a/frameworks/native/ability/native/extension_impl.cpp +++ b/frameworks/native/ability/native/extension_impl.cpp @@ -79,7 +79,6 @@ void ExtensionImpl::HandleExtensionTransaction(const Want &want, const AAFwk::Li Stop(isAsyncCallback); } if (isAsyncCallback) { - // AMS will be notified after async callback ret = false; } break; @@ -198,7 +197,7 @@ void ExtensionImpl::Stop(bool &isAsyncCallback) return; } std::weak_ptr weakPtr = shared_from_this(); - auto asyncCallback = [ExtensionImplWeakPtr = weakPtr, state = AAFwk::ABILITY_STATE_INITIAL,this]() { + auto asyncCallback = [ExtensionImplWeakPtr = weakPtr, state = AAFwk::ABILITY_STATE_INITIAL, this]() { auto extensionImpl = ExtensionImplWeakPtr.lock(); if (extensionImpl == nullptr) { HILOG_ERROR("extensionImpl is nullptr."); -- Gitee From c1d90dc881e9443b18fd0b85d9f9e8ffc5d0af6e Mon Sep 17 00:00:00 2001 From: wangxiao0610 Date: Tue, 29 Aug 2023 09:25:57 +0000 Subject: [PATCH 3/5] align_code_standard Signed-off-by: wangxiao0610 Change-Id: I45101cee905e73d817bd4c29e9792c264716d6d0 --- .../ui_extension_ability/js_ui_extension.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp index 20522b70080..b30929af084 100755 --- a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp +++ b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp @@ -243,12 +243,12 @@ void JsUIExtension::OnStop(AppExecFwk::AbilityTransactionCallbackInfo<> *callbac std::weak_ptr weakPtr = shared_from_this(); auto asyncCallback = [extensionWeakPtr = weakPtr]() { - auto js_ui_extension = extensionWeakPtr.lock(); - if (js_ui_extension == nullptr) { + auto jsUIExtension = extensionWeakPtr.lock(); + if (jsUIExtension == nullptr) { HILOG_ERROR("extension is nullptr."); return; } - js_ui_extension->OnStopCallBack(); + jsUIExtension->OnStopCallBack(); }; callbackInfo->Push(asyncCallback); isAsyncCallback = CallPromise(result, callbackInfo); @@ -269,8 +269,8 @@ void JsUIExtension::OnStopCallBack() auto applicationContext = Context::GetApplicationContext(); if (applicationContext != nullptr) { - std::shared_ptr shared_jsObj_ = std::move(jsObj_); - applicationContext->DispatchOnAbilityDestroy(shared_jsObj_); + std::shared_ptr sharedJsObj = std::move(jsObj_); + applicationContext->DispatchOnAbilityDestroy(sharedJsObj); } } @@ -526,10 +526,10 @@ void JsUIExtension::DestroyWindow(const sptr &sessionInfo) NativeValue *JsUIExtension::CallObjectMethod(const char *name, NativeValue *const *argv, size_t argc, bool withResult) { - HILOG_DEBUG("JsAbility::CallObjectMethod(%{public}s", name); + HILOG_DEBUG("JsUIExtension CallObjectMethod(%{public}s), begin", name); if (!jsObj_) { - HILOG_WARN("Not found Ability.js"); + HILOG_ERROR("Not found UIExtension.js"); return nullptr; } @@ -539,18 +539,19 @@ NativeValue *JsUIExtension::CallObjectMethod(const char *name, NativeValue *cons NativeValue *value = jsObj_->Get(); NativeObject *obj = ConvertNativeValueTo(value); if (obj == nullptr) { - HILOG_ERROR("Failed to get Ability object"); + HILOG_ERROR("Failed to get UIExtension object"); return nullptr; } NativeValue *methodOnCreate = obj->GetProperty(name); if (methodOnCreate == nullptr) { - HILOG_ERROR("Failed to get '%{public}s' from Ability object", name); + HILOG_ERROR("Failed to get '%{public}s' from UIExtension object", name); return nullptr; } if (withResult) { return handleEscape.Escape(nativeEngine.CallFunction(value, methodOnCreate, argv, argc)); } + HILOG_DEBUG("JsUIExtension CallFunction(%{public}s), success", name); nativeEngine.CallFunction(value, methodOnCreate, argv, argc); return nullptr; } -- Gitee From d553c654a43cbf5c9d53b025879ac56acacaed76 Mon Sep 17 00:00:00 2001 From: wangxiao0610 Date: Tue, 29 Aug 2023 09:41:42 +0000 Subject: [PATCH 4/5] fix Signed-off-by: wangxiao0610 Change-Id: I8ed724810d5b6456adddac8531fce317d1a43e0b --- .../ability/native/ui_extension_ability/js_ui_extension.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp index b30929af084..9c3ac23f084 100755 --- a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp +++ b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp @@ -545,7 +545,7 @@ NativeValue *JsUIExtension::CallObjectMethod(const char *name, NativeValue *cons NativeValue *methodOnCreate = obj->GetProperty(name); if (methodOnCreate == nullptr) { - HILOG_ERROR("Failed to get '%{public}s' from UIExtension object", name); + HILOG_ERROR("Failed to get '%{public}s' from UIExtension object", name); return nullptr; } if (withResult) { -- Gitee From 0cdc26ddd931853722845532edae926977b201bc Mon Sep 17 00:00:00 2001 From: wangxiao0610 Date: Tue, 29 Aug 2023 12:32:24 +0000 Subject: [PATCH 5/5] fix2 Signed-off-by: wangxiao0610 Change-Id: I69b67bf9853027de35ec7d398acb369b3aa7014e --- frameworks/native/ability/native/extension_impl.cpp | 4 ++-- .../ability/native/ui_extension_ability/js_ui_extension.cpp | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/native/ability/native/extension_impl.cpp b/frameworks/native/ability/native/extension_impl.cpp index f834a0d4292..a123ebcaa41 100644 --- a/frameworks/native/ability/native/extension_impl.cpp +++ b/frameworks/native/ability/native/extension_impl.cpp @@ -197,13 +197,13 @@ void ExtensionImpl::Stop(bool &isAsyncCallback) return; } std::weak_ptr weakPtr = shared_from_this(); - auto asyncCallback = [ExtensionImplWeakPtr = weakPtr, state = AAFwk::ABILITY_STATE_INITIAL, this]() { + auto asyncCallback = [ExtensionImplWeakPtr = weakPtr, state = AAFwk::ABILITY_STATE_INITIAL]() { auto extensionImpl = ExtensionImplWeakPtr.lock(); if (extensionImpl == nullptr) { HILOG_ERROR("extensionImpl is nullptr."); return; } - lifecycleState_ = AAFwk::ABILITY_STATE_INITIAL; + extensionImpl->lifecycleState_ = AAFwk::ABILITY_STATE_INITIAL; extensionImpl->AbilityTransactionCallback(state); }; callbackInfo->Push(asyncCallback); diff --git a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp index 9c3ac23f084..8aa48db9edb 100755 --- a/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp +++ b/frameworks/native/ability/native/ui_extension_ability/js_ui_extension.cpp @@ -544,7 +544,7 @@ NativeValue *JsUIExtension::CallObjectMethod(const char *name, NativeValue *cons } NativeValue *methodOnCreate = obj->GetProperty(name); - if (methodOnCreate == nullptr) { + if (methodOnCreate == nullptr || methodOnCreate->TypeOf() != NATIVE_FUNCTION) { HILOG_ERROR("Failed to get '%{public}s' from UIExtension object", name); return nullptr; } -- Gitee