From 2c20fc574d8c81d78608a8e0d349e4e2770bcd7b Mon Sep 17 00:00:00 2001 From: zhangzezhong Date: Thu, 28 Aug 2025 19:56:30 +0800 Subject: [PATCH] fix 401 errorcode Signed-off-by: zhangzezhong --- .../include/ets_ability_delegator.h | 11 ++ .../src/ets_ability_delegator.cpp | 80 ++++++++ .../src/ets_ability_delegator_utils.cpp | 12 ++ .../src/ets_ability_manager.cpp | 26 ++- .../include/ets_application_context_utils.h | 2 + .../src/ets_application_context_utils.cpp | 44 +++++ .../ani/app_manager/src/ets_app_manager.cpp | 34 +++- .../ani/application/include/ets_application.h | 6 + .../ani/application/src/ets_application.cpp | 137 ++++++++++++- .../ui_ability/include/ets_ability_context.h | 6 + .../ui_ability/src/ets_ability_context.cpp | 183 +++++++++++++----- .../include/ets_ui_extension_context.h | 2 + .../src/ets_ui_extension_context.cpp | 64 ++++-- .../ani/wantagent/include/ani_want_agent.h | 1 + .../ets/ani/wantagent/src/ani_want_agent.cpp | 58 +++++- ...@ohos.app.ability.InsightIntentContext.ets | 3 + .../ets/@ohos.app.ability.abilityManager.ets | 2 + .../ets/ets/@ohos.app.ability.appManager.ets | 6 + .../ets/ets/@ohos.app.ability.application.ets | 10 +- .../ets/ets/@ohos.app.ability.wantAgent.ets | 47 ++++- .../ets/ets/application/AbilityDelegator.ets | 28 +++ .../ets/application/ApplicationContext.ets | 17 ++ .../ets/ets/application/UIAbilityContext.ets | 18 ++ .../ets/application/UIExtensionContext.ets | 5 +- frameworks/ets/ets/utils/AbilityUtils.ets | 8 + .../ets_insight_intent_context.cpp | 19 +- .../ets_insight_intent_context.h | 3 +- 27 files changed, 740 insertions(+), 92 deletions(-) diff --git a/frameworks/ets/ani/ability_delegator/include/ets_ability_delegator.h b/frameworks/ets/ani/ability_delegator/include/ets_ability_delegator.h index 5f2a8f29863..12cfcf2478d 100644 --- a/frameworks/ets/ani/ability_delegator/include/ets_ability_delegator.h +++ b/frameworks/ets/ani/ability_delegator/include/ets_ability_delegator.h @@ -47,22 +47,30 @@ public: static void AddAbilityMonitor(ani_env *env, [[maybe_unused]]ani_class aniClass, ani_object monitorObj, ani_object callback); + static void AddAbilityMonitorCheck(ani_env *env, ani_object object, ani_object monitorObj); + static void AddAbilityMonitorSync(ani_env *env, [[maybe_unused]]ani_class aniClass, ani_object monitorObj); static void RemoveAbilityMonitor(ani_env *env, [[maybe_unused]]ani_class aniClass, ani_object monitorObj, ani_object callback); + static void RemoveAbilityMonitorCheck(ani_env *env, ani_object object, ani_object monitorObj); + static void RemoveAbilityMonitorSync(ani_env *env, [[maybe_unused]]ani_class aniClass, ani_object monitorObj); static void WaitAbilityMonitor(ani_env *env, [[maybe_unused]]ani_class aniClass, ani_object monitorOb0, ani_long timeout, ani_object callback); + static void AddAbilityStageMonitorCheck(ani_env *env, ani_object aniObj, ani_object stageMonitorObj); + static void AddAbilityStageMonitor(ani_env *env, [[maybe_unused]]ani_class aniClass, ani_object stageMonitorObj, ani_object callback); static void AddAbilityStageMonitorSync(ani_env *env, [[maybe_unused]]ani_class aniClass, ani_object stageMonitorObj); + static void RemoveAbilityStageMonitorCheck(ani_env *env, ani_object aniObj, ani_object monitorObj); + static void RemoveAbilityStageMonitor(ani_env *env, [[maybe_unused]]ani_class aniClass, ani_object stageMonitorObj, ani_object callback); @@ -72,6 +80,9 @@ public: static void WaitAbilityStageMonitor(ani_env *env, [[maybe_unused]]ani_class aniClass, ani_object stageMonitorObj, ani_long timeout, ani_object callback); + static void DoAbilityForegroundOrBackgroundCheck(ani_env *env, [[maybe_unused]]ani_object object, + ani_object abilityObj); + static void DoAbilityForeground(ani_env *env, [[maybe_unused]]ani_object object, ani_object abilityObj, ani_object callback); diff --git a/frameworks/ets/ani/ability_delegator/src/ets_ability_delegator.cpp b/frameworks/ets/ani/ability_delegator/src/ets_ability_delegator.cpp index b5d00a6db2e..7f55e9b9709 100644 --- a/frameworks/ets/ani/ability_delegator/src/ets_ability_delegator.cpp +++ b/frameworks/ets/ani/ability_delegator/src/ets_ability_delegator.cpp @@ -284,6 +284,20 @@ void EtsAbilityDelegator::PrintSync(ani_env *env, [[maybe_unused]]ani_class aniC return; } +void EtsAbilityDelegator::AddAbilityMonitorCheck(ani_env *env, ani_object aniObj, ani_object monitorObj) +{ + if (env == nullptr || aniObj == nullptr) { + TAG_LOGE(AAFwkTag::DELEGATOR, "null env or aniObj"); + return; + } + std::shared_ptr monitorImpl = nullptr; + if (!ParseMonitorPara(env, monitorObj, monitorImpl)) { + TAG_LOGE(AAFwkTag::DELEGATOR, "invalid params"); + AbilityRuntime::EtsErrorUtil::ThrowInvalidParamError(env, + "Parse param monitor failed, monitor must be Monitor."); + } +} + void EtsAbilityDelegator::AddAbilityMonitor(ani_env *env, [[maybe_unused]]ani_class aniClass, ani_object monitorObj, ani_object callback) { @@ -337,6 +351,7 @@ void EtsAbilityDelegator::AddAbilityMonitorSync(ani_env *env, [[maybe_unused]]an } return; } + void EtsAbilityDelegator::StartAbility(ani_env *env, [[maybe_unused]]ani_object object, ani_object wantObj, ani_object callback) { @@ -417,6 +432,20 @@ ani_ref EtsAbilityDelegator::GetCurrentTopAbility(ani_env* env, [[maybe_unused]] return objValue; } +void EtsAbilityDelegator::RemoveAbilityMonitorCheck(ani_env *env, ani_object aniObj, ani_object monitorObj) +{ + if (env == nullptr || aniObj == nullptr) { + TAG_LOGE(AAFwkTag::DELEGATOR, "null env or aniObj"); + return; + } + std::shared_ptr monitorImpl = nullptr; + if (!ParseMonitorPara(env, monitorObj, monitorImpl)) { + TAG_LOGE(AAFwkTag::DELEGATOR, "invalid params"); + AbilityRuntime::EtsErrorUtil::ThrowInvalidParamError(env, + "Parse monitor failed, removeAbilityMonitor must be Monitor."); + } +} + void EtsAbilityDelegator::RemoveAbilityMonitor(ani_env *env, [[maybe_unused]]ani_class aniClass, ani_object monitorObj, ani_object callback) { @@ -560,6 +589,22 @@ void EtsAbilityDelegator::AddAbilityStageMonitor(ani_env *env, [[maybe_unused]]a return; } +void EtsAbilityDelegator::AddAbilityStageMonitorCheck(ani_env *env, ani_object aniObj, ani_object stageMonitorObj) +{ + TAG_LOGI(AAFwkTag::DELEGATOR, "AddAbilityStageMonitorCheck"); + if (env == nullptr || aniObj == nullptr) { + TAG_LOGE(AAFwkTag::DELEGATOR, "null env or aniObj"); + return; + } + bool isExisted = false; + std::shared_ptr stageMonitor = nullptr; + if (!ParseStageMonitorPara(env, stageMonitorObj, stageMonitor, isExisted)) { + TAG_LOGE(AAFwkTag::DELEGATOR, "invalid params"); + AbilityRuntime::EtsErrorUtil::ThrowInvalidParamError(env, + "Parse parameters failed, monitor must be Monitor and isExited must be boolean."); + } +} + void EtsAbilityDelegator::AddAbilityStageMonitorSync(ani_env *env, [[maybe_unused]]ani_class aniClass, ani_object stageMonitorObj) { @@ -624,6 +669,23 @@ void EtsAbilityDelegator::RemoveAbilityStageMonitor(ani_env *env, [[maybe_unused return; } +void EtsAbilityDelegator::RemoveAbilityStageMonitorCheck(ani_env *env, ani_object aniObj, ani_object stageMonitorObj) +{ + if (env == nullptr || aniObj == nullptr) { + TAG_LOGE(AAFwkTag::DELEGATOR, "null env or aniObj"); + return; + } + bool isExisted = false; + std::shared_ptr stageMonitor = nullptr; + if (!ParseStageMonitorPara(env, stageMonitorObj, stageMonitor, isExisted)) { + TAG_LOGE(AAFwkTag::DELEGATOR, "invalid params"); + AbilityRuntime::EtsErrorUtil::ThrowError(env, + static_cast(AbilityRuntime::AbilityErrorCode::ERROR_CODE_INVALID_PARAM), + "Parse monitor failed, removeAbilityMonitor must be Monitor."); + } +} + + void EtsAbilityDelegator::RemoveAbilityStageMonitorSync(ani_env *env, [[maybe_unused]]ani_class aniClass, ani_object stageMonitorObj) { @@ -697,6 +759,24 @@ void EtsAbilityDelegator::WaitAbilityStageMonitor(ani_env *env, [[maybe_unused]] return; } +void EtsAbilityDelegator::DoAbilityForegroundOrBackgroundCheck(ani_env *env, [[maybe_unused]]ani_object object, + ani_object abilityObj) +{ + TAG_LOGI(AAFwkTag::DELEGATOR, "DoAbilityForegroundCheck called"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::DELEGATOR, "env is nullptr"); + return; + } + sptr remoteObject = nullptr; + if (!ParseAbilityCommonPara(env, abilityObj, remoteObject)) { + TAG_LOGE(AAFwkTag::DELEGATOR, "invalid params"); + AbilityRuntime::EtsErrorUtil::ThrowError(env, + static_cast(AbilityRuntime::AbilityErrorCode::ERROR_CODE_INVALID_PARAM), + "Parse remoteObject failed, remoteObject must be RemoteObject."); + return; + } +} + void EtsAbilityDelegator::DoAbilityForeground(ani_env *env, [[maybe_unused]]ani_object object, ani_object abilityObj, ani_object callback) { diff --git a/frameworks/ets/ani/ability_delegator/src/ets_ability_delegator_utils.cpp b/frameworks/ets/ani/ability_delegator/src/ets_ability_delegator_utils.cpp index e5ad56d2680..fda85c5b5ea 100644 --- a/frameworks/ets/ani/ability_delegator/src/ets_ability_delegator_utils.cpp +++ b/frameworks/ets/ani/ability_delegator/src/ets_ability_delegator_utils.cpp @@ -43,6 +43,8 @@ constexpr const char* SIGNATURE_STAGEMONITOR_NUMBER_ASYNCCALLBACK = "Lapplication/AbilityStageMonitor/AbilityStageMonitor;JLutils/AbilityUtils/AsyncCallbackWrapper;:V"; constexpr const char* STAGEMONITOR_UIABILITY_ASYNCCALLBACK = "L@ohos/app/ability/UIAbility/UIAbility;Lutils/AbilityUtils/AsyncCallbackWrapper;:V"; +constexpr const char* STAGEMONITOR_UIABILITY_CHECK = + "L@ohos/app/ability/UIAbility/UIAbility;:V"; constexpr const char* STRING_ASYNCCALLBACK_VOID = "Lstd/core/String;Lutils/AbilityUtils/AsyncCallbackWrapper;:V"; constexpr const char* STRING_UIABILITY_NUMBER = "L@ohos/app/ability/UIAbility/UIAbility;:I"; constexpr const char* STRING_CALLBACK_UIABILITY = @@ -68,12 +70,16 @@ bool BindFunctions(ani_env *aniEnv, ani_class abilityDelegator) ani_native_function {"printSync", STRING_VOID, reinterpret_cast(EtsAbilityDelegator::PrintSync)}, ani_native_function {"nativeAddAbilityMonitor", MONITOR_ASYNCCALLBACK_VOID, reinterpret_cast(EtsAbilityDelegator::AddAbilityMonitor)}, + ani_native_function {"addAbilityMonitorCheck", SIGNATURE_MONITOR_VOID, + reinterpret_cast(EtsAbilityDelegator::AddAbilityMonitorCheck)}, ani_native_function {"nativeStartAbility", WANT_ASYNCCALLBACK, reinterpret_cast(EtsAbilityDelegator::StartAbility)}, ani_native_function {"addAbilityMonitorSync", SIGNATURE_MONITOR_VOID, reinterpret_cast(EtsAbilityDelegator::AddAbilityMonitorSync)}, ani_native_function {"removeAbilityMonitorAsync", MONITOR_ASYNCCALLBACK_VOID, reinterpret_cast(EtsAbilityDelegator::RemoveAbilityMonitor)}, + ani_native_function {"removeAbilityMonitorCheck", SIGNATURE_MONITOR_VOID, + reinterpret_cast(EtsAbilityDelegator::RemoveAbilityMonitorCheck)}, ani_native_function {"removeAbilityMonitorSync", SIGNATURE_MONITOR_VOID, reinterpret_cast(EtsAbilityDelegator::RemoveAbilityMonitorSync)}, ani_native_function {"waitAbilityMonitorAsync", SIGNATURE_MONITOR_NUMBER_ASYNCCALLBACK, @@ -82,14 +88,20 @@ bool BindFunctions(ani_env *aniEnv, ani_class abilityDelegator) reinterpret_cast(EtsAbilityDelegator::AddAbilityStageMonitor)}, ani_native_function {"addAbilityStageMonitorSync", STAGEMONITOR_VOID, reinterpret_cast(EtsAbilityDelegator::AddAbilityStageMonitorSync)}, + ani_native_function {"addAbilityStageMonitorCheck", STAGEMONITOR_VOID, + reinterpret_cast(EtsAbilityDelegator::AddAbilityStageMonitorCheck)}, ani_native_function {"removeAbilityStageMonitorAsync", STAGEMONITOR_ASYNCCALLBACK_VOID, reinterpret_cast(EtsAbilityDelegator::RemoveAbilityStageMonitor)}, ani_native_function {"removeAbilityStageMonitorSync", STAGEMONITOR_VOID, reinterpret_cast(EtsAbilityDelegator::RemoveAbilityStageMonitorSync)}, + ani_native_function {"removeAbilityStageMonitorCheck", STAGEMONITOR_VOID, + reinterpret_cast(EtsAbilityDelegator::RemoveAbilityStageMonitorCheck)}, ani_native_function {"waitAbilityStageMonitorAsync", SIGNATURE_STAGEMONITOR_NUMBER_ASYNCCALLBACK, reinterpret_cast(EtsAbilityDelegator::WaitAbilityStageMonitor)}, ani_native_function {"doAbilityForegroundAsync", STAGEMONITOR_UIABILITY_ASYNCCALLBACK, reinterpret_cast(EtsAbilityDelegator::DoAbilityForeground)}, + ani_native_function {"doAbilityForegroundOrBackgroundCheck", STAGEMONITOR_UIABILITY_CHECK, + reinterpret_cast(EtsAbilityDelegator::DoAbilityForegroundOrBackgroundCheck)}, ani_native_function {"doAbilityBackgroundAsync", STAGEMONITOR_UIABILITY_ASYNCCALLBACK, reinterpret_cast(EtsAbilityDelegator::DoAbilityBackground)}, ani_native_function {"printAsync", STRING_ASYNCCALLBACK_VOID, diff --git a/frameworks/ets/ani/ability_manager/src/ets_ability_manager.cpp b/frameworks/ets/ani/ability_manager/src/ets_ability_manager.cpp index 7bc8aa86e21..dbf4830535c 100644 --- a/frameworks/ets/ani/ability_manager/src/ets_ability_manager.cpp +++ b/frameworks/ets/ani/ability_manager/src/ets_ability_manager.cpp @@ -100,6 +100,7 @@ public: static void GetTopAbility(ani_env *env, ani_object callback); static void GetAbilityRunningInfos(ani_env *env, ani_object callback); static void IsEmbeddedOpenAllowed(ani_env *env, ani_object contextObj, ani_string aniAppId, ani_object callbackObj); + static void IsEmbeddedOpenAllowedCheck(ani_env *env, ani_object contextObj); static void NativeOn(ani_env *env, ani_string aniType, ani_object aniObserver); static void NativeOff(ani_env *env, ani_string aniType, ani_object aniObserver); static void NativeNotifyDebugAssertResult(ani_env *env, ani_string aniSessionId, ani_object userStatusObj, @@ -250,6 +251,26 @@ void EtsAbilityManager::GetAbilityRunningInfos(ani_env *env, ani_object callback AppExecFwk::AsyncCallback(env, callback, EtsErrorUtil::CreateErrorByNativeErr(env, errcode), retObject); } +void EtsAbilityManager::IsEmbeddedOpenAllowedCheck(ani_env *env, ani_object contextObj) +{ + TAG_LOGD(AAFwkTag::ABILITYMGR, "IsEmbeddedOpenAllowedCheck"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "null env"); + return; + } + auto context = OHOS::AbilityRuntime::GetStageModeContext(env, contextObj); + if (context == nullptr) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "null context"); + EtsErrorUtil::ThrowInvalidParamError(env, "Parse param context failed, must not be nullptr."); + return; + } + auto uiAbilityContext = OHOS::AbilityRuntime::Context::ConvertTo(context); + if (uiAbilityContext == nullptr) { + TAG_LOGE(AAFwkTag::ABILITYMGR, "null UIAbilityContext"); + EtsErrorUtil::ThrowInvalidParamError(env, "Parse param context failed, must be UIAbilityContext."); + } +} + void EtsAbilityManager::IsEmbeddedOpenAllowed(ani_env *env, ani_object contextObj, ani_string aniAppId, ani_object callbackObj) { @@ -261,18 +282,15 @@ void EtsAbilityManager::IsEmbeddedOpenAllowed(ani_env *env, ani_object contextOb auto context = OHOS::AbilityRuntime::GetStageModeContext(env, contextObj); if (context == nullptr) { TAG_LOGE(AAFwkTag::ABILITYMGR, "null context"); - EtsErrorUtil::ThrowInvalidParamError(env, "Parse param context failed, must not be nullptr."); return; } auto uiAbilityContext = OHOS::AbilityRuntime::Context::ConvertTo(context); if (uiAbilityContext == nullptr) { TAG_LOGE(AAFwkTag::ABILITYMGR, "null UIAbilityContext"); - EtsErrorUtil::ThrowInvalidParamError(env, "Parse param context failed, must be UIAbilityContext."); return; } std::string appId; if (!AppExecFwk::GetStdString(env, aniAppId, appId)) { - EtsErrorUtil::ThrowInvalidParamError(env, "Parse param appId failed, must be a string."); return; } auto token = uiAbilityContext->GetToken(); @@ -718,6 +736,8 @@ void EtsAbilityManagerRegistryInit(ani_env *env) reinterpret_cast(EtsAbilityManager::QueryAtomicServiceStartupRule) }, ani_native_function { "nativeQueryAtomicServiceStartupRuleCheck", "Lapplication/Context/Context;:V", reinterpret_cast(EtsAbilityManager::QueryAtomicServiceStartupRuleCheck) }, + ani_native_function { "nativeIsEmbeddedOpenAllowedCheck", "Lapplication/Context/Context;:V", + reinterpret_cast(EtsAbilityManager::IsEmbeddedOpenAllowedCheck) }, ani_native_function { "nativeOn", nullptr, reinterpret_cast(EtsAbilityManager::NativeOn) }, ani_native_function { "nativeOff", nullptr, reinterpret_cast(EtsAbilityManager::NativeOff) }, ani_native_function { "nativeNotifyDebugAssertResult", diff --git a/frameworks/ets/ani/ani_common/include/ets_application_context_utils.h b/frameworks/ets/ani/ani_common/include/ets_application_context_utils.h index fe9bf6764cd..f54d2159e44 100644 --- a/frameworks/ets/ani/ani_common/include/ets_application_context_utils.h +++ b/frameworks/ets/ani/ani_common/include/ets_application_context_utils.h @@ -58,6 +58,7 @@ public: ani_object callback); static void NativeOffLifecycleCallbackSync(ani_env *env, ani_object aniObj, ani_string type, ani_int callbackId, ani_object callback); + static void NativeOffAbilityLifecycleCheck(ani_env *env, ani_object aniObj); static void NativeOnInteropLifecycleCallbackSync(ani_env *env, ani_object aniObj, ani_string type, ani_object callback); static void NativeOffInteropLifecycleCallbackSync(ani_env *env, ani_object aniObj, ani_string type, @@ -65,6 +66,7 @@ public: static void NativeOffApplicationStateChangeSync(ani_env *env, ani_object aniObj, ani_object callback); static void NativeOnApplicationStateChangeSync(ani_env *env, ani_object aniObj, ani_object callback); static void NativeOffEnvironmentSync(ani_env *env, ani_object aniObj, ani_int callbackId, ani_object callback); + static void NativeOffEnvironmentCheck(ani_env *env, ani_object aniObj); static ani_int NativeOnEnvironmentSync(ani_env *env, ani_object aniObj, ani_object envCallback); protected: std::weak_ptr applicationContext_; diff --git a/frameworks/ets/ani/ani_common/src/ets_application_context_utils.cpp b/frameworks/ets/ani/ani_common/src/ets_application_context_utils.cpp index b6cfd867fdb..03eb75b46aa 100644 --- a/frameworks/ets/ani/ani_common/src/ets_application_context_utils.cpp +++ b/frameworks/ets/ani/ani_common/src/ets_application_context_utils.cpp @@ -16,6 +16,7 @@ #include +#include "ability_runtime_error_util.h" #include "ani_enum_convert.h" #include "application_context_manager.h" #include "ets_ability_lifecycle_callback.h" @@ -698,6 +699,25 @@ void EtsApplicationContextUtils::RegisterInteropAbilityLifecycleCallback(ani_env applicationContext->RegisterInteropAbilityLifecycleCallback(interopAbilityLifecycleCallback_); } +void EtsApplicationContextUtils::NativeOffAbilityLifecycleCheck(ani_env *env, ani_object aniObj) +{ + TAG_LOGD(AAFwkTag::APPKIT, "NativeOffAbilityLifecycleCheck Call"); + if (env == nullptr || aniObj == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "null env or aniObj"); + return; + } + auto etsContext = GeApplicationContext(env, aniObj); + if (etsContext == nullptr) { + EtsErrorUtil::ThrowRuntimeError(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER); + return; + } + auto applicationContext = etsContext->applicationContext_.lock(); + if (applicationContext == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "nativeContext is null"); + EtsErrorUtil::ThrowRuntimeError(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER); + } +} + void EtsApplicationContextUtils::NativeOffLifecycleCallbackSync(ani_env *env, ani_object aniObj, ani_string type, ani_int callbackId, ani_object callback) { @@ -866,6 +886,26 @@ ani_int EtsApplicationContextUtils::NativeOnEnvironmentSync(ani_env *env, ani_ob return etsContext->OnNativeOnEnvironmentSync(env, aniObj, envCallback); } +void EtsApplicationContextUtils::NativeOffEnvironmentCheck(ani_env *env, ani_object aniObj) +{ + TAG_LOGD(AAFwkTag::APPKIT, "NativeOffEnvironmentCheck Call"); + if (env == nullptr || aniObj == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "null env or aniObj"); + return; + } + auto etsContext = GeApplicationContext(env, aniObj); + if (etsContext == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "null etsContext"); + EtsErrorUtil::ThrowRuntimeError(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER); + return; + } + auto applicationContext = etsContext->applicationContext_.lock(); + if (applicationContext == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "nativeContext is null"); + EtsErrorUtil::ThrowRuntimeError(env, ERR_ABILITY_RUNTIME_EXTERNAL_INVALID_PARAMETER); + } +} + void EtsApplicationContextUtils::NativeOffEnvironmentSync(ani_env *env, ani_object aniObj, ani_int callbackId, ani_object callback) { @@ -1028,6 +1068,8 @@ void EtsApplicationContextUtils::BindApplicationContextFunc(ani_env* aniEnv) ani_native_function {"nativeOffLifecycleCallbackSync", "Lstd/core/String;ILutils/AbilityUtils/AsyncCallbackWrapper;:V", reinterpret_cast(EtsApplicationContextUtils::NativeOffLifecycleCallbackSync)}, + ani_native_function {"nativeOffAbilityLifecycleCheck", ":V", + reinterpret_cast(EtsApplicationContextUtils::NativeOffAbilityLifecycleCheck)}, ani_native_function {"nativegetRunningProcessInformation", "Lutils/AbilityUtils/AsyncCallbackWrapper;:V", reinterpret_cast(EtsApplicationContextUtils::GetRunningProcessInformation)}, @@ -1050,6 +1092,8 @@ void EtsApplicationContextUtils::BindApplicationContextFunc(ani_env* aniEnv) reinterpret_cast(EtsApplicationContextUtils::NativeOnEnvironmentSync)}, ani_native_function {"nativeOffEnvironmentSync", "ILutils/AbilityUtils/AsyncCallbackWrapper;:V", reinterpret_cast(EtsApplicationContextUtils::NativeOffEnvironmentSync)}, + ani_native_function {"nativeOffEnvironmentCheck", ":V", + reinterpret_cast(EtsApplicationContextUtils::NativeOffEnvironmentCheck)}, ani_native_function {"nativeOnApplicationStateChangeSync", "L@ohos/app/ability/ApplicationStateChangeCallback/ApplicationStateChangeCallback;:V", reinterpret_cast(EtsApplicationContextUtils::NativeOnApplicationStateChangeSync)}, diff --git a/frameworks/ets/ani/app_manager/src/ets_app_manager.cpp b/frameworks/ets/ani/app_manager/src/ets_app_manager.cpp index 30636affc73..91427749e25 100644 --- a/frameworks/ets/ani/app_manager/src/ets_app_manager.cpp +++ b/frameworks/ets/ani/app_manager/src/ets_app_manager.cpp @@ -122,6 +122,7 @@ public: static void ClearUpAppData(ani_env *env, ani_object callback, ani_string aniBundleName, ani_object appCloneIndex); static void TerminateMission(ani_env *env, ani_int missionId, ani_object callback); static void IsApplicationRunning(ani_env *env, ani_string aniBundleName, ani_object callback); + static void GetRunningMultiAppInfoCheck(ani_env *env, ani_string aniBundleName); private: static sptr GetAppManagerInstance(); static sptr GetAbilityManagerInstance(); @@ -294,6 +295,30 @@ void EtsAppManager::GetForegroundApplications(ani_env *env, ani_object callback) TAG_LOGD(AAFwkTag::APPMGR, "GetForegroundApplications end"); } + +void EtsAppManager::GetRunningMultiAppInfoCheck(ani_env *env, ani_string aniBundleName) +{ + TAG_LOGD(AAFwkTag::APPMGR, "GetRunningMultiAppInfoCheck called"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::APPMGR, "env null"); + return; + } + std::string bundleName; + if (!AppExecFwk::GetStdString(env, aniBundleName, bundleName) || bundleName.empty()) { + TAG_LOGE(AAFwkTag::APPMGR, "GetStdString Failed"); + AbilityRuntime::EtsErrorUtil::ThrowInvalidParamError(env, "Parse param bundleName failed, must be a string."); + return; + } +#ifdef SUPPORT_SCREEN + if (!AppExecFwk::CheckCallerIsSystemApp()) { + TAG_LOGE(AAFwkTag::APPMGR, "Non-system app"); + AbilityRuntime::EtsErrorUtil::ThrowError( + env, AbilityRuntime::AbilityErrorCode::ERROR_CODE_NOT_SYSTEM_APP); + return; + } +#endif +} + void EtsAppManager::GetRunningMultiAppInfo(ani_env *env, ani_string aniBundleName, ani_object callback) { TAG_LOGD(AAFwkTag::APPMGR, "GetRunningMultiAppInfo called"); @@ -305,19 +330,12 @@ void EtsAppManager::GetRunningMultiAppInfo(ani_env *env, ani_string aniBundleNam #ifdef SUPPORT_SCREEN if (!AppExecFwk::CheckCallerIsSystemApp()) { TAG_LOGE(AAFwkTag::APPMGR, "Non-system app"); - AppExecFwk::AsyncCallback(env, callback, - AbilityRuntime::EtsErrorUtil::CreateError( - env, AbilityRuntime::AbilityErrorCode::ERROR_CODE_NOT_SYSTEM_APP), emptyMultiAppInfo); return; } #endif std::string bundleName; if (!AppExecFwk::GetStdString(env, aniBundleName, bundleName) || bundleName.empty()) { TAG_LOGE(AAFwkTag::APPMGR, "GetStdString Failed"); - AppExecFwk::AsyncCallback(env, callback, - AbilityRuntime::EtsErrorUtil::CreateError(env, - static_cast(AbilityRuntime::AbilityErrorCode::ERROR_CODE_INVALID_PARAM), - "Parse param bundleName failed, must be a string."), emptyMultiAppInfo); return; } auto appManager = GetAppManagerInstance(); @@ -1619,6 +1637,8 @@ void EtsAppManagerRegistryInit(ani_env *env) "nativeGetRunningMultiAppInfo", nullptr, reinterpret_cast(EtsAppManager::GetRunningMultiAppInfo)}, ani_native_function{"nativeGetRunningProcessInfoByBundleName", nullptr, reinterpret_cast(EtsAppManager::GetRunningProcessInfoByBundleName)}, + ani_native_function{"nativeGetRunningMultiAppInfoCheck", nullptr, + reinterpret_cast(EtsAppManager::GetRunningMultiAppInfoCheck)}, ani_native_function{"nativeGetRunningProcessInfoByBundleNameAndUserId", nullptr, reinterpret_cast(EtsAppManager::GetRunningProcessInfoByBundleNameAndUserId)}, ani_native_function {"nativeOn", APPLICATION_STATE_WITH_BUNDLELIST_ON_SIGNATURE, diff --git a/frameworks/ets/ani/application/include/ets_application.h b/frameworks/ets/ani/application/include/ets_application.h index d9db6684bfa..8a36ef65400 100644 --- a/frameworks/ets/ani/application/include/ets_application.h +++ b/frameworks/ets/ani/application/include/ets_application.h @@ -24,10 +24,16 @@ class EtsApplication { public: static void CreateModuleContext(ani_env *env, ani_object contextObj, ani_string bundleName, ani_string moduleName, ani_object callback); + static void CreateModuleContextCheck(ani_env *env, + ani_object contextObj, ani_string moduleName, ani_object bundleName); static void CreateBundleContext(ani_env *env, ani_object contextObj, ani_string bundleName, ani_object callback); + static void CreateBundleContextCheck(ani_env *env, + ani_object contextObj, ani_string bundleName); static void CreatePluginModuleContext(ani_env *env, ani_object contextObj, ani_string pluginBundleName, ani_string pluginModuleName, ani_object callback); + static void CreatePluginModuleContextCheck(ani_env *env, + ani_object contextObj, ani_string pluginBundleName, ani_string pluginModuleName); static ani_object GetApplicationContext(ani_env *env); }; void ApplicationInit(ani_env *env); diff --git a/frameworks/ets/ani/application/src/ets_application.cpp b/frameworks/ets/ani/application/src/ets_application.cpp index 2af28b9cda3..495a5cb87dd 100644 --- a/frameworks/ets/ani/application/src/ets_application.cpp +++ b/frameworks/ets/ani/application/src/ets_application.cpp @@ -147,20 +147,64 @@ std::shared_ptr GetContextByStageMode(ani_env *env, ani_object &context ani_status status = IsStageContext(env, contextObj, stageMode); if (status != ANI_OK || !stageMode) { TAG_LOGE(AAFwkTag::APPKIT, "not stageMode"); - AppExecFwk::AsyncCallback(env, callback, EtsErrorUtil::CreateInvalidParamError(env, - "Parse param context failed, must be a context of stageMode."), emptyObject); return nullptr; } auto context = GetStageModeContext(env, contextObj); if (context == nullptr) { - TAG_LOGE(AAFwkTag::APPKIT, "null context"); - AppExecFwk::AsyncCallback(env, callback, EtsErrorUtil::CreateInvalidParamError(env, - "Parse param context failed, must not be nullptr."), emptyObject); return nullptr; } return context; } +void EtsApplication::CreateModuleContextCheck(ani_env *env, + ani_object contextObj, ani_string moduleName, ani_object bundleName) +{ + TAG_LOGD(AAFwkTag::APPKIT, "CreateModuleContextCheck Call"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "null env"); + return; + } + ani_boolean stageMode = false; + ani_status status = IsStageContext(env, contextObj, stageMode); + if (status != ANI_OK || !stageMode) { + TAG_LOGE(AAFwkTag::APPKIT, "not stageMode"); + EtsErrorUtil::ThrowInvalidParamError(env, + "Parse param context failed, must be a context of stageMode."); + return; + } + auto context = GetStageModeContext(env, contextObj); + if (context == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "null context"); + EtsErrorUtil::ThrowInvalidParamError(env, + "Parse param context failed, must not be nullptr."); + return; + } + auto inputContextPtr = Context::ConvertTo(context); + if (inputContextPtr == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "Convert to context failed"); + EtsErrorUtil::ThrowInvalidParamError(env, + "Parse param context failed, must be a context."); + return; + } + ani_boolean isUndefined = false; + if ((status = env->Reference_IsUndefined(bundleName, &isUndefined)) != ANI_OK) { + TAG_LOGE(AAFwkTag::APPKIT, "Failed to check undefined status : %{public}d", status); + return; + } + if (!isUndefined) { + if (!AAFwk::PermissionVerification::GetInstance()->IsSystemAppCall()) { + TAG_LOGE(AAFwkTag::APPKIT, "no system app"); + EtsErrorUtil::ThrowNotSystemAppError(env); + return; + } + if (!AAFwk::PermissionVerification::GetInstance()->VerifyGetBundleInfoPrivilegedPermission()) { + TAG_LOGE(AAFwkTag::APPKIT, "no permission"); + EtsErrorUtil::ThrowNoPermissionError(env, PERMISSION_GET_BUNDLE_INFO); + return; + } + } +} + void EtsApplication::CreateModuleContext(ani_env *env, ani_object contextObj, ani_string bundleName, ani_string moduleName, ani_object callback) { @@ -181,8 +225,6 @@ void EtsApplication::CreateModuleContext(ani_env *env, auto inputContextPtr = Context::ConvertTo(context); if (inputContextPtr == nullptr) { TAG_LOGE(AAFwkTag::APPKIT, "Convert to context failed"); - AppExecFwk::AsyncCallback(env, callback, EtsErrorUtil::CreateInvalidParamError(env, - "Parse param context failed, must be a context."), emptyObject); return; } std::shared_ptr> moduleContext = std::make_shared>(); @@ -205,6 +247,43 @@ void EtsApplication::CreateModuleContext(ani_env *env, SetCreateCompleteCallback(env, moduleContext, callback); } +void EtsApplication::CreateBundleContextCheck(ani_env *env, + ani_object contextObj, ani_string bundleName) +{ + if (!AAFwk::PermissionVerification::GetInstance()->IsSystemAppCall()) { + TAG_LOGE(AAFwkTag::APPKIT, "no system app"); + EtsErrorUtil::ThrowNotSystemAppError(env); + return; + } + if (!AAFwk::PermissionVerification::GetInstance()->VerifyGetBundleInfoPrivilegedPermission()) { + TAG_LOGE(AAFwkTag::APPKIT, "no permission"); + EtsErrorUtil::ThrowNoPermissionError(env, PERMISSION_GET_BUNDLE_INFO); + return; + } + ani_boolean stageMode = false; + ani_status status = IsStageContext(env, contextObj, stageMode); + if (status != ANI_OK || !stageMode) { + TAG_LOGE(AAFwkTag::APPKIT, "not stageMode"); + EtsErrorUtil::ThrowInvalidParamError(env, + "Parse param context failed, must be a context of stageMode."); + return; + } + auto context = GetStageModeContext(env, contextObj); + if (context == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "null context"); + EtsErrorUtil::ThrowInvalidParamError(env, + "Parse param context failed, must not be nullptr."); + return; + } + auto inputContextPtr = Context::ConvertTo(context); + if (inputContextPtr == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "Convert to context failed"); + EtsErrorUtil::ThrowInvalidParamError(env, + "Parse param context failed, must be a context."); + return; + } +} + void EtsApplication::CreateBundleContext(ani_env *env, ani_object contextObj, ani_string bundleName, ani_object callback) { @@ -244,6 +323,35 @@ void EtsApplication::CreateBundleContext(ani_env *env, SetCreateCompleteCallback(env, bundleContext, callback); } +void EtsApplication::CreatePluginModuleContextCheck(ani_env *env, + ani_object contextObj, ani_string pluginBundleName, ani_string pluginModuleName) +{ + TAG_LOGD(AAFwkTag::APPKIT, "CreatePluginModuleContextCheck Call"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "null env"); + return; + } + ani_boolean stageMode = false; + ani_status status = OHOS::AbilityRuntime::IsStageContext(env, contextObj, stageMode); + if (status != ANI_OK || !stageMode) { + EtsErrorUtil::ThrowInvalidParamError( + env, "Parse param context failed, must be a context of stageMode."); + return; + } + auto context = OHOS::AbilityRuntime::GetStageModeContext(env, contextObj); + if (context == nullptr) { + EtsErrorUtil::ThrowInvalidParamError( + env, "Parse param context failed, must not be nullptr."); + return; + } + auto inputContextPtr = Context::ConvertTo(context); + if (inputContextPtr == nullptr) { + EtsErrorUtil::ThrowInvalidParamError( + env, "Parse param context failed, must be a context."); + return; + } +} + void EtsApplication::CreatePluginModuleContext(ani_env *env, ani_object contextObj, ani_string pluginBundleName, ani_string pluginModuleName, ani_object callback) { @@ -342,18 +450,33 @@ void ApplicationInit(ani_env *env) "C{utils.AbilityUtils.AsyncCallbackWrapper}:", reinterpret_cast(EtsApplication::CreateModuleContext) }, + ani_native_function { + "nativeCreateModuleContextCheck", + "C{application.Context.Context}C{std.core.String}C{std.core.String}:", + reinterpret_cast(EtsApplication::CreateModuleContextCheck) + }, ani_native_function { "nativeCreateBundleContext", "C{application.Context.Context}C{std.core.String}" "C{utils.AbilityUtils.AsyncCallbackWrapper}:", reinterpret_cast(EtsApplication::CreateBundleContext) }, + ani_native_function { + "nativeCreateBundleContextCheck", + "C{application.Context.Context}C{std.core.String}:", + reinterpret_cast(EtsApplication::CreateBundleContextCheck) + }, ani_native_function { "nativeCreatePluginModuleContext", "Lapplication/Context/Context;Lstd/core/String;Lstd/core/String;" "Lutils/AbilityUtils/AsyncCallbackWrapper;:V", reinterpret_cast(EtsApplication::CreatePluginModuleContext) }, + ani_native_function { + "nativeCreatePluginModuleContextCheck", + "Lapplication/Context/Context;Lstd/core/String;Lstd/core/String;:V", + reinterpret_cast(EtsApplication::CreatePluginModuleContextCheck) + }, ani_native_function { "nativeGetApplicationContext", ":C{application.ApplicationContext.ApplicationContext}", diff --git a/frameworks/ets/ani/ui_ability/include/ets_ability_context.h b/frameworks/ets/ani/ui_ability/include/ets_ability_context.h index b29b5117a64..b9b16619ce0 100644 --- a/frameworks/ets/ani/ui_ability/include/ets_ability_context.h +++ b/frameworks/ets/ani/ui_ability/include/ets_ability_context.h @@ -130,12 +130,18 @@ public: ani_object callbackObj, ani_object startOptionsObj); static void StartRecentAbility(ani_env *env, ani_object aniObj, ani_object wantObj, ani_object callbackObj, ani_object startOptionsObj); + static void OpenLinkCheck(ani_env *env, ani_object aniObj, ani_string aniLink); + static void OpenAtomicServiceCheck(ani_env *env, ani_object aniObj); + static void StartAbilityForResultWithAccountCheck(ani_env *env, ani_object aniObj); #ifdef SUPPORT_GRAPHICS public: static void SetAbilityInstanceInfo(ani_env *env, ani_object aniObj, ani_string labelObj, ani_object iconObj, ani_object callback); static void SetMissionIcon(ani_env *env, ani_object aniObj, ani_object pixelMapObj, ani_object callbackObj); + static void SetAbilityInstanceInfoCheck(ani_env *env, ani_object aniObj, ani_object iconObj); + static void SetMissionIconCheck(ani_env *env, ani_object aniObj, ani_object pixelMapObj); + private: void OnSetAbilityInstanceInfo(ani_env *env, ani_object aniObj, ani_string labelObj, ani_object iconObj, ani_object callback); diff --git a/frameworks/ets/ani/ui_ability/src/ets_ability_context.cpp b/frameworks/ets/ani/ui_ability/src/ets_ability_context.cpp index 931eb6acdd4..f6cfd2da7eb 100644 --- a/frameworks/ets/ani/ui_ability/src/ets_ability_context.cpp +++ b/frameworks/ets/ani/ui_ability/src/ets_ability_context.cpp @@ -140,6 +140,18 @@ void RemoveConnection(int32_t connectId) TAG_LOGD(AAFwkTag::CONTEXT, "remove connection ability not exist"); } } + +bool CheckUrl(std::string &urlValue) +{ + if (urlValue.empty()) { + return false; + } + Uri uri = Uri(urlValue); + if (uri.GetScheme().empty() || uri.GetHost().empty()) { + return false; + } + return true; +} } // namespace EtsAbilityContext::~EtsAbilityContext() @@ -366,6 +378,21 @@ void EtsAbilityContext::OpenLink(ani_env *env, ani_object aniObj, ani_string ani !isCallbackUndefined); } +void EtsAbilityContext::OpenLinkCheck(ani_env *env, ani_object aniObj, ani_string aniLink) +{ + TAG_LOGD(AAFwkTag::CONTEXT, "OpenLinkCheck called"); + if (env == nullptr || aniObj == nullptr) { + TAG_LOGE(AAFwkTag::CONTEXT, "null env or aniObj"); + return; + } + std::string link(""); + if (!AppExecFwk::GetStdString(env, aniLink, link) || !CheckUrl(link)) { + TAG_LOGE(AAFwkTag::CONTEXT, "invalid link params"); + EtsErrorUtil::ThrowInvalidParamError( + env, "Parse param link or openLinkOptions failed, link must be string, openLinkOptions must be options."); + } +} + bool EtsAbilityContext::IsTerminating(ani_env *env, ani_object aniObj) { TAG_LOGD(AAFwkTag::CONTEXT, "IsTerminating called"); @@ -484,6 +511,26 @@ void EtsAbilityContext::OpenAtomicService( etsContext->OnOpenAtomicService(env, aniObj, aniAppId, callbackObj, optionsObj); } +void EtsAbilityContext::OpenAtomicServiceCheck(ani_env *env, ani_object aniObj) +{ + TAG_LOGD(AAFwkTag::CONTEXT, "OpenAtomicServiceCheck called"); + if (env == nullptr || aniObj == nullptr) { + TAG_LOGE(AAFwkTag::CONTEXT, "null env or aniObj"); + return; + } + auto etsContext = GetEtsAbilityContext(env, aniObj); + if (etsContext == nullptr) { + TAG_LOGE(AAFwkTag::CONTEXT, "null etsContext"); + EtsErrorUtil::ThrowError(env, AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT); + return; + } + auto context = etsContext->context_.lock(); + if (context == nullptr) { + TAG_LOGE(AAFwkTag::CONTEXT, "null context"); + EtsErrorUtil::ThrowError(env, AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT); + } +} + ani_long EtsAbilityContext::ConnectServiceExtensionAbilityWithAccount(ani_env *env, ani_object aniObj, ani_object wantObj, ani_int aniAccountId, ani_object connectOptionsObj) { @@ -623,6 +670,21 @@ void EtsAbilityContext::SetAbilityInstanceInfo(ani_env *env, ani_object aniObj, etsContext->OnSetAbilityInstanceInfo(env, aniObj, labelObj, iconObj, callback); } +void EtsAbilityContext::SetAbilityInstanceInfoCheck(ani_env *env, ani_object aniObj, ani_object iconObj) +{ + TAG_LOGD(AAFwkTag::CONTEXT, "SetAbilityInstanceInfoCheck called"); + if (env == nullptr || aniObj == nullptr) { + TAG_LOGE(AAFwkTag::CONTEXT, "null env or aniObj"); + return; + } + auto icon = OHOS::Media::PixelMapTaiheAni::GetNativePixelMap(env, iconObj); + if (icon == nullptr) { + TAG_LOGE(AAFwkTag::CONTEXT, "parse icon failed"); + EtsErrorUtil::ThrowInvalidParamError(env, "Parse icon failed."); + return; + } +} + void EtsAbilityContext::SetMissionIcon(ani_env *env, ani_object aniObj, ani_object pixelMapObj, ani_object callbackObj) { @@ -634,6 +696,22 @@ void EtsAbilityContext::SetMissionIcon(ani_env *env, ani_object aniObj, ani_obje } etsContext->OnSetMissionIcon(env, aniObj, pixelMapObj, callbackObj); } + +void EtsAbilityContext::SetMissionIconCheck( + ani_env *env, ani_object aniObj, ani_object pixelMapObj) +{ + TAG_LOGD(AAFwkTag::CONTEXT, "SetMissionIconCheck called"); + if (env == nullptr || aniObj == nullptr) { + TAG_LOGE(AAFwkTag::CONTEXT, "null env or aniObj"); + return; + } + auto icon = OHOS::Media::PixelMapTaiheAni::GetNativePixelMap(env, pixelMapObj); + if (icon == nullptr) { + TAG_LOGE(AAFwkTag::CONTEXT, "parse icon failed"); + EtsErrorUtil::ThrowError(env, AbilityErrorCode::ERROR_CODE_INVALID_PARAM); + return; + } +} #endif void EtsAbilityContext::RestoreWindowStage( @@ -714,10 +792,7 @@ void EtsAbilityContext::OnStartAbility( { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); AAFwk::Want want; - if (!AppExecFwk::UnwrapWant(env, wantObj, want)) { - EtsErrorUtil::ThrowInvalidParamError(env, "Parse param want failed, must be a Want"); - return; - } + AppExecFwk::UnwrapWant(env, wantObj, want); InheritWindowMode(want); if (isStartRecent) { TAG_LOGD(AAFwkTag::CONTEXT, "startRecentAbility"); @@ -798,21 +873,21 @@ void EtsAbilityContext::OnStartAbilityForResult( ani_object EtsAbilityContext::StartAbilityByCall(ani_env *env, ani_object aniObj, ani_object wantObj) { - TAG_LOGI(AAFwkTag::UIABILITY, "StartAbilityByCall"); + TAG_LOGI(AAFwkTag::CONTEXT, "StartAbilityByCall"); auto etsContext = GetEtsAbilityContext(env, aniObj); if (etsContext == nullptr) { TAG_LOGE(AAFwkTag::CONTEXT, "null etsContext"); } auto context = etsContext ? etsContext->context_.lock() : nullptr; if (context == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "GetAbilityContext is nullptr"); + TAG_LOGE(AAFwkTag::CONTEXT, "GetAbilityContext is nullptr"); EtsErrorUtil::ThrowError(env, AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT); return nullptr; } AAFwk::Want want; if (!AppExecFwk::UnwrapWant(env, wantObj, want)) { - TAG_LOGE(AAFwkTag::UIABILITY, "parse want failed"); + TAG_LOGE(AAFwkTag::CONTEXT, "parse want failed"); EtsErrorUtil::ThrowInvalidParamError(env, "Parse param want failed, want must be Want."); return nullptr; } @@ -821,7 +896,7 @@ ani_object EtsAbilityContext::StartAbilityByCall(ani_env *env, ani_object aniObj CallUtil::GenerateCallerCallBack(callData, callerCallBack); auto ret = context->StartAbilityByCall(want, callerCallBack, -1); if (ret != 0) { - TAG_LOGE(AAFwkTag::UIABILITY, "startAbility failed"); + TAG_LOGE(AAFwkTag::CONTEXT, "startAbility failed"); EtsErrorUtil::ThrowErrorByNativeErr(env, ret); return nullptr; } @@ -1040,18 +1115,6 @@ void EtsAbilityContext::OnStopServiceExtensionAbility(ani_env *env, ani_object a AppExecFwk::AsyncCallback(env, callbackobj, aniObject, nullptr); } -static bool CheckUrl(std::string &urlValue) -{ - if (urlValue.empty()) { - return false; - } - Uri uri = Uri(urlValue); - if (uri.GetScheme().empty() || uri.GetHost().empty()) { - return false; - } - return true; -} - void EtsAbilityContext::OnOpenLink(ani_env *env, ani_object aniObj, ani_string aniLink, ani_object myCallbackobj, ani_object optionsObj, ani_object callbackobj, bool haveOptionsParm, bool haveCallBackParm) { @@ -1733,16 +1796,16 @@ bool EtsAbilityContext::IsInstanceOf(ani_env *env, ani_object aniObj) ani_class cls {}; ani_status status = ANI_ERROR; if (env == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null env"); + TAG_LOGE(AAFwkTag::CONTEXT, "null env"); return false; } if ((status = env->FindClass(UI_ABILITY_CONTEXT_CLASS_NAME, &cls)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); return false; } ani_boolean isInstanceOf = false; if ((status = env->Object_InstanceOf(aniObj, cls, &isInstanceOf)) != ANI_OK) { - TAG_LOGE(AAFwkTag::UIABILITY, "status: %{public}d", status); + TAG_LOGE(AAFwkTag::CONTEXT, "status: %{public}d", status); return false; } return isInstanceOf; @@ -1750,9 +1813,9 @@ bool EtsAbilityContext::IsInstanceOf(ani_env *env, ani_object aniObj) void EtsAbilityContext::NativeOnSetRestoreEnabled(ani_env *env, ani_object aniObj, ani_boolean aniEnabled) { - TAG_LOGD(AAFwkTag::UIABILITY, "NativeOnSetRestoreEnabled"); + TAG_LOGD(AAFwkTag::CONTEXT, "NativeOnSetRestoreEnabled"); if (env == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "null env"); + TAG_LOGE(AAFwkTag::CONTEXT, "null env"); return; } @@ -1981,6 +2044,20 @@ void EtsAbilityContext::StartAbilityForResultWithAccount(ani_env *env, ani_objec etsContext->OnStartAbilityForResultWithAccount(env, aniObj, wantObj, etsAccountId, nullptr, callback); } +void EtsAbilityContext::StartAbilityForResultWithAccountCheck(ani_env *env, ani_object aniObj) +{ + TAG_LOGD(AAFwkTag::CONTEXT, "StartAbilityForResultWithAccountCheck called"); + if (env == nullptr || aniObj == nullptr) { + TAG_LOGE(AAFwkTag::CONTEXT, "null env or aniObj"); + return; + } + if (!AppExecFwk::CheckCallerIsSystemApp()) { + TAG_LOGE(AAFwkTag::CONTEXT, "non system app forbidden to call"); + EtsErrorUtil::ThrowError(env, AbilityErrorCode::ERROR_CODE_NOT_SYSTEM_APP); + return; + } +} + void EtsAbilityContext::StartAbilityForResultWithAccountVoid(ani_env *env, ani_object aniObj, ani_object wantObj, ani_int etsAccountId, ani_object startOptionsObj, ani_object callback) { @@ -2016,7 +2093,7 @@ void EtsAbilityContext::OnStartAbilityWithAccount( ErrCode innerErrCode = ERR_OK; auto context = context_.lock(); if (context == nullptr) { - TAG_LOGE(AAFwkTag::UIABILITY, "context null"); + TAG_LOGE(AAFwkTag::CONTEXT, "context null"); EtsErrorUtil::ThrowError(env, AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT); return; } @@ -2091,24 +2168,26 @@ bool BindNativeMethods(ani_env *env, ani_class &cls) reinterpret_cast(EtsAbilityContext::TerminateSelfWithResult) }, ani_native_function { "nativeStartAbilityByCallSync", "L@ohos/app/ability/Want/Want;:L@ohos/app/ability/UIAbility/Caller;", - reinterpret_cast(EtsAbilityContext::StartAbilityByCall) }, + reinterpret_cast(EtsAbilityContext::StartAbilityByCall) }, ani_native_function { "nativeReportDrawnCompletedSync", "Lutils/AbilityUtils/AsyncCallbackWrapper;:V", reinterpret_cast(EtsAbilityContext::ReportDrawnCompleted) }, ani_native_function { "nativeStartServiceExtensionAbility", "L@ohos/app/ability/Want/Want;Lutils/AbilityUtils/AsyncCallbackWrapper;:V", - reinterpret_cast(EtsAbilityContext::StartServiceExtensionAbility) }, + reinterpret_cast(EtsAbilityContext::StartServiceExtensionAbility) }, ani_native_function { "nativeOpenLink", SIGNATURE_OPEN_LINK, - reinterpret_cast(EtsAbilityContext::OpenLink) }, + reinterpret_cast(EtsAbilityContext::OpenLink) }, + ani_native_function { "nativeOpenLinkCheck", "Lstd/core/String;:V", + reinterpret_cast(EtsAbilityContext::OpenLinkCheck) }, ani_native_function { "nativeIsTerminating", ":Z", - reinterpret_cast(EtsAbilityContext::IsTerminating) }, + reinterpret_cast(EtsAbilityContext::IsTerminating) }, ani_native_function { "nativeMoveAbilityToBackground", "Lutils/AbilityUtils/AsyncCallbackWrapper;:V", - reinterpret_cast(EtsAbilityContext::MoveAbilityToBackground) }, + reinterpret_cast(EtsAbilityContext::MoveAbilityToBackground) }, ani_native_function { "nativeRequestModalUIExtension", "L@ohos/app/ability/Want/Want;Lutils/AbilityUtils/AsyncCallbackWrapper;:V", - reinterpret_cast(EtsAbilityContext::RequestModalUIExtension) }, + reinterpret_cast(EtsAbilityContext::RequestModalUIExtension) }, ani_native_function { "nativeBackToCallerAbilityWithResult", "Lability/abilityResult/AbilityResult;Lstd/core/String;Lutils/AbilityUtils/AsyncCallbackWrapper;:V", - reinterpret_cast(EtsAbilityContext::BackToCallerAbilityWithResult) }, + reinterpret_cast(EtsAbilityContext::BackToCallerAbilityWithResult) }, ani_native_function { "nativeSetMissionLabel", "Lstd/core/String;Lutils/AbilityUtils/AsyncCallbackWrapper;:V", reinterpret_cast(EtsAbilityContext::SetMissionLabel) }, @@ -2118,27 +2197,29 @@ bool BindNativeMethods(ani_env *env, ani_class &cls) reinterpret_cast(EtsAbilityContext::DisconnectServiceExtensionAbility) }, ani_native_function {"nativeSetColorMode", "L@ohos/app/ability/ConfigurationConstant/ConfigurationConstant/ColorMode;:V", - reinterpret_cast(EtsAbilityContext::SetColorMode)}, + reinterpret_cast(EtsAbilityContext::SetColorMode)}, ani_native_function { "nativeStartAbilityByTypeSync", SIGNATURE_START_ABILITY_BY_TYPE, - reinterpret_cast(EtsAbilityContext::StartAbilityByType) }, + reinterpret_cast(EtsAbilityContext::StartAbilityByType) }, ani_native_function { "nativeOpenAtomicService", SIGNATURE_OPEN_ATOMIC_SERVICE, reinterpret_cast(EtsAbilityContext::OpenAtomicService) }, + ani_native_function { "nativeOpenAtomicServiceCheck", ":V", + reinterpret_cast(EtsAbilityContext::OpenAtomicServiceCheck) }, ani_native_function { "nativeOnSetRestoreEnabled", "Z:V", - reinterpret_cast(EtsAbilityContext::NativeOnSetRestoreEnabled) }, + reinterpret_cast(EtsAbilityContext::NativeOnSetRestoreEnabled) }, ani_native_function { "nativeConnectServiceExtensionAbilityWithAccount", "L@ohos/app/ability/Want/Want;ILability/connectOptions/ConnectOptions;:J", - reinterpret_cast(EtsAbilityContext::ConnectServiceExtensionAbilityWithAccount) }, + reinterpret_cast(EtsAbilityContext::ConnectServiceExtensionAbilityWithAccount) }, ani_native_function { "nativeStopServiceExtensionAbilityWithAccount", "L@ohos/app/ability/Want/Want;ILutils/AbilityUtils/AsyncCallbackWrapper;:V", - reinterpret_cast(EtsAbilityContext::StopServiceExtensionAbilityWithAccount) }, + reinterpret_cast(EtsAbilityContext::StopServiceExtensionAbilityWithAccount) }, ani_native_function { "nativeStopServiceExtensionAbility", "L@ohos/app/ability/Want/Want;Lutils/AbilityUtils/AsyncCallbackWrapper;:V", - reinterpret_cast(EtsAbilityContext::StopServiceExtensionAbility) }, + reinterpret_cast(EtsAbilityContext::StopServiceExtensionAbility) }, ani_native_function { "nativeStartServiceExtensionAbilityWithAccount", "L@ohos/app/ability/Want/Want;ILutils/AbilityUtils/AsyncCallbackWrapper;:V", - reinterpret_cast(EtsAbilityContext::StartServiceExtensionAbilityWithAccount) }, + reinterpret_cast(EtsAbilityContext::StartServiceExtensionAbilityWithAccount) }, ani_native_function { "nativeChangeAbilityVisibility", "ZLutils/AbilityUtils/AsyncCallbackWrapper;:V", - reinterpret_cast(EtsAbilityContext::NativeChangeAbilityVisibility) }, + reinterpret_cast(EtsAbilityContext::NativeChangeAbilityVisibility) }, ani_native_function { "nativeConnectAppServiceExtensionAbility", SIGNATURE_CONNECT_SERVICE_EXTENSION, reinterpret_cast(EtsAbilityContext::ConnectAppServiceExtensionAbility) }, ani_native_function { "nativeDisconnectAppServiceExtensionAbility", SIGNATURE_DISCONNECT_SERVICE_EXTENSION, @@ -2150,30 +2231,36 @@ bool BindNativeMethods(ani_env *env, ani_class &cls) "L@ohos/app/ability/Want/Want;Lutils/AbilityUtils/AsyncCallbackWrapper;:V", reinterpret_cast(EtsAbilityContext::StopAppServiceExtensionAbility) }, ani_native_function { "nativeStartAbilityWithAccountSync", SIGNATURE_START_ABILITY_WITH_ACCOUNT, - reinterpret_cast(EtsAbilityContext::StartAbilityWithAccount) }, + reinterpret_cast(EtsAbilityContext::StartAbilityWithAccount) }, ani_native_function { "nativeStartAbilityWithAccountSync", SIGNATURE_START_ABILITY_WITH_ACCOUNT_OPTIONS, - reinterpret_cast(EtsAbilityContext::StartAbilityWithAccountAndOptions) }, + reinterpret_cast(EtsAbilityContext::StartAbilityWithAccountAndOptions) }, #ifdef SUPPORT_GRAPHICS ani_native_function { "nativeSetAbilityInstanceInfo", "Lstd/core/String;L@ohos/multimedia/image/image/PixelMap;Lutils/AbilityUtils/AsyncCallbackWrapper;:V", - reinterpret_cast(EtsAbilityContext::SetAbilityInstanceInfo) }, + reinterpret_cast(EtsAbilityContext::SetAbilityInstanceInfo) }, + ani_native_function { "nativeSetAbilityInstanceInfoCheck", "L@ohos/multimedia/image/image/PixelMap;:V", + reinterpret_cast(EtsAbilityContext::SetAbilityInstanceInfoCheck) }, ani_native_function { "nativeSetMissionIcon", "L@ohos/multimedia/image/image/PixelMap;Lutils/AbilityUtils/AsyncCallbackWrapper;:V", - reinterpret_cast(EtsAbilityContext::SetMissionIcon) }, + reinterpret_cast(EtsAbilityContext::SetMissionIcon) }, + ani_native_function { "nativeSetMissionIconCheck", "L@ohos/multimedia/image/image/PixelMap;:V", + reinterpret_cast(EtsAbilityContext::SetMissionIconCheck) }, #endif ani_native_function { "nativeRevokeDelegator", "Lutils/AbilityUtils/AsyncCallbackWrapper;:V", reinterpret_cast(EtsAbilityContext::RevokeDelegator) }, ani_native_function { "nativeStartAbilityForResultWithAccount", "L@ohos/app/ability/Want/Want;ILutils/AbilityUtils/AsyncCallbackWrapper;:V", - reinterpret_cast(EtsAbilityContext::StartAbilityForResultWithAccount) }, + reinterpret_cast(EtsAbilityContext::StartAbilityForResultWithAccount) }, + ani_native_function { "nativeStartAbilityForResultWithAccountCheck", ":V", + reinterpret_cast(EtsAbilityContext::StartAbilityForResultWithAccountCheck) }, ani_native_function { "nativeStartAbilityForResultWithAccountVoid", "L@ohos/app/ability/Want/Want;IL@ohos/app/ability/StartOptions/StartOptions;" "Lutils/AbilityUtils/AsyncCallbackWrapper;:V", - reinterpret_cast(EtsAbilityContext::StartAbilityForResultWithAccountVoid) }, + reinterpret_cast(EtsAbilityContext::StartAbilityForResultWithAccountVoid) }, ani_native_function { "nativeStartAbilityForResultWithAccountResult", "L@ohos/app/ability/Want/Want;IL@ohos/app/ability/StartOptions/StartOptions;" "Lutils/AbilityUtils/AsyncCallbackWrapper;:V", - reinterpret_cast(EtsAbilityContext::StartAbilityForResultWithAccountResult) }, + reinterpret_cast(EtsAbilityContext::StartAbilityForResultWithAccountResult) }, ani_native_function { "nativeRestoreWindowStage", SIGNATURE_RESTORE_WINDOW_STAGE, reinterpret_cast(EtsAbilityContext::RestoreWindowStage) }, ani_native_function { "nativeStartAbilityAsCaller", SIGNATURE_START_ABILITY_AS_CALLER, diff --git a/frameworks/ets/ani/ui_extension_ability/include/ets_ui_extension_context.h b/frameworks/ets/ani/ui_extension_ability/include/ets_ui_extension_context.h index b5535a625ec..72e46b039b0 100644 --- a/frameworks/ets/ani/ui_extension_ability/include/ets_ui_extension_context.h +++ b/frameworks/ets/ani/ui_extension_ability/include/ets_ui_extension_context.h @@ -83,8 +83,10 @@ public: static void ReportDrawnCompleted(ani_env *env, ani_object aniObj, ani_object callback); static void OpenLink(ani_env *env, ani_object aniObj, ani_string aniLink, ani_object myCallbackobj, ani_object optionsObj, ani_object callbackobj); + static void OpenLinkCheck(ani_env *env, ani_object aniObj, ani_string aniLink); static void OpenAtomicService(ani_env *env, ani_object aniObj, ani_string aniAppId, ani_object callbackobj, ani_object optionsObj); + static void OpenAtomicServiceCheck(ani_env *env, ani_object aniObj); static bool BindNativePtrCleaner(ani_env *env); static void Clean(ani_env *env, ani_object object); diff --git a/frameworks/ets/ani/ui_extension_ability/src/ets_ui_extension_context.cpp b/frameworks/ets/ani/ui_extension_ability/src/ets_ui_extension_context.cpp index c3369680cbd..aa86622f955 100644 --- a/frameworks/ets/ani/ui_extension_ability/src/ets_ui_extension_context.cpp +++ b/frameworks/ets/ani/ui_extension_ability/src/ets_ui_extension_context.cpp @@ -32,6 +32,7 @@ namespace OHOS { namespace AbilityRuntime { +namespace { static std::mutex g_connectsMutex; int32_t g_serialNumber = 0; static std::map, Etskey_compare> g_connects; @@ -51,6 +52,19 @@ constexpr const char* SIGNATURE_OPEN_LINK = "Lstd/core/String;Lutils/AbilityUtil const std::string APP_LINKING_ONLY = "appLinkingOnly"; const std::string ATOMIC_SERVICE_PREFIX = "com.atomicservice."; +static bool CheckUrl(std::string &urlValue) +{ + if (urlValue.empty()) { + return false; + } + Uri uri = Uri(urlValue); + if (uri.GetScheme().empty() || uri.GetHost().empty()) { + return false; + } + return true; +} +} // namespace + void EtsUIExtensionContext::TerminateSelfSync(ani_env *env, ani_object obj, ani_object callback) { TAG_LOGD(AAFwkTag::UI_EXT, "TerminateSelfSync called"); @@ -154,6 +168,21 @@ void EtsUIExtensionContext::StartAbilityForResult(ani_env *env, ani_object aniOb etsUiExtensionContext->OnStartAbilityForResult(env, aniObj, wantObj, nullptr, callback); } +void EtsUIExtensionContext::OpenLinkCheck(ani_env *env, ani_object aniObj, ani_string aniLink) +{ + TAG_LOGD(AAFwkTag::UI_EXT, "OpenLinkCheck called"); + if (env == nullptr || aniObj == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null env or aniObj"); + return; + } + std::string link(""); + if (!AppExecFwk::GetStdString(env, aniLink, link) || !CheckUrl(link)) { + TAG_LOGE(AAFwkTag::UI_EXT, "invalid link params"); + EtsErrorUtil::ThrowInvalidParamError( + env, "Parse param link or openLinkOptions failed, link must be string, openLinkOptions must be options."); + } +} + void EtsUIExtensionContext::OpenLink(ani_env *env, ani_object aniObj, ani_string aniLink, ani_object myCallbackobj, ani_object optionsObj, ani_object callbackobj) { @@ -170,6 +199,25 @@ void EtsUIExtensionContext::OpenLink(ani_env *env, ani_object aniObj, ani_string etsContext->OnOpenLink(env, aniObj, aniLink, myCallbackobj, optionsObj, callbackobj); } +void EtsUIExtensionContext::OpenAtomicServiceCheck(ani_env *env, ani_object aniObj) +{ + TAG_LOGD(AAFwkTag::UI_EXT, "OpenAtomicServiceCheck"); + if (env == nullptr || aniObj == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null env or aniObj"); + return; + } + auto etsContext = GetEtsUIExtensionContext(env, aniObj); + if (etsContext == nullptr || etsContext->context_.lock() == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null etsContext"); + EtsErrorUtil::ThrowError(env, AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT); + return; + } + if (etsContext->context_.lock() == nullptr) { + TAG_LOGW(AAFwkTag::UI_EXT, "null context"); + EtsErrorUtil::ThrowError(env, AbilityErrorCode::ERROR_CODE_INVALID_CONTEXT); + } +} + void EtsUIExtensionContext::OpenAtomicService(ani_env *env, ani_object aniObj, ani_string aniAppId, ani_object callbackobj, ani_object optionsObj) { @@ -786,18 +834,6 @@ void EtsUIExtensionContext::OnSetHostPageOverlayForbidden(ani_env *env, ani_obje TAG_LOGD(AAFwkTag::UI_EXT, "SetHostPageOverlayForbidden ok, isNotAllow: %{public}d", isNotAllow); } -static bool CheckUrl(std::string &urlValue) -{ - if (urlValue.empty()) { - return false; - } - Uri uri = Uri(urlValue); - if (uri.GetScheme().empty() || uri.GetHost().empty()) { - return false; - } - return true; -} - void EtsUIExtensionContext::OpenLinkInner(ani_env *env, ani_object aniObj, ani_string aniLink, ani_object myCallbackobj, ani_object optionsObj, ani_object callbackobj, bool haveOptionsParm, bool haveCallBackParm) { @@ -1155,8 +1191,12 @@ ani_object CreateEtsUIExtensionContext(ani_env *env, std::shared_ptr(EtsUIExtensionContext::ReportDrawnCompleted)}, ani_native_function { "nativeOpenAtomicService", SIGNATURE_OPEN_ATOMIC_SERVICE, reinterpret_cast(EtsUIExtensionContext::OpenAtomicService) }, + ani_native_function { "nativeOpenAtomicServiceCheck", ":V", + reinterpret_cast(EtsUIExtensionContext::OpenAtomicServiceCheck) }, ani_native_function { "nativeOpenLinkSync", SIGNATURE_OPEN_LINK, reinterpret_cast(EtsUIExtensionContext::OpenLink) }, + ani_native_function { "nativeOpenLinkCheck", "Lstd/core/String;:V", + reinterpret_cast(EtsUIExtensionContext::OpenLinkCheck) }, }; if ((status = env->Class_BindNativeMethods(cls, functions.data(), functions.size())) != ANI_OK) { TAG_LOGE(AAFwkTag::UI_EXT, "status: %{public}d", status); diff --git a/frameworks/ets/ani/wantagent/include/ani_want_agent.h b/frameworks/ets/ani/wantagent/include/ani_want_agent.h index bb9d83f6c9f..d57642bbb67 100644 --- a/frameworks/ets/ani/wantagent/include/ani_want_agent.h +++ b/frameworks/ets/ani/wantagent/include/ani_want_agent.h @@ -69,6 +69,7 @@ public: static void Trigger(ani_env *env, ani_object agent, ani_object triggerInfoObj, ani_object call); static void GetWantAgent(ani_env *env, ani_object info, ani_object call); static void Clean(ani_env *env, ani_object object); + static void TriggerCheck(ani_env *env, ani_object agent, ani_object triggerInfoObj); private: void OnEqual(ani_env *env, ani_object agent, ani_object otherAgent, ani_object call); diff --git a/frameworks/ets/ani/wantagent/src/ani_want_agent.cpp b/frameworks/ets/ani/wantagent/src/ani_want_agent.cpp index 34dcc150e4a..c3049b2619a 100644 --- a/frameworks/ets/ani/wantagent/src/ani_want_agent.cpp +++ b/frameworks/ets/ani/wantagent/src/ani_want_agent.cpp @@ -201,6 +201,34 @@ void EtsWantAgent::GetWantAgent(ani_env *env, ani_object info, ani_object call) GetInstance().OnGetWantAgent(env, info, call); } +void EtsWantAgent::TriggerCheck(ani_env *env, ani_object agent, ani_object triggerInfoObj) +{ + TAG_LOGD(AAFwkTag::WANTAGENT, "TriggerCheck called"); + if (env == nullptr) { + TAG_LOGE(AAFwkTag::WANTAGENT, "null env"); + return; + } + WantAgent* pWantAgent = nullptr; + UnwrapWantAgent(env, agent, reinterpret_cast(&pWantAgent)); + if (pWantAgent == nullptr) { + TAG_LOGE(AAFwkTag::WANTAGENT, "Parse pWantAgent failed"); + EtsErrorUtil::ThrowInvalidParamError(env, "Parse pWantAgent failed. Agent must be a WantAgent."); + return; + } + std::shared_ptr wantAgent = std::make_shared(*pWantAgent); + TriggerInfo triggerInfo; + int32_t ret = GetInstance().GetTriggerInfo(env, triggerInfoObj, triggerInfo); + if (ret != BUSINESS_ERROR_CODE_OK) { + TAG_LOGE(AAFwkTag::WANTAGENT, "Get trigger info error"); + EtsErrorUtil::ThrowInvalidParamError(env, "Get trigger info error. TriggerInfo must be a TriggerInfo."); + return; + } + if (wantAgent->IsLocal()) { + TAG_LOGE(AAFwkTag::WANTAGENT, "Trigger does not support localWantAgent"); + EtsErrorUtil::ThrowInvalidParamError(env, "Agent can not be local."); + } +} + void EtsWantAgent::Clean(ani_env *env, ani_object object) { TAG_LOGD(AAFwkTag::WANTAGENT, "Clean called"); @@ -656,15 +684,27 @@ ani_status BindNativeFunctions(ani_env *env) return status; } std::array functions = { - ani_native_function { "nativeGetBundleName", nullptr, reinterpret_cast(EtsWantAgent::GetBundleName) }, - ani_native_function { "nativeGetUid", nullptr, reinterpret_cast(EtsWantAgent::GetUid) }, - ani_native_function { - "nativeGetOperationType", nullptr, reinterpret_cast(EtsWantAgent::GetOperationType) }, - ani_native_function { "nativeCancel", nullptr, reinterpret_cast(EtsWantAgent::Cancel) }, - ani_native_function { "nativeEqual", nullptr, reinterpret_cast(EtsWantAgent::Equal) }, - ani_native_function { "nativeTrigger", nullptr, reinterpret_cast(EtsWantAgent::Trigger) }, - ani_native_function { "nativeGetWant", nullptr, reinterpret_cast(EtsWantAgent::GetWant) }, - ani_native_function { "nativeGetWantAgent", nullptr, reinterpret_cast(EtsWantAgent::GetWantAgent) }, + ani_native_function { "nativeGetBundleName", "Lstd/core/Object;Lutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(EtsWantAgent::GetBundleName) }, + ani_native_function { "nativeGetUid", "Lstd/core/Object;Lutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(EtsWantAgent::GetUid) }, + ani_native_function { "nativeGetOperationType", "Lstd/core/Object;Lutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(EtsWantAgent::GetOperationType) }, + ani_native_function { "nativeCancel", "Lstd/core/Object;Lutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(EtsWantAgent::Cancel) }, + ani_native_function { "nativeEqual", + "Lstd/core/Object;Lstd/core/Object;Lutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(EtsWantAgent::Equal) }, + ani_native_function { "nativeTrigger", + "Lstd/core/Object;LwantAgent/triggerInfo/TriggerInfo;Lutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(EtsWantAgent::Trigger) }, + ani_native_function { "nativeGetWant", "Lstd/core/Object;Lutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(EtsWantAgent::GetWant) }, + ani_native_function { "nativeGetWantAgent", + "LwantAgent/wantAgentInfo/WantAgentInfo;Lutils/AbilityUtils/AsyncCallbackWrapper;:V", + reinterpret_cast(EtsWantAgent::GetWantAgent) }, + ani_native_function { "nativeTriggerCheck", "Lstd/core/Object;LwantAgent/triggerInfo/TriggerInfo;:V", + reinterpret_cast(EtsWantAgent::TriggerCheck) }, }; if ((status = env->Namespace_BindNativeFunctions(ns, functions.data(), functions.size())) != ANI_OK) { TAG_LOGE(AAFwkTag::WANTAGENT, "Namespace_BindNativeFunctions failed status: %{public}d", status); diff --git a/frameworks/ets/ets/@ohos.app.ability.InsightIntentContext.ets b/frameworks/ets/ets/@ohos.app.ability.InsightIntentContext.ets index 40a7569f487..f656f2a9717 100644 --- a/frameworks/ets/ets/@ohos.app.ability.InsightIntentContext.ets +++ b/frameworks/ets/ets/@ohos.app.ability.InsightIntentContext.ets @@ -20,8 +20,10 @@ export default class InsightIntentContext { nativeContext: long; public native nativeStartAbilitySync(want: Want): BusinessError; + public native nativeStartAbilitySyncCheck(): void; startAbility(want: Want, callback: AsyncCallback): void { + this.nativeStartAbilitySyncCheck(); let p1 = taskpool.execute((): BusinessError => { return this.nativeStartAbilitySync(want); }); @@ -34,6 +36,7 @@ export default class InsightIntentContext { } startAbility(want: Want): Promise { + this.nativeStartAbilitySyncCheck(); let p = new Promise((resolve: (v: undefined) => void, reject: (error: BusinessError) => void): void => { let p1 = taskpool.execute((): BusinessError => { return this.nativeStartAbilitySync(want); diff --git a/frameworks/ets/ets/@ohos.app.ability.abilityManager.ets b/frameworks/ets/ets/@ohos.app.ability.abilityManager.ets index 646d8c56523..05435e610f0 100644 --- a/frameworks/ets/ets/@ohos.app.ability.abilityManager.ets +++ b/frameworks/ets/ets/@ohos.app.ability.abilityManager.ets @@ -34,6 +34,7 @@ export default namespace abilityManager { export native function nativeGetTopAbility(callback:AsyncCallbackWrapper) : void; export native function nativeGetAbilityRunningInfos(callback:AsyncCallbackWrapper>) : void; export native function nativeIsEmbeddedOpenAllowed(context: Context, appId: string, callback:AsyncCallbackWrapper) : void; + export native function nativeIsEmbeddedOpenAllowedCheck(context: Context): void; export native function nativeOn(type:string, observer: AbilityForegroundStateObserver): void; export native function nativeOff(type:string, observer?: AbilityForegroundStateObserver): void; export native function nativeNotifyDebugAssertResult(sessionId: string, status: UserStatus, callback: AsyncCallbackWrapper): void; @@ -117,6 +118,7 @@ export default namespace abilityManager { } function isEmbeddedOpenAllowed(context: Context, appId: string): Promise { + abilityManager.nativeIsEmbeddedOpenAllowedCheck(context); return new Promise((resolve:(data:boolean)=>void, reject:(err: BusinessError | null)=>void):void => { let asyncCall = new AsyncCallbackWrapper((err: BusinessError | null, data: boolean | undefined)=>{ if (err == null || err.code == 0) { diff --git a/frameworks/ets/ets/@ohos.app.ability.appManager.ets b/frameworks/ets/ets/@ohos.app.ability.appManager.ets index 8e2a1b28dae..b1b95924378 100644 --- a/frameworks/ets/ets/@ohos.app.ability.appManager.ets +++ b/frameworks/ets/ets/@ohos.app.ability.appManager.ets @@ -24,6 +24,7 @@ import bundleManager from '@ohos.bundle.bundleManager'; import _AppForegroundStateObserver from 'application.AppForegroundStateObserver'; import { AbilityFirstFrameStateObserver as _AbilityFirstFrameStateObserver } from 'application.AbilityFirstFrameStateObserver'; import { AbilityFirstFrameStateData as _AbilityFirstFrameStateData } from 'application.AbilityFirstFrameStateData'; +import { AbilityUtils } from './utils/AbilityUtils'; export default namespace appManager { loadLibrary("app_manager_ani.z") @@ -88,6 +89,9 @@ export class KeepAliveBundleInfoInner implements KeepAliveBundleInfo { export native function nativePreloadApplication(callback: AsyncCallbackWrapper, bundleName: string, userId: int, mode: PreloadMode, appIndex?: int): void; export function preloadApplication(bundleName: string, userId: int, mode: PreloadMode, appIndex?: int): Promise{ + if (mode !== PreloadMode.PRESS_DOWN) { + throw AbilityUtils.createBusinessError(401, 'Unsupported preloadMode, must be PreloadMode.PRESS_DOWN.'); + } let p:Promise = new Promise((resolve: (data:undefined)=>void, reject:(err: BusinessError | null)=>void):void => { let myCall = new AsyncCallbackWrapper((err: BusinessError | null)=>{ if (err == null || err.code == 0) { @@ -151,8 +155,10 @@ export function getForegroundApplications(): Promise> { return p; } +export native function nativeGetRunningMultiAppInfoCheck(bundleName: string): void; export native function nativeGetRunningMultiAppInfo(bundleName: string, callback: AsyncCallbackWrapper): void; export function getRunningMultiAppInfo(bundleName: string): Promise { + nativeGetRunningMultiAppInfoCheck(bundleName); let p = new Promise((resolve:(data: RunningMultiAppInfo)=>void, reject:(err: BusinessError)=>void):void => { let myCall = new AsyncCallbackWrapper((err: BusinessError | null, data: RunningMultiAppInfo | undefined)=>{ if (err == null || err.code == 0) { diff --git a/frameworks/ets/ets/@ohos.app.ability.application.ets b/frameworks/ets/ets/@ohos.app.ability.application.ets index 91f63543512..b0bbcff5634 100644 --- a/frameworks/ets/ets/@ohos.app.ability.application.ets +++ b/frameworks/ets/ets/@ohos.app.ability.application.ets @@ -31,7 +31,9 @@ export default namespace application { export native function nativeGetApplicationContext(): ApplicationContext; + export native function nativeCreateModuleContextCheck(context: Context, moduleName: string, bundleName?: string): void; export function createModuleContext(context: Context, moduleName: string): Promise { + nativeCreateModuleContextCheck(context, moduleName); let p = new Promise((resolve: (data: Context) => void, reject: (err: BusinessError) => void): void => { let myCall = new AsyncCallbackWrapper((err: BusinessError | null, data: Context | undefined) => { @@ -49,6 +51,7 @@ export default namespace application { } export function createModuleContext(context: Context, bundleName: string, moduleName: string): Promise { + nativeCreateModuleContextCheck(context, moduleName, bundleName); let p = new Promise((resolve: (data: Context) => void, reject: (err: BusinessError) => void): void => { let myCall = new AsyncCallbackWrapper((err: BusinessError | null, data: Context | undefined) => { @@ -65,7 +68,9 @@ export default namespace application { return p; } + export native function nativeCreateBundleContextCheck(context: Context, bundleName: string): void; export function createBundleContext(context: Context, bundleName: string): Promise { + nativeCreateBundleContextCheck(context, bundleName); let p = new Promise((resolve: (data: Context) => void, reject: (err: BusinessError) => void): void => { let myCall = new AsyncCallbackWrapper((err: BusinessError | null, data: Context | undefined) => { @@ -82,8 +87,11 @@ export default namespace application { return p; } - export function createPluginModuleContext(context: Context, pluginBundleName: string, + export native function nativeCreatePluginModuleContextCheck(context: Context, pluginBundleName: string, + pluginModuleName: string): void; + export function createPluginModuleContext(context: Context, pluginBundleName: string, pluginModuleName: string): Promise { + nativeCreatePluginModuleContextCheck(context, pluginBundleName, pluginModuleName); let p = new Promise((resolve: (data: Context) => void, reject: (err: BusinessError) => void): void => { let myCall = new AsyncCallbackWrapper((err: BusinessError | null, data: Context | undefined) => { diff --git a/frameworks/ets/ets/@ohos.app.ability.wantAgent.ets b/frameworks/ets/ets/@ohos.app.ability.wantAgent.ets index 8a153dac7ae..6723a2eb4ff 100644 --- a/frameworks/ets/ets/@ohos.app.ability.wantAgent.ets +++ b/frameworks/ets/ets/@ohos.app.ability.wantAgent.ets @@ -18,6 +18,7 @@ import Want from '@ohos.app.ability.Want'; import { WantAgentInfo as _WantAgentInfo } from 'wantAgent.wantAgentInfo'; import { TriggerInfo as _TriggerInfo } from 'wantAgent.triggerInfo'; import AsyncCallbackWrapper from './utils/AbilityUtils'; +import { AbilityUtils } from './utils/AbilityUtils'; namespace wantAgent { loadLibrary("aniwantagent.z"); @@ -67,9 +68,13 @@ namespace wantAgent { native function nativeEqual(agent: WantAgent, otherAgent: WantAgent, callback: AsyncCallbackWrapper): void; native function nativeTrigger(agent: WantAgent, triggerInfo: TriggerInfo, callback?: AsyncCallbackWrapper): void; native function nativeGetWant(agent: WantAgent, callback: AsyncCallbackWrapper): void; - native function nativeGetWantAgent(agent: WantAgentInfo, callback: AsyncCallbackWrapper): void; + native function nativeGetWantAgent(info: WantAgentInfo, callback: AsyncCallbackWrapper): void; + native function nativeTriggerCheck(agent: WantAgent, triggerInfo: TriggerInfo): void; export function getBundleName(agent: WantAgent, callback: AsyncCallback): void { + if (!(agent instanceof WantAgentCls)) { + throw AbilityUtils.createBusinessError(401, 'Parse pWantAgent failed. Agent must be a WantAgent.'); + } let call = new AsyncCallbackWrapper(callback); taskpool.execute((): void => { try { @@ -81,6 +86,9 @@ namespace wantAgent { } export function getBundleName(agent: WantAgent): Promise { + if (!(agent instanceof WantAgentCls)) { + throw AbilityUtils.createBusinessError(401, 'Parse pWantAgent failed. Agent must be a WantAgent.'); + } return new Promise((resolve: (data: string) => void, reject: (err: BusinessError) => void): void => { let call = new AsyncCallbackWrapper((err: BusinessError | null, data: string | undefined) => { if (err == null || err.code == 0) { @@ -100,6 +108,9 @@ namespace wantAgent { } export function getUid(agent: WantAgent, callback: AsyncCallback): void { + if (!(agent instanceof WantAgentCls)) { + throw AbilityUtils.createBusinessError(401, 'Parse pWantAgent error. Agent must be a WantAgent.'); + } let call = new AsyncCallbackWrapper(callback); taskpool.execute((): void => { try { @@ -111,6 +122,9 @@ namespace wantAgent { } export function getUid(agent: WantAgent): Promise { + if (!(agent instanceof WantAgentCls)) { + throw AbilityUtils.createBusinessError(401, 'Parse pWantAgent error. Agent must be a WantAgent.'); + } return new Promise((resolve: (data: int) => void, reject: (err: BusinessError) => void): void => { let call = new AsyncCallbackWrapper((err: BusinessError | null, data: int | undefined) => { if (err == null || err.code == 0) { @@ -130,6 +144,9 @@ namespace wantAgent { } export function getWant(agent: WantAgent, callback: AsyncCallback): void { + if (!(agent instanceof WantAgentCls)) { + throw AbilityUtils.createBusinessError(401, 'Parse wantAgent failed! Agent must be a WantAgent!'); + } let call = new AsyncCallbackWrapper(callback); taskpool.execute((): void => { try { @@ -141,6 +158,9 @@ namespace wantAgent { } export function getWant(agent: WantAgent): Promise { + if (!(agent instanceof WantAgentCls)) { + throw AbilityUtils.createBusinessError(401, 'Parse wantAgent failed! Agent must be a WantAgent!'); + } return new Promise((resolve: (data: Want) => void, reject: (err: BusinessError) => void): void => { let call = new AsyncCallbackWrapper((err: BusinessError | null, data: Want | undefined) => { if (err == null || err.code == 0) { @@ -160,6 +180,9 @@ namespace wantAgent { } export function cancel(agent: WantAgent, callback: AsyncCallback): void { + if (!(agent instanceof WantAgentCls)) { + throw AbilityUtils.createBusinessError(401, 'Parse pWantAgent error. Agent must be a WantAgent.'); + } let call = new AsyncCallbackWrapper(callback); taskpool.execute((): void => { try { @@ -171,6 +194,9 @@ namespace wantAgent { } export function cancel(agent: WantAgent): Promise { + if (!(agent instanceof WantAgentCls)) { + throw AbilityUtils.createBusinessError(401, 'Parse pWantAgent error. Agent must be a WantAgent.'); + } return new Promise((resolve: (data: undefined) => void, reject: (err: BusinessError) => void): void => { let call = new AsyncCallbackWrapper((err: BusinessError | null) => { if (err == null || err.code == 0) { @@ -190,6 +216,7 @@ namespace wantAgent { } export function trigger(agent: WantAgent, triggerInfo: TriggerInfo, callback?: AsyncCallback): void { + nativeTriggerCheck(agent, triggerInfo); taskpool.execute((): void => { if (callback == undefined) { nativeTrigger(agent, triggerInfo); @@ -205,6 +232,12 @@ namespace wantAgent { } export function equal(agent: WantAgent, otherAgent: WantAgent, callback: AsyncCallback): void { + if (!(agent instanceof WantAgentCls)) { + throw AbilityUtils.createBusinessError(401, 'Parse pWantAgentFirst failed. Agent must be a WantAgent.'); + } + if (!(otherAgent instanceof WantAgentCls)) { + throw AbilityUtils.createBusinessError(401, 'Parse pWantAgentSceond failed. OtherAgent must be a WantAgent.'); + } let call = new AsyncCallbackWrapper(callback); taskpool.execute((): void => { try { @@ -216,6 +249,12 @@ namespace wantAgent { } export function equal(agent: WantAgent, otherAgent: WantAgent): Promise { + if (!(agent instanceof WantAgentCls)) { + throw AbilityUtils.createBusinessError(401, 'Parse pWantAgentFirst failed. Agent must be a WantAgent.'); + } + if (!(otherAgent instanceof WantAgentCls)) { + throw AbilityUtils.createBusinessError(401, 'Parse pWantAgentSceond failed. OtherAgent must be a WantAgent.'); + } return new Promise((resolve: (data: boolean) => void, reject: (err: BusinessError) => void): void => { let call = new AsyncCallbackWrapper((err: BusinessError | null, data: boolean | undefined) => { @@ -267,6 +306,9 @@ namespace wantAgent { } export function getOperationType(agent: WantAgent, callback: AsyncCallback): void { + if (!(agent instanceof WantAgentCls)) { + throw AbilityUtils.createBusinessError(401, 'Parse wantAgent failed! Agent must be a WantAgent.'); + } let call = new AsyncCallbackWrapper(callback); taskpool.execute((): void => { try { @@ -278,6 +320,9 @@ namespace wantAgent { } export function getOperationType(agent: WantAgent): Promise { + if (!(agent instanceof WantAgentCls)) { + throw AbilityUtils.createBusinessError(401, 'Parse wantAgent failed! Agent must be a WantAgent.'); + } return new Promise((resolve: (data: int) => void, reject: (err: BusinessError) => void): void => { let call = new AsyncCallbackWrapper((err: BusinessError | null, data: int | undefined) => { if (err == null || err.code == 0) { diff --git a/frameworks/ets/ets/application/AbilityDelegator.ets b/frameworks/ets/ets/application/AbilityDelegator.ets index fec39c5bcea..66fe8582f7e 100644 --- a/frameworks/ets/ets/application/AbilityDelegator.ets +++ b/frameworks/ets/ets/application/AbilityDelegator.ets @@ -113,10 +113,14 @@ class AbilityDelegatorInner implements AbilityDelegator { public native nativeAddAbilityMonitor(monitor: AbilityMonitor, callback: AsyncCallbackWrapper): void; + public native addAbilityMonitorCheck(monitor: AbilityMonitor): void; + public native addAbilityMonitorSync(monitor: AbilityMonitor): void; public native removeAbilityMonitorAsync(monitor: AbilityMonitor, callback: AsyncCallbackWrapper): void; + public native removeAbilityMonitorCheck(monitor: AbilityMonitor): void; + public native removeAbilityMonitorSync(monitor: AbilityMonitor): void; public native waitAbilityMonitorAsync(monitor: AbilityMonitor, timeout: long, @@ -126,16 +130,22 @@ class AbilityDelegatorInner implements AbilityDelegator { public native addAbilityStageMonitorSync(monitor: AbilityStageMonitor): void; + public native addAbilityStageMonitorCheck(monitor: AbilityStageMonitor): void; + public native removeAbilityStageMonitorAsync(monitor: AbilityStageMonitor, callback: AsyncCallbackWrapper): void; public native removeAbilityStageMonitorSync(monitor: AbilityStageMonitor): void; + public native removeAbilityStageMonitorCheck(monitor: AbilityStageMonitor): void; + public native waitAbilityStageMonitorAsync(monitor: AbilityStageMonitor, timeout: long, callback: AsyncCallbackWrapper): void; public native doAbilityForegroundAsync(ability: UIAbility, callback: AsyncCallbackWrapper): void; + public native doAbilityForegroundOrBackgroundCheck(ability: UIAbility): void; + public native doAbilityBackgroundAsync(ability: UIAbility, callback: AsyncCallbackWrapper): void; public native printAsync(msg: string, callback: AsyncCallbackWrapper): void; @@ -205,12 +215,14 @@ class AbilityDelegatorInner implements AbilityDelegator { } addAbilityMonitor(monitor: AbilityMonitor, callback: AsyncCallback): void { + this.addAbilityMonitorCheck(monitor); let myCall = new AsyncCallbackWrapper(callback); taskpool.execute((): void => { this.nativeAddAbilityMonitor(monitor, myCall); }); } addAbilityMonitor(monitor: AbilityMonitor): Promise { + this.addAbilityMonitorCheck(monitor); let p = new Promise((resolve: (data: undefined) => void, reject: (err: BusinessError) => void): void => { let myCall = new AsyncCallbackWrapper((err: BusinessError | null) => { @@ -228,12 +240,14 @@ class AbilityDelegatorInner implements AbilityDelegator { } removeAbilityMonitor(monitor: AbilityMonitor, callback: AsyncCallback): void { + this.removeAbilityMonitorCheck(monitor); let myCall = new AsyncCallbackWrapper(callback); taskpool.execute((): void => { this.removeAbilityMonitorAsync(monitor, myCall); }); } removeAbilityMonitor(monitor: AbilityMonitor): Promise { + this.removeAbilityMonitorCheck(monitor); let p = new Promise((resolve: (data: undefined) => void, reject: (err: BusinessError) => void): void => { let myCall = new AsyncCallbackWrapper((err: BusinessError | null) => { @@ -251,6 +265,7 @@ class AbilityDelegatorInner implements AbilityDelegator { } waitAbilityMonitor(monitor: AbilityMonitor, callback: AsyncCallback): void { + this.removeAbilityMonitorCheck(monitor); let timeout = -1; let myCall = new AsyncCallbackWrapper(callback); taskpool.execute((): void => { @@ -258,12 +273,14 @@ class AbilityDelegatorInner implements AbilityDelegator { }); } waitAbilityMonitor(monitor: AbilityMonitor, timeout: long, callback: AsyncCallback): void { + this.removeAbilityMonitorCheck(monitor); let myCall = new AsyncCallbackWrapper(callback); taskpool.execute((): void => { this.waitAbilityMonitorAsync(monitor, timeout, myCall); }); } waitAbilityMonitor(monitor: AbilityMonitor, timeout?: long): Promise { + this.removeAbilityMonitorCheck(monitor); let p = new Promise((resolve: (data: UIAbility) => void, reject: (err: BusinessError) => void): void => { let myCall = new AsyncCallbackWrapper((err: BusinessError | null, data: UIAbility | undefined) => { @@ -285,12 +302,14 @@ class AbilityDelegatorInner implements AbilityDelegator { } addAbilityStageMonitor(monitor: AbilityStageMonitor, callback: AsyncCallback): void { + this.addAbilityStageMonitorCheck(monitor); let myCall = new AsyncCallbackWrapper(callback); taskpool.execute((): void => { this.addAbilityStageMonitorAsync(monitor, myCall); }); } addAbilityStageMonitor(monitor: AbilityStageMonitor): Promise { + this.addAbilityStageMonitorCheck(monitor); let p = new Promise((resolve: (data: undefined) => void, reject: (err: BusinessError) => void): void => { let myCall = new AsyncCallbackWrapper((err: BusinessError | null) => { @@ -308,12 +327,14 @@ class AbilityDelegatorInner implements AbilityDelegator { } removeAbilityStageMonitor(monitor: AbilityStageMonitor, callback: AsyncCallback): void { + this.removeAbilityStageMonitorCheck(monitor); let myCall = new AsyncCallbackWrapper(callback); taskpool.execute((): void => { this.removeAbilityStageMonitorAsync(monitor, myCall); }); } removeAbilityStageMonitor(monitor: AbilityStageMonitor): Promise { + this.removeAbilityStageMonitorCheck(monitor); let p = new Promise((resolve: (data: undefined) => void, reject: (err: BusinessError) => void): void => { let myCall = new AsyncCallbackWrapper((err: BusinessError | null) => { @@ -331,6 +352,7 @@ class AbilityDelegatorInner implements AbilityDelegator { } waitAbilityStageMonitor(monitor: AbilityStageMonitor, callback: AsyncCallback): void { + this.removeAbilityStageMonitorCheck(monitor); let timeout = -1; let myCall = new AsyncCallbackWrapper(callback); taskpool.execute((): void => { @@ -339,12 +361,14 @@ class AbilityDelegatorInner implements AbilityDelegator { } waitAbilityStageMonitor(monitor: AbilityStageMonitor, timeout: long, callback: AsyncCallback): void { + this.removeAbilityStageMonitorCheck(monitor); let myCall = new AsyncCallbackWrapper(callback); taskpool.execute((): void => { this.waitAbilityStageMonitorAsync(monitor, timeout, myCall); }); } waitAbilityStageMonitor(monitor: AbilityStageMonitor, timeout?: long): Promise { + this.removeAbilityStageMonitorCheck(monitor); let p = new Promise((resolve: (data: AbilityStage) => void, reject: (err: BusinessError) => void): void => { let myCall = @@ -367,12 +391,14 @@ class AbilityDelegatorInner implements AbilityDelegator { } doAbilityForeground(ability: UIAbility, callback: AsyncCallback): void { + this.doAbilityForegroundOrBackgroundCheck(ability); let myCall = new AsyncCallbackWrapper(callback); taskpool.execute((): void => { this.doAbilityForegroundAsync(ability, myCall); }); } doAbilityForeground(ability: UIAbility): Promise { + this.doAbilityForegroundOrBackgroundCheck(ability); let p: Promise = new Promise((resolve: (data: undefined) => void, reject: (err: BusinessError) => void): void => { let myCall = new AsyncCallbackWrapper((err: BusinessError | null) => { @@ -390,12 +416,14 @@ class AbilityDelegatorInner implements AbilityDelegator { } doAbilityBackground(ability: UIAbility, callback: AsyncCallback): void { + this.doAbilityForegroundOrBackgroundCheck(ability); let myCall = new AsyncCallbackWrapper(callback); taskpool.execute((): void => { this.doAbilityBackgroundAsync(ability, myCall); }); } doAbilityBackground(ability: UIAbility): Promise { + this.doAbilityForegroundOrBackgroundCheck(ability); let p: Promise = new Promise((resolve: (data: undefined) => void, reject: (err: BusinessError) => void): void => { let myCall = new AsyncCallbackWrapper((err: BusinessError | null) => { diff --git a/frameworks/ets/ets/application/ApplicationContext.ets b/frameworks/ets/ets/application/ApplicationContext.ets index 2b671931462..1dcb50abb24 100644 --- a/frameworks/ets/ets/application/ApplicationContext.ets +++ b/frameworks/ets/ets/application/ApplicationContext.ets @@ -23,6 +23,7 @@ import { ProcessInformation } from 'application.ProcessInformation'; import ConfigurationConstant from '@ohos.app.ability.ConfigurationConstant'; import EnvironmentCallback from '@ohos.app.ability.EnvironmentCallback'; import type ApplicationStateChangeCallback from '@ohos.app.ability.ApplicationStateChangeCallback'; +import { AbilityUtils } from '../utils/AbilityUtils'; class Cleaner { public ptr: long = 0; @@ -68,6 +69,7 @@ export default class ApplicationContext extends Context { public native nativeOnLifecycleCallbackSync(type: string, callback: AbilityLifecycleCallback): int; public native nativeOffLifecycleCallbackSync(type: string, callbackId: int, callback: AsyncCallbackWrapper): void; + public native nativeOffAbilityLifecycleCheck(): void; public native nativekillAllProcessesSync(clearPageStack: boolean, callback: AsyncCallbackWrapper): void; public native nativepreloadUIExtensionAbilitySync(want: Want, callback: AsyncCallbackWrapper): void; public native setSupportedProcessCacheSync(isSupported : boolean):void; @@ -81,6 +83,7 @@ export default class ApplicationContext extends Context { public native nativeGetAllRunningInstanceKeys(callback: AsyncCallbackWrapper>): void; public native nativeOnEnvironmentSync(callback: EnvironmentCallback): int; public native nativeOffEnvironmentSync(callbackId: int, callback: AsyncCallbackWrapper): void; + public native nativeOffEnvironmentCheck(): void; public native nativeOnApplicationStateChangeSync(callback: ApplicationStateChangeCallback): void; public native nativeOffApplicationStateChangeSync(callback?: ApplicationStateChangeCallback): void; public native nativegetCurrentAppCloneIndex(): int; @@ -243,6 +246,13 @@ export default class ApplicationContext extends Context { off(type: string, callbackId: int, callback: AsyncCallback): void { let myCall = new AsyncCallbackWrapper(callback); + if (type == 'environment') { + this.nativeOffEnvironmentCheck(); + } else if (type == 'abilityLifecycle') { + this.nativeOffAbilityLifecycleCheck(); + } else { + throw AbilityUtils.createBusinessError(401, 'Parse param callback failed, callback must be function.'); + } taskpool.execute((): void => { if (type == 'environment') { this.nativeOffEnvironmentSync(callbackId, myCall); @@ -253,6 +263,13 @@ export default class ApplicationContext extends Context { } off(type: string, callbackId: int): Promise { + if (type == 'environment') { + this.nativeOffEnvironmentCheck(); + } else if (type == 'abilityLifecycle') { + this.nativeOffAbilityLifecycleCheck(); + } else { + throw AbilityUtils.createBusinessError(401, 'Parse param callback failed, callback must be function.'); + } let p = new Promise((resolve: (data: undefined) => void, reject: (err: BusinessError) => void): void => { let myCall = new AsyncCallbackWrapper((err: BusinessError | null) => { diff --git a/frameworks/ets/ets/application/UIAbilityContext.ets b/frameworks/ets/ets/application/UIAbilityContext.ets index c32fcd8672c..4d521a73e27 100644 --- a/frameworks/ets/ets/application/UIAbilityContext.ets +++ b/frameworks/ets/ets/application/UIAbilityContext.ets @@ -185,6 +185,16 @@ export default class UIAbilityContext extends Context { private native nativeStartAbilityAsCaller(want: Want, callback: AsyncCallbackWrapper, options?: StartOptions): void; private native nativeStartRecentAbility(want: Want, callback: AsyncCallbackWrapper, options?: StartOptions): void; + + private native nativeOpenLinkCheck(link: string): void; + + private native nativeOpenAtomicServiceCheck(): void; + + private native nativeSetAbilityInstanceInfoCheck(icon: image.PixelMap): void; + + private native nativeSetMissionIconCheck(icon: image.PixelMap): void; + + private native nativeStartAbilityForResultWithAccountCheck(): void; startAbility(want: Want, callback: AsyncCallback): void { let myCall = new AsyncCallbackWrapper(callback); @@ -338,6 +348,7 @@ export default class UIAbilityContext extends Context { } openLink(link: string, options?: OpenLinkOptions, callback?: AsyncCallback): Promise { + this.nativeOpenLinkCheck(link); return new Promise((resolve: (data: undefined) => void, reject: (err: BusinessError) => void): void => { let myCall = new AsyncCallbackWrapper((err: BusinessError | null) => { if (err == null || err.code == 0) { @@ -540,6 +551,7 @@ hideAbility(): Promise { } openAtomicService(appId: string, options?: AtomicServiceOptions): Promise { + this.nativeOpenAtomicServiceCheck(); return new Promise((resolve: (data: AbilityResult) => void, reject: (err: BusinessError) => void): void => { let asyncCall = new AsyncCallbackWrapper((err: BusinessError | null, data: AbilityResult | undefined) => { if (err == null || err.code == 0) { @@ -555,6 +567,7 @@ hideAbility(): Promise { } setAbilityInstanceInfo(label: string, icon: image.PixelMap): Promise { + this.nativeSetAbilityInstanceInfoCheck(icon); let p:Promise = new Promise((resolve: (data:undefined)=>void, reject: (err: BusinessError)=>void):void => { let syncCall = new AsyncCallbackWrapper((err: BusinessError | null)=>{ if (err == null || err.code == 0) { @@ -650,6 +663,7 @@ hideAbility(): Promise { } setMissionIcon(icon: image.PixelMap, callback: AsyncCallback): void { + this.nativeSetMissionIconCheck(icon); let syncCall = new AsyncCallbackWrapper(callback); taskpool.execute((): void => { this.nativeSetMissionIcon(icon, syncCall); @@ -657,6 +671,7 @@ hideAbility(): Promise { } setMissionIcon(icon: image.PixelMap): Promise { + this.nativeSetMissionIconCheck(icon); let p = new Promise((resolve: (data: undefined) => void, reject: (err: BusinessError) => void): void => { let callback = new AsyncCallbackWrapper((err: BusinessError | null) => { if (err == null || err.code == 0) { @@ -749,6 +764,7 @@ hideAbility(): Promise { } startAbilityForResultWithAccount(want: Want, accountId: int, callback: AsyncCallback): void { + this.nativeStartAbilityForResultWithAccountCheck(); let myCall = new AsyncCallbackWrapper(callback); taskpool.execute((): void => { this.nativeStartAbilityForResultWithAccount(want, accountId, myCall); @@ -757,6 +773,7 @@ hideAbility(): Promise { startAbilityForResultWithAccount(want: Want, accountId: int, options: StartOptions, callback: AsyncCallback): void { + this.nativeStartAbilityForResultWithAccountCheck(); let myCall = new AsyncCallbackWrapper(callback); taskpool.execute((): void => { this.nativeStartAbilityForResultWithAccountVoid(want, accountId, options, myCall); @@ -764,6 +781,7 @@ hideAbility(): Promise { } startAbilityForResultWithAccount(want: Want, accountId: int, options?: StartOptions): Promise { + this.nativeStartAbilityForResultWithAccountCheck(); let p = new Promise((resolve: (data: AbilityResult) => void, reject: (err: BusinessError) => void): void => { let myCall = diff --git a/frameworks/ets/ets/application/UIExtensionContext.ets b/frameworks/ets/ets/application/UIExtensionContext.ets index 6f2d70e1c4e..ffe27493cfb 100644 --- a/frameworks/ets/ets/application/UIExtensionContext.ets +++ b/frameworks/ets/ets/application/UIExtensionContext.ets @@ -73,9 +73,10 @@ export default class UIExtensionContext extends ExtensionContext { native nativeReportDrawnCompleted(callback:AsyncCallbackWrapper): void; private native nativeOpenLinkSync(link: string, syncCallback:AsyncCallbackWrapper, options?: OpenLinkOptions, callback?: AsyncCallbackWrapper): void; + private native nativeOpenLinkCheck(link: string): void; private native nativeOpenAtomicService(appId: string, syncCallback: AsyncCallbackWrapper, options?: AtomicServiceOptions): void; - + private native nativeOpenAtomicServiceCheck(): void; terminateSelf(callback:AsyncCallback): void { let myCall = new AsyncCallbackWrapper(callback); taskpool.execute((): void => { @@ -288,6 +289,7 @@ export default class UIExtensionContext extends ExtensionContext { } openLink(link: string, options?: OpenLinkOptions, callback?: AsyncCallback): Promise { + this.nativeOpenLinkCheck(link); return new Promise((resolve: (data: undefined) => void, reject: (err: BusinessError) => void): void => { let finalOptions: OpenLinkOptions | undefined = undefined; if (options) { @@ -311,6 +313,7 @@ export default class UIExtensionContext extends ExtensionContext { } openAtomicService(appId: string, options?: AtomicServiceOptions): Promise { + this.nativeOpenAtomicServiceCheck(); return new Promise((resolve: (data: AbilityResult) => void, reject: (err: BusinessError) => void): void => { let syncCall = new AsyncCallbackWrapper((err: BusinessError | null, data: AbilityResult | undefined) => { if (err == null || err.code == 0) { diff --git a/frameworks/ets/ets/utils/AbilityUtils.ets b/frameworks/ets/ets/utils/AbilityUtils.ets index d59f826b595..5994bf494ba 100644 --- a/frameworks/ets/ets/utils/AbilityUtils.ets +++ b/frameworks/ets/ets/utils/AbilityUtils.ets @@ -71,4 +71,12 @@ export class AbilityUtils { } return false; } + + public static createBusinessError(code: int, message: string) { + let err = new BusinessError(); + err.code = code; + err.name = 'Error'; + err.message = message; + return err; + } } diff --git a/frameworks/native/insight_intent/insight_intent_context/ets_insight_intent_context.cpp b/frameworks/native/insight_intent/insight_intent_context/ets_insight_intent_context.cpp index 62a7cb80c95..04155b41a34 100644 --- a/frameworks/native/insight_intent/insight_intent_context/ets_insight_intent_context.cpp +++ b/frameworks/native/insight_intent/insight_intent_context/ets_insight_intent_context.cpp @@ -32,7 +32,20 @@ void EtsInsightIntentContext::Finalizer(ani_env *env, void *data, void *hint) std::unique_ptr(static_cast(data)); } -ani_object EtsInsightIntentContext::StartAbiitySync(ani_env *env, ani_object aniObj, ani_object wantObj) +void EtsInsightIntentContext::StartAbilitySyncCheck(ani_env *env, ani_object aniObj) +{ + if (env == nullptr) { + TAG_LOGE(AAFwkTag::INTENT, "null env"); + return; + } + auto context = GetContext(env, aniObj); + if (context == nullptr) { + TAG_LOGE(AAFwkTag::INTENT, "null context"); + EtsErrorUtil::ThrowError(env, AbilityErrorCode::ERROR_CODE_INNER); + } +} + +ani_object EtsInsightIntentContext::StartAbilitySync(ani_env *env, ani_object aniObj, ani_object wantObj) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); auto context = GetContext(env, aniObj); @@ -130,7 +143,9 @@ std::unique_ptr CreateEtsInsightIntentContext(an } std::array functions = { ani_native_function { "nativeStartAbilitySync", nullptr, - reinterpret_cast(EtsInsightIntentContext::StartAbiitySync) }, + reinterpret_cast(EtsInsightIntentContext::StartAbilitySync) }, + ani_native_function { "nativeStartAbilitySyncCheck", nullptr, + reinterpret_cast(EtsInsightIntentContext::StartAbilitySyncCheck) }, }; if ((status = env->Class_BindNativeMethods(cls, functions.data(), functions.size())) != ANI_OK) { if (status != ANI_ALREADY_BINDED) { diff --git a/interfaces/inner_api/insight_intent/insight_intent_context/ets_insight_intent_context.h b/interfaces/inner_api/insight_intent/insight_intent_context/ets_insight_intent_context.h index ee211cc4cb4..7d4412ce2cf 100644 --- a/interfaces/inner_api/insight_intent/insight_intent_context/ets_insight_intent_context.h +++ b/interfaces/inner_api/insight_intent/insight_intent_context/ets_insight_intent_context.h @@ -42,7 +42,8 @@ public: * * @return result of StartAbility. */ - static ani_object StartAbiitySync(ani_env *env, ani_object aniObj, ani_object wantObj); + static ani_object StartAbilitySync(ani_env *env, ani_object aniObj, ani_object wantObj); + static void StartAbilitySyncCheck(ani_env *env, ani_object aniObj); static EtsInsightIntentContext *GetContext(ani_env *env, ani_object aniObj); private: -- Gitee