diff --git a/devtools/devtools-integration/native/include/devtools/devtools_utils.h b/devtools/devtools-integration/native/include/devtools/devtools_utils.h index 384a7c06e58..cce16310167 100644 --- a/devtools/devtools-integration/native/include/devtools/devtools_utils.h +++ b/devtools/devtools-integration/native/include/devtools/devtools_utils.h @@ -52,6 +52,8 @@ class DevToolsUtil { static void PostDomTask(const std::weak_ptr& weak_dom_manager, std::function func); + static bool ShouldAvoidPostDomManagerTask(const std::string& event_name); + private: static std::shared_ptr GetHitNode(const std::shared_ptr& root_node, const std::shared_ptr& node, double x, double y); static bool IsLocationHitNode(const std::shared_ptr& root_node, const std::shared_ptr& dom_node, double x, double y); diff --git a/devtools/devtools-integration/native/src/devtools_utils.cc b/devtools/devtools-integration/native/src/devtools_utils.cc index 058e118ea11..8a49d3ff605 100644 --- a/devtools/devtools-integration/native/src/devtools_utils.cc +++ b/devtools/devtools-integration/native/src/devtools_utils.cc @@ -413,4 +413,13 @@ void DevToolsUtil::PostDomTask(const std::weak_ptr& weak_dom_manager dom_manager->PostTask(hippy::dom::Scene(std::move(ops))); } } + +/** + * Specific methods like getLocationOnScreen should wait in the dom manager task runner. To avoid a deadlock, the + * callback must not be posted in the same task runner. + */ +bool DevToolsUtil::ShouldAvoidPostDomManagerTask(const std::string& event_name) { + return event_name == kGetLocationOnScreen; +} + } // namespace hippy::devtools diff --git a/renderer/native/android/src/main/cpp/src/renderer/native_render_jni.cc b/renderer/native/android/src/main/cpp/src/renderer/native_render_jni.cc index d82e958ecac..1106f8e8855 100644 --- a/renderer/native/android/src/main/cpp/src/renderer/native_render_jni.cc +++ b/renderer/native/android/src/main/cpp/src/renderer/native_render_jni.cc @@ -33,6 +33,9 @@ #include "jni/jni_env.h" #include "renderer/native_render_manager.h" +#ifdef ENABLE_INSPECTOR +#include "devtools/devtools_utils.h" +#endif using DomArgument = hippy::dom::DomArgument; using DomEvent = hippy::dom::DomEvent; @@ -291,6 +294,12 @@ void DoCallBack(JNIEnv *j_env, jobject j_object, callback(std::make_shared(*params)); }}; +#ifdef ENABLE_INSPECTOR + if (hippy::devtools::DevToolsUtil::ShouldAvoidPostDomManagerTask(func_name)) { + ops[0](); + return; + } +#endif dom_manager->PostTask(Scene(std::move(ops))); }