From 3ff558a8ab2ea00019b35651965fba596d75a533 Mon Sep 17 00:00:00 2001 From: zhangzezhong Date: Tue, 5 Aug 2025 19:52:52 +0800 Subject: [PATCH] add getUIExtensionWindowProxy Signed-off-by: zhangzezhong --- .../ani/ani_common/include/ani_common_util.h | 1 + .../ani/ani_common/src/ani_common_util.cpp | 12 ++++ .../ani/ani_common/src/ets_context_utils.cpp | 8 +-- .../ani/app_manager/src/ets_app_manager.cpp | 17 +---- .../ets_ui_extension_content_session.h | 4 +- .../src/ets_ui_extension_content_session.cpp | 66 ++++++++++++++----- .../ets/ani/wantagent/src/ani_want_agent.cpp | 14 +--- ....app.ability.UIExtensionContentSession.ets | 2 + 8 files changed, 74 insertions(+), 50 deletions(-) diff --git a/frameworks/ets/ani/ani_common/include/ani_common_util.h b/frameworks/ets/ani/ani_common/include/ani_common_util.h index ed447d00ce8..5cac429408d 100644 --- a/frameworks/ets/ani/ani_common/include/ani_common_util.h +++ b/frameworks/ets/ani/ani_common/include/ani_common_util.h @@ -85,6 +85,7 @@ bool SetRefProperty(ani_env *env, ani_object param, const char *name, ani_ref va bool GetStaticFieldString(ani_env *env, ani_class classObj, const char *fieldName, std::string &value); bool IsValidProperty(ani_env *env, ani_ref param); +bool CheckCallerIsSystemApp(); } // namespace AppExecFwk } // namespace OHOS #endif // OHOS_ABILITY_RUNTIME_ANI_COMMON_UTIL_H diff --git a/frameworks/ets/ani/ani_common/src/ani_common_util.cpp b/frameworks/ets/ani/ani_common/src/ani_common_util.cpp index e0188c9ed39..ce8478c4295 100644 --- a/frameworks/ets/ani/ani_common/src/ani_common_util.cpp +++ b/frameworks/ets/ani/ani_common/src/ani_common_util.cpp @@ -19,7 +19,9 @@ #include "ani_enum_convert.h" #include "running_process_info.h" #include "hilog_tag_wrapper.h" +#include "ipc_skeleton.h" #include "securec.h" +#include "tokenid_kit.h" namespace OHOS { namespace AppExecFwk { @@ -1412,5 +1414,15 @@ bool IsValidProperty(ani_env *env, ani_ref param) } return true; } + +bool CheckCallerIsSystemApp() +{ + auto selfToken = IPCSkeleton::GetSelfTokenID(); + if (!Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(selfToken)) { + TAG_LOGE(AAFwkTag::ANI, "Non-system app forbidden to call"); + return false; + } + return true; +} } // namespace AppExecFwk } // namespace OHOS diff --git a/frameworks/ets/ani/ani_common/src/ets_context_utils.cpp b/frameworks/ets/ani/ani_common/src/ets_context_utils.cpp index f8f48fafc7d..cb24b70d979 100644 --- a/frameworks/ets/ani/ani_common/src/ets_context_utils.cpp +++ b/frameworks/ets/ani/ani_common/src/ets_context_utils.cpp @@ -386,12 +386,6 @@ std::shared_ptr GetBaseContext(ani_env *env, ani_object aniObj) return weakContext != nullptr ? weakContext->lock() : nullptr; } -bool CheckCallerIsSystemApp() -{ - auto selfToken = IPCSkeleton::GetSelfTokenID(); - return Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(selfToken); -} - ani_object CreateModuleResourceManagerSync(ani_env *env, ani_object aniObj, ani_string bundleName, ani_string moduleName) { @@ -409,7 +403,7 @@ ani_object CreateModuleResourceManagerSync(ani_env *env, ani_object aniObj, EtsErrorUtil::ThrowError(env, AbilityErrorCode::ERROR_CODE_INVALID_PARAM); return nullptr; } - if (!CheckCallerIsSystemApp()) { + if (!AppExecFwk::CheckCallerIsSystemApp()) { TAG_LOGE(AAFwkTag::APPKIT, "not system-app"); EtsErrorUtil::ThrowError(env, AbilityErrorCode::ERROR_CODE_NOT_SYSTEM_APP); return nullptr; 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 5a65cfead8e..e094ed923b2 100644 --- a/frameworks/ets/ani/app_manager/src/ets_app_manager.cpp +++ b/frameworks/ets/ani/app_manager/src/ets_app_manager.cpp @@ -107,9 +107,6 @@ public: private: static sptr GetAppManagerInstance(); static sptr GetAbilityManagerInstance(); -#ifdef SUPPORT_SCREEN - static bool CheckCallerIsSystemApp(); -#endif static bool CheckOnOnApplicationStateInnerParam(ani_env *env, ani_string type, ani_object observer, ani_object etsBundleNameList, std::vector &bundleNameList); static ani_int OnOnApplicationStateInner( @@ -146,14 +143,6 @@ sptr EtsAppManager::GetAbilityManagerInstance() return iface_cast(abilityObject); } -#ifdef SUPPORT_SCREEN -bool EtsAppManager::CheckCallerIsSystemApp() -{ - auto selfToken = IPCSkeleton::GetSelfTokenID(); - return Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(selfToken); -} -#endif - void EtsAppManager::PreloadApplication(ani_env *env, ani_object callback, ani_string aniBundleName, ani_int aniUserId, ani_enum_item aniMode, ani_object aniAppIndex) { @@ -296,7 +285,7 @@ void EtsAppManager::GetRunningMultiAppInfo(ani_env *env, ani_string aniBundleNam } ani_object emptyMultiAppInfo = CreateEmptyMultiAppInfo(env); #ifdef SUPPORT_SCREEN - if (!CheckCallerIsSystemApp()) { + if (!AppExecFwk::CheckCallerIsSystemApp()) { TAG_LOGE(AAFwkTag::APPMGR, "Non-system app"); AppExecFwk::AsyncCallback(env, callback, AbilityRuntime::EtsErrorUtil::CreateError( @@ -1131,7 +1120,7 @@ void EtsAppManager::OnOnAbilityFirstFrameState( TAG_LOGE(AAFwkTag::APPMGR, "env null ptr"); return; } - if (!CheckCallerIsSystemApp()) { + if (!AppExecFwk::CheckCallerIsSystemApp()) { TAG_LOGE(AAFwkTag::APPMGR, "Non-system app"); AbilityRuntime::EtsErrorUtil::ThrowError(env, AbilityRuntime::AbilityErrorCode::ERROR_CODE_NOT_SYSTEM_APP); return; @@ -1219,7 +1208,7 @@ void EtsAppManager::OnOffAbilityFirstFrameState(ani_env *env, ani_string type, a TAG_LOGE(AAFwkTag::APPMGR, "env null ptr"); return; } - if (!CheckCallerIsSystemApp()) { + if (!AppExecFwk::CheckCallerIsSystemApp()) { TAG_LOGE(AAFwkTag::APPMGR, "Non-system app"); AbilityRuntime::EtsErrorUtil::ThrowError(env, AbilityRuntime::AbilityErrorCode::ERROR_CODE_NOT_SYSTEM_APP); return; diff --git a/frameworks/ets/ani/ui_extension_ability/include/ets_ui_extension_content_session.h b/frameworks/ets/ani/ui_extension_ability/include/ets_ui_extension_content_session.h index 2e4ffae1c19..a980605ce5a 100644 --- a/frameworks/ets/ani/ui_extension_ability/include/ets_ui_extension_content_session.h +++ b/frameworks/ets/ani/ui_extension_ability/include/ets_ui_extension_content_session.h @@ -83,6 +83,7 @@ public: static void NativeSetReceiveDataCallback(ani_env *env, ani_object clsObj, ani_object funcObj); static void NativeSetReceiveDataForResultCallback(ani_env *env, ani_object clsObj, ani_object funcObj); static ani_object NativeGetUIExtensionHostWindowProxy(ani_env *env, ani_object obj); + static ani_object NativeGetUIExtensionWindowProxy(ani_env *env, ani_object obj); static ani_object NativeStartAbilityByTypeSync( ani_env *env, ani_object obj, ani_string type, ani_ref wantParam, ani_object startCallback); @@ -91,7 +92,6 @@ public: void TerminateSelf(); int32_t TerminateSelfWithResult(); void SetWindowBackgroundColor(ani_env *env, ani_string color); - ani_object GetUIExtensionHostWindowProxy(ani_env *env, ani_object object); void SetReceiveDataCallback(ani_env *env, ani_object functionObj); static void CallReceiveDataCallback(ani_vm *vm, ani_ref callbackRef, const AAFwk::WantParams &wantParams); void SetReceiveDataForResultCallback(ani_env *env, ani_object object); @@ -107,6 +107,8 @@ private: ani_object StartAbilityByTypeSync(ani_env *env, ani_string aniType, ani_ref aniWantParam, ani_object startCallback); bool CheckStartAbilityByTypeParam( ani_env *env, ani_string aniType, ani_ref aniWantParam, std::string &type, AAFwk::WantParams &wantParam); + ani_object GetUIExtensionHostWindowProxy(ani_env *env, ani_object object); + ani_object GetUIExtensionWindowProxy(ani_env *env, ani_object object); sptr sessionInfo_; sptr uiWindow_; diff --git a/frameworks/ets/ani/ui_extension_ability/src/ets_ui_extension_content_session.cpp b/frameworks/ets/ani/ui_extension_ability/src/ets_ui_extension_content_session.cpp index 7c1778944f5..66605f4408b 100644 --- a/frameworks/ets/ani/ui_extension_ability/src/ets_ui_extension_content_session.cpp +++ b/frameworks/ets/ani/ui_extension_ability/src/ets_ui_extension_content_session.cpp @@ -47,6 +47,10 @@ const std::string FLAG_AUTH_READ_URI_PERMISSION = "ability.want.params.uriPermis constexpr const char *SIGNATURE_START_ABILITY_BY_TYPE = "Lstd/core/String;Lescompat/Record;Lapplication/AbilityStartCallback/AbilityStartCallback;:L@ohos/base/" "BusinessError;"; +constexpr const char *SIGNATURE_GET_UI_EXTENSION_HOST_WINDOW_PROXY = + ":L@ohos/uiExtensionHost/uiExtensionHost/UIExtensionHostWindowProxy;"; +constexpr const char *SIGNATURE_GET_UI_EXTENSION_WINDOW_PROXY = + ":L@ohos/arkui/uiExtension/uiExtension/WindowProxy;"; } // namespace EtsUIExtensionContentSession* EtsUIExtensionContentSession::GetEtsContentSession(ani_env *env, ani_object obj) @@ -170,22 +174,32 @@ void EtsUIExtensionContentSession::NativeSetWindowBackgroundColor(ani_env *env, ani_object EtsUIExtensionContentSession::NativeGetUIExtensionHostWindowProxy(ani_env *env, ani_object obj) { auto etsContentSession = EtsUIExtensionContentSession::GetEtsContentSession(env, obj); - ani_object object = nullptr; - if (etsContentSession != nullptr) { - object = etsContentSession->GetUIExtensionHostWindowProxy(env, obj); + if (etsContentSession == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null etsContentSession"); + return nullptr; } - return object; + return etsContentSession->GetUIExtensionHostWindowProxy(env, obj); +} + +ani_object EtsUIExtensionContentSession::NativeGetUIExtensionWindowProxy(ani_env *env, ani_object obj) +{ + auto etsContentSession = EtsUIExtensionContentSession::GetEtsContentSession(env, obj); + if (etsContentSession == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null etsContentSession"); + return nullptr; + } + return etsContentSession->GetUIExtensionWindowProxy(env, obj); } ani_object EtsUIExtensionContentSession::NativeStartAbilityByTypeSync( ani_env *env, ani_object obj, ani_string type, ani_ref wantParam, ani_object startCallback) { auto etsContentSession = EtsUIExtensionContentSession::GetEtsContentSession(env, obj); - ani_object object = nullptr; - if (etsContentSession != nullptr) { - object = etsContentSession->StartAbilityByTypeSync(env, type, wantParam, startCallback); + if (etsContentSession == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null etsContentSession"); + return nullptr; } - return object; + return etsContentSession->StartAbilityByTypeSync(env, type, wantParam, startCallback); } EtsUIExtensionContentSession::EtsUIExtensionContentSession( @@ -277,8 +291,10 @@ ani_object EtsUIExtensionContentSession::CreateEtsUIExtensionContentSession(ani_ reinterpret_cast(EtsUIExtensionContentSession::NativeTerminateSelfWithResult)}, ani_native_function {"setWindowBackgroundColor", nullptr, reinterpret_cast(EtsUIExtensionContentSession::NativeSetWindowBackgroundColor)}, - ani_native_function {"getUIExtensionHostWindowProxy", nullptr, + ani_native_function {"getUIExtensionHostWindowProxy", SIGNATURE_GET_UI_EXTENSION_HOST_WINDOW_PROXY, reinterpret_cast(EtsUIExtensionContentSession::NativeGetUIExtensionHostWindowProxy)}, + ani_native_function {"getUIExtensionWindowProxy", SIGNATURE_GET_UI_EXTENSION_WINDOW_PROXY, + reinterpret_cast(EtsUIExtensionContentSession::NativeGetUIExtensionWindowProxy)}, ani_native_function {"nativeSetReceiveDataCallback", nullptr, reinterpret_cast(EtsUIExtensionContentSession::NativeSetReceiveDataCallback)}, ani_native_function {"nativeSetReceiveDataForResultCallback", nullptr, @@ -387,25 +403,43 @@ void EtsUIExtensionContentSession::SetWindowBackgroundColor(ani_env *env, ani_st ani_object EtsUIExtensionContentSession::GetUIExtensionHostWindowProxy(ani_env *env, ani_object object) { - TAG_LOGD(AAFwkTag::UI_EXT, "called"); + TAG_LOGD(AAFwkTag::UI_EXT, "GetUIExtensionHostWindowProxy called"); + if (!AppExecFwk::CheckCallerIsSystemApp()) { + TAG_LOGE(AAFwkTag::UI_EXT, "This application is not system-app, can not use system-api"); + EtsErrorUtil::ThrowError(env, AbilityErrorCode::ERROR_CODE_NOT_SYSTEM_APP); + return nullptr; + } if (sessionInfo_ == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null sessionInfo_"); EtsErrorUtil::ThrowError(env, AbilityErrorCode::ERROR_CODE_INNER); return nullptr; } - ani_object etsExtensionWindow = nullptr; - etsExtensionWindow = + ani_object etsExtensionWindow = Rosen::AniExtensionWindow::CreateAniExtensionWindow(env, uiWindow_, sessionInfo_->hostWindowId); if (etsExtensionWindow == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null etsExtensionWindow"); EtsErrorUtil::ThrowError(env, AbilityErrorCode::ERROR_CODE_INNER); return nullptr; } - ani_ref resultRef = nullptr; - ani_status status = ANI_ERROR; - if ((status = env->GlobalReference_Create(etsExtensionWindow, &resultRef)) != ANI_OK) { + return etsExtensionWindow; +} + +ani_object EtsUIExtensionContentSession::GetUIExtensionWindowProxy(ani_env *env, ani_object object) +{ + TAG_LOGD(AAFwkTag::UI_EXT, "GetUIExtensionWindowProxy called"); + if (sessionInfo_ == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null sessionInfo_"); + EtsErrorUtil::ThrowError(env, AbilityErrorCode::ERROR_CODE_INNER); + return nullptr; + } + ani_object etsExtensionWindow = + Rosen::AniExtensionWindow::CreateAniExtensionWindow(env, uiWindow_, sessionInfo_->hostWindowId); + if (etsExtensionWindow == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null etsExtensionWindow"); EtsErrorUtil::ThrowError(env, AbilityErrorCode::ERROR_CODE_INNER); return nullptr; } - return reinterpret_cast(resultRef); + return etsExtensionWindow; } void EtsUIExtensionContentSession::SetReceiveDataCallback(ani_env *env, ani_object functionObj) diff --git a/frameworks/ets/ani/wantagent/src/ani_want_agent.cpp b/frameworks/ets/ani/wantagent/src/ani_want_agent.cpp index ce4634f7dcf..88d10cf7104 100644 --- a/frameworks/ets/ani/wantagent/src/ani_want_agent.cpp +++ b/frameworks/ets/ani/wantagent/src/ani_want_agent.cpp @@ -35,16 +35,6 @@ constexpr int32_t PARAMETER_ERROR = -1; constexpr const char* COMPLETE_DATA_IMPL_CLASS_NAME = "L@ohos/app/ability/wantAgent/wantAgent/CompleteDataImpl;"; constexpr const char* WANT_AGENT_NAMESPACE = "L@ohos/app/ability/wantAgent/wantAgent;"; constexpr const char* CLEANER_CLASS = "L@ohos/app/ability/wantAgent/wantAgent/Cleaner;"; - -bool CheckCallerIsSystemApp() -{ - auto selfToken = IPCSkeleton::GetSelfTokenID(); - if (!Security::AccessToken::TokenIdKit::IsSystemAppByFullTokenID(selfToken)) { - TAG_LOGE(AAFwkTag::WANTAGENT, "Non-system app forbidden to call"); - return false; - } - return true; -} } // namespace TriggerCompleteCallBack::TriggerCompleteCallBack() @@ -314,7 +304,7 @@ void EtsWantAgent::OnGetWant(ani_env *env, ani_object agent, ani_object call) return; } WantAgent* pWantAgent = nullptr; - if (!CheckCallerIsSystemApp()) { + if (!AppExecFwk::CheckCallerIsSystemApp()) { TAG_LOGE(AAFwkTag::WANTAGENT, "Non-system app"); EtsErrorUtil::ThrowError(env, ERR_ABILITY_RUNTIME_NOT_SYSTEM_APP, AbilityRuntimeErrorUtil::GetErrMessage(ERR_ABILITY_RUNTIME_NOT_SYSTEM_APP)); @@ -567,7 +557,7 @@ int32_t EtsWantAgent::GetTriggerInfo(ani_env *env, ani_object triggerInfoObj, Tr } std::shared_ptr startOptions = nullptr; if (!isUndefined) { - if (!CheckCallerIsSystemApp()) { + if (!AppExecFwk::CheckCallerIsSystemApp()) { TAG_LOGE(AAFwkTag::WANTAGENT, "Non-system app"); EtsErrorUtil::ThrowError(env, ERR_ABILITY_RUNTIME_NOT_SYSTEM_APP, AbilityRuntimeErrorUtil::GetErrMessage(ERR_ABILITY_RUNTIME_NOT_SYSTEM_APP)); diff --git a/frameworks/ets/ets/@ohos.app.ability.UIExtensionContentSession.ets b/frameworks/ets/ets/@ohos.app.ability.UIExtensionContentSession.ets index 266dbed17a1..0d5b7bdabc9 100644 --- a/frameworks/ets/ets/@ohos.app.ability.UIExtensionContentSession.ets +++ b/frameworks/ets/ets/@ohos.app.ability.UIExtensionContentSession.ets @@ -20,6 +20,7 @@ import uiExtensionHost from '@ohos.uiExtensionHost'; import { LocalStorage } from '@ohos.arkui.stateManagement'; import AsyncCallbackWrapper from './utils/AbilityUtils'; import AbilityStartCallback from 'application.AbilityStartCallback'; +import uiExtension from '@ohos.arkui.uiExtension'; class Cleaner { static callback(cleaner: Cleaner): void { @@ -54,6 +55,7 @@ export default class UIExtensionContentSession { native loadContent(path: string, storage?: LocalStorage): void; native setWindowBackgroundColor(color: string): void; native getUIExtensionHostWindowProxy(): uiExtensionHost.UIExtensionHostWindowProxy; + native getUIExtensionWindowProxy(): uiExtension.WindowProxy; native nativeSetReceiveDataCallback(callback: (data: Record) => void): void; native nativeSetReceiveDataForResultCallback(callback: (data: Record) => Record): void; native terminateSelfSync(callback:AsyncCallbackWrapper): void; -- Gitee