From fa9319dd5a2d704e3b5719dc6ee9ee529bbcee0b Mon Sep 17 00:00:00 2001 From: lijiancheng21 Date: Wed, 3 Sep 2025 11:35:40 +0800 Subject: [PATCH] runJavaScript_0702 Signed-off-by: YuYingying1120 --- .../webview/src/common/ani_parse_utils.cpp | 24 ++++++---- .../ani_webview_controller.cpp | 7 +-- .../webview_javascript_execute_callback.cpp | 46 ++++++++++--------- .../webview_javascript_execute_callback.h | 8 ++-- 4 files changed, 47 insertions(+), 38 deletions(-) diff --git a/interfaces/kits/ani/webview/src/common/ani_parse_utils.cpp b/interfaces/kits/ani/webview/src/common/ani_parse_utils.cpp index 939534343..45575d1c6 100644 --- a/interfaces/kits/ani/webview/src/common/ani_parse_utils.cpp +++ b/interfaces/kits/ani/webview/src/common/ani_parse_utils.cpp @@ -862,7 +862,15 @@ ErrCode AniParseUtils::ConstructStringFlowbuf(ani_env *env, const std::string sc return NWebError::PARAM_CHECK_ERROR; } - scriptLength = script.size(); + ani_string str = nullptr; + if (env->String_NewUTF8(script.c_str(), script.size(), &str) != ANI_OK) { + WVLOG_E("create ani_string failed"); + return NWebError::NEW_OOM; + } + if (env->String_GetUTF8Size(str, &scriptLength) != ANI_OK) { + WVLOG_E("GetUTF8Size error"); + return NWebError::NEW_OOM; + } if (scriptLength + 1 > MAX_FLOWBUF_DATA_SIZE) { WVLOG_E("String length is too long"); return NWebError::PARAM_CHECK_ERROR; @@ -879,15 +887,13 @@ ErrCode AniParseUtils::ConstructStringFlowbuf(ani_env *env, const std::string sc return NWebError::NEW_OOM; } - ani_string string = nullptr; - env->String_NewUTF8(script.c_str(), scriptLength, &string); - ani_size result = 0U; - env->String_GetUTF8Size(string, &result); - if (result != scriptLength) { - close(fd); - WVLOG_E("Write js string failed, the length values are different"); - return NWebError::PARAM_CHECK_ERROR; + // write to ashmem + if (memcpy_s(ashmem, scriptLength + 1, script.c_str(), scriptLength) != EOK) { + WVLOG_E("ConstructArrayBufFlowbuf, memory copy failed"); + return NWebError::NEW_OOM; } + static_cast(ashmem)[scriptLength] = '\0'; + WVLOG_D("ConstructStringFlowbuf successful"); return NWebError::NO_ERROR; } diff --git a/interfaces/kits/ani/webview/src/webviewcontroller/ani_webview_controller.cpp b/interfaces/kits/ani/webview/src/webviewcontroller/ani_webview_controller.cpp index 59fa4b57a..f212de3d6 100644 --- a/interfaces/kits/ani/webview/src/webviewcontroller/ani_webview_controller.cpp +++ b/interfaces/kits/ani/webview/src/webviewcontroller/ani_webview_controller.cpp @@ -140,7 +140,7 @@ struct Scheme { bool ParsePrepareUrl(ani_env* env, ani_ref urlObj, std::string& url) { - if (AniParseUtils::ParseString(env, urlObj, url)) { + if (!AniParseUtils::ParseString(env, urlObj, url)) { WVLOG_E("urlObj convert to string failed"); return false; } @@ -491,6 +491,8 @@ static void Clean(ani_env *env, ani_object object) delete reinterpret_cast(ptr); } else if (clsName == "PrintDocumentAdapterInner") { delete reinterpret_cast(ptr); + } else if (clsName == "JsMessageExt") { + delete reinterpret_cast(ptr); } else { WVLOG_E("Clean unsupport className: %{public}s", clsName.c_str()); } @@ -5025,7 +5027,7 @@ ErrCode ConstructFlowbuf(ani_env* env, ani_object script, int& fd, size_t& scrip flowbufferAdapter->StartPerformanceBoost(); std::string scriptStr; if (AniParseUtils::IsString(env, script)) { - if (!AniParseUtils::ParseString(env, script, scriptStr)) { + if (AniParseUtils::ParseString(env, script, scriptStr)) { WVLOG_I("script is string constructstringflowbuf"); return AniParseUtils::ConstructStringFlowbuf(env, scriptStr, fd, scriptLength); } @@ -5244,7 +5246,6 @@ static ani_object RunJavaScriptInternalPromiseExt(ani_env* env, ani_object objec } auto callbackImpl = std::make_shared(env, nullptr, resolver, extention); nweb_ptr->ExecuteJavaScriptExt(fd, scriptLength, callbackImpl, extention); - close(fd); usedFd_--; return promise; } diff --git a/interfaces/kits/ani/webview/src/webviewcontroller/webview_javascript_execute_callback.cpp b/interfaces/kits/ani/webview/src/webviewcontroller/webview_javascript_execute_callback.cpp index 42fee6c9f..168ab1f2e 100644 --- a/interfaces/kits/ani/webview/src/webviewcontroller/webview_javascript_execute_callback.cpp +++ b/interfaces/kits/ani/webview/src/webviewcontroller/webview_javascript_execute_callback.cpp @@ -37,8 +37,8 @@ const std::string TASK_ID = "javascript"; constexpr int32_t CALLBACK_PARAM_LENGTH = 2; WebviewJavaScriptExecuteCallback::WebviewJavaScriptExecuteCallback( - ani_env* env, ani_ref callback, ani_resolver resolver, bool extention) - : vm_(nullptr), callbackRef_(nullptr), resolver_(resolver), extention_(extention) + ani_env* env, ani_ref callback, ani_resolver resolver, bool extension) + : vm_(nullptr), callbackRef_(nullptr), resolver_(resolver), extension_(extension) { WVLOG_D("WebviewJavaScriptExecuteCallback::WebviewJavaScriptExecuteCallback"); if (!env) { @@ -121,8 +121,8 @@ ani_ref CreateStsError(ani_env* env, ani_int code, const std::string& msg) return reinterpret_cast(obj); } -bool CreateArgs( - WebviewJavaScriptExecuteCallback* jsObj, std::shared_ptr result, std::vector& resultRef) +bool CreateArgs(std::shared_ptr jsObj, std::shared_ptr result, + std::vector& resultRef) { ani_env* env = jsObj->GetEnv(); if (!env || !jsObj) { @@ -142,8 +142,8 @@ bool CreateArgs( WVLOG_E("create null resultRef[0] error"); return false; } - if (!(jsObj->GetExtention())) { - WVLOG_E("TriggerJsCallback extention is false"); + if (!(jsObj->GetExtension())) { + WVLOG_E("TriggerJsCallback extension is false"); resultRef[1] = OHOS::NWeb::AniParseUtils::ConvertNWebToAniValue(env, result); } else { WebJsMessageExt* webJsMessageExt = new (std::nothrow) WebJsMessageExt(result); @@ -170,8 +170,8 @@ bool CreateArgs( return true; } -static void UvAfterWorkCbPromise( - WebviewJavaScriptExecuteCallback* jsObj, std::shared_ptr result, std::vector& resultRef) +static void UvAfterWorkCbPromise(std::shared_ptr jsObj, + std::shared_ptr result, std::vector& resultRef) { WVLOG_D("enter UvAfterWorkCbPromise"); ani_env* env; @@ -181,8 +181,7 @@ static void UvAfterWorkCbPromise( } ani_status status; resultRef[0] = CreateStsError(env, static_cast(NWebError::INVALID_RESOURCE), result->GetErrMsg()); - if (!(jsObj->GetExtention())) { - WVLOG_E("TriggerJsCallback extention is false"); + if (!(jsObj->GetExtension())) { resultRef[1] = OHOS::NWeb::AniParseUtils::ConvertNWebToAniValue(env, result); } else { WebJsMessageExt* webJsMessageExt = new (std::nothrow) WebJsMessageExt(result); @@ -218,7 +217,7 @@ static void UvAfterWorkCbPromise( } } -void TriggerJsCallback(WebviewJavaScriptExecuteCallback* jsObj, std::shared_ptr result) +void TriggerJsCallback(std::shared_ptr jsObj, std::shared_ptr result) { WVLOG_D("WebviewJavaScriptExecuteCallback::TriggerJsCallback"); if (!jsObj) { @@ -255,16 +254,12 @@ void TriggerJsCallback(WebviewJavaScriptExecuteCallback* jsObj, std::shared_ptr< void WebviewJavaScriptExecuteCallback::OnReceiveValue(std::shared_ptr result) { - WVLOG_D("WebviewJavaScriptExecuteCallback::OnReceiveValue"); - std::weak_ptr weakThis = weak_from_this(); - auto ensureMainHandler = [weakThis, result]() { - if (auto sharedThis = weakThis.lock()) { - TriggerJsCallback(sharedThis.get(), result); - } else { - WVLOG_E("object destory before task execution"); - return; - } - }; + if (!result) { + WVLOG_E("result is null"); + return; + } + WVLOG_I("WebviewJavaScriptExecuteCallback::OnReceiveValue"); + std::shared_ptr sharedThis = shared_from_this(); if (!mainHandler_) { std::shared_ptr runner = OHOS::AppExecFwk::EventRunner::GetMainEventRunner(); @@ -279,7 +274,14 @@ void WebviewJavaScriptExecuteCallback::OnReceiveValue(std::shared_ptrPostTask(std::move(ensureMainHandler), TASK_ID, 0, OHOS::AppExecFwk::EventQueue::Priority::HIGH, {}); + auto task = [sharedThis, result] () { TriggerJsCallback(sharedThis, result); }; + bool postResult = false; + postResult = mainHandler_->PostTask(std::move(task), TASK_ID, 0, OHOS::AppExecFwk::EventQueue::Priority::HIGH, {}); + if (postResult) { + WVLOG_D("PostTask success"); + } else { + WVLOG_E("PostTask failed"); + } } int32_t WebJsMessageExt::ConvertToJsType(NWebValue::Type type) diff --git a/interfaces/kits/ani/webview/src/webviewcontroller/webview_javascript_execute_callback.h b/interfaces/kits/ani/webview/src/webviewcontroller/webview_javascript_execute_callback.h index 0cfbd0efd..66c56950c 100644 --- a/interfaces/kits/ani/webview/src/webviewcontroller/webview_javascript_execute_callback.h +++ b/interfaces/kits/ani/webview/src/webviewcontroller/webview_javascript_execute_callback.h @@ -41,7 +41,7 @@ ani_ref CreateStsError(ani_env* env, ani_int code, const std::string& msg); class WebviewJavaScriptExecuteCallback : public std::enable_shared_from_this, public NWebMessageValueCallback { public: - explicit WebviewJavaScriptExecuteCallback(ani_env* env, ani_ref callbackRef, ani_resolver resolver, bool extention); + explicit WebviewJavaScriptExecuteCallback(ani_env* env, ani_ref callbackRef, ani_resolver resolver, bool extension); ~WebviewJavaScriptExecuteCallback(); void SetJavaScriptCallBackRef(ani_object callback); void OnReceiveValue(std::shared_ptr result) override; @@ -57,8 +57,8 @@ public: return callbackRef_; } - bool GetExtention() { - return extention_; + bool GetExtension() { + return extension_; } ani_resolver GetResolver() { @@ -70,7 +70,7 @@ private: ani_ref callbackRef_ = nullptr; ani_resolver resolver_ = nullptr; std::shared_ptr mainHandler_; - bool extention_ = false; + bool extension_ = false; }; class WebJsMessageExt { -- Gitee