diff --git a/frameworks/napi/input_consumer/include/js_register_module.h b/frameworks/napi/input_consumer/include/js_register_module.h index 43666703ecf0ee9b78bd8c8a0aea59a6a236e6e5..124bc7feb71a80aece27804c7b791bf567f47edf 100644 --- a/frameworks/napi/input_consumer/include/js_register_module.h +++ b/frameworks/napi/input_consumer/include/js_register_module.h @@ -21,6 +21,7 @@ #include #include #include +#include #include "napi/native_api.h" #include "napi/native_node_api.h" @@ -54,6 +55,16 @@ struct KeyEventMonitorInfo { napi_ref callback[1] { nullptr }; int32_t subscribeId { 0 }; std::shared_ptr keyOption { nullptr }; + bool valid { true }; + std::mutex refLock; + void SetValid(bool flag) { + std::lock_guard lock(refLock); + valid = flag; + } + bool IsValid() { + std::lock_guard lock(refLock); + return valid; + } }; static std::mutex sCallBacksMutex_; typedef std::map> Callbacks; diff --git a/frameworks/napi/input_consumer/src/js_register_module.cpp b/frameworks/napi/input_consumer/src/js_register_module.cpp index 1200a31d12106c3429e40a2d87dca1113f79813d..ffab2c6edf284d6eb27bead6d5f86065fab95ba7 100644 --- a/frameworks/napi/input_consumer/src/js_register_module.cpp +++ b/frameworks/napi/input_consumer/src/js_register_module.cpp @@ -239,11 +239,22 @@ static napi_value JsOn(napi_env env, napi_callback_info info) CALL_DEBUG_ENTER; size_t argc = 3; napi_value argv[3] = { 0 }; - CHKRP(napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr), GET_CB_INFO); + napi_value thisArg = nullptr; + CHKRP(napi_get_cb_info(env, info, &argc, argv, &thisArg, nullptr), GET_CB_INFO); if (argc < 3) { THROWERR_CUSTOM(env, COMMON_PARAMETER_ERROR, "parameter number error"); return nullptr; } + if (thisArg == nullptr) { + MMI_HILOGE("%{public}s, This argument is nullptr.", __func__); + return nullptr; + } + napi_valuetype valueOfThis = napi_undefined; + CHKRP(napi_typeof(env, thisArg, &valueOfThis), TYPEOF); + if (valueOfThis == napi_undefined) { + MMI_HILOGE("%{public}s, Wrong value of this.", __func__); + return nullptr; + } KeyEventMonitorInfo *event = new (std::nothrow) KeyEventMonitorInfo { .env = env, .asyncWork = nullptr, @@ -283,6 +294,14 @@ static napi_value JsOn(napi_env env, napi_callback_info info) MMI_HILOGE("AddEventCallback failed"); return nullptr; } + std::shared_ptr* cbInfo = new std::shared_ptr(event); + napi_wrap(env, thisArg, (void*)cbInfo, [](napi_env env, void* data, void* hint) { + std::shared_ptr* cbInfo = static_cast*>(data); + if (cbInfo != nullptr && *cbInfo != nullptr) { + (*cbInfo)->SetValid(false); + delete cbInfo; + } + }, nullptr, nullptr); return nullptr; } diff --git a/frameworks/napi/input_consumer/src/js_register_util.cpp b/frameworks/napi/input_consumer/src/js_register_util.cpp index 667f02cf87b76ea4ec499671f52fa0bfbe7eb9e0..84220e656cd722fb8258c5942e263edc14e5ceaf 100644 --- a/frameworks/napi/input_consumer/src/js_register_util.cpp +++ b/frameworks/napi/input_consumer/src/js_register_util.cpp @@ -313,6 +313,10 @@ void EmitAsyncCallbackWork(KeyEventMonitorInfo *reportEvent) { CALL_DEBUG_ENTER; CHKPV(reportEvent); + if (!reportEvent->IsValid()) { + MMI_HILOGE("%{public}s, module exported object is invalid.", __func__); + return; + } uv_loop_s *loop = nullptr; CHKRV(napi_get_uv_event_loop(reportEvent->env, &loop), GET_UV_EVENT_LOOP); uv_work_t *work = new (std::nothrow) uv_work_t;