From cd04e12bb5d949bb4b6a3c14c2ed4a4f54b24f5d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E8=8F=B2=E5=A2=A8?= Date: Thu, 7 Aug 2025 20:00:45 +0800 Subject: [PATCH] =?UTF-8?q?openLink=E6=94=AF=E6=8C=81=E5=94=A4=E7=AB=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 朱菲墨 --- .../ability_runtime/ability_context_impl.cpp | 70 +++++++- .../ability_runtime/js_ability_context.cpp | 68 +++++++- .../native/js_service_extension_context.cpp | 71 +++++++- .../js_ui_extension_context.cpp | 68 +++++++- .../ui_extension_context.cpp | 70 +++++++- .../ability_runtime/extension_context.cpp | 16 ++ .../service_extension_context.cpp | 72 +++++++- .../include/open_link_options.h | 13 ++ .../ability/ability_runtime/ability_context.h | 8 + .../ability_runtime/ability_context_impl.h | 10 ++ .../ability_runtime/js_ability_context.h | 2 + .../js_ui_extension_context.h | 2 + .../ui_extension_base/ui_extension_context.h | 10 ++ .../ability_runtime/extension_context.h | 9 + .../service_extension_context.h | 10 ++ .../ability_context_impl_test.cpp | 163 ++++++++++++++++++ .../ability_context_test.cpp | 18 ++ 17 files changed, 670 insertions(+), 10 deletions(-) diff --git a/frameworks/native/ability/ability_runtime/ability_context_impl.cpp b/frameworks/native/ability/ability_runtime/ability_context_impl.cpp index 39bc51ebfd0..9bd3ee186fa 100644 --- a/frameworks/native/ability/ability_runtime/ability_context_impl.cpp +++ b/frameworks/native/ability/ability_runtime/ability_context_impl.cpp @@ -1357,8 +1357,7 @@ void AbilityContextImpl::OnRequestSuccess(const std::string &requestId, const Ap atomicResult->onRequestSuccess_(atomicResult->appId_); return; } - - TAG_LOGE(AAFwkTag::CONTEXT, "requestId=%{public}s not exist", requestId.c_str()); + OnOpenLinkRequestSuccess(requestId); } void AbilityContextImpl::OnRequestFailure(const std::string &requestId, const AppExecFwk::ElementName &element, @@ -1399,6 +1398,53 @@ void AbilityContextImpl::OnRequestFailure(const std::string &requestId, const Ap atomicResult->onRequestFailure_(atomicResult->appId_, failureCode, failureMessage); return; } + OnOpenLinkRequestFailure(requestId, message, resultCode); +} + +void AbilityContextImpl::OnOpenLinkRequestSuccess(const std::string &requestId) +{ + std::shared_ptr openLinkResult = nullptr; + { + std::lock_guard lock(onOpenLinkRequestResultMutex_); + for (auto iter = onOpenLinkRequestResults_.begin(); iter != onOpenLinkRequestResults_.end(); iter++) { + if ((*iter)->requestId_ == requestId) { + openLinkResult = *iter; + onOpenLinkRequestResults_.erase(iter); + break; + } + } + } + if (openLinkResult != nullptr) { + TAG_LOGI(AAFwkTag::CONTEXT, "requestId=%{public}s, call onRequestSuccess", requestId.c_str()); + openLinkResult->onRequestSuccess_(openLinkResult->url_); + return; + } + + TAG_LOGE(AAFwkTag::CONTEXT, "requestId=%{public}s not exist", requestId.c_str()); +} + +void AbilityContextImpl::OnOpenLinkRequestFailure(const std::string &requestId, const std::string &message, + int32_t resultCode) +{ + std::shared_ptr openLinkResult = nullptr; + { + std::lock_guard lock(onOpenLinkRequestResultMutex_); + for (auto iter = onOpenLinkRequestResults_.begin(); iter != onOpenLinkRequestResults_.end(); iter++) { + if ((*iter)->requestId_ == requestId) { + openLinkResult = *iter; + onOpenLinkRequestResults_.erase(iter); + break; + } + } + } + if (openLinkResult != nullptr) { + TAG_LOGI(AAFwkTag::CONTEXT, "requestId=%{public}s, call onRequestFailure", requestId.c_str()); + int32_t failureCode = static_cast(FailureCode::FAILURE_CODE_SYSTEM_MALFUNCTION); + std::string failureMessage; + GetFailureInfoByMessage(message, failureCode, failureMessage, resultCode); + openLinkResult->onRequestFailure_(openLinkResult->url_, failureCode, failureMessage); + return; + } TAG_LOGE(AAFwkTag::CONTEXT, "requestId=%{public}s not exist", requestId.c_str()); } @@ -1469,6 +1515,26 @@ ErrCode AbilityContextImpl::AddCompletionHandlerForAtomicService(const std::stri return ERR_OK; } +ErrCode AbilityContextImpl::AddCompletionHandlerForOpenLink(const std::string &requestId, + AAFwk::OnOpenLinkRequestSuccess onRequestSucc, AAFwk::OnOpenLinkRequestFailure onRequestFail, + const std::string &url) +{ + if (onRequestSucc == nullptr || onRequestFail == nullptr) { + TAG_LOGE(AAFwkTag::CONTEXT, "either func is null"); + return ERR_INVALID_VALUE; + } + std::lock_guard lock(onOpenLinkRequestResultMutex_); + for (auto iter = onOpenLinkRequestResults_.begin(); iter != onOpenLinkRequestResults_.end(); iter++) { + if ((*iter)->requestId_ == requestId) { + TAG_LOGI(AAFwkTag::CONTEXT, "requestId=%{public}s already exists", requestId.c_str()); + return ERR_OK; + } + } + onOpenLinkRequestResults_.emplace_back(std::make_shared( + requestId, url, onRequestSucc, onRequestFail)); + return ERR_OK; +} + void AbilityContextImpl::GetFailureInfoByMessage( const std::string &message, int32_t &failureCode, std::string &failureMessage, int32_t resultCode) { diff --git a/frameworks/native/ability/native/ability_runtime/js_ability_context.cpp b/frameworks/native/ability/native/ability_runtime/js_ability_context.cpp index f273f8edd43..d43b59e4548 100644 --- a/frameworks/native/ability/native/ability_runtime/js_ability_context.cpp +++ b/frameworks/native/ability/native/ability_runtime/js_ability_context.cpp @@ -66,6 +66,7 @@ constexpr size_t ARGC_ONE = 1; constexpr size_t ARGC_TWO = 2; constexpr size_t ARGC_THREE = 3; constexpr int32_t TRACE_ATOMIC_SERVICE_ID = 201; +const std::string KEY_REQUEST_ID = "com.ohos.param.requestId"; const std::string TRACE_ATOMIC_SERVICE = "StartAtomicService"; constexpr int32_t CALLER_TIME_OUT = 10; // 10s const std::string JSON_KEY_ERR_MSG = "errMsg"; @@ -575,6 +576,60 @@ void JsAbilityContext::UnWrapCompletionHandlerForAtomicService( options.requestId_ = requestId; } +void JsAbilityContext::UnwrapCompletionHandlerForOpenLink( + napi_env env, napi_value param, const std::string &url, AAFwk::Want& want) +{ + if (!CheckTypeForNapiValue(env, param, napi_object)) { + return; + } + napi_value completionHandlerForOpenLink = AppExecFwk::GetPropertyValueByPropertyName(env, param, + "completionHandlerForOpenLink", napi_object); + if (completionHandlerForOpenLink == nullptr) { + TAG_LOGD(AAFwkTag::CONTEXT, "null completionHandlerForOpenLink"); + return; + } + napi_value onRequestSuccFunc = AppExecFwk::GetPropertyValueByPropertyName(env, completionHandlerForOpenLink, + "onRequestSuccess", napi_function); + napi_value onRequestFailFunc = AppExecFwk::GetPropertyValueByPropertyName(env, completionHandlerForOpenLink, + "onRequestFailure", napi_function); + if (onRequestSuccFunc == nullptr || onRequestFailFunc == nullptr) { + TAG_LOGE(AAFwkTag::CONTEXT, "null onRequestSuccFunc or onRequestFailFunc"); + return; + } + AAFwk::OnOpenLinkRequestSuccess onRequestSucc = [env, completionHandlerForOpenLink, onRequestSuccFunc]( + const std::string &url) { + napi_value argv[ARGC_ONE] = { CreateJsValue(env, url) }; + napi_status status = napi_call_function( + env, completionHandlerForOpenLink, onRequestSuccFunc, ARGC_ONE, argv, nullptr); + if (status != napi_ok) { + TAG_LOGE(AAFwkTag::CONTEXT, "call onRequestSuccess, failed: %{public}d", status); + } + }; + AAFwk::OnOpenLinkRequestFailure onRequestFail = [env, completionHandlerForOpenLink, onRequestFailFunc]( + const std::string &url, int32_t failureCode, const std::string &message) { + napi_value argv[ARGC_THREE] = { CreateJsValue(env, url), CreateJsValue(env, failureCode), + CreateJsValue(env, message) }; + napi_status status = napi_call_function( + env, completionHandlerForOpenLink, onRequestFailFunc, ARGC_THREE, argv, nullptr); + if (status != napi_ok) { + TAG_LOGE(AAFwkTag::CONTEXT, "call onRequestFailure, failed: %{public}d", status); + } + }; + auto context = context_.lock(); + if (!context) { + TAG_LOGE(AAFwkTag::CONTEXT, "null context"); + return; + } + std::string requestId = std::to_string(static_cast(std::chrono::duration_cast( + std::chrono::high_resolution_clock::now().time_since_epoch()).count())); + if (context->AddCompletionHandlerForOpenLink(requestId, onRequestSucc, onRequestFail, url) != ERR_OK) { + TAG_LOGE(AAFwkTag::CONTEXT, "add completionHandler failed"); + return; + } + want.RemoveParam(KEY_REQUEST_ID); + want.SetParam(KEY_REQUEST_ID, requestId); +} + napi_value JsAbilityContext::OnStartAbility(napi_env env, NapiCallbackInfo& info, bool isStartRecent) { StartAsyncTrace(HITRACE_TAG_ABILITY_MANAGER, TRACE_ATOMIC_SERVICE, TRACE_ATOMIC_SERVICE_ID); @@ -972,6 +1027,7 @@ napi_value JsAbilityContext::OnOpenLink(napi_env env, NapiCallbackInfo& info) "Parse param link or openLinkOptions failed, link must be string, openLinkOptions must be options."); return CreateJsUndefined(env); } + UnwrapCompletionHandlerForOpenLink(env, info.argv[INDEX_ONE], linkValue, want); want.SetUri(linkValue); std::string startTime = std::to_string(std::chrono::duration_cast(std::chrono:: @@ -980,7 +1036,7 @@ napi_value JsAbilityContext::OnOpenLink(napi_env env, NapiCallbackInfo& info) int requestCode = -1; if (CheckTypeForNapiValue(env, info.argv[INDEX_TWO], napi_function)) { - TAG_LOGD(AAFwkTag::CONTEXT, "completionHandler is used"); + TAG_LOGD(AAFwkTag::CONTEXT, "async callback is used"); CreateOpenLinkTask(env, info.argv[INDEX_TWO], want, requestCode); } return OnOpenLinkInner(env, want, requestCode, startTime, linkValue); @@ -1001,7 +1057,7 @@ napi_value JsAbilityContext::OnOpenLinkInner(napi_env env, const AAFwk::Want& wa }; napi_value result = nullptr; AddFreeInstallObserver(env, want, nullptr, &result, false, true); - NapiAsyncTask::CompleteCallback complete = [innerErrCode, requestCode, startTime, url, weak = context_, + NapiAsyncTask::CompleteCallback complete = [want, innerErrCode, requestCode, startTime, url, weak = context_, observer = freeInstallObserver_](napi_env env, NapiAsyncTask& task, int32_t status) { if (*innerErrCode == 0) { TAG_LOGI(AAFwkTag::CONTEXT, "openLink succeeded"); @@ -1019,6 +1075,14 @@ napi_value JsAbilityContext::OnOpenLinkInner(napi_env env, const AAFwk::Want& wa return; } observer->OnInstallFinishedByUrl(startTime, url, *innerErrCode); + std::string requestId = want.GetStringParam(KEY_REQUEST_ID); + if (!requestId.empty()) { + nlohmann::json jsonObject = nlohmann::json { + { JSON_KEY_ERR_MSG, "Failed to call openLink" }, + }; + TAG_LOGI(AAFwkTag::CONTEXT, "OnOpenLinkRequestFailure ErrCode: %{public}d", *innerErrCode); + context->OnOpenLinkRequestFailure(requestId, jsonObject.dump(), *innerErrCode); + } } context->RemoveResultCallbackTask(requestCode); }; diff --git a/frameworks/native/ability/native/js_service_extension_context.cpp b/frameworks/native/ability/native/js_service_extension_context.cpp index 7beb9df89f8..fe7b15a3d29 100644 --- a/frameworks/native/ability/native/js_service_extension_context.cpp +++ b/frameworks/native/ability/native/js_service_extension_context.cpp @@ -57,6 +57,7 @@ constexpr size_t ARGC_THREE = 3; constexpr size_t ARGC_FOUR = 4; constexpr const char* ATOMIC_SERVICE_PREFIX = "com.atomicservice."; const std::string JSON_KEY_ERR_MSG = "errMsg"; +const std::string KEY_REQUEST_ID = "com.ohos.param.requestId"; class StartAbilityByCallParameters { public: @@ -331,6 +332,60 @@ private: return true; } + void UnwrapCompletionHandlerForOpenLink( + napi_env env, napi_value param, const std::string &url, AAFwk::Want& want) + { + if (!CheckTypeForNapiValue(env, param, napi_object)) { + return; + } + napi_value completionHandlerForOpenLink = AppExecFwk::GetPropertyValueByPropertyName(env, param, + "completionHandlerForOpenLink", napi_object); + if (completionHandlerForOpenLink == nullptr) { + TAG_LOGD(AAFwkTag::SERVICE_EXT, "null completionHandlerForOpenLink"); + return; + } + napi_value onRequestSuccFunc = AppExecFwk::GetPropertyValueByPropertyName(env, completionHandlerForOpenLink, + "onRequestSuccess", napi_function); + napi_value onRequestFailFunc = AppExecFwk::GetPropertyValueByPropertyName(env, completionHandlerForOpenLink, + "onRequestFailure", napi_function); + if (onRequestSuccFunc == nullptr || onRequestFailFunc == nullptr) { + TAG_LOGE(AAFwkTag::SERVICE_EXT, "null onRequestSuccFunc or onRequestFailFunc"); + return; + } + AAFwk::OnOpenLinkRequestSuccess onRequestSucc = [env, completionHandlerForOpenLink, onRequestSuccFunc]( + const std::string &url) { + napi_value argv[ARGC_ONE] = { CreateJsValue(env, url) }; + napi_status status = napi_call_function( + env, completionHandlerForOpenLink, onRequestSuccFunc, ARGC_ONE, argv, nullptr); + if (status != napi_ok) { + TAG_LOGE(AAFwkTag::SERVICE_EXT, "call onRequestSuccess, failed: %{public}d", status); + } + }; + AAFwk::OnOpenLinkRequestFailure onRequestFail = [env, completionHandlerForOpenLink, onRequestFailFunc]( + const std::string &url, int32_t failureCode, const std::string &message) { + napi_value argv[ARGC_THREE] = { CreateJsValue(env, url), CreateJsValue(env, failureCode), + CreateJsValue(env, message) }; + napi_status status = napi_call_function( + env, completionHandlerForOpenLink, onRequestFailFunc, ARGC_THREE, argv, nullptr); + if (status != napi_ok) { + TAG_LOGE(AAFwkTag::SERVICE_EXT, "call onRequestFailure, failed: %{public}d", status); + } + }; + auto context = context_.lock(); + if (!context) { + TAG_LOGE(AAFwkTag::SERVICE_EXT, "null context"); + return; + } + std::string requestId = std::to_string(static_cast(std::chrono::duration_cast( + std::chrono::high_resolution_clock::now().time_since_epoch()).count())); + if (context->AddCompletionHandlerForOpenLink(requestId, onRequestSucc, onRequestFail, url) != ERR_OK) { + TAG_LOGE(AAFwkTag::SERVICE_EXT, "add completionHandler failed"); + return; + } + want.RemoveParam(KEY_REQUEST_ID); + want.SetParam(KEY_REQUEST_ID, requestId); + } + napi_value OnOpenLink(napi_env env, NapiCallbackInfo& info) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); @@ -347,6 +402,7 @@ private: "Parse param link or openLinkOptions failed, link must be string, openLinkOptions must be options."); return CreateJsUndefined(env); } + UnwrapCompletionHandlerForOpenLink(env, info.argv[INDEX_ONE], linkValue, want); want.SetUri(linkValue); std::string startTime = std::to_string(std::chrono::duration_cast(std::chrono:: @@ -370,7 +426,7 @@ private: *innerErrorCode = context->OpenLink(want, -1); }; - NapiAsyncTask::CompleteCallback complete = [innerErrorCode, startTime, url, + NapiAsyncTask::CompleteCallback complete = [weak = context_, want, innerErrorCode, startTime, url, freeInstallObserver = freeInstallObserver_]( napi_env env, NapiAsyncTask& task, int32_t status) { if (*innerErrorCode == 0) { @@ -388,6 +444,19 @@ private: } TAG_LOGI(AAFwkTag::SERVICE_EXT, "OpenLink failed"); freeInstallObserver->OnInstallFinishedByUrl(startTime, url, *innerErrorCode); + std::string requestId = want.GetStringParam(KEY_REQUEST_ID); + auto context = weak.lock(); + if (context == nullptr) { + TAG_LOGW(AAFwkTag::SERVICE_EXT, "null context"); + return; + } + if (!requestId.empty()) { + nlohmann::json jsonObject = nlohmann::json { + { JSON_KEY_ERR_MSG, "Failed to call openLink" }, + }; + TAG_LOGI(AAFwkTag::SERVICE_EXT, "OnOpenLinkRequestFailure ErrCode: %{public}d", *innerErrorCode); + context->OnOpenLinkRequestFailure(requestId, jsonObject.dump(), *innerErrorCode); + } }; napi_value result = nullptr; diff --git a/frameworks/native/ability/native/ui_extension_base/js_ui_extension_context.cpp b/frameworks/native/ability/native/ui_extension_base/js_ui_extension_context.cpp index bb48409d762..a63d6e8366d 100755 --- a/frameworks/native/ability/native/ui_extension_base/js_ui_extension_context.cpp +++ b/frameworks/native/ability/native/ui_extension_base/js_ui_extension_context.cpp @@ -59,7 +59,7 @@ constexpr size_t ARGC_ONE = 1; constexpr size_t ARGC_TWO = 2; constexpr size_t ARGC_THREE = 3; const std::string JSON_KEY_ERR_MSG = "errMsg"; - +const std::string KEY_REQUEST_ID = "com.ohos.param.requestId"; const std::string ATOMIC_SERVICE_PREFIX = "com.atomicservice."; } // namespace @@ -335,6 +335,60 @@ static bool ParseOpenLinkParams(const napi_env &env, const NapiCallbackInfo &inf return true; } +void JsUIExtensionContext::UnwrapCompletionHandlerForOpenLink(napi_env env, napi_value param, + const std::string &url, AAFwk::Want& want) +{ + if (!CheckTypeForNapiValue(env, param, napi_object)) { + return; + } + napi_value completionHandlerForOpenLink = AppExecFwk::GetPropertyValueByPropertyName(env, param, + "completionHandlerForOpenLink", napi_object); + if (completionHandlerForOpenLink == nullptr) { + TAG_LOGD(AAFwkTag::UI_EXT, "null completionHandlerForOpenLink"); + return; + } + napi_value onRequestSuccFunc = AppExecFwk::GetPropertyValueByPropertyName(env, completionHandlerForOpenLink, + "onRequestSuccess", napi_function); + napi_value onRequestFailFunc = AppExecFwk::GetPropertyValueByPropertyName(env, completionHandlerForOpenLink, + "onRequestFailure", napi_function); + if (onRequestSuccFunc == nullptr || onRequestFailFunc == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "null onRequestSuccFunc or onRequestFailFunc"); + return; + } + AAFwk::OnOpenLinkRequestSuccess onRequestSucc = [env, completionHandlerForOpenLink, onRequestSuccFunc]( + const std::string &url) { + napi_value argv[ARGC_ONE] = { CreateJsValue(env, url) }; + napi_status status = napi_call_function( + env, completionHandlerForOpenLink, onRequestSuccFunc, ARGC_ONE, argv, nullptr); + if (status != napi_ok) { + TAG_LOGE(AAFwkTag::UI_EXT, "call onRequestSuccess, failed: %{public}d", status); + } + }; + AAFwk::OnOpenLinkRequestFailure onRequestFail = [env, completionHandlerForOpenLink, onRequestFailFunc]( + const std::string &url, int32_t failureCode, const std::string &message) { + napi_value argv[ARGC_THREE] = { CreateJsValue(env, url), CreateJsValue(env, failureCode), + CreateJsValue(env, message) }; + napi_status status = napi_call_function( + env, completionHandlerForOpenLink, onRequestFailFunc, ARGC_THREE, argv, nullptr); + if (status != napi_ok) { + TAG_LOGE(AAFwkTag::UI_EXT, "call onRequestFailure, failed: %{public}d", status); + } + }; + auto context = context_.lock(); + if (!context) { + TAG_LOGE(AAFwkTag::UI_EXT, "null context"); + return; + } + std::string requestId = std::to_string(static_cast(std::chrono::duration_cast( + std::chrono::high_resolution_clock::now().time_since_epoch()).count())); + if (context->AddCompletionHandlerForOpenLink(requestId, onRequestSucc, onRequestFail, url) != ERR_OK) { + TAG_LOGE(AAFwkTag::UI_EXT, "add completionHandler failed"); + return; + } + want.RemoveParam(KEY_REQUEST_ID); + want.SetParam(KEY_REQUEST_ID, requestId); +} + napi_value JsUIExtensionContext::OnOpenLink(napi_env env, NapiCallbackInfo& info) { HITRACE_METER_NAME(HITRACE_TAG_ABILITY_MANAGER, __PRETTY_FUNCTION__); @@ -351,6 +405,7 @@ napi_value JsUIExtensionContext::OnOpenLink(napi_env env, NapiCallbackInfo& info "Parse param link or openLinkOptions failed, link must be string, openLinkOptions must be options."); return CreateJsUndefined(env); } + UnwrapCompletionHandlerForOpenLink(env, info.argv[INDEX_ONE], linkValue, want); want.SetUri(linkValue); std::string startTime = std::to_string(std::chrono::duration_cast(std::chrono:: @@ -384,7 +439,7 @@ napi_value JsUIExtensionContext::OnOpenLinkInner(napi_env env, const AAFwk::Want napi_value result = nullptr; AddFreeInstallObserver(env, want, nullptr, &result, false, true); - NapiAsyncTask::CompleteCallback complete = [innerErrorCode, requestCode, startTime, url, weak = context_, + NapiAsyncTask::CompleteCallback complete = [want, innerErrorCode, requestCode, startTime, url, weak = context_, observer = freeInstallObserver_](napi_env env, NapiAsyncTask& task, int32_t status) { if (*innerErrorCode == 0) { TAG_LOGI(AAFwkTag::UI_EXT, "OpenLink succeeded"); @@ -402,6 +457,15 @@ napi_value JsUIExtensionContext::OnOpenLinkInner(napi_env env, const AAFwk::Want return; } observer->OnInstallFinishedByUrl(startTime, url, *innerErrorCode); + //不需要捕获want,只要捕获requestId即可 + std::string requestId = want.GetStringParam(KEY_REQUEST_ID); + if (!requestId.empty()) { + nlohmann::json jsonObject = nlohmann::json { + { JSON_KEY_ERR_MSG, "Failed to call openLink" }, + }; + TAG_LOGI(AAFwkTag::UI_EXT, "OnOpenLinkRequestFailure ErrCode: %{public}d", *innerErrorCode); + context->OnOpenLinkRequestFailure(requestId, jsonObject.dump(), *innerErrorCode); + } } context->RemoveResultCallbackTask(requestCode); }; diff --git a/frameworks/native/ability/native/ui_extension_base/ui_extension_context.cpp b/frameworks/native/ability/native/ui_extension_base/ui_extension_context.cpp index d8f1a0a551a..0e2b01982e5 100755 --- a/frameworks/native/ability/native/ui_extension_base/ui_extension_context.cpp +++ b/frameworks/native/ability/native/ui_extension_base/ui_extension_context.cpp @@ -507,7 +507,7 @@ void UIExtensionContext::OnRequestSuccess(const std::string &requestId, const Ap return; } - TAG_LOGE(AAFwkTag::UI_EXT, "requestId=%{public}s not exist", requestId.c_str()); + OnOpenLinkRequestSuccess(requestId); } void UIExtensionContext::OnRequestFailure(const std::string &requestId, const AppExecFwk::ElementName &element, @@ -534,6 +534,74 @@ void UIExtensionContext::OnRequestFailure(const std::string &requestId, const Ap return; } + OnOpenLinkRequestFailure(requestId, message, resultCode); +} + +ErrCode UIExtensionContext::AddCompletionHandlerForOpenLink(const std::string &requestId, + AAFwk::OnOpenLinkRequestSuccess onRequestSucc, AAFwk::OnOpenLinkRequestFailure onRequestFail, + const std::string &url) +{ + if (onRequestSucc == nullptr || onRequestFail == nullptr) { + TAG_LOGE(AAFwkTag::UI_EXT, "either func is null"); + return ERR_INVALID_VALUE; + } + std::lock_guard lock(onOpenLinkRequestResultMutex_); + for (auto iter = onOpenLinkRequestResults_.begin(); iter != onOpenLinkRequestResults_.end(); iter++) { + if ((*iter)->requestId_ == requestId) { + TAG_LOGI(AAFwkTag::UI_EXT, "requestId=%{public}s already exists", requestId.c_str()); + return ERR_OK; + } + } + onOpenLinkRequestResults_.emplace_back(std::make_shared( + requestId, url, onRequestSucc, onRequestFail)); + return ERR_OK; +} + +void UIExtensionContext::OnOpenLinkRequestSuccess(const std::string &requestId) +{ + std::shared_ptr openLinkResult = nullptr; + { + std::lock_guard lock(onOpenLinkRequestResultMutex_); + for (auto iter = onOpenLinkRequestResults_.begin(); iter != onOpenLinkRequestResults_.end(); iter++) { + if ((*iter)->requestId_ == requestId) { + openLinkResult = *iter; + onOpenLinkRequestResults_.erase(iter); + break; + } + } + } + if (openLinkResult != nullptr) { + TAG_LOGI(AAFwkTag::UI_EXT, "requestId=%{public}s, call onRequestSuccess", requestId.c_str()); + openLinkResult->onRequestSuccess_(openLinkResult->url_); + return; + } + + TAG_LOGE(AAFwkTag::UI_EXT, "requestId=%{public}s not exist", requestId.c_str()); +} + +void UIExtensionContext::OnOpenLinkRequestFailure(const std::string &requestId, const std::string &message, + int32_t resultCode) +{ + std::shared_ptr openLinkResult = nullptr; + { + std::lock_guard lock(onOpenLinkRequestResultMutex_); + for (auto iter = onOpenLinkRequestResults_.begin(); iter != onOpenLinkRequestResults_.end(); iter++) { + if ((*iter)->requestId_ == requestId) { + openLinkResult = *iter; + onOpenLinkRequestResults_.erase(iter); + break; + } + } + } + if (openLinkResult != nullptr) { + TAG_LOGI(AAFwkTag::UI_EXT, "requestId=%{public}s, call onRequestFailure", requestId.c_str()); + int32_t failureCode = static_cast(FailureCode::FAILURE_CODE_SYSTEM_MALFUNCTION); + std::string failureMessage; + GetFailureInfoByMessage(message, failureCode, failureMessage, resultCode); + openLinkResult->onRequestFailure_(openLinkResult->url_, failureCode, failureMessage); + return; + } + TAG_LOGE(AAFwkTag::UI_EXT, "requestId=%{public}s not exist", requestId.c_str()); } diff --git a/frameworks/native/appkit/ability_runtime/extension_context.cpp b/frameworks/native/appkit/ability_runtime/extension_context.cpp index ef75e69806b..f79978e348f 100644 --- a/frameworks/native/appkit/ability_runtime/extension_context.cpp +++ b/frameworks/native/appkit/ability_runtime/extension_context.cpp @@ -41,6 +41,13 @@ ErrCode ExtensionContext::AddCompletionHandlerForAtomicService(const std::string return ERR_OK; } +ErrCode ExtensionContext::AddCompletionHandlerForOpenLink(const std::string &requestId, + AAFwk::OnOpenLinkRequestSuccess onRequestSucc, AAFwk::OnOpenLinkRequestFailure onRequestFail, + const std::string &url) +{ + return ERR_OK; +} + void ExtensionContext::OnRequestSuccess(const std::string &requestId, const AppExecFwk::ElementName &element, const std::string &message) { @@ -50,5 +57,14 @@ void ExtensionContext::OnRequestFailure(const std::string &requestId, const AppE const std::string &message, int32_t resultCode) { } + +void ExtensionContext::OnOpenLinkRequestSuccess(const std::string &requestId) +{ +} + +void ExtensionContext::OnOpenLinkRequestFailure(const std::string &requestId, const std::string &message, + int32_t resultCode) +{ +} } // namespace AbilityRuntime } // namespace OHOS diff --git a/frameworks/native/appkit/ability_runtime/service_extension_context.cpp b/frameworks/native/appkit/ability_runtime/service_extension_context.cpp index ac3fff62cf8..eacbf5660cc 100644 --- a/frameworks/native/appkit/ability_runtime/service_extension_context.cpp +++ b/frameworks/native/appkit/ability_runtime/service_extension_context.cpp @@ -305,6 +305,74 @@ ErrCode ServiceExtensionContext::AddCompletionHandlerForAtomicService(const std: return ERR_OK; } +ErrCode ServiceExtensionContext::AddCompletionHandlerForOpenLink(const std::string &requestId, + AAFwk::OnOpenLinkRequestSuccess onRequestSucc, AAFwk::OnOpenLinkRequestFailure onRequestFail, + const std::string &url) +{ + if (onRequestSucc == nullptr || onRequestFail == nullptr) { + TAG_LOGE(AAFwkTag::APPKIT, "either func is null"); + return ERR_INVALID_VALUE; + } + std::lock_guard lock(onOpenLinkRequestResultMutex_); + for (auto iter = onOpenLinkRequestResults_.begin(); iter != onOpenLinkRequestResults_.end(); iter++) { + if ((*iter)->requestId_ == requestId) { + TAG_LOGI(AAFwkTag::APPKIT, "requestId=%{public}s already exists", requestId.c_str()); + return ERR_OK; + } + } + onOpenLinkRequestResults_.emplace_back(std::make_shared( + requestId, url, onRequestSucc, onRequestFail)); + return ERR_OK; +} + +void ServiceExtensionContext::OnOpenLinkRequestSuccess(const std::string &requestId) +{ + std::shared_ptr openLinkResult = nullptr; + { + std::lock_guard lock(onOpenLinkRequestResultMutex_); + for (auto iter = onOpenLinkRequestResults_.begin(); iter != onOpenLinkRequestResults_.end(); iter++) { + if ((*iter)->requestId_ == requestId) { + openLinkResult = *iter; + onOpenLinkRequestResults_.erase(iter); + break; + } + } + } + if (openLinkResult != nullptr) { + TAG_LOGI(AAFwkTag::APPKIT, "requestId=%{public}s, call onRequestSuccess", requestId.c_str()); + openLinkResult->onRequestSuccess_(openLinkResult->url_); + return; + } + + TAG_LOGE(AAFwkTag::APPKIT, "requestId=%{public}s not exist", requestId.c_str()); +} + +void ServiceExtensionContext::OnOpenLinkRequestFailure(const std::string &requestId, const std::string &message, + int32_t resultCode) +{ + std::shared_ptr openLinkResult = nullptr; + { + std::lock_guard lock(onOpenLinkRequestResultMutex_); + for (auto iter = onOpenLinkRequestResults_.begin(); iter != onOpenLinkRequestResults_.end(); iter++) { + if ((*iter)->requestId_ == requestId) { + openLinkResult = *iter; + onOpenLinkRequestResults_.erase(iter); + break; + } + } + } + if (openLinkResult != nullptr) { + TAG_LOGI(AAFwkTag::APPKIT, "requestId=%{public}s, call onRequestFailure", requestId.c_str()); + int32_t failureCode = static_cast(FailureCode::FAILURE_CODE_SYSTEM_MALFUNCTION); + std::string failureMessage; + GetFailureInfoByMessage(message, failureCode, failureMessage, resultCode); + openLinkResult->onRequestFailure_(openLinkResult->url_, failureCode, failureMessage); + return; + } + + TAG_LOGE(AAFwkTag::APPKIT, "requestId=%{public}s not exist", requestId.c_str()); +} + void ServiceExtensionContext::OnRequestSuccess(const std::string &requestId, const AppExecFwk::ElementName &element, const std::string &message) { @@ -325,7 +393,7 @@ void ServiceExtensionContext::OnRequestSuccess(const std::string &requestId, con atomicResult->onRequestSuccess_(atomicResult->appId_); return; } - TAG_LOGE(AAFwkTag::APPKIT, "requestId=%{public}s not exist", requestId.c_str()); + OnOpenLinkRequestSuccess(requestId); } void ServiceExtensionContext::OnRequestFailure(const std::string &requestId, const AppExecFwk::ElementName &element, @@ -352,7 +420,7 @@ void ServiceExtensionContext::OnRequestFailure(const std::string &requestId, con return; } - TAG_LOGE(AAFwkTag::APPKIT, "requestId=%{public}s not exist", requestId.c_str()); + OnOpenLinkRequestFailure(requestId, message, resultCode); } void ServiceExtensionContext::GetFailureInfoByMessage( diff --git a/interfaces/inner_api/ability_manager/include/open_link_options.h b/interfaces/inner_api/ability_manager/include/open_link_options.h index f01875662fc..da1baf32045 100644 --- a/interfaces/inner_api/ability_manager/include/open_link_options.h +++ b/interfaces/inner_api/ability_manager/include/open_link_options.h @@ -23,6 +23,19 @@ #include "want.h" namespace OHOS { namespace AAFwk { +using OnOpenLinkRequestSuccess = std::function; +using OnOpenLinkRequestFailure = std::function; +struct OnOpenLinkRequestResult { + std::string requestId_; + std::string url_; + OnOpenLinkRequestSuccess onRequestSuccess_; + OnOpenLinkRequestFailure onRequestFailure_; + + OnOpenLinkRequestResult(const std::string &requestId, std::string url, OnOpenLinkRequestSuccess onRequestSucc, + OnOpenLinkRequestFailure onRequestFail) : requestId_(requestId), url_(url), onRequestSuccess_(onRequestSucc), + onRequestFailure_(onRequestFail) + {} +}; class OpenLinkOptions final : public Parcelable { public: OpenLinkOptions() = default; diff --git a/interfaces/kits/native/ability/ability_runtime/ability_context.h b/interfaces/kits/native/ability/ability_runtime/ability_context.h index 1bc0b053dec..a9e27913643 100644 --- a/interfaces/kits/native/ability/ability_runtime/ability_context.h +++ b/interfaces/kits/native/ability/ability_runtime/ability_context.h @@ -27,6 +27,7 @@ #include "mission_info.h" #include "native_engine/native_reference.h" #include "native_engine/native_value.h" +#include "open_link_options.h" #include "start_options.h" #include "want.h" #include @@ -499,8 +500,15 @@ public: virtual void OnRequestFailure(const std::string &requestId, const AppExecFwk::ElementName &element, const std::string &message, int32_t resultCode = 0) = 0; + virtual void OnOpenLinkRequestSuccess(const std::string &requestId) = 0; + virtual void OnOpenLinkRequestFailure(const std::string &requestId, const std::string &message, + int32_t resultCode =0) = 0; + virtual ErrCode AddCompletionHandlerForAtomicService(const std::string &requestId, OnAtomicRequestSuccess onRequestSucc, OnAtomicRequestFailure onRequestFail, const std::string &appId) = 0; + virtual ErrCode AddCompletionHandlerForOpenLink(const std::string &requestId, + AAFwk::OnOpenLinkRequestSuccess onRequestSucc, AAFwk::OnOpenLinkRequestFailure onRequestFail, + const std::string &url) = 0; protected: bool IsContext(size_t contextTypeId) override diff --git a/interfaces/kits/native/ability/ability_runtime/ability_context_impl.h b/interfaces/kits/native/ability/ability_runtime/ability_context_impl.h index 35bdfd8339a..0c836b7812f 100644 --- a/interfaces/kits/native/ability/ability_runtime/ability_context_impl.h +++ b/interfaces/kits/native/ability/ability_runtime/ability_context_impl.h @@ -364,6 +364,10 @@ public: void OnRequestFailure(const std::string &requestId, const AppExecFwk::ElementName &element, const std::string &message, int32_t resultCode = 0) override; + void OnOpenLinkRequestSuccess(const std::string &requestId) override; + void OnOpenLinkRequestFailure(const std::string &requestId, const std::string &message, + int32_t resultCode = 0) override; + ErrCode StartExtensionAbilityWithExtensionType(const AAFwk::Want &want, AppExecFwk::ExtensionAbilityType extensionType) override; ErrCode StopExtensionAbilityWithExtensionType(const AAFwk::Want& want, @@ -374,6 +378,10 @@ public: ErrCode AddCompletionHandlerForAtomicService(const std::string &requestId, OnAtomicRequestSuccess onRequestSucc, OnAtomicRequestFailure onRequestFail, const std::string &appId) override; + + ErrCode AddCompletionHandlerForOpenLink(const std::string &requestId, + AAFwk::OnOpenLinkRequestSuccess onRequestSucc, AAFwk::OnOpenLinkRequestFailure onRequestFail, + const std::string &url) override; private: sptr token_ = nullptr; @@ -407,8 +415,10 @@ private: std::mutex onRequestResultMutex_; std::mutex onAtomicRequestResultMutex_; + std::mutex onOpenLinkRequestResultMutex_; std::vector> onRequestResults_; std::vector> onAtomicRequestResults_; + std::vector> onOpenLinkRequestResults_; }; } // namespace AbilityRuntime } // namespace OHOS diff --git a/interfaces/kits/native/ability/native/ability_runtime/js_ability_context.h b/interfaces/kits/native/ability/native/ability_runtime/js_ability_context.h index b1e8c0b70fc..0f031f729f7 100644 --- a/interfaces/kits/native/ability/native/ability_runtime/js_ability_context.h +++ b/interfaces/kits/native/ability/native/ability_runtime/js_ability_context.h @@ -179,6 +179,8 @@ private: static int32_t GenerateRequestCode(); void UnWrapCompletionHandlerForAtomicService( napi_env env, napi_value param, AAFwk::StartOptions &options, const std::string &appId); + void UnwrapCompletionHandlerForOpenLink(napi_env env, napi_value param, + const std::string &url, AAFwk::Want& want); static int32_t curRequestCode_; static std::mutex requestCodeMutex_; diff --git a/interfaces/kits/native/ability/native/ui_extension_base/js_ui_extension_context.h b/interfaces/kits/native/ability/native/ui_extension_base/js_ui_extension_context.h index 41e074b89ae..e553a63f91f 100755 --- a/interfaces/kits/native/ability/native/ui_extension_base/js_ui_extension_context.h +++ b/interfaces/kits/native/ability/native/ui_extension_base/js_ui_extension_context.h @@ -103,6 +103,8 @@ private: int requestCode, const std::string& startTime, const std::string& url); void UnWrapCompletionHandlerForAtomicService( napi_env env, napi_value param, AAFwk::StartOptions &options, const std::string &appId); + void UnwrapCompletionHandlerForOpenLink(napi_env env, napi_value param, + const std::string &url, AAFwk::Want& want); #ifdef SUPPORT_SCREEN void InitDisplayId(AAFwk::Want &want); void InitDisplayId(AAFwk::Want &want, AAFwk::StartOptions &startOptions, napi_env &env, NapiCallbackInfo& info); diff --git a/interfaces/kits/native/ability/native/ui_extension_base/ui_extension_context.h b/interfaces/kits/native/ability/native/ui_extension_base/ui_extension_context.h index 8dcd4477f0e..3fa917d3355 100755 --- a/interfaces/kits/native/ability/native/ui_extension_base/ui_extension_context.h +++ b/interfaces/kits/native/ability/native/ui_extension_base/ui_extension_context.h @@ -190,12 +190,20 @@ public: ErrCode AddCompletionHandlerForAtomicService(const std::string &requestId, OnAtomicRequestSuccess onRequestSucc, OnAtomicRequestFailure onRequestFail, const std::string &appId) override; + ErrCode AddCompletionHandlerForOpenLink(const std::string &requestId, + AAFwk::OnOpenLinkRequestSuccess onRequestSucc, AAFwk::OnOpenLinkRequestFailure onRequestFail, + const std::string &url) override; + void OnRequestSuccess(const std::string &requestId, const AppExecFwk::ElementName &element, const std::string &message) override; void OnRequestFailure(const std::string &requestId, const AppExecFwk::ElementName &element, const std::string &message, int32_t resultCode = 0) override; + void OnOpenLinkRequestSuccess(const std::string &requestId) override; + void OnOpenLinkRequestFailure(const std::string &requestId, const std::string &message, + int32_t resultCode) override; + /** * @brief Start a new ability using type; * @return errCode ERR_OK on success, others on failure. @@ -243,7 +251,9 @@ private: std::string &failureMessage, int32_t resultCode); std::mutex onRequestResultMutex_; + std::mutex onOpenLinkRequestResultMutex_; std::vector> onAtomicRequestResults_; + std::vector> onOpenLinkRequestResults_; }; } // namespace AbilityRuntime } // namespace OHOS diff --git a/interfaces/kits/native/appkit/ability_runtime/extension_context.h b/interfaces/kits/native/appkit/ability_runtime/extension_context.h index fe1e2bd34a0..0c2230db39c 100644 --- a/interfaces/kits/native/appkit/ability_runtime/extension_context.h +++ b/interfaces/kits/native/appkit/ability_runtime/extension_context.h @@ -19,6 +19,7 @@ #include "ability_info.h" #include "context_impl.h" #include "start_options.h" +#include "open_link_options.h" namespace OHOS { namespace AbilityRuntime { @@ -56,6 +57,10 @@ public: virtual ErrCode AddCompletionHandlerForAtomicService(const std::string &requestId, OnAtomicRequestSuccess onRequestSucc, OnAtomicRequestFailure onRequestFail, const std::string &appId); + virtual ErrCode AddCompletionHandlerForOpenLink(const std::string &requestId, + AAFwk::OnOpenLinkRequestSuccess onRequestSucc, AAFwk::OnOpenLinkRequestFailure onRequestFail, + const std::string &url); + /** * @brief Callback on request success. * @@ -76,6 +81,10 @@ public: virtual void OnRequestFailure(const std::string &requestId, const AppExecFwk::ElementName &element, const std::string &message, int32_t resultCode = 0); + virtual void OnOpenLinkRequestSuccess(const std::string &requestId); + virtual void OnOpenLinkRequestFailure(const std::string &requestId, const std::string &message, + int32_t resultCode); + using SelfType = ExtensionContext; static const size_t CONTEXT_TYPE_ID; diff --git a/interfaces/kits/native/appkit/ability_runtime/service_extension_context.h b/interfaces/kits/native/appkit/ability_runtime/service_extension_context.h index b43da9bde5e..eb3570cdb1c 100644 --- a/interfaces/kits/native/appkit/ability_runtime/service_extension_context.h +++ b/interfaces/kits/native/appkit/ability_runtime/service_extension_context.h @@ -176,6 +176,10 @@ public: ErrCode AddCompletionHandlerForAtomicService(const std::string &requestId, OnAtomicRequestSuccess onRequestSucc, OnAtomicRequestFailure onRequestFail, const std::string &appId) override; + + ErrCode AddCompletionHandlerForOpenLink(const std::string &requestId, + AAFwk::OnOpenLinkRequestSuccess onRequestSucc, AAFwk::OnOpenLinkRequestFailure onRequestFail, + const std::string &url) override; void OnRequestSuccess(const std::string &requestId, const AppExecFwk::ElementName &element, const std::string &message) override; @@ -183,6 +187,10 @@ public: void OnRequestFailure(const std::string &requestId, const AppExecFwk::ElementName &element, const std::string &message, int32_t resultCode = 0) override; + void OnOpenLinkRequestSuccess(const std::string &requestId) override; + void OnOpenLinkRequestFailure(const std::string &requestId, const std::string &message, + int32_t resultCode) override; + protected: bool IsContext(size_t contextTypeId) override { @@ -204,7 +212,9 @@ private: std::string &failureMessage, int32_t resultCode); std::mutex onRequestResultMutex_; + std::mutex onOpenLinkRequestResultMutex_; std::vector> onAtomicRequestResults_; + std::vector> onOpenLinkRequestResults_; }; } // namespace AbilityRuntime } // namespace OHOS diff --git a/test/unittest/frameworks_kits_ability_ability_runtime_test/ability_context_impl_test.cpp b/test/unittest/frameworks_kits_ability_ability_runtime_test/ability_context_impl_test.cpp index 9bb3485e569..a3adc2ccd56 100644 --- a/test/unittest/frameworks_kits_ability_ability_runtime_test/ability_context_impl_test.cpp +++ b/test/unittest/frameworks_kits_ability_ability_runtime_test/ability_context_impl_test.cpp @@ -2514,6 +2514,169 @@ HWTEST_F(AbilityContextImplTest, OnRequestFailure_0300, Function | MediumTest | context_->onAtomicRequestResults_.clear(); } +/** + * @tc.number: OnOpenLinkRequestSuccess_0001 + * @tc.name: OnOpenLinkRequestSuccess + * @tc.desc: OpenLinkRequest not exist. + */ +HWTEST_F(AbilityContextImplTest, OnOpenLinkRequestSuccess_0001, Function | MediumTest | Level1) +{ + std::string requestId = "1234567890"; + std::string url = "openlink"; + AAFwk::OnOpenLinkRequestSuccess onRequestSucc = [](const std::string&) {}; + AAFwk::OnOpenLinkRequestFailure onRequestFail = [](const std::string&, int32_t, const std::string&) {}; + auto result = context_->AddCompletionHandlerForOpenLink(requestId, onRequestSucc, onRequestFail, url); + EXPECT_EQ(result, ERR_OK); + EXPECT_EQ(context_->onOpenLinkRequestResults_.empty(), false); + std::string norequestId = "test"; + context_->OnOpenLinkRequestSuccess(norequestId); + EXPECT_EQ(context_->onOpenLinkRequestResults_.empty(), false); + context_->onOpenLinkRequestResults_.clear(); +} + +/** + * @tc.number: OnOpenLinkRequestSuccess_0002 + * @tc.name: OnOpenLinkRequestSuccess + * @tc.desc: OpenLinkRequest exist. + */ +HWTEST_F(AbilityContextImplTest, OnOpenLinkRequestSuccess_0002, Function | MediumTest | Level1) +{ + std::string requestId = "1234567890"; + std::string url = "openlink"; + AAFwk::OnOpenLinkRequestSuccess onRequestSucc = [](const std::string&) {}; + AAFwk::OnOpenLinkRequestFailure onRequestFail = [](const std::string&, int32_t, const std::string&) {}; + auto result = context_->AddCompletionHandlerForOpenLink(requestId, onRequestSucc, onRequestFail, url); + EXPECT_EQ(result, ERR_OK); + EXPECT_EQ(context_->onOpenLinkRequestResults_.empty(), false); + + context_->OnOpenLinkRequestSuccess(requestId); + EXPECT_EQ(context_->onOpenLinkRequestResults_.empty(), true); + context_->onOpenLinkRequestResults_.clear(); +} + +/** + * @tc.number: OnOpenLinkRequestFailure_0001 + * @tc.name: OnOpenLinkRequestFailure + * @tc.desc: OpenLinkRequest not exist. + */ +HWTEST_F(AbilityContextImplTest, OnOpenLinkRequestFailure_0001, Function | MediumTest | Level1) +{ + std::string requestId = "1234567890"; + std::string url = "openlink"; + AAFwk::OnOpenLinkRequestSuccess onRequestSucc = [](const std::string&) {}; + AAFwk::OnOpenLinkRequestFailure onRequestFail = [](const std::string&, int32_t, const std::string&) {}; + auto result = context_->AddCompletionHandlerForOpenLink(requestId, onRequestSucc, onRequestFail, url); + EXPECT_EQ(result, ERR_OK); + EXPECT_EQ(context_->onOpenLinkRequestResults_.empty(), false); + std::string norequestId = "test"; + context_->OnOpenLinkRequestFailure(norequestId, "failed"); + EXPECT_EQ(context_->onOpenLinkRequestResults_.empty(), false); + context_->onOpenLinkRequestResults_.clear(); +} + +/** + * @tc.number: OnOpenLinkRequestFailure_0002 + * @tc.name: OnOpenLinkRequestFailure + * @tc.desc: OpenLinkRequest exist. + */ +HWTEST_F(AbilityContextImplTest, OnOpenLinkRequestFailure_0002, Function | MediumTest | Level1) +{ + std::string requestId = "1234567890"; + std::string url = "openlink"; + AAFwk::OnOpenLinkRequestSuccess onRequestSucc = [](const std::string&) {}; + AAFwk::OnOpenLinkRequestFailure onRequestFail = [](const std::string&, int32_t, const std::string&) {}; + auto result = context_->AddCompletionHandlerForOpenLink(requestId, onRequestSucc, onRequestFail, url); + EXPECT_EQ(result, ERR_OK); + EXPECT_EQ(context_->onOpenLinkRequestResults_.empty(), false); + + context_->OnOpenLinkRequestFailure(requestId, "failed"); + EXPECT_EQ(context_->onOpenLinkRequestResults_.empty(), true); + context_->onOpenLinkRequestResults_.clear(); +} + +/** + * @tc.number: AddCompletionHandlerForOpenLink_0001 + * @tc.name: AddCompletionHandlerForOpenLink + * @tc.desc: param onRequestSucc error + */ +HWTEST_F(AbilityContextImplTest, AddCompletionHandlerForOpenLink_0001, Function | MediumTest | Level1) +{ + std::string requestId = "1234567890"; + std::string url = "openlink"; + AAFwk::OnOpenLinkRequestSuccess onRequestSucc = [](const std::string&) {}; + AAFwk::OnOpenLinkRequestFailure onRequestFail = [](const std::string&, int32_t, const std::string&) {}; + auto result = context_->AddCompletionHandlerForOpenLink(requestId, nullptr, onRequestFail, url); + EXPECT_EQ(result, ERR_INVALID_VALUE); + context_->onOpenLinkRequestResults_.clear(); +} + +/** + * @tc.number: AddCompletionHandlerForOpenLink_0002 + * @tc.name: AddCompletionHandlerForOpenLink + * @tc.desc: param onRequestFail error + */ +HWTEST_F(AbilityContextImplTest, AddCompletionHandlerForOpenLink_0002, Function | MediumTest | Level1) +{ + std::string requestId = "1234567890"; + std::string url = "openlink"; + AAFwk::OnOpenLinkRequestSuccess onRequestSucc = [](const std::string&) {}; + AAFwk::OnOpenLinkRequestFailure onRequestFail = [](const std::string&, int32_t, const std::string&) {}; + auto result = context_->AddCompletionHandlerForOpenLink(requestId, onRequestSucc, nullptr, url); + EXPECT_EQ(result, ERR_INVALID_VALUE); + context_->onOpenLinkRequestResults_.clear(); +} + +/** + * @tc.number: AddCompletionHandlerForOpenLink_0003 + * @tc.name: AddCompletionHandlerForOpenLink + * @tc.desc: param onRequestSucc onRequestFail error + */ +HWTEST_F(AbilityContextImplTest, AddCompletionHandlerForOpenLink_0003, Function | MediumTest | Level1) +{ + std::string requestId = "1234567890"; + std::string url = "openlink"; + AAFwk::OnOpenLinkRequestSuccess onRequestSucc = [](const std::string&) {}; + AAFwk::OnOpenLinkRequestFailure onRequestFail = [](const std::string&, int32_t, const std::string&) {}; + auto result = context_->AddCompletionHandlerForOpenLink(requestId, nullptr, nullptr, url); + EXPECT_EQ(result, ERR_INVALID_VALUE); + context_->onOpenLinkRequestResults_.clear(); +} + +/** + * @tc.number: AddCompletionHandlerForOpenLink_0003 + * @tc.name: AddCompletionHandlerForOpenLink + * @tc.desc: insert success. + */ +HWTEST_F(AbilityContextImplTest, AddCompletionHandlerForOpenLink_0004, Function | MediumTest | Level1) +{ + std::string requestId = "1234567890"; + std::string url = "openlink"; + AAFwk::OnOpenLinkRequestSuccess onRequestSucc = [](const std::string&) {}; + AAFwk::OnOpenLinkRequestFailure onRequestFail = [](const std::string&, int32_t, const std::string&) {}; + auto result = context_->AddCompletionHandlerForOpenLink(requestId, onRequestSucc, onRequestFail, url); + EXPECT_EQ(result, ERR_OK); + context_->onOpenLinkRequestResults_.clear(); +} + +/** + * @tc.number: AddCompletionHandlerForOpenLink_0003 + * @tc.name: AddCompletionHandlerForOpenLink + * @tc.desc: already exists. + */ +HWTEST_F(AbilityContextImplTest, AddCompletionHandlerForOpenLink_0005, Function | MediumTest | Level1) +{ + std::string requestId = "1234567890"; + std::string url = "openlink"; + AAFwk::OnOpenLinkRequestSuccess onRequestSucc = [](const std::string&) {}; + AAFwk::OnOpenLinkRequestFailure onRequestFail = [](const std::string&, int32_t, const std::string&) {}; + auto result = context_->AddCompletionHandlerForOpenLink(requestId, onRequestSucc, onRequestFail, url); + EXPECT_EQ(result, ERR_OK); + result = context_->AddCompletionHandlerForOpenLink(requestId, onRequestSucc, onRequestFail, url); + EXPECT_EQ(result, ERR_OK); + EXPECT_EQ(context_->onOpenLinkRequestResults_.size(), 1); + context_->onOpenLinkRequestResults_.clear(); +} + /** * @tc.number: GetFailureInfoByMessage_0100 * @tc.name: GetFailureInfoByMessage diff --git a/test/unittest/frameworks_kits_ability_ability_runtime_test/ability_context_test.cpp b/test/unittest/frameworks_kits_ability_ability_runtime_test/ability_context_test.cpp index 3a130c38573..ffb9f6e804a 100644 --- a/test/unittest/frameworks_kits_ability_ability_runtime_test/ability_context_test.cpp +++ b/test/unittest/frameworks_kits_ability_ability_runtime_test/ability_context_test.cpp @@ -526,6 +526,13 @@ public: return 0; } + virtual ErrCode AddCompletionHandlerForOpenLink(const std::string &requestId, + AAFwk::OnOpenLinkRequestSuccess onRequestSucc, AAFwk::OnOpenLinkRequestFailure onRequestFail, + const std::string &url) + { + return 0; + } + /** * @brief Callback on request success. * @@ -552,6 +559,17 @@ public: return; } + virtual void OnOpenLinkRequestSuccess(const std::string &requestId) + { + return; + } + + virtual void OnOpenLinkRequestFailure(const std::string &requestId, const std::string &message, + int32_t resultCode) + { + return; + } + virtual ErrCode SetOnNewWantSkipScenarios(int32_t scenarios) { return 0; -- Gitee