Context
Discovered during PR #58 review.
Problem
EventDelegator and LinkInterceptor store listener references as expando properties on document:
(document as any)[`__lvt_delegated_${eventType}_${wrapperId}`] = listener;
(document as any)[`__lvt_link_intercept_${wrapperId}`] = listener;
Issues:
- Non-standard — expando properties on DOM nodes
- Invisible to TypeScript (requires
as any casts)
- Risks collisions with external scripts that iterate document properties
- Harder to introspect during debugging
Proposed Fix
Use a private Map<string, EventListener> on each class.
Scope
Deferred from PR #58 to keep that PR focused. All locations using expando properties should migrate:
dom/event-delegation.ts — __lvt_delegated_${eventType}_${wrapperId}
dom/event-delegation.ts — __lvt_window_${eventType}_${wrapperId}
dom/event-delegation.ts — __lvt_focus_trap_${wrapperId}
dom/event-delegation.ts — __lvt_autofocus_observer_${wrapperId}
dom/link-interceptor.ts — __lvt_link_intercept_${wrapperId}
Context
Discovered during PR #58 review.
Problem
EventDelegator and LinkInterceptor store listener references as expando properties on document:
Issues:
as anycasts)Proposed Fix
Use a private
Map<string, EventListener>on each class.Scope
Deferred from PR #58 to keep that PR focused. All locations using expando properties should migrate:
dom/event-delegation.ts—__lvt_delegated_${eventType}_${wrapperId}dom/event-delegation.ts—__lvt_window_${eventType}_${wrapperId}dom/event-delegation.ts—__lvt_focus_trap_${wrapperId}dom/event-delegation.ts—__lvt_autofocus_observer_${wrapperId}dom/link-interceptor.ts—__lvt_link_intercept_${wrapperId}