From 0213a7172bcd236728b40b4cd1edb7961c0c7bfe Mon Sep 17 00:00:00 2001 From: z00932658 Date: Wed, 4 Jun 2025 16:56:38 +0800 Subject: [PATCH 1/2] Fix isHybrid for napi Issue: https://gitee.com/openharmony/arkcompiler_ets_runtime/issues/ICIBCU Signed-off-by: zhushihao Change-Id: I768896756a16f7ef6b6a6b88b94a676d9b12ef01 --- interfaces/inner_api/napi/native_node_api.h | 4 +++ native_engine/impl/ark/ark_native_engine.cpp | 31 ++++++++++++++++++-- native_engine/impl/ark/ark_native_engine.h | 3 +- native_engine/native_api.cpp | 7 ++--- native_engine/native_engine.h | 3 +- 5 files changed, 40 insertions(+), 8 deletions(-) diff --git a/interfaces/inner_api/napi/native_node_api.h b/interfaces/inner_api/napi/native_node_api.h index ddea4adee..91d67986f 100644 --- a/interfaces/inner_api/napi/native_node_api.h +++ b/interfaces/inner_api/napi/native_node_api.h @@ -67,6 +67,10 @@ typedef enum { using NapiAppStateCallback = void (*)(int state, int64_t timestamp); +NAPI_EXTERN napi_status napi_load_module_with_info_hybrid(napi_env env, + const char* path, + const char* module_info, + napi_value* result); NAPI_EXTERN napi_status napi_create_limit_runtime(napi_env env, napi_env* result_env); NAPI_EXTERN void napi_module_with_js_register(napi_module_with_js* mod); NAPI_EXTERN napi_status napi_is_callable(napi_env env, napi_value value, bool* result); diff --git a/native_engine/impl/ark/ark_native_engine.cpp b/native_engine/impl/ark/ark_native_engine.cpp index 0684a2489..4715f4eb9 100644 --- a/native_engine/impl/ark/ark_native_engine.cpp +++ b/native_engine/impl/ark/ark_native_engine.cpp @@ -1863,7 +1863,7 @@ napi_value ArkNativeEngine::NapiLoadModule(const char* path) return JsValueFromLocalValue(scope.Escape(exportObj)); } -napi_value ArkNativeEngine::NapiLoadModuleWithInfo(const char* path, const char* module_info, bool isHybrid) +napi_value ArkNativeEngine::NapiLoadModuleWithInfo(const char* path, const char* module_info) { if (path == nullptr) { HILOG_ERROR("ArkNativeEngine:The module name is empty"); @@ -1876,7 +1876,34 @@ napi_value ArkNativeEngine::NapiLoadModuleWithInfo(const char* path, const char* std::string modulePath; if (module_info != nullptr) { modulePath = module_info; - exportObj = panda::JSNApi::GetModuleNameSpaceWithModuleInfo(vm_, inputPath, modulePath, isHybrid); + exportObj = panda::JSNApi::GetModuleNameSpaceWithModuleInfoForNormalApp(vm_, inputPath, modulePath); + } else { + exportObj = NapiLoadNativeModule(inputPath); + } + + if (panda::JSNApi::HasPendingException(vm_)) { + HILOG_WARN("ArkNativeEngine:NapiLoadModuleWithInfo failed."); + panda::JSNApi::PrintExceptionInfo(vm_); + panda::JSNApi::GetAndClearUncaughtException(vm_); // clear exception here + return JsValueFromLocalValue(scope.Escape(undefObj)); + } + return JsValueFromLocalValue(scope.Escape(exportObj)); +} + +napi_value ArkNativeEngine::NapiLoadModuleWithInfoForHybridApp(const char* path, const char* module_info) +{ + if (path == nullptr) { + HILOG_ERROR("ArkNativeEngine:The module name is empty"); + return nullptr; + } + panda::EscapeLocalScope scope(vm_); + Local undefObj = JSValueRef::Undefined(vm_); + Local exportObj(undefObj); + std::string inputPath(path); + std::string modulePath; + if (module_info != nullptr) { + modulePath = module_info; + exportObj = panda::JSNApi::GetModuleNameSpaceWithModuleInfoForHybridApp(vm_, inputPath, modulePath); } else { exportObj = NapiLoadNativeModule(inputPath); } diff --git a/native_engine/impl/ark/ark_native_engine.h b/native_engine/impl/ark/ark_native_engine.h index 82040cd4f..47ab97607 100644 --- a/native_engine/impl/ark/ark_native_engine.h +++ b/native_engine/impl/ark/ark_native_engine.h @@ -347,7 +347,8 @@ public: const std::string& moduleName, bool isAppModule, const std::string& id, const std::string& param, const std::string& instanceName, void** instance); napi_value NapiLoadModule(const char* path) override; - napi_value NapiLoadModuleWithInfo(const char* path, const char* module_info, bool isHybrid = false) override; + napi_value NapiLoadModuleWithInfo(const char* path, const char* module_info) override; + napi_value NapiLoadModuleWithInfoForHybridApp(const char* path, const char* module_info) override; std::string GetOhmurl(std::string str); Local NapiLoadNativeModule(std::string path); NativeReference* GetPromiseRejectCallBackRef() diff --git a/native_engine/native_api.cpp b/native_engine/native_api.cpp index 6c2db3166..4ca0b58fa 100644 --- a/native_engine/native_api.cpp +++ b/native_engine/native_api.cpp @@ -3295,13 +3295,12 @@ NAPI_EXTERN napi_status napi_load_module_with_info(napi_env env, NAPI_EXTERN napi_status napi_load_module_with_info_hybrid(napi_env env, const char* path, const char* module_info, - napi_value* result, - bool isHybrid) + napi_value* result) { NAPI_PREAMBLE(env); CHECK_ARG(env, result); auto engine = reinterpret_cast(env); - *result = engine->NapiLoadModuleWithInfo(path, module_info, isHybrid); + *result = engine->NapiLoadModuleWithInfoForHybridApp(path, module_info); return GET_RETURN_STATUS(env); } // Memory management @@ -4604,7 +4603,7 @@ NAPI_EXTERN napi_status napi_load_module_with_module_request(napi_env env, const if (request_name[0] == NAME_SPACE_TAG) { // load module with OhmUrl auto [path, module_info] = panda::JSNApi::ResolveOhmUrl(request_name); - napi_load_module_with_info_hybrid(env, path.c_str(), module_info.c_str(), result, true); + napi_load_module_with_info_hybrid(env, path.c_str(), module_info.c_str(), result); } else { napi_load_module_with_path(env, request_name, result); } diff --git a/native_engine/native_engine.h b/native_engine/native_engine.h index c3bd0abb6..54ab66e3d 100644 --- a/native_engine/native_engine.h +++ b/native_engine/native_engine.h @@ -521,7 +521,8 @@ public: void SetModuleLoadChecker(const std::shared_ptr& moduleCheckerDelegate); virtual napi_value NapiLoadModule(const char* path) = 0; - virtual napi_value NapiLoadModuleWithInfo(const char* path, const char* module_info, bool isHybrid = false) = 0; + virtual napi_value NapiLoadModuleWithInfo(const char* path, const char* module_info) = 0; + virtual napi_value NapiLoadModuleWithInfoForHybridApp(const char* path, const char* module_info) = 0; virtual std::string GetPkgName(const std::string &moduleName) = 0; double NewAsyncId() -- Gitee From 748b4ad1745577cb44a2995c681f98ab0b24e2a5 Mon Sep 17 00:00:00 2001 From: z00932658 Date: Thu, 26 Jun 2025 10:11:50 +0800 Subject: [PATCH 2/2] Add tests for NapiLoadModuleWithInfoForHybridApp Issue: https://gitee.com/openharmony/arkcompiler_ets_runtime/issues/ICIBCU Signed-off-by: zhushihao Change-Id: Ia3d2e0168e6b902363344ec0636b5e07fff78bb1 --- interfaces/inner_api/napi/native_node_api.h | 7 +--- test/unittest/test_napi.cpp | 40 +++++++++++++++++++++ 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/interfaces/inner_api/napi/native_node_api.h b/interfaces/inner_api/napi/native_node_api.h index 91d67986f..18fd603f3 100644 --- a/interfaces/inner_api/napi/native_node_api.h +++ b/interfaces/inner_api/napi/native_node_api.h @@ -67,10 +67,6 @@ typedef enum { using NapiAppStateCallback = void (*)(int state, int64_t timestamp); -NAPI_EXTERN napi_status napi_load_module_with_info_hybrid(napi_env env, - const char* path, - const char* module_info, - napi_value* result); NAPI_EXTERN napi_status napi_create_limit_runtime(napi_env env, napi_env* result_env); NAPI_EXTERN void napi_module_with_js_register(napi_module_with_js* mod); NAPI_EXTERN napi_status napi_is_callable(napi_env env, napi_value value, bool* result); @@ -246,7 +242,6 @@ NAPI_EXTERN napi_status napi_register_appstate_callback(napi_env env, NapiAppSta NAPI_EXTERN napi_status napi_load_module_with_info_hybrid(napi_env env, const char* path, const char* module_info, - napi_value* result, - bool isHybrid); + napi_value* result); #endif /* FOUNDATION_ACE_NAPI_INTERFACES_KITS_NAPI_NATIVE_NODE_API_H */ diff --git a/test/unittest/test_napi.cpp b/test/unittest/test_napi.cpp index 8fa34980a..e8c6c2923 100644 --- a/test/unittest/test_napi.cpp +++ b/test/unittest/test_napi.cpp @@ -13659,6 +13659,46 @@ HWTEST_F(NapiBasicTest, NapiLoadModuleWithInfoTest004, testing::ext::TestSize.Le ASSERT_EQ(result2->error_code, napi_generic_failure); } +/** + * @tc.name: NapiLoadModuleWithInfoForHybridAppTest + * @tc.desc: Test interface of napi_load_module_with_info_hybrid + * @tc.type: FUNC + */ +HWTEST_F(NapiBasicTest, NapiLoadModuleWithInfoForHybridAppTest001, testing::ext::TestSize.Level1) +{ + auto res = napi_load_module_with_info_hybrid(nullptr, nullptr, nullptr, nullptr); + ASSERT_EQ(res, napi_invalid_arg); +} + +/** + * @tc.name: NapiLoadModuleWithInfoForHybridAppTest + * @tc.desc: Test interface of napi_load_module_with_info_hybrid + * @tc.type: FUNC + */ +HWTEST_F(NapiBasicTest, NapiLoadModuleWithInfoForHybridAppTest002, testing::ext::TestSize.Level1) +{ + ASSERT_NE(engine_, nullptr); + napi_env env = reinterpret_cast(engine_); + + auto res = napi_load_module_with_info_hybrid(env, nullptr, nullptr, nullptr); + ASSERT_EQ(res, napi_invalid_arg); +} + +/** + * @tc.name: NapiLoadModuleWithInfoForHybridAppTest + * @tc.desc: Test interface of napi_load_module_with_info_hybrid + * @tc.type: FUNC + */ +HWTEST_F(NapiBasicTest, NapiLoadModuleWithInfoForHybridAppTest003, testing::ext::TestSize.Level1) +{ + ASSERT_NE(engine_, nullptr); + napi_env env = reinterpret_cast(engine_); + + napi_value result = nullptr; + auto res = napi_load_module_with_info_hybrid(env, nullptr, nullptr, &result); + ASSERT_EQ(res, napi_ok); +} + /** * @tc.name: NapiSerializeTest * @tc.desc: Test interface of napi_serialize -- Gitee