From f4d0abcbc0e29f0bc055c19567a8f825db050af5 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/ability_ability_runtime/issues/ICD2ZO Signed-off-by: zhushihao Change-Id: I768896756a16f7ef6b6a6b88b94a676d9b12ef01 --- interfaces/inner_api/napi/native_node_api.h | 4 +++ interfaces/kits/napi/native_api.h | 5 ---- 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 +- 6 files changed, 40 insertions(+), 13 deletions(-) diff --git a/interfaces/inner_api/napi/native_node_api.h b/interfaces/inner_api/napi/native_node_api.h index 6cff6901a..9304c250d 100644 --- a/interfaces/inner_api/napi/native_node_api.h +++ b/interfaces/inner_api/napi/native_node_api.h @@ -66,6 +66,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/interfaces/kits/napi/native_api.h b/interfaces/kits/napi/native_api.h index 88309b852..09943bef0 100644 --- a/interfaces/kits/napi/native_api.h +++ b/interfaces/kits/napi/native_api.h @@ -85,11 +85,6 @@ NAPI_EXTERN napi_status napi_load_module_with_info(napi_env env, const char* path, const char* module_info, napi_value* result); -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 = false); NAPI_EXTERN napi_status napi_create_object_with_properties(napi_env env, napi_value* result, size_t property_count, diff --git a/native_engine/impl/ark/ark_native_engine.cpp b/native_engine/impl/ark/ark_native_engine.cpp index 7e5fd80b2..a3d4cef14 100644 --- a/native_engine/impl/ark/ark_native_engine.cpp +++ b/native_engine/impl/ark/ark_native_engine.cpp @@ -1493,7 +1493,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"); @@ -1506,7 +1506,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 8101b3b41..7d3230ef5 100644 --- a/native_engine/impl/ark/ark_native_engine.h +++ b/native_engine/impl/ark/ark_native_engine.h @@ -330,7 +330,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 fc764e994..1ca7312ff 100644 --- a/native_engine/native_api.cpp +++ b/native_engine/native_api.cpp @@ -3135,13 +3135,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 @@ -4393,7 +4392,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 ca528856c..48d73ce78 100644 --- a/native_engine/native_engine.h +++ b/native_engine/native_engine.h @@ -491,7 +491,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 45add31e98a2cab0e1a6f61e3d92a3a95ec001a7 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/ability_ability_runtime/issues/ICD2ZO Signed-off-by: zhushihao --- test/unittest/test_napi.cpp | 40 +++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/test/unittest/test_napi.cpp b/test/unittest/test_napi.cpp index 3fc43e02a..11b96ec82 100644 --- a/test/unittest/test_napi.cpp +++ b/test/unittest/test_napi.cpp @@ -12589,6 +12589,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