diff --git a/interfaces/inner_api/napi/native_node_api.h b/interfaces/inner_api/napi/native_node_api.h index c871bffa3c80b6d23e20b3a9f990e4be00cfce32..b9c23dca71904e6ca776f11906c0ff180e4b08c9 100644 --- a/interfaces/inner_api/napi/native_node_api.h +++ b/interfaces/inner_api/napi/native_node_api.h @@ -196,4 +196,4 @@ NAPI_EXTERN napi_status napi_load_module_with_path(napi_env env, const char* pat napi_value* result); NAPI_EXTERN napi_status napi_throw_jsvalue(napi_env env, napi_value error); -#endif /* FOUNDATION_ACE_NAPI_INTERFACES_KITS_NAPI_NATIVE_NODE_API_H */ \ No newline at end of file +#endif /* FOUNDATION_ACE_NAPI_INTERFACES_KITS_NAPI_NATIVE_NODE_API_H */ diff --git a/interfaces/inner_api/napi/native_node_hybrid_api.h b/interfaces/inner_api/napi/native_node_hybrid_api.h index 38839f14d200ec184caead3eaca1c973d14d20d9..33a4c97658fb41f35e52af49049459728fa5a944 100644 --- a/interfaces/inner_api/napi/native_node_hybrid_api.h +++ b/interfaces/inner_api/napi/native_node_hybrid_api.h @@ -96,10 +96,11 @@ NAPI_EXTERN napi_status napi_serialize_hybrid(napi_env env, napi_value object, napi_value transfer_list, napi_value clone_list, void** result); - NAPI_EXTERN napi_status napi_wrap_with_xref(napi_env env, +NAPI_EXTERN napi_status napi_wrap_with_xref(napi_env env, napi_value js_object, void* native_object, napi_finalize finalize_cb, + proxy_object_attach_cb proxy_cb, napi_ref* result); #endif // PANDA_JS_ETS_HYBRID_MODE NAPI_EXTERN napi_status napi_register_appstate_callback(napi_env env, NapiAppStateCallback callback); diff --git a/native_engine/native_node_api.cpp b/native_engine/native_node_api.cpp index 9319d07f9a20ea03722c706a0fbbaaa5adf7b932..c0b13eb2a6de2d365cf278a1114963d19f7ae6cf 100644 --- a/native_engine/native_node_api.cpp +++ b/native_engine/native_node_api.cpp @@ -642,4 +642,4 @@ NAPI_EXTERN napi_status napi_set_module_validate_callback(napi_module_validate_c return napi_ok; } return napi_generic_failure; -} \ No newline at end of file +} diff --git a/native_engine/native_node_hybrid_api.cpp b/native_engine/native_node_hybrid_api.cpp index 2d959cefeccfc8af4af0fe782e82546e3b31aa5f..ff9beef5b86ab3095dfd66a891f0d741a3404b1b 100644 --- a/native_engine/native_node_hybrid_api.cpp +++ b/native_engine/native_node_hybrid_api.cpp @@ -330,6 +330,7 @@ NAPI_EXTERN napi_status napi_wrap_with_xref(napi_env env, napi_value js_object, void* native_object, napi_finalize finalize_cb, + proxy_object_attach_cb proxy_cb, napi_ref* result) { NAPI_PREAMBLE(env); @@ -352,9 +353,22 @@ NAPI_EXTERN napi_status napi_wrap_with_xref(napi_env env, // Create strong reference now, will update to weak reference after interop support ref = engine->CreateXRefReference(js_object, 1, false, callback, native_object); *reference = ref; + panda::JSNApi::XRefBindingInfo* data = panda::JSNApi::XRefBindingInfo::CreateNewInstance(); + if (data == nullptr) { + HILOG_ERROR("data is nullptr"); + return napi_set_last_error(env, napi_invalid_arg); + } + data->attachXRefFunc = reinterpret_cast(proxy_cb); + data->attachXRefData = native_object; object->SetNativePointerFieldCount(vm, 1); - object->SetNativePointerField(vm, 0, ref, nullptr, nullptr, nativeBindingSize); - PropertyAttribute attr(object, true, false, true); + object->SetNativePointerField( + vm, 0, ref, + [](void* env, void* data, void* info) { + panda::JSNApi::XRefBindingInfo* externalInfo = reinterpret_cast(info); + delete externalInfo; + }, + reinterpret_cast(data), nativeBindingSize); + panda::PropertyAttribute attr(object, true, false, true); nativeObject->DefineProperty(vm, key, attr); return GET_RETURN_STATUS(env); } diff --git a/test/unittest/test_napi.cpp b/test/unittest/test_napi.cpp index 7e05d997979256a4e7e419899282776f70f632ed..c495b52260625cc37d97fb61100e3eb0ba94bfb8 100644 --- a/test/unittest/test_napi.cpp +++ b/test/unittest/test_napi.cpp @@ -7806,7 +7806,7 @@ HWTEST_F(NapiBasicTest, NapiWrapWithXRefTest001, testing::ext::TestSize.Level1) napi_create_object(env, &obj); napi_status status = napi_wrap_with_xref( - env, obj, (void*)TEST_STRING, [](napi_env, void* data, void* hint) {}, &result); + env, obj, (void*)TEST_STRING, [](napi_env, void* data, void* hint) {}, nullptr, &result); ASSERT_EQ(status, napi_ok); } @@ -7818,7 +7818,7 @@ HWTEST_F(NapiBasicTest, NapiWrapWithXRefTest002, testing::ext::TestSize.Level1) napi_create_object(env, &obj); napi_status status = napi_wrap_with_xref( - env, obj, (void*)TEST_STRING, [](napi_env, void* data, void* hint) {}, &result); + env, obj, (void*)TEST_STRING, [](napi_env, void* data, void* hint) {}, nullptr, &result); ASSERT_EQ(status, napi_ok); } @@ -7829,7 +7829,7 @@ HWTEST_F(NapiBasicTest, NapiWrapWithXRefTest003, testing::ext::TestSize.Level1) napi_ref result; napi_status status = napi_wrap_with_xref( - env, obj, (void*)TEST_STRING, [](napi_env, void* data, void* hint) {}, &result); + env, obj, (void*)TEST_STRING, [](napi_env, void* data, void* hint) {}, nullptr, &result); ASSERT_EQ(status, napi_invalid_arg); } @@ -7841,7 +7841,7 @@ HWTEST_F(NapiBasicTest, NapiWrapWithXRefTest004, testing::ext::TestSize.Level1) napi_create_object(env, &obj); napi_status status = napi_wrap_with_xref( - env, obj, nullptr, [](napi_env, void* data, void* hint) {}, &result); + env, obj, nullptr, [](napi_env, void* data, void* hint) {}, nullptr, &result); ASSERT_EQ(status, napi_invalid_arg); } @@ -7852,7 +7852,7 @@ HWTEST_F(NapiBasicTest, NapiWrapWithXRefTest005, testing::ext::TestSize.Level1) napi_ref result; napi_create_object(env, &obj); - napi_status status = napi_wrap_with_xref(env, obj, (void*)TEST_STRING, nullptr, &result); + napi_status status = napi_wrap_with_xref(env, obj, (void*)TEST_STRING, nullptr, nullptr, &result); ASSERT_EQ(status, napi_invalid_arg); } @@ -7863,7 +7863,7 @@ HWTEST_F(NapiBasicTest, NapiWrapWithXRefTest006, testing::ext::TestSize.Level1) napi_ref result; napi_create_object(env, &obj); - napi_status status = napi_wrap_with_xref(env, obj, (void*)TEST_STRING, nullptr, &result); + napi_status status = napi_wrap_with_xref(env, obj, (void*)TEST_STRING, nullptr, nullptr, &result); ASSERT_EQ(status, napi_invalid_arg); } @@ -7875,7 +7875,7 @@ HWTEST_F(NapiBasicTest, NapiMarkFromObjectTest001, testing::ext::TestSize.Level1 napi_create_object(env, &obj); napi_status status = napi_wrap_with_xref( - env, obj, (void*)TEST_STRING, [](napi_env, void* data, void* hint) {}, &result); + env, obj, (void*)TEST_STRING, [](napi_env, void* data, void* hint) {}, nullptr, &result); ASSERT_EQ(status, napi_ok); status = napi_mark_from_object(env, result); ASSERT_EQ(status, napi_ok); @@ -7915,6 +7915,33 @@ HWTEST_F(NapiBasicTest, NapiCreateXRefTest003, testing::ext::TestSize.Level1) auto res = napi_create_xref(env, nullptr, 1, nullptr); ASSERT_EQ(res, napi_invalid_arg); } + +HWTEST_F(NapiBasicTest, NapiCreateXRefTest004, testing::ext::TestSize.Level1) +{ + ASSERT_NE(engine_, nullptr); + napi_env env = reinterpret_cast(engine_); + + auto res = napi_serialize_hybrid(env, nullptr, nullptr, nullptr, nullptr); + ASSERT_EQ(res, napi_invalid_arg); +} + +HWTEST_F(NapiBasicTest, NapiCreateXRefTest005, testing::ext::TestSize.Level1) +{ + ASSERT_NE(engine_, nullptr); + napi_env env = reinterpret_cast(engine_); + + auto res = napi_deserialize_hybrid(env, nullptr, nullptr); + ASSERT_EQ(res, napi_invalid_arg); +} + +HWTEST_F(NapiBasicTest, NapiCreateXRefTest006, testing::ext::TestSize.Level1) +{ + ASSERT_NE(engine_, nullptr); + napi_env env = reinterpret_cast(engine_); + + auto res = napi_mark_attach_with_xref(env, nullptr, nullptr, nullptr); + ASSERT_EQ(res, napi_invalid_arg); +} #endif HWTEST_F(NapiBasicTest, NapiRegisterAppStateCallbakcTest001, testing::ext::TestSize.Level1) @@ -9171,7 +9198,7 @@ HWTEST_F(NapiBasicTest, NapiIsAliveObjectTest001, testing::ext::TestSize.Level1) napi_create_object(env, &obj); napi_status status = - napi_wrap_with_xref(env, obj, (void*)TEST_STRING, [](napi_env, void* data, void* hint) {}, &result); + napi_wrap_with_xref(env, obj, (void*)TEST_STRING, [](napi_env, void* data, void* hint) {}, nullptr, &result); ASSERT_EQ(status, napi_ok); status = napi_is_alive_object(env, result, &res); ASSERT_EQ(status, napi_ok); @@ -9186,7 +9213,7 @@ HWTEST_F(NapiBasicTest, NapiIsValidHeapObjectTest001, testing::ext::TestSize.Lev napi_create_object(env, &obj); napi_status status = - napi_wrap_with_xref(env, obj, (void*)TEST_STRING, [](napi_env, void* data, void* hint) {}, &result); + napi_wrap_with_xref(env, obj, (void*)TEST_STRING, [](napi_env, void* data, void* hint) {}, nullptr, &result); ASSERT_EQ(status, napi_ok); status = napi_is_contain_object(env, result, &res); ASSERT_EQ(status, napi_ok);