diff --git a/frameworks/inputmethod_ability/include/event_target.h b/frameworks/inputmethod_ability/include/event_target.h index e1a345a..96b99ec 100644 --- a/frameworks/inputmethod_ability/include/event_target.h +++ b/frameworks/inputmethod_ability/include/event_target.h @@ -45,6 +45,14 @@ namespace MiscServices { EventListener *first_; EventListener *last_; }; + + class UvWorkMsg{ + public: + UvWorkMsg(const char *type, Event *event); + ~UvWorkMsg(){}; + char *type_; + Event *event_; + }; } } #endif // INPUT_METHOD_NAPI_EVENT_TARGET_H \ No newline at end of file diff --git a/frameworks/inputmethod_ability/src/event_target.cpp b/frameworks/inputmethod_ability/src/event_target.cpp index 8269d9c..0d95845 100644 --- a/frameworks/inputmethod_ability/src/event_target.cpp +++ b/frameworks/inputmethod_ability/src/event_target.cpp @@ -162,24 +162,73 @@ namespace MiscServices { void EventTarget::Emit(const char *type, Event *event) { IMSA_HILOGI("EventTarget::Emit"); - napi_handle_scope scope = nullptr; - napi_open_handle_scope(env_, &scope); - - napi_value thisVar = nullptr; - napi_get_reference_value(env_, thisVarRef_, &thisVar); - for (EventListener *eventListener = first_; eventListener != nullptr; eventListener = eventListener->next) { - if (strcmp(eventListener->type, type) == 0) { - napi_value jsEvent = event ? event->ToJsObject() : nullptr; - napi_value handler = nullptr; - napi_value result = nullptr; - napi_get_reference_value(env_, eventListener->handlerRef, &handler); - napi_call_function(env_, thisVar, handler, jsEvent ? 1 : 0, jsEvent ? &jsEvent : nullptr, &result); - if (eventListener->isOnce) { - Off(type, handler); - } - } + uv_loop_s *loop = nullptr; + napi_get_uv_event_loop(env_, &loop); + if (loop == nullptr) { + IMSA_HILOGI("EventTarget::Emit loop == nullptr"); + return; } - napi_close_handle_scope(env_, scope); + + uv_work_t *work1 = new (std::nothrow) uv_work_t; + if (work1 == nullptr) { + IMSA_HILOGI("EventTarget::Emit No memory work1 == nullptr"); + return; + } + + UvWorkMsg *workData = new (std::nothrow) UvWorkMsg(type, event); + if (workData == nullptr) { + IMSA_HILOGI("EventTarget::Emit No memory workData == nullptr"); + delete work1; + return; + } + + work1->data = reinterpret_cast(workData); + int ret = uv_queue_work(loop, work1, [](uv_work_t *work) {}, [](uv_work_t *work, int status) { + //Js Thread + if (work == nullptr) { + IMSA_HILOGI("EventTarget::Emit work == nullptr"); + return; + } + UvWorkMsg *workMsg = reinterpret_cast(work->data); + do { + if (!workMsg) { + IMSA_HILOGI("EventTarget::Emit workMsg is nullptr"); + break; + } + + napi_handle_scope scope = nullptr; + napi_open_handle_scope(env_, &scope); + + napi_value thisVar = nullptr; + napi_get_reference_value(env_, thisVarRef_, &thisVar); + for (EventListener *eventListener = first_; eventListener != nullptr; eventListener = eventListener->next) { + if (strcmp(eventListener->type, workMsg->type) == 0) { + napi_value jsEvent = event ? event->ToJsObject() : nullptr; + napi_value handler = nullptr; + napi_value result = nullptr; + napi_get_reference_value(env_, eventListener->handlerRef, &handler); + napi_call_function(env_, thisVar, handler, jsEvent ? 1 : 0, jsEvent ? &jsEvent : nullptr, &result); + if (eventListener->isOnce) { + Off(workMsg->type, handler); + } + } + } + napi_close_handle_scope(env_, scope); + } while (0); + if (workMsg) { + delete workMsg; + } + delete work; + }); + if (ret != 0) { + IMSA_HILOGI("EventTarget::Emit failed to execute libuv work queue"); + delete workData; + delete work1; + } + } + + UvWorkMsg::UvWorkMsg(const char *type, Event *event) : type_(type), event_(event) + { } } } \ No newline at end of file