MCPcopy Create free account
hub / github.com/ChromeDevTools/devtools-frontend / ObjectWrapper

Class ObjectWrapper

front_end/core/common/Object.ts:41–116  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

39}
40
41export class ObjectWrapper<Events> implements EventTarget<Events> {
42 // eslint-disable-next-line @typescript-eslint/no-explicit-any
43 listeners?: Map<keyof Events, Set<ListenerCallbackTuple<Events, any>>>;
44
45 addEventListener<T extends keyof Events>(eventType: T, listener: EventListener<Events, T>, thisObject?: Object):
46 EventDescriptor<Events, T> {
47 if (!this.listeners) {
48 this.listeners = new Map();
49 }
50
51 let listenersForEventType = this.listeners.get(eventType);
52 if (!listenersForEventType) {
53 listenersForEventType = new Set();
54 this.listeners.set(eventType, listenersForEventType);
55 }
56 listenersForEventType.add({thisObject, listener});
57 return {eventTarget: this, eventType, thisObject, listener};
58 }
59
60 once<T extends keyof Events>(eventType: T): Promise<Events[T]> {
61 return new Promise(resolve => {
62 const descriptor = this.addEventListener(eventType, event => {
63 this.removeEventListener(eventType, descriptor.listener);
64 resolve(event.data);
65 });
66 });
67 }
68
69 removeEventListener<T extends keyof Events>(eventType: T, listener: EventListener<Events, T>, thisObject?: Object):
70 void {
71 const listeners = this.listeners?.get(eventType);
72 if (!listeners) {
73 return;
74 }
75 for (const listenerTuple of listeners) {
76 if (listenerTuple.listener === listener && listenerTuple.thisObject === thisObject) {
77 listenerTuple.disposed = true;
78 listeners.delete(listenerTuple);
79 }
80 }
81
82 if (!listeners.size) {
83 this.listeners?.delete(eventType);
84 }
85 }
86
87 hasEventListeners(eventType: keyof Events): boolean {
88 return Boolean(this.listeners?.has(eventType));
89 }
90
91 dispatchEventToListeners<T extends keyof Events>(
92 eventType: Platform.TypeScriptUtilities.NoUnion<T>,
93 ...[eventData]: EventPayloadToRestParameters<Events, T>): void {
94 const listeners = this.listeners?.get(eventType);
95 if (!listeners) {
96 return;
97 }
98 // `eventData` is typed as `Events[T] | undefined`:

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected