From affbb3acddb8962e948f1ea9a1991f6d2a08ac43 Mon Sep 17 00:00:00 2001 From: wuliushuan Date: Sat, 12 Apr 2025 15:26:59 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9D=83=E9=99=90=E5=BC=B9=E7=AA=97=E6=94=AF?= =?UTF-8?q?=E6=8C=81windowId=E5=8F=AF=E8=A1=8C=E6=80=A7=E6=B5=8B=E8=AF=952?= =?UTF-8?q?0250412?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wuliushuan Change-Id: Ie0f25860bbceeb9195b432c425b2de5d5ed40414 --- frameworks/js/napi/accesstoken/BUILD.gn | 1 + .../napi/accesstoken/src/napi_atmanager.cpp | 2 + .../src/napi_request_permission.cpp | 52 ++++++++++++++++++- .../include/napi_request_permission.h | 3 ++ 4 files changed, 57 insertions(+), 1 deletion(-) diff --git a/frameworks/js/napi/accesstoken/BUILD.gn b/frameworks/js/napi/accesstoken/BUILD.gn index 6cebe5c4c..19f7ca5db 100644 --- a/frameworks/js/napi/accesstoken/BUILD.gn +++ b/frameworks/js/napi/accesstoken/BUILD.gn @@ -60,6 +60,7 @@ ohos_shared_library("libabilityaccessctrl") { "init:libbegetutil", "ipc:ipc_single", "napi:ace_napi", + "window_manager:libwm", ] if (eventhandler_enable == true) { diff --git a/frameworks/js/napi/accesstoken/src/napi_atmanager.cpp b/frameworks/js/napi/accesstoken/src/napi_atmanager.cpp index fb96bff4c..7fcf69786 100644 --- a/frameworks/js/napi/accesstoken/src/napi_atmanager.cpp +++ b/frameworks/js/napi/accesstoken/src/napi_atmanager.cpp @@ -238,6 +238,8 @@ napi_value NapiAtManager::Init(napi_env env, napi_value exports) DECLARE_NAPI_FUNCTION("requestPermissionOnSetting", NapiRequestPermissionOnSetting::RequestPermissionOnSetting), DECLARE_NAPI_FUNCTION("requestGlobalSwitch", NapiRequestGlobalSwitch::RequestGlobalSwitch), DECLARE_NAPI_FUNCTION("requestPermissionOnApplicationSetting", RequestAppPermOnSetting), + DECLARE_NAPI_FUNCTION("requestPermissionsFromUserWindow", + NapiRequestPermission::RequestPermissionsFromUserWindow), }; napi_value cons = nullptr; diff --git a/frameworks/js/napi/accesstoken/src/napi_request_permission.cpp b/frameworks/js/napi/accesstoken/src/napi_request_permission.cpp index 38930d947..dbca25cba 100644 --- a/frameworks/js/napi/accesstoken/src/napi_request_permission.cpp +++ b/frameworks/js/napi/accesstoken/src/napi_request_permission.cpp @@ -24,6 +24,7 @@ #include "napi_hisysevent_adapter.h" #include "token_setproc.h" #include "want.h" +#include "window.h" namespace OHOS { namespace Security { @@ -93,6 +94,13 @@ static Ace::UIContent* GetUIContent(std::shared_ptr asyncCo Ace::UIContent* uiContent = nullptr; if (asyncContext->uiAbilityFlag) { uiContent = asyncContext->abilityContext->GetUIContent(); + } else if (asyncContext->isWindowFlag) { + auto window = Rosen::Window::Find(asyncContext->windowName); + if (window == nullptr) { + LOGE(ATM_DOMAIN, ATM_TAG, "Find window failed!"); + return nullptr; + } + uiContent = window->GetUIContent(); } else { uiContent = asyncContext->uiExtensionContext->GetUIContent(); } @@ -211,6 +219,9 @@ static napi_value GetContext( asyncContext->uiAbilityFlag = true; asyncContext->tokenId = asyncContext->abilityContext->GetApplicationInfo()->accessTokenId; asyncContext->bundleName = asyncContext->abilityContext->GetApplicationInfo()->bundleName; + } else if (asyncContext->isWindowFlag) { + asyncContext->tokenId = context->GetApplicationInfo()->accessTokenId; + asyncContext->bundleName = context->GetApplicationInfo()->bundleName; } else { LOGW(ATM_DOMAIN, ATM_TAG, "Convert to ability context failed"); asyncContext->uiExtensionContext = @@ -578,6 +589,38 @@ static void CreateUIExtension(std::shared_ptr asyncContext) } +napi_value NapiRequestPermission::RequestPermissionsFromUserWindow(napi_env env, napi_callback_info info) +{ + LOGD(ATM_DOMAIN, ATM_TAG, "RequestPermissionsFromUserWindow begin."); + // use handle to protect asyncContext + std::shared_ptr asyncContext = std::make_shared(env); + asyncContext->isWindowFlag = true; + + if (!ParseRequestPermissionFromUser(env, info, asyncContext)) { + return nullptr; + } + auto asyncContextHandle = std::make_unique(asyncContext); + napi_value result = nullptr; + if (asyncContextHandle->asyncContextPtr->callbackRef == nullptr) { + NAPI_CALL(env, napi_create_promise(env, &(asyncContextHandle->asyncContextPtr->deferred), &result)); + } else { + NAPI_CALL(env, napi_get_undefined(env, &result)); + } + + napi_value resource = nullptr; // resource name + NAPI_CALL(env, napi_create_string_utf8(env, "RequestPermissionsFromUserWindow", NAPI_AUTO_LENGTH, &resource)); + NAPI_CALL(env, napi_create_async_work( + env, nullptr, resource, RequestPermissionsFromUserExecute, RequestPermissionsFromUserComplete, + reinterpret_cast(asyncContextHandle.get()), &(asyncContextHandle->asyncContextPtr->work))); + + NAPI_CALL(env, + napi_queue_async_work_with_qos(env, asyncContextHandle->asyncContextPtr->work, napi_qos_user_initiated)); + + LOGD(ATM_DOMAIN, ATM_TAG, "RequestPermissionsFromUserWindow end."); + asyncContextHandle.release(); + return result; +} + napi_value NapiRequestPermission::RequestPermissionsFromUser(napi_env env, napi_callback_info info) { LOGD(ATM_DOMAIN, ATM_TAG, "RequestPermissionsFromUser begin."); @@ -647,8 +690,15 @@ bool NapiRequestPermission::ParseRequestPermissionFromUser(const napi_env& env, } if (argc == NapiContextCommon::MAX_PARAMS_THREE) { + bool isWindowFlag = asyncContext->isWindowFlag; + if (isWindowFlag && (!ParseString(env, argv[2], asyncContext->windowName) || asyncContext->windowName == "")) { + errMsg = GetParamErrorMsg("windowName", "string"); + napi_throw(env, GenerateBusinessError(env, JsErrorCode::JS_ERROR_PARAM_ILLEGAL, errMsg)); + return false; + } // argv[2] : callback - if (!IsUndefinedOrNull(env, argv[2]) && !ParseCallback(env, argv[2], asyncContext->callbackRef)) { + if (!isWindowFlag && + !IsUndefinedOrNull(env, argv[2]) && !ParseCallback(env, argv[2], asyncContext->callbackRef)) { errMsg = GetParamErrorMsg("callback", "Callback"); napi_throw(env, GenerateBusinessError(env, JsErrorCode::JS_ERROR_PARAM_ILLEGAL, errMsg)); return false; diff --git a/interfaces/kits/js/napi/accesstoken/include/napi_request_permission.h b/interfaces/kits/js/napi/accesstoken/include/napi_request_permission.h index 8e74fc954..b6464c7b9 100644 --- a/interfaces/kits/js/napi/accesstoken/include/napi_request_permission.h +++ b/interfaces/kits/js/napi/accesstoken/include/napi_request_permission.h @@ -49,6 +49,8 @@ struct RequestAsyncContext : public AtManagerAsyncWorkData { PermissionGrantInfo info; std::shared_ptr abilityContext; std::shared_ptr uiExtensionContext; + std::string windowName = ""; + bool isWindowFlag = false; bool uiAbilityFlag = false; bool uiExtensionFlag = false; bool uiContentFlag = false; @@ -121,6 +123,7 @@ class NapiRequestPermission { public: static bool IsDynamicRequest(std::shared_ptr& asyncContext); static napi_value RequestPermissionsFromUser(napi_env env, napi_callback_info info); + static napi_value RequestPermissionsFromUserWindow(napi_env env, napi_callback_info info); static napi_value GetPermissionsStatus(napi_env env, napi_callback_info info); private: -- Gitee