diff --git a/goldens/public-api/core/primitives/event-dispatch/index.md b/goldens/public-api/core/primitives/event-dispatch/index.md index 433251ec4b180..a5fa3bb152a3b 100644 --- a/goldens/public-api/core/primitives/event-dispatch/index.md +++ b/goldens/public-api/core/primitives/event-dispatch/index.md @@ -78,6 +78,8 @@ export class EventInfoWrapper { // (undocumented) getIsReplay(): boolean | undefined; // (undocumented) + getResolved(): boolean | undefined; + // (undocumented) getTargetElement(): Element; // (undocumented) getTimestamp(): number; @@ -92,6 +94,8 @@ export class EventInfoWrapper { // (undocumented) setIsReplay(replay: boolean): void; // (undocumented) + setResolved(resolved: boolean): void; + // (undocumented) setTargetElement(targetElement: Element): void; // (undocumented) setTimestamp(timestamp: number): void; diff --git a/packages/core/primitives/event-dispatch/src/action_resolver.ts b/packages/core/primitives/event-dispatch/src/action_resolver.ts index 013c661c9c408..e965d09ba668d 100644 --- a/packages/core/primitives/event-dispatch/src/action_resolver.ts +++ b/packages/core/primitives/event-dispatch/src/action_resolver.ts @@ -53,7 +53,11 @@ export class ActionResolver { } resolve(eventInfo: eventInfoLib.EventInfo) { + if (eventInfoLib.getResolved(eventInfo)) { + return; + } this.populateAction(eventInfo); + eventInfoLib.setResolved(eventInfo, true); } /** diff --git a/packages/core/primitives/event-dispatch/src/event_info.ts b/packages/core/primitives/event-dispatch/src/event_info.ts index 791de4e55b096..c6faf00da9ff8 100644 --- a/packages/core/primitives/event-dispatch/src/event_info.ts +++ b/packages/core/primitives/event-dispatch/src/event_info.ts @@ -54,6 +54,8 @@ export declare interface EventInfo { * as a `click`. Only used when a11y click events is on. */ eiack?: boolean; + /** Whether action resolution has already run on this `EventInfo`. */ + eir?: boolean; } /** Added for readability when accessing stable property names. */ @@ -151,6 +153,16 @@ export function setA11yClickKey(eventInfo: EventInfo, a11yClickKey: boolean) { eventInfo.eiack = a11yClickKey; } +/** Added for readability when accessing stable property names. */ +export function getResolved(eventInfo: EventInfo) { + return eventInfo.eir; +} + +/** Added for readability when accessing stable property names. */ +export function setResolved(eventInfo: EventInfo, resolved: boolean) { + eventInfo.eir = resolved; +} + /** Clones an `EventInfo` */ export function cloneEventInfo(eventInfo: EventInfo): EventInfo { return { @@ -162,6 +174,7 @@ export function cloneEventInfo(eventInfo: EventInfo): EventInfo { timeStamp: eventInfo.timeStamp, eirp: eventInfo.eirp, eiack: eventInfo.eiack, + eir: eventInfo.eir, }; } @@ -303,6 +316,14 @@ export class EventInfoWrapper { setIsReplay(this.eventInfo, replay); } + getResolved() { + return getResolved(this.eventInfo); + } + + setResolved(resolved: boolean) { + setResolved(this.eventInfo, resolved); + } + clone() { return new EventInfoWrapper(cloneEventInfo(this.eventInfo)); } diff --git a/packages/core/primitives/event-dispatch/test/eventcontract_test.ts b/packages/core/primitives/event-dispatch/test/eventcontract_test.ts index 867dc150dc4fe..4ab8a1e0e9885 100644 --- a/packages/core/primitives/event-dispatch/test/eventcontract_test.ts +++ b/packages/core/primitives/event-dispatch/test/eventcontract_test.ts @@ -450,6 +450,7 @@ describe('EventContract', () => { expect(eventInfoWrapper.getTargetElement()).toBe(targetElement); expect(eventInfoWrapper.getAction()?.name).toBe('handleClick'); expect(eventInfoWrapper.getAction()?.element).toBe(actionElement); + expect(eventInfoWrapper.getResolved()).toBe(true); }); it('dispatches event when targetElement is actionElement', () => {