mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
[React Native] Fix for view config registrations (#16821)
This commit is contained in:
+4
-1
@@ -101,10 +101,13 @@ exports.get = function(name: string): ReactNativeBaseComponentViewConfig<> {
|
||||
: '',
|
||||
);
|
||||
}
|
||||
viewConfigCallbacks.set(name, null);
|
||||
viewConfig = callback();
|
||||
processEventTypes(viewConfig);
|
||||
viewConfigs.set(name, viewConfig);
|
||||
|
||||
// Clear the callback after the config is set so that
|
||||
// we don't mask any errors during registration.
|
||||
viewConfigCallbacks.set(name, null);
|
||||
} else {
|
||||
viewConfig = viewConfigs.get(name);
|
||||
}
|
||||
|
||||
@@ -75,6 +75,49 @@ beforeEach(() => {
|
||||
.ReactNativeViewConfigRegistry.register;
|
||||
});
|
||||
|
||||
it('fails to register the same event name with different types', () => {
|
||||
const InvalidEvents = createReactNativeComponentClass('InvalidEvents', () => {
|
||||
if (!__DEV__) {
|
||||
// Simulate a registration error in prod.
|
||||
throw new Error('Event cannot be both direct and bubbling: topChange');
|
||||
}
|
||||
|
||||
// This view config has the same bubbling and direct event name
|
||||
// which will fail to register in developement.
|
||||
return {
|
||||
uiViewClassName: 'InvalidEvents',
|
||||
validAttributes: {
|
||||
onChange: true,
|
||||
},
|
||||
bubblingEventTypes: {
|
||||
topChange: {
|
||||
phasedRegistrationNames: {
|
||||
bubbled: 'onChange',
|
||||
captured: 'onChangeCapture',
|
||||
},
|
||||
},
|
||||
},
|
||||
directEventTypes: {
|
||||
topChange: {
|
||||
registrationName: 'onChange',
|
||||
},
|
||||
},
|
||||
};
|
||||
});
|
||||
|
||||
// The first time this renders,
|
||||
// we attempt to register the view config and fail.
|
||||
expect(() => ReactNative.render(<InvalidEvents />, 1)).toThrow(
|
||||
'Event cannot be both direct and bubbling: topChange',
|
||||
);
|
||||
|
||||
// Continue to re-register the config and
|
||||
// fail so that we don't mask the above failure.
|
||||
expect(() => ReactNative.render(<InvalidEvents />, 1)).toThrow(
|
||||
'Event cannot be both direct and bubbling: topChange',
|
||||
);
|
||||
});
|
||||
|
||||
it('fails if unknown/unsupported event types are dispatched', () => {
|
||||
expect(RCTEventEmitter.register).toHaveBeenCalledTimes(1);
|
||||
const EventEmitter = RCTEventEmitter.register.mock.calls[0][0];
|
||||
|
||||
@@ -98,10 +98,13 @@ exports.get = function(name: string): ReactNativeBaseComponentViewConfig<> {
|
||||
: '',
|
||||
);
|
||||
}
|
||||
viewConfigCallbacks.set(name, null);
|
||||
viewConfig = callback();
|
||||
processEventTypes(viewConfig);
|
||||
viewConfigs.set(name, viewConfig);
|
||||
|
||||
// Clear the callback after the config is set so that
|
||||
// we don't mask any errors during registration.
|
||||
viewConfigCallbacks.set(name, null);
|
||||
} else {
|
||||
viewConfig = viewConfigs.get(name);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user