diff --git a/packages/react-native/src/private/renderer/events/ReactNativeEventTypeMapping.js b/packages/react-native/src/private/renderer/events/ReactNativeEventTypeMapping.js index 21ff655ea69b..43a44d44156d 100644 --- a/packages/react-native/src/private/renderer/events/ReactNativeEventTypeMapping.js +++ b/packages/react-native/src/private/renderer/events/ReactNativeEventTypeMapping.js @@ -30,7 +30,7 @@ type EventPropNames = { }; // Cache of already-resolved event types. -const eventTypeToProps: {[string]: EventPropNames} = {}; +const eventTypeToProps = new Map(); /** * Converts a topLevelType (e.g., "topPointerUp") to a DOM event type @@ -90,13 +90,13 @@ export function getEventTypePropName( eventType: string, isCapture: boolean, ): string | null { - const cached = eventTypeToProps[eventType]; + const cached = eventTypeToProps.get(eventType); if (cached !== undefined) { return isCapture ? cached.captured : cached.bubbled; } const entry = findEventPropNames(eventType); if (entry != null) { - eventTypeToProps[eventType] = entry; + eventTypeToProps.set(eventType, entry); return isCapture ? entry.captured : entry.bubbled; } return null; diff --git a/packages/react-native/src/private/renderer/events/__tests__/ReactNativeEventTypeMapping-test.js b/packages/react-native/src/private/renderer/events/__tests__/ReactNativeEventTypeMapping-test.js new file mode 100644 index 000000000000..8534fbdc8b9e --- /dev/null +++ b/packages/react-native/src/private/renderer/events/__tests__/ReactNativeEventTypeMapping-test.js @@ -0,0 +1,27 @@ +/** + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow strict-local + * @format + */ + +import {customDirectEventTypes} from '../../../../../Libraries/Renderer/shims/ReactNativeViewConfigRegistry'; +import {getEventTypePropName} from '../ReactNativeEventTypeMapping'; + +describe('ReactNativeEventTypeMapping', () => { + afterEach(() => { + delete customDirectEventTypes.topConstructor; + }); + + it('resolves event types that shadow Object prototype properties', () => { + customDirectEventTypes.topConstructor = { + registrationName: 'onConstructor', + }; + + expect(getEventTypePropName('constructor', false)).toBe('onConstructor'); + expect(getEventTypePropName('constructor', true)).toBeNull(); + }); +});