diff --git a/.changeset/fix-event-handler-unique-id.md b/.changeset/fix-event-handler-unique-id.md new file mode 100644 index 0000000000..a7d69a62f8 --- /dev/null +++ b/.changeset/fix-event-handler-unique-id.md @@ -0,0 +1,5 @@ +--- +"@lynx-js/web-core": patch +--- + +fix: filter out -1 uniqueId in commonEventHandler diff --git a/packages/web-platform/web-core/tests/element-apis.spec.ts b/packages/web-platform/web-core/tests/element-apis.spec.ts index 7f47627adc..e1513466ca 100644 --- a/packages/web-platform/web-core/tests/element-apis.spec.ts +++ b/packages/web-platform/web-core/tests/element-apis.spec.ts @@ -50,6 +50,35 @@ describe('Element APIs', () => { true, ); }); + test('#commonEventHandler should filter out -1 uniqueId', () => { + mtsBinding.wasmContext = Object.assign(mtsBinding.wasmContext || {}, { + common_event_handler: vi.fn(), + }) as any; + mtsBinding.addEventListener('touchstart'); + + const node1 = mtsGlobalThis.__CreateView(0); + const node2 = document.createElement('div') as any; + node1.appendChild(node2); + rootDom.appendChild(node1); + + const event = document.createEvent('Event') as any; + event.initEvent('touchstart', true, true); + event.touches = []; + event.targetTouches = []; + event.changedTouches = []; + node2.dispatchEvent(event); + + expect(mtsBinding.wasmContext!.common_event_handler).toHaveBeenCalled(); + const calls = + (mtsBinding.wasmContext!.common_event_handler as any).mock.calls; + const bubblePath = calls[0][1] as Uint32Array; + + // Check that -1 (4294967295 in Uint32Array) is NOT in the bubblePath + for (let i = 0; i < bubblePath.length; i++) { + expect(bubblePath[i] !== 4294967295).toBe(true); + } + }); + test('createElementView', () => { const element = mtsGlobalThis.__CreateElement('view', 0); expect(mtsGlobalThis.__GetTag(element)).toBe('view'); diff --git a/packages/web-platform/web-core/ts/client/mainthread/elementAPIs/WASMJSBinding.ts b/packages/web-platform/web-core/ts/client/mainthread/elementAPIs/WASMJSBinding.ts index 7bf1bb6fa4..27fcea1637 100644 --- a/packages/web-platform/web-core/ts/client/mainthread/elementAPIs/WASMJSBinding.ts +++ b/packages/web-platform/web-core/ts/client/mainthread/elementAPIs/WASMJSBinding.ts @@ -167,11 +167,13 @@ export class WASMJSBinding implements RustMainthreadContextBinding { break; } const uniqueId = __GetElementUniqueID(currentTarget as HTMLElement); - bubblePath[bubblePathLength++] = uniqueId; - if (bubblePathLength >= bubblePath.length) { - const newBubblePath = new Uint32Array(bubblePath.length * 2); - newBubblePath.set(bubblePath); - bubblePath = newBubblePath; + if (uniqueId !== -1) { + bubblePath[bubblePathLength++] = uniqueId; + if (bubblePathLength >= bubblePath.length) { + const newBubblePath = new Uint32Array(bubblePath.length * 2); + newBubblePath.set(bubblePath); + bubblePath = newBubblePath; + } } currentTarget = currentTarget.parentElement as | DecoratedHTMLElement