From 67f3ff0c17d4c7da09fa530ef3a8941a68c06cbc Mon Sep 17 00:00:00 2001 From: Oskar Eichler Date: Sun, 30 Aug 2026 11:11:22 +0200 Subject: [PATCH] Fix EventEmitter prototype-key event types --- .../Libraries/vendor/emitter/EventEmitter.js | 4 ++-- .../emitter/__tests__/EventEmitter-itest.js | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/packages/react-native/Libraries/vendor/emitter/EventEmitter.js b/packages/react-native/Libraries/vendor/emitter/EventEmitter.js index 6014db5bd7c9..305965630f24 100644 --- a/packages/react-native/Libraries/vendor/emitter/EventEmitter.js +++ b/packages/react-native/Libraries/vendor/emitter/EventEmitter.js @@ -84,7 +84,7 @@ export default class EventEmitter< constructor() { // $FlowFixMe[incompatible-type] - this.#registry = {}; + this.#registry = Object.create(null); } /** @@ -147,7 +147,7 @@ export default class EventEmitter< ): void { if (eventType == null) { // $FlowFixMe[incompatible-type] - this.#registry = {}; + this.#registry = Object.create(null); } else { // $FlowFixMe[cannot-write] delete this.#registry[eventType]; diff --git a/packages/react-native/Libraries/vendor/emitter/__tests__/EventEmitter-itest.js b/packages/react-native/Libraries/vendor/emitter/__tests__/EventEmitter-itest.js index 7a746f0b47a5..dc0fb8b9f7e7 100644 --- a/packages/react-native/Libraries/vendor/emitter/__tests__/EventEmitter-itest.js +++ b/packages/react-native/Libraries/vendor/emitter/__tests__/EventEmitter-itest.js @@ -57,6 +57,27 @@ describe('listeners', () => { expect(listenerB).toHaveBeenCalledTimes(1); }); + it('supports event types that match Object prototype keys', () => { + const emitter = new EventEmitter>>(); + + const constructorListener = jest.fn(); + const protoListener = jest.fn(); + emitter.addListener('constructor', constructorListener); + emitter.addListener('__proto__', protoListener); + + emitter.emit('constructor'); + emitter.emit('__proto__'); + + expect(constructorListener).toHaveBeenCalledTimes(1); + expect(protoListener).toHaveBeenCalledTimes(1); + expect(emitter.listenerCount('constructor')).toBe(1); + expect(emitter.listenerCount('__proto__')).toBe(1); + + emitter.removeAllListeners(); + expect(emitter.listenerCount('constructor')).toBe(0); + expect(emitter.listenerCount('__proto__')).toBe(0); + }); + it('invokes listeners in registration order', () => { const emitter = new EventEmitter<{A: []}>();