Skip to content

Commit

Permalink
Merge pull request #5187 from tomduncalf/support_invalid_event-issue_…
Browse files Browse the repository at this point in the history
…5152

Add support for "invalid" event within Form elements
  • Loading branch information
jimfb committed Oct 17, 2015
2 parents 98c96b6 + 5ceb229 commit 7a164fd
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 4 deletions.
8 changes: 8 additions & 0 deletions src/renderers/dom/client/eventPlugins/SimpleEventPlugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,12 @@ var eventTypes = {
captured: keyOf({onInputCapture: true}),
},
},
invalid: {
phasedRegistrationNames: {
bubbled: keyOf({onInvalid: true}),
captured: keyOf({onInvalidCapture: true}),
},
},
keyDown: {
phasedRegistrationNames: {
bubbled: keyOf({onKeyDown: true}),
Expand Down Expand Up @@ -404,6 +410,7 @@ var topLevelEventsToDispatchConfig = {
topError: eventTypes.error,
topFocus: eventTypes.focus,
topInput: eventTypes.input,
topInvalid: eventTypes.invalid,
topKeyDown: eventTypes.keyDown,
topKeyPress: eventTypes.keyPress,
topKeyUp: eventTypes.keyUp,
Expand Down Expand Up @@ -480,6 +487,7 @@ var SimpleEventPlugin = {
case topLevelTypes.topEnded:
case topLevelTypes.topError:
case topLevelTypes.topInput:
case topLevelTypes.topInvalid:
case topLevelTypes.topLoad:
case topLevelTypes.topLoadedData:
case topLevelTypes.topLoadedMetadata:
Expand Down
32 changes: 28 additions & 4 deletions src/renderers/dom/shared/ReactDOMComponent.js
Original file line number Diff line number Diff line change
Expand Up @@ -414,6 +414,17 @@ function trapBubbledEventsLocal() {
),
];
break;
case 'input':
case 'select':
case 'textarea':
inst._wrapperState.listeners = [
ReactBrowserEventEmitter.trapBubbledEvent(
EventConstants.topLevelTypes.topInvalid,
'invalid',
node
),
];
break;
}
}

Expand Down Expand Up @@ -557,15 +568,13 @@ ReactDOMComponent.Mixin = {
case 'form':
case 'video':
case 'audio':
this._wrapperState = {
listeners: null,
};
transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this);
this._setupTrapBubbledEventsLocal(transaction);
break;
case 'button':
props = ReactDOMButton.getNativeProps(this, props, nativeParent);
break;
case 'input':
this._setupTrapBubbledEventsLocal(transaction);
ReactDOMInput.mountWrapper(this, props, nativeParent);
props = ReactDOMInput.getNativeProps(this, props);
break;
Expand All @@ -574,10 +583,12 @@ ReactDOMComponent.Mixin = {
props = ReactDOMOption.getNativeProps(this, props);
break;
case 'select':
this._setupTrapBubbledEventsLocal(transaction);
ReactDOMSelect.mountWrapper(this, props, nativeParent);
props = ReactDOMSelect.getNativeProps(this, props);
break;
case 'textarea':
this._setupTrapBubbledEventsLocal(transaction);
ReactDOMTextarea.mountWrapper(this, props, nativeParent);
props = ReactDOMTextarea.getNativeProps(this, props);
break;
Expand Down Expand Up @@ -686,6 +697,19 @@ ReactDOMComponent.Mixin = {
return mountImage;
},

/**
* Setup this component to trap non-bubbling events locally
*
* @private
* @param {ReactReconcileTransaction|ReactServerRenderingTransaction} transaction
*/
_setupTrapBubbledEventsLocal: function(transaction) {
this._wrapperState = {
listeners: null,
};
transaction.getReactMountReady().enqueue(trapBubbledEventsLocal, this);
},

/**
* Creates markup for the open tag and all attributes.
*
Expand Down
1 change: 1 addition & 0 deletions src/renderers/shared/event/EventConstants.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ var topLevelTypes = keyMirror({
topError: null,
topFocus: null,
topInput: null,
topInvalid: null,
topKeyDown: null,
topKeyPress: null,
topKeyUp: null,
Expand Down

0 comments on commit 7a164fd

Please sign in to comment.