// Copyright 2021 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. import type * as Platform from '../platform/platform.js'; // eslint-disable-next-line @typescript-eslint/no-explicit-any export interface EventDescriptor { eventTarget: EventTarget; eventType: T; thisObject?: Object; listener: EventListener; } export function removeEventListeners(eventList: EventDescriptor[]): void { for (const eventInfo of eventList) { eventInfo.eventTarget.removeEventListener(eventInfo.eventType, eventInfo.listener, eventInfo.thisObject); } // Do not hold references on unused event descriptors. eventList.splice(0); } // This type can be used as the type parameter for `EventTarget`/`ObjectWrapper` // when the set of events is not known at compile time. // eslint-disable-next-line @typescript-eslint/no-explicit-any export type GenericEvents = Record; export type EventPayloadToRestParameters = Events[T] extends void ? [] : [Events[T]]; export type EventListener = (arg0: EventTargetEvent) => void; export interface EventTarget { addEventListener(eventType: T, listener: EventListener, thisObject?: Object): EventDescriptor; once(eventType: T): Promise; removeEventListener(eventType: T, listener: EventListener, thisObject?: Object): void; hasEventListeners(eventType: keyof Events): boolean; dispatchEventToListeners( eventType: Platform.TypeScriptUtilities.NoUnion, ...[eventData]: EventPayloadToRestParameters): void; } export function fireEvent(name: string, detail: unknown = {}, target: HTMLElement|Window = window): void { const evt = new CustomEvent(name, {bubbles: true, cancelable: true, detail}); target.dispatchEvent(evt); } // eslint-disable-next-line @typescript-eslint/no-explicit-any export interface EventTargetEvent { data: T; source?: EventTarget; }