diff --git a/frameworks/js/napi/accesstoken/BUILD.gn b/frameworks/js/napi/accesstoken/BUILD.gn index 6cebe5c4c58380e6392910cf5b676301cad5ec80..19f7ca5dbe0a72ab27ada8e711cf7ba65d7e27c9 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 fb96bff4c5b5288b6cd815562c901c5f9cea18ea..7fcf69786027903022fb135c8c0844aad50c3b3c 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 38930d947ac2b8d5396382eb90e490fced91d2ca..dbca25cbabba7622a6a0c6bd2fb0a0c34320da62 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 8e74fc9548f1abe2f7bb26c711ff6ca7ea77b5f0..b6464c7b98ac4f1a82d7eb4cb207a8ac3675fc78 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: