chrome-devtools-frontend
Version:
Chrome DevTools UI
55 lines (46 loc) • 2.29 kB
text/typescript
// Copyright 2021 The Chromium Authors. All rights reserved.
// 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<Events = any, T extends keyof Events = any> {
eventTarget: EventTarget<Events>;
eventType: T;
thisObject?: Object;
listener: EventListener<Events, T>;
}
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.
export type GenericEvents = {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
[eventName: string]: any,
};
export type EventPayloadToRestParameters<Events, T extends keyof Events> = Events[T] extends void ? [] : [Events[T]];
export type EventListener<Events, T extends keyof Events> = (arg0: EventTargetEvent<Events[T], Events>) => void;
export interface EventTarget<Events> {
addEventListener<T extends keyof Events>(eventType: T, listener: EventListener<Events, T>, thisObject?: Object):
EventDescriptor<Events, T>;
once<T extends keyof Events>(eventType: T): Promise<Events[T]>;
removeEventListener<T extends keyof Events>(eventType: T, listener: EventListener<Events, T>, thisObject?: Object):
void;
hasEventListeners(eventType: keyof Events): boolean;
dispatchEventToListeners<T extends keyof Events>(
eventType: Platform.TypeScriptUtilities.NoUnion<T>,
...[eventData]: EventPayloadToRestParameters<Events, T>): 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<T, Events = any> {
data: T;
source?: EventTarget<Events>;
}