Skip to content

Commit

Permalink
[change] whitelist props passed to React DOM
Browse files Browse the repository at this point in the history
Avoiding unknown property warnings from React DOM. Many components
within and build upon React Native do not filter their own properties
and spread them into View. It is expected that React Native ignore these
properties.

Fix #898
  • Loading branch information
necolas committed Jun 3, 2018
1 parent 6292fa5 commit ed43258
Show file tree
Hide file tree
Showing 2 changed files with 81 additions and 19 deletions.
75 changes: 75 additions & 0 deletions packages/react-native-web/src/exports/View/filterSupportedProps.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
const whitelist = {
accessibilityComponentType: true,
accessibilityLabel: true,
accessibilityLiveRegion: true,
accessibilityRole: true,
accessibilityTraits: true,
accessible: true,
children: true,
disabled: true,
importantForAccessibility: true,
onBlur: true,
onContextMenu: true,
onFocus: true,
onMoveShouldSetResponder: true,
onMoveShouldSetResponderCapture: true,
onResponderEnd: true,
onResponderGrant: true,
onResponderMove: true,
onResponderReject: true,
onResponderRelease: true,
onResponderStart: true,
onResponderTerminate: true,
onResponderTerminationRequest: true,
onScrollShouldSetResponder: true,
onScrollShouldSetResponderCapture: true,
onSelectionChangeShouldSetResponder: true,
onSelectionChangeShouldSetResponderCapture: true,
onStartShouldSetResponder: true,
onStartShouldSetResponderCapture: true,
onTouchCancel: true,
onTouchCancelCapture: true,
onTouchEnd: true,
onTouchEndCapture: true,
onTouchMove: true,
onTouchMoveCapture: true,
onTouchStart: true,
onTouchStartCapture: true,
pointerEvents: true,
style: true,
testID: true,
// escape-hatches for ScrollView
onScroll: true,
onWheel: true,
// escape-hatches for Touchable keyboard support
onKeyDown: true,
onKeyPress: true,
onKeyUp: true,
// escape-hatches for creating hover effects
onMouseEnter: true,
onMouseLeave: true,
onMouseMove: true,
onMouseOver: true,
onMouseOut: true,
// unstable escape-hatches for web
className: true,
href: true,
onClick: true,
onClickCapture: true,
rel: true,
target: true
};

const filterSupportedProps = props => {
const safeProps = {};
for (const prop in props) {
if (props.hasOwnProperty(prop)) {
if (whitelist[prop] || prop.indexOf('aria-') === 0 || prop.indexOf('data-') === 0) {
safeProps[prop] = props[prop];
}
}
}
return safeProps;
};

export default filterSupportedProps;
25 changes: 6 additions & 19 deletions packages/react-native-web/src/exports/View/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import applyLayout from '../../modules/applyLayout';
import applyNativeMethods from '../../modules/applyNativeMethods';
import { bool } from 'prop-types';
import createElement from '../createElement';
import filterSupportedProps from './filterSupportedProps';
import invariant from 'fbjs/lib/invariant';
import StyleSheet from '../StyleSheet';
import ViewPropTypes, { type ViewProps } from './ViewPropTypes';
Expand All @@ -36,22 +37,8 @@ class View extends Component<ViewProps> {
static propTypes = ViewPropTypes;

render() {
const {
hitSlop,
/* eslint-disable */
accessibilityViewIsModal,
collapsable,
needsOffscreenAlphaCompositing,
onAccessibilityTap,
onLayout,
onMagicTap,
removeClippedSubviews,
renderToHardwareTextureAndroid,
shouldRasterizeIOS,
tvParallaxProperties,
/* eslint-enable */
...otherProps
} = this.props;
const hitSlop = this.props.hitSlop;
const supportedProps = filterSupportedProps(this.props);

if (process.env.NODE_ENV !== 'production') {
React.Children.toArray(this.props.children).forEach(item => {
Expand All @@ -64,18 +51,18 @@ class View extends Component<ViewProps> {

const { isInAParentText } = this.context;

otherProps.style = StyleSheet.compose(
supportedProps.style = StyleSheet.compose(
styles.initial,
StyleSheet.compose(isInAParentText && styles.inline, this.props.style)
);

if (hitSlop) {
const hitSlopStyle = calculateHitSlopStyle(hitSlop);
const hitSlopChild = createElement('span', { style: [styles.hitSlop, hitSlopStyle] });
otherProps.children = React.Children.toArray([hitSlopChild, otherProps.children]);
supportedProps.children = React.Children.toArray([hitSlopChild, supportedProps.children]);
}

return createElement('div', otherProps);
return createElement('div', supportedProps);
}
}

Expand Down

0 comments on commit ed43258

Please sign in to comment.