Skip to content

Commit bacd12a

Browse files
committed
[Optimize][Event] Add nodeIndex to event target info
- Pass optional ElementInfo through component creation so component elements keep their nodeIndex. - Include nodeIndex in event target payloads when an Element is available, while preserving callers that only provide an AttributeHolder. - Keep the type-element-api package testable by declaring its TypeScript dev dependency and aligning tsconfig with existing type packages. TEST: lynx/tools/rtf/rtf native-ut run --names lynx --target events_test_exec --gtest-filter="TouchEventHandlerTest.*" --silent TEST: pnpm --dir lynx/js_libraries/type-element-api test
1 parent c925fd0 commit bacd12a

10 files changed

Lines changed: 73 additions & 20 deletions

File tree

core/renderer/dom/element.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2346,6 +2346,7 @@ lepus::Value Element::GetEventTargetInfo(bool is_core_event) {
23462346
BASE_STATIC_STRING_DECL(kId, "id");
23472347
BASE_STATIC_STRING_DECL(kDataset, "dataset");
23482348
BASE_STATIC_STRING_DECL(kUid, "uid");
2349+
BASE_STATIC_STRING_DECL(kNodeIndex, "nodeIndex");
23492350

23502351
dict.get()->SetValue(kId, data_model_->idSelector());
23512352
auto dataset = lepus::Dictionary::Create();
@@ -2354,6 +2355,7 @@ lepus::Value Element::GetEventTargetInfo(bool is_core_event) {
23542355
}
23552356
dict.get()->SetValue(kDataset, std::move(dataset));
23562357
dict.get()->SetValue(kUid, id_);
2358+
dict.get()->SetValue(kNodeIndex, node_index_);
23572359
}
23582360

23592361
// element ref needed in fiber element worklet

core/renderer/events/touch_event_handler.cc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,6 +1047,7 @@ lepus::Value TouchEventHandler::GetTargetInfo(int32_t impl_id,
10471047
BASE_STATIC_STRING_DECL(kId, "id");
10481048
BASE_STATIC_STRING_DECL(kDataset, "dataset");
10491049
BASE_STATIC_STRING_DECL(kUid, "uid");
1050+
BASE_STATIC_STRING_DECL(kNodeIndex, "nodeIndex");
10501051

10511052
dict.get()->SetValue(kId, holder->idSelector());
10521053
auto data_set = lepus::Dictionary::Create();
@@ -1055,6 +1056,9 @@ lepus::Value TouchEventHandler::GetTargetInfo(int32_t impl_id,
10551056
}
10561057
dict.get()->SetValue(kDataset, std::move(data_set));
10571058
dict.get()->SetValue(kUid, impl_id);
1059+
if (element != nullptr) {
1060+
dict.get()->SetValue(kNodeIndex, element->NodeIndex());
1061+
}
10581062
}
10591063

10601064
// element ref needed in fiber element worklet

core/renderer/events/touch_event_handler_unittest.cc

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,26 @@ TEST_F(TouchEventHandlerTest, TestGetCustomEventParamName) {
7878
EXPECT_EQ(res2.Table().get()->Contains("params"), true);
7979
}
8080

81+
TEST_F(TouchEventHandlerTest, TestGetTargetInfoNodeIndex) {
82+
auto holder = fml::MakeRefCounted<AttributeHolder>();
83+
holder->SetIdSelector(base::String("target"));
84+
85+
lepus::Value target_info_without_element =
86+
TouchEventHandler::GetTargetInfo(11, holder.get());
87+
ASSERT_TRUE(target_info_without_element.IsObject());
88+
EXPECT_FALSE(target_info_without_element.Table()->Contains("nodeIndex"));
89+
90+
base::String tag("view");
91+
auto element =
92+
tasm_->page_proxy()->element_manager()->CreateFiberElement(tag);
93+
element->SetNodeIndex(42);
94+
lepus::Value target_info_with_element = TouchEventHandler::GetTargetInfo(
95+
element->impl_id(), element->data_model(), element.get());
96+
ASSERT_TRUE(target_info_with_element.IsObject());
97+
EXPECT_EQ(target_info_with_element.Table()->GetValue("nodeIndex").Number(),
98+
42);
99+
}
100+
81101
TEST_F(TouchEventHandlerTest, TestHandleTriggerComponentEvent0) {
82102
touch_event_handler_->HandleTriggerComponentEvent(nullptr, "xxxx",
83103
lepus::Value());
@@ -114,8 +134,10 @@ TEST_F(TouchEventHandlerTest, TestHandleTriggerComponentEvent2) {
114134
touch_event_handler_->HandleTriggerComponentEvent(tasm_.get(), "xxxx", obj);
115135
EXPECT_EQ(delegate_->DumpDelegate(),
116136
"SendPageEvent onXXXX "
117-
"{\"currentTarget\":{\"dataset\":{},\"id\":\"\"},\"detail\":null,"
118-
"\"target\":{\"dataset\":{},\"id\":\"\"},\"type\":\"xxxx\"}\n");
137+
"{\"currentTarget\":{\"dataset\":{},\"id\":\"\",\"nodeIndex\":1},"
138+
"\"detail\":null,"
139+
"\"target\":{\"dataset\":{},\"id\":\"\",\"nodeIndex\":1},\"type\":"
140+
"\"xxxx\"}\n");
119141
}
120142

121143
TEST_F(TouchEventHandlerTest, TestHandleTriggerComponentEvent3) {

core/runtime/lepus/bindings/renderer_functions.cc

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2667,8 +2667,6 @@ RENDERER_FUNCTION_CC(FiberCreateComponent) {
26672667
CONVERT_ARG_AND_CHECK_FOR_ELEMENT_API(arg3, 3, String, FiberCreateComponent);
26682668
CONVERT_ARG_AND_CHECK_FOR_ELEMENT_API(arg4, 4, String, FiberCreateComponent);
26692669
CONVERT_ARG_AND_CHECK_FOR_ELEMENT_API(arg5, 5, String, FiberCreateComponent);
2670-
CONVERT_ARG(arg6, 6);
2671-
26722670
auto* self = GET_TASM_POINTER();
26732671
auto& manager = self->page_proxy()->element_manager();
26742672
const auto& parent_component_unique_id = static_cast<int64_t>(arg0->Number());
@@ -2688,21 +2686,35 @@ RENDERER_FUNCTION_CC(FiberCreateComponent) {
26882686
component_element->set_style_sheet_manager(
26892687
self->style_sheet_manager(entry_name_str));
26902688

2691-
if (argc >= 7 && arg6->IsObject()) {
2692-
if (arg6->GetProperty(BASE_STATIC_STRING(kRemoveComponentElement))
2693-
.IsTrue()) {
2694-
component_element->MarkAsWrapperComponent();
2689+
if (argc >= 7) {
2690+
CONVERT_ARG(arg6, 6);
2691+
if (arg6->IsObject()) {
2692+
if (arg6->GetProperty(BASE_STATIC_STRING(kRemoveComponentElement))
2693+
.IsTrue()) {
2694+
component_element->MarkAsWrapperComponent();
2695+
}
2696+
// TODO(zhouzhitao): Currently, the Component Element is non-standard, and
2697+
// in fact, TTML is given a non-standard behavior based on this
2698+
// non-standard Component Element. In the future, the Component Element is
2699+
// expected to be gradually deprecated, and TTML should also migrate to
2700+
// the standard API. Therefore, for now, this logic will not be added to
2701+
// SetConfig; the standard behavior should be a combination of the two
2702+
// PAPIs.
2703+
if (arg6->GetProperty(BASE_STATIC_STRING(kIsAsyncFlushRoot)).IsTrue()) {
2704+
component_element->MarkAsyncFlushRoot(true);
2705+
}
2706+
component_element->SetConfig(arg6->ToLepusValue());
26952707
}
2696-
// TODO(zhouzhitao): Currently, the Component Element is non-standard, and
2697-
// in fact, TTML is given a non-standard behavior based on this non-standard
2698-
// Component Element. In the future, the Component Element is expected to be
2699-
// gradually deprecated, and TTML should also migrate to the standard API.
2700-
// Therefore, for now, this logic will not be added to SetConfig; the
2701-
// standard behavior should be a combination of the two PAPIs.
2702-
if (arg6->GetProperty(BASE_STATIC_STRING(kIsAsyncFlushRoot)).IsTrue()) {
2703-
component_element->MarkAsyncFlushRoot(true);
2708+
}
2709+
2710+
if (argc >= 8) {
2711+
CONVERT_ARG(arg7, 7);
2712+
if (arg7->IsObject()) {
2713+
const auto& nid = arg7->GetProperty(BASE_STATIC_STRING(kNodeIndex));
2714+
if (nid.IsNumber()) {
2715+
component_element->SetNodeIndex(nid.Number());
2716+
}
27042717
}
2705-
component_element->SetConfig(arg6->ToLepusValue());
27062718
}
27072719

27082720
ON_NODE_CREATE(component_element);

js_libraries/type-element-api/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# CHANGELOG
22

3+
## 0.0.8
4+
5+
### Patch Changes
6+
7+
- Add ElementInfo for `__CreateComponent` API.
8+
39
## 0.0.7
410

511
### Patch Changes

js_libraries/type-element-api/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@lynx-js/type-element-api",
3-
"version": "0.0.7",
3+
"version": "0.0.8",
44
"description": "Type definitions for all Element PAPI provided by the Lynx team, used to improve Element PAPI support in your framework.",
55
"keywords": ["element-api" , "types"],
66
"repository": {
@@ -25,6 +25,7 @@
2525
],
2626
"dependencies": {},
2727
"devDependencies": {
28+
"typescript": "5.8.3",
2829
"tsd": "0.30.4",
2930
"vitest": "2.1.9"
3031
}

js_libraries/type-element-api/test/index.test-d.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ describe('Test Element API Types', () => {
5252

5353
it('should have correct global functions available', () => {
5454
expectTypeOf<typeof __CreatePage>().toBeFunction();
55+
expectTypeOf<typeof __CreateComponent>().toBeFunction();
56+
expectTypeOf<typeof __CreateComponent>().toBeCallableWith(1, 'component-id', 2, '', 'component-name', 'component/path');
57+
expectTypeOf<typeof __CreateComponent>().toBeCallableWith(1, 'component-id', 2, '', 'component-name', 'component/path', {}, { nodeIndex: 42 });
5558
expectTypeOf<typeof __CreateView>().toBeFunction();
5659
expectTypeOf<typeof __CreateText>().toBeFunction();
5760
expectTypeOf<typeof __ElementAnimate>().toBeFunction();

js_libraries/type-element-api/tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
"strict": true,
77
"outDir": "lib",
88
"typeRoots": ["./node_modules/@types", "./types"],
9-
"types": ["./types/index"],
9+
"types": [],
1010
"jsx": "preserve",
1111
"module": "esnext",
1212
"moduleResolution": "Node",

js_libraries/type-element-api/types/element-api.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,8 @@ declare global {
148148
entryName: string,
149149
name: string,
150150
path: string,
151-
config?: Record<string, unknown>
151+
config?: Record<string, unknown>,
152+
info?: ElementInfo,
152153
): ComponentElementRef;
153154

154155
function __CreateView(parentComponentUniId: number, info?: ElementInfo): ViewElementRef;

pnpm-lock.yaml

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)