From df794b47bc901c0fcf75536a14e4b1b600883cf9 Mon Sep 17 00:00:00 2001 From: Andreas Svensson Date: Wed, 9 Apr 2014 23:35:12 +0200 Subject: [PATCH 1/5] Add support for pointer events --- src/browser/ReactEventEmitter.js | 6 + .../eventPlugins/EnterLeaveEventPlugin.js | 72 +++++++++-- src/browser/eventPlugins/SimpleEventPlugin.js | 115 +++++++++++++----- .../syntheticEvents/SyntheticPointerEvent.js | 52 ++++++++ src/event/EventConstants.js | 8 ++ src/event/EventPluginUtils.js | 4 + 6 files changed, 212 insertions(+), 45 deletions(-) create mode 100644 src/browser/syntheticEvents/SyntheticPointerEvent.js diff --git a/src/browser/ReactEventEmitter.js b/src/browser/ReactEventEmitter.js index c09ed460dec..24603307b8d 100644 --- a/src/browser/ReactEventEmitter.js +++ b/src/browser/ReactEventEmitter.js @@ -113,6 +113,12 @@ var topEventMapping = { topMouseOver: 'mouseover', topMouseUp: 'mouseup', topPaste: 'paste', + topPointerCancel: 'pointercancel', + topPointerDown: 'pointerdown', + topPointerMove: 'pointermove', + topPointerOut: 'pointerout', + topPointerOver: 'pointerover', + topPointerUp: 'pointerup', topScroll: 'scroll', topSelectionChange: 'selectionchange', topTextInput: 'textInput', diff --git a/src/browser/eventPlugins/EnterLeaveEventPlugin.js b/src/browser/eventPlugins/EnterLeaveEventPlugin.js index 6dbfaa43995..efee0801c81 100644 --- a/src/browser/eventPlugins/EnterLeaveEventPlugin.js +++ b/src/browser/eventPlugins/EnterLeaveEventPlugin.js @@ -22,6 +22,7 @@ var EventConstants = require('EventConstants'); var EventPropagators = require('EventPropagators'); var SyntheticMouseEvent = require('SyntheticMouseEvent'); +var SyntheticPointerEvent = require('SyntheticPointerEvent'); var ReactMount = require('ReactMount'); var keyOf = require('keyOf'); @@ -43,6 +44,20 @@ var eventTypes = { topLevelTypes.topMouseOut, topLevelTypes.topMouseOver ] + }, + pointerEnter: { + registrationName: keyOf({onPointerEnter: null}), + dependencies: [ + topLevelTypes.topPointerOut, + topLevelTypes.topPointerOver + ] + }, + pointerLeave: { + registrationName: keyOf({onPointerLeave: null}), + dependencies: [ + topLevelTypes.topPointerOut, + topLevelTypes.topPointerOver + ] } }; @@ -71,15 +86,29 @@ var EnterLeaveEventPlugin = { topLevelTarget, topLevelTargetID, nativeEvent) { - if (topLevelType === topLevelTypes.topMouseOver && - (nativeEvent.relatedTarget || nativeEvent.fromElement)) { + var isMouseEvent = ( + topLevelType === topLevelTypes.topMouseOut || + topLevelType === topLevelTypes.topMouseOver + ); + var isPointerEvent = ( + topLevelType === topLevelTypes.topPointerOut || + topLevelType === topLevelTypes.topPointerOver + ); + if (!isMouseEvent && !isPointerEvent) { + // Must not be a mouse/pointer in or out - ignoring. return null; } - if (topLevelType !== topLevelTypes.topMouseOut && - topLevelType !== topLevelTypes.topMouseOver) { - // Must not be a mouse in or mouse out - ignoring. + var isOverEvent = ( + topLevelType === topLevelTypes.topMouseOver || + topLevelType === topLevelTypes.topPointerOver + ); + if (isOverEvent && (nativeEvent.relatedTarget || nativeEvent.fromElement)) { return null; } + var isOutEvent = ( + topLevelType === topLevelTypes.topMouseOut || + topLevelType === topLevelTypes.topPointerOut + ); var win; if (topLevelTarget.window === topLevelTarget) { @@ -96,7 +125,7 @@ var EnterLeaveEventPlugin = { } var from, to; - if (topLevelType === topLevelTypes.topMouseOut) { + if (isOutEvent) { from = topLevelTarget; to = getFirstReactDOM(nativeEvent.relatedTarget || nativeEvent.toElement) || @@ -114,21 +143,38 @@ var EnterLeaveEventPlugin = { var fromID = from ? ReactMount.getID(from) : ''; var toID = to ? ReactMount.getID(to) : ''; - var leave = SyntheticMouseEvent.getPooled( - eventTypes.mouseLeave, + var syntheticEventInterface, + leaveEventType, + enterEventType, + eventTypePrefix; + + if (isMouseEvent) { + syntheticEventInterface = SyntheticMouseEvent; + leaveEventType = eventTypes.mouseLeave; + enterEventType = eventTypes.mouseEnter; + eventTypePrefix = 'mouse'; + } else if (isPointerEvent) { + syntheticEventInterface = SyntheticPointerEvent; + leaveEventType = eventTypes.pointerLeave; + enterEventType = eventTypes.pointerEnter; + eventTypePrefix = 'pointer'; + } + + var leave = syntheticEventInterface.getPooled( + leaveEventType, fromID, nativeEvent ); - leave.type = 'mouseleave'; + leave.type = eventTypePrefix + 'leave'; leave.target = from; leave.relatedTarget = to; - var enter = SyntheticMouseEvent.getPooled( - eventTypes.mouseEnter, - toID, + var enter = syntheticEventInterface.getPooled( + enterEventType, + fromID, nativeEvent ); - enter.type = 'mouseenter'; + enter.type = eventTypePrefix + 'enter'; enter.target = to; enter.relatedTarget = from; diff --git a/src/browser/eventPlugins/SimpleEventPlugin.js b/src/browser/eventPlugins/SimpleEventPlugin.js index c7147933383..5da2a6dbe8d 100644 --- a/src/browser/eventPlugins/SimpleEventPlugin.js +++ b/src/browser/eventPlugins/SimpleEventPlugin.js @@ -30,6 +30,7 @@ var SyntheticDragEvent = require('SyntheticDragEvent'); var SyntheticTouchEvent = require('SyntheticTouchEvent'); var SyntheticUIEvent = require('SyntheticUIEvent'); var SyntheticWheelEvent = require('SyntheticWheelEvent'); +var SyntheticPointerEvent = require('SyntheticPointerEvent'); var invariant = require('invariant'); var keyOf = require('keyOf'); @@ -201,6 +202,42 @@ var eventTypes = { captured: keyOf({onPasteCapture: true}) } }, + pointerCancel: { + phasedRegistrationNames: { + bubbled: keyOf({onPointerCancel: true}), + captured: keyOf({onPointerCancelCapture: true}) + } + }, + pointerDown: { + phasedRegistrationNames: { + bubbled: keyOf({onPointerDown: true}), + captured: keyOf({onPointerDownCapture: true}) + } + }, + pointerMove: { + phasedRegistrationNames: { + bubbled: keyOf({onPointerMove: true}), + captured: keyOf({onPointerMoveCapture: true}) + } + }, + pointerOut: { + phasedRegistrationNames: { + bubbled: keyOf({onPointerOut: true}), + captured: keyOf({onPointerOutCapture: true}) + } + }, + pointerOver: { + phasedRegistrationNames: { + bubbled: keyOf({onPointerOver: true}), + captured: keyOf({onPointerOverCapture: true}) + } + }, + pointerUp: { + phasedRegistrationNames: { + bubbled: keyOf({onPointerUp: true}), + captured: keyOf({onPointerUpCapture: true}) + } + }, reset: { phasedRegistrationNames: { bubbled: keyOf({onReset: true}), @@ -252,41 +289,47 @@ var eventTypes = { }; var topLevelEventsToDispatchConfig = { - topBlur: eventTypes.blur, - topClick: eventTypes.click, + topBlur: eventTypes.blur, + topClick: eventTypes.click, topContextMenu: eventTypes.contextMenu, - topCopy: eventTypes.copy, - topCut: eventTypes.cut, + topCopy: eventTypes.copy, + topCut: eventTypes.cut, topDoubleClick: eventTypes.doubleClick, - topDrag: eventTypes.drag, - topDragEnd: eventTypes.dragEnd, - topDragEnter: eventTypes.dragEnter, - topDragExit: eventTypes.dragExit, - topDragLeave: eventTypes.dragLeave, - topDragOver: eventTypes.dragOver, - topDragStart: eventTypes.dragStart, - topDrop: eventTypes.drop, - topError: eventTypes.error, - topFocus: eventTypes.focus, - topInput: eventTypes.input, - topKeyDown: eventTypes.keyDown, - topKeyPress: eventTypes.keyPress, - topKeyUp: eventTypes.keyUp, - topLoad: eventTypes.load, - topMouseDown: eventTypes.mouseDown, - topMouseMove: eventTypes.mouseMove, - topMouseOut: eventTypes.mouseOut, - topMouseOver: eventTypes.mouseOver, - topMouseUp: eventTypes.mouseUp, - topPaste: eventTypes.paste, - topReset: eventTypes.reset, - topScroll: eventTypes.scroll, - topSubmit: eventTypes.submit, + topDrag: eventTypes.drag, + topDragEnd: eventTypes.dragEnd, + topDragEnter: eventTypes.dragEnter, + topDragExit: eventTypes.dragExit, + topDragLeave: eventTypes.dragLeave, + topDragOver: eventTypes.dragOver, + topDragStart: eventTypes.dragStart, + topDrop: eventTypes.drop, + topError: eventTypes.error, + topFocus: eventTypes.focus, + topInput: eventTypes.input, + topKeyDown: eventTypes.keyDown, + topKeyPress: eventTypes.keyPress, + topKeyUp: eventTypes.keyUp, + topLoad: eventTypes.load, + topMouseDown: eventTypes.mouseDown, + topMouseMove: eventTypes.mouseMove, + topMouseOut: eventTypes.mouseOut, + topMouseOver: eventTypes.mouseOver, + topMouseUp: eventTypes.mouseUp, + topPaste: eventTypes.paste, + topPointerCancel: eventTypes.pointerCancel, + topPointerDown: eventTypes.pointerDown, + topPointerMove: eventTypes.pointerMove, + topPointerOut: eventTypes.pointerOut, + topPointerOver: eventTypes.pointerOver, + topPointerUp: eventTypes.pointerUp, + topReset: eventTypes.reset, + topScroll: eventTypes.scroll, + topSubmit: eventTypes.submit, topTouchCancel: eventTypes.touchCancel, - topTouchEnd: eventTypes.touchEnd, - topTouchMove: eventTypes.touchMove, - topTouchStart: eventTypes.touchStart, - topWheel: eventTypes.wheel + topTouchEnd: eventTypes.touchEnd, + topTouchMove: eventTypes.touchMove, + topTouchStart: eventTypes.touchStart, + topWheel: eventTypes.wheel }; for (var topLevelType in topLevelEventsToDispatchConfig) { @@ -366,6 +409,14 @@ var SimpleEventPlugin = { case topLevelTypes.topMouseUp: EventConstructor = SyntheticMouseEvent; break; + case topLevelTypes.topPointerCancel: + case topLevelTypes.topPointerDown: + case topLevelTypes.topPointerMove: + case topLevelTypes.topPointerOut: + case topLevelTypes.topPointerOver: + case topLevelTypes.topPointerUp: + EventConstructor = SyntheticPointerEvent; + break; case topLevelTypes.topDrag: case topLevelTypes.topDragEnd: case topLevelTypes.topDragEnter: diff --git a/src/browser/syntheticEvents/SyntheticPointerEvent.js b/src/browser/syntheticEvents/SyntheticPointerEvent.js new file mode 100644 index 00000000000..3d07c336932 --- /dev/null +++ b/src/browser/syntheticEvents/SyntheticPointerEvent.js @@ -0,0 +1,52 @@ +/** + * Copyright 2013-2014 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * @providesModule SyntheticPointerEvent + * @typechecks static-only + */ + +"use strict"; + +var SyntheticMouseEvent = require('SyntheticMouseEvent'); +var ViewportMetrics = require('ViewportMetrics'); + +/** + * @interface PointerEvent + * @see http://www.w3.org/TR/DOM-Level-3-Events/ + */ +var PointerEventInterface = { + pointerId: null, + width: null, + height: null, + pressure: null, + tiltX: null, + tiltY: null, + pointerType: null, + isPrimary: null +}; + +/** + * @param {object} dispatchConfig Configuration used to dispatch this event. + * @param {string} dispatchMarker Marker identifying the event target. + * @param {object} nativeEvent Native browser event. + * @extends {SyntheticMouseEvent} + */ +function SyntheticPointerEvent(dispatchConfig, dispatchMarker, nativeEvent) { + SyntheticMouseEvent.call(this, dispatchConfig, dispatchMarker, nativeEvent); +} + +SyntheticMouseEvent.augmentClass(SyntheticPointerEvent, PointerEventInterface); + +module.exports = SyntheticPointerEvent; diff --git a/src/event/EventConstants.js b/src/event/EventConstants.js index ee8508340f1..0ba4f6b5fd1 100644 --- a/src/event/EventConstants.js +++ b/src/event/EventConstants.js @@ -57,6 +57,14 @@ var topLevelTypes = keyMirror({ topMouseOver: null, topMouseUp: null, topPaste: null, + topPointerCancel: null, + topPointerDown: null, + topPointerEnter: null, + topPointerLeave: null, + topPointerMove: null, + topPointerOut: null, + topPointerOver: null, + topPointerUp: null, topReset: null, topScroll: null, topSelectionChange: null, diff --git a/src/event/EventPluginUtils.js b/src/event/EventPluginUtils.js index 5f2715ab9a7..70b0441b430 100644 --- a/src/event/EventPluginUtils.js +++ b/src/event/EventPluginUtils.js @@ -48,16 +48,20 @@ var topLevelTypes = EventConstants.topLevelTypes; function isEndish(topLevelType) { return topLevelType === topLevelTypes.topMouseUp || + topLevelType === topLevelTypes.topPointerUp || + topLevelType === topLevelTypes.topPointerCancel || topLevelType === topLevelTypes.topTouchEnd || topLevelType === topLevelTypes.topTouchCancel; } function isMoveish(topLevelType) { return topLevelType === topLevelTypes.topMouseMove || + topLevelType === topLevelTypes.topPointerMove || topLevelType === topLevelTypes.topTouchMove; } function isStartish(topLevelType) { return topLevelType === topLevelTypes.topMouseDown || + topLevelType === topLevelTypes.topPointerDown || topLevelType === topLevelTypes.topTouchStart; } From d27c24c89a72ac683d27143bf5829e74fe96c37a Mon Sep 17 00:00:00 2001 From: Andreas Svensson Date: Thu, 10 Apr 2014 11:01:22 +0200 Subject: [PATCH 2/5] Reorder and inline pointer/mouse checks --- .../eventPlugins/EnterLeaveEventPlugin.js | 29 +++++++------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/src/browser/eventPlugins/EnterLeaveEventPlugin.js b/src/browser/eventPlugins/EnterLeaveEventPlugin.js index efee0801c81..0fdfdf7d03b 100644 --- a/src/browser/eventPlugins/EnterLeaveEventPlugin.js +++ b/src/browser/eventPlugins/EnterLeaveEventPlugin.js @@ -86,30 +86,21 @@ var EnterLeaveEventPlugin = { topLevelTarget, topLevelTargetID, nativeEvent) { - var isMouseEvent = ( - topLevelType === topLevelTypes.topMouseOut || - topLevelType === topLevelTypes.topMouseOver - ); - var isPointerEvent = ( - topLevelType === topLevelTypes.topPointerOut || - topLevelType === topLevelTypes.topPointerOver - ); - if (!isMouseEvent && !isPointerEvent) { - // Must not be a mouse/pointer in or out - ignoring. - return null; - } var isOverEvent = ( topLevelType === topLevelTypes.topMouseOver || topLevelType === topLevelTypes.topPointerOver ); - if (isOverEvent && (nativeEvent.relatedTarget || nativeEvent.fromElement)) { - return null; - } var isOutEvent = ( topLevelType === topLevelTypes.topMouseOut || topLevelType === topLevelTypes.topPointerOut ); - + if (!isOverEvent && !isOutEvent) { + // Must not be a mouse/pointer in or out - ignoring. + return null; + } + if (isOverEvent && (nativeEvent.relatedTarget || nativeEvent.fromElement)) { + return null; + } var win; if (topLevelTarget.window === topLevelTarget) { // `topLevelTarget` is probably a window object. @@ -148,12 +139,14 @@ var EnterLeaveEventPlugin = { enterEventType, eventTypePrefix; - if (isMouseEvent) { + if (topLevelType === topLevelTypes.topMouseOut || + topLevelType === topLevelTypes.topMouseOver) { syntheticEventInterface = SyntheticMouseEvent; leaveEventType = eventTypes.mouseLeave; enterEventType = eventTypes.mouseEnter; eventTypePrefix = 'mouse'; - } else if (isPointerEvent) { + } else if (topLevelType === topLevelTypes.topPointerOut || + topLevelType === topLevelTypes.topPointerOver) { syntheticEventInterface = SyntheticPointerEvent; leaveEventType = eventTypes.pointerLeave; enterEventType = eventTypes.pointerEnter; From 6b1e06ecdcdea8cf6bd11127fb41e35cd8b91caa Mon Sep 17 00:00:00 2001 From: Andreas Svensson Date: Thu, 10 Apr 2014 21:50:57 +0200 Subject: [PATCH 3/5] Minor style changes --- .../eventPlugins/EnterLeaveEventPlugin.js | 40 +++++++------------ .../syntheticEvents/SyntheticPointerEvent.js | 3 +- 2 files changed, 15 insertions(+), 28 deletions(-) diff --git a/src/browser/eventPlugins/EnterLeaveEventPlugin.js b/src/browser/eventPlugins/EnterLeaveEventPlugin.js index 0fdfdf7d03b..97b7be2df60 100644 --- a/src/browser/eventPlugins/EnterLeaveEventPlugin.js +++ b/src/browser/eventPlugins/EnterLeaveEventPlugin.js @@ -94,6 +94,7 @@ var EnterLeaveEventPlugin = { topLevelType === topLevelTypes.topMouseOut || topLevelType === topLevelTypes.topPointerOut ); + if (!isOverEvent && !isOutEvent) { // Must not be a mouse/pointer in or out - ignoring. return null; @@ -101,6 +102,7 @@ var EnterLeaveEventPlugin = { if (isOverEvent && (nativeEvent.relatedTarget || nativeEvent.fromElement)) { return null; } + var win; if (topLevelTarget.window === topLevelTarget) { // `topLevelTarget` is probably a window object. @@ -108,19 +110,16 @@ var EnterLeaveEventPlugin = { } else { // TODO: Figure out why `ownerDocument` is sometimes undefined in IE8. var doc = topLevelTarget.ownerDocument; - if (doc) { - win = doc.defaultView || doc.parentWindow; - } else { - win = window; - } + win = doc ? doc.defaultView || doc.parentWindow : window; } var from, to; if (isOutEvent) { from = topLevelTarget; - to = + to = ( getFirstReactDOM(nativeEvent.relatedTarget || nativeEvent.toElement) || - win; + win + ); } else { from = win; to = topLevelTarget; @@ -131,42 +130,31 @@ var EnterLeaveEventPlugin = { return null; } - var fromID = from ? ReactMount.getID(from) : ''; - var toID = to ? ReactMount.getID(to) : ''; - - var syntheticEventInterface, - leaveEventType, - enterEventType, - eventTypePrefix; + var eventInterface, leaveEventType, enterEventType, eventTypePrefix; if (topLevelType === topLevelTypes.topMouseOut || topLevelType === topLevelTypes.topMouseOver) { - syntheticEventInterface = SyntheticMouseEvent; + eventInterface = SyntheticMouseEvent; leaveEventType = eventTypes.mouseLeave; enterEventType = eventTypes.mouseEnter; eventTypePrefix = 'mouse'; } else if (topLevelType === topLevelTypes.topPointerOut || topLevelType === topLevelTypes.topPointerOver) { - syntheticEventInterface = SyntheticPointerEvent; + eventInterface = SyntheticPointerEvent; leaveEventType = eventTypes.pointerLeave; enterEventType = eventTypes.pointerEnter; eventTypePrefix = 'pointer'; } - var leave = syntheticEventInterface.getPooled( - leaveEventType, - fromID, - nativeEvent - ); + var fromID = from ? ReactMount.getID(from) : ''; + var toID = to ? ReactMount.getID(to) : ''; + + var leave = eventInterface.getPooled(leaveEventType, fromID, nativeEvent); leave.type = eventTypePrefix + 'leave'; leave.target = from; leave.relatedTarget = to; - var enter = syntheticEventInterface.getPooled( - enterEventType, - fromID, - nativeEvent - ); + var enter = eventInterface.getPooled(enterEventType, fromID, nativeEvent); enter.type = eventTypePrefix + 'enter'; enter.target = to; enter.relatedTarget = from; diff --git a/src/browser/syntheticEvents/SyntheticPointerEvent.js b/src/browser/syntheticEvents/SyntheticPointerEvent.js index 3d07c336932..7b03956610c 100644 --- a/src/browser/syntheticEvents/SyntheticPointerEvent.js +++ b/src/browser/syntheticEvents/SyntheticPointerEvent.js @@ -20,11 +20,10 @@ "use strict"; var SyntheticMouseEvent = require('SyntheticMouseEvent'); -var ViewportMetrics = require('ViewportMetrics'); /** * @interface PointerEvent - * @see http://www.w3.org/TR/DOM-Level-3-Events/ + * @see http://www.w3.org/TR/pointerevents/ */ var PointerEventInterface = { pointerId: null, From b3935657de9b66b649b101a112f41cd6fda9f9ce Mon Sep 17 00:00:00 2001 From: Andreas Svensson Date: Thu, 10 Apr 2014 22:07:22 +0200 Subject: [PATCH 4/5] Update TapEventPlugin dependencies --- src/browser/eventPlugins/TapEventPlugin.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/browser/eventPlugins/TapEventPlugin.js b/src/browser/eventPlugins/TapEventPlugin.js index 6db72af8a96..72f8408b517 100644 --- a/src/browser/eventPlugins/TapEventPlugin.js +++ b/src/browser/eventPlugins/TapEventPlugin.js @@ -66,7 +66,11 @@ function getDistance(coords, nativeEvent) { var dependencies = [ topLevelTypes.topMouseDown, topLevelTypes.topMouseMove, - topLevelTypes.topMouseUp + topLevelTypes.topMouseUp, + topLevelTypes.topPointerCancel, + topLevelTypes.topPointerDown, + topLevelTypes.topPointerMove, + topLevelTypes.topPointerUp ]; if (EventPluginUtils.useTouchEvents) { From bf3acd2fa109e0e1a08c0a901e10ccf06280a2ca Mon Sep 17 00:00:00 2001 From: Andreas Svensson Date: Sat, 12 Apr 2014 00:01:28 +0200 Subject: [PATCH 5/5] Add got/lostPointerCapture events --- src/browser/ReactEventEmitter.js | 2 ++ src/browser/eventPlugins/SimpleEventPlugin.js | 16 ++++++++++++++++ src/event/EventConstants.js | 2 ++ 3 files changed, 20 insertions(+) diff --git a/src/browser/ReactEventEmitter.js b/src/browser/ReactEventEmitter.js index 24603307b8d..27e4c039cab 100644 --- a/src/browser/ReactEventEmitter.js +++ b/src/browser/ReactEventEmitter.js @@ -103,10 +103,12 @@ var topEventMapping = { topDragStart: 'dragstart', topDrop: 'drop', topFocus: 'focus', + topGotPointerCapture: 'gotpointercapture', topInput: 'input', topKeyDown: 'keydown', topKeyPress: 'keypress', topKeyUp: 'keyup', + topLostPointerCapture: 'lostpointercapture', topMouseDown: 'mousedown', topMouseMove: 'mousemove', topMouseOut: 'mouseout', diff --git a/src/browser/eventPlugins/SimpleEventPlugin.js b/src/browser/eventPlugins/SimpleEventPlugin.js index 5da2a6dbe8d..2ce7acd6753 100644 --- a/src/browser/eventPlugins/SimpleEventPlugin.js +++ b/src/browser/eventPlugins/SimpleEventPlugin.js @@ -128,6 +128,12 @@ var eventTypes = { captured: keyOf({onFocusCapture: true}) } }, + gotPointerCapture: { + phasedRegistrationNames: { + bubbled: keyOf({onGotPointerCapture: true}), + captured: keyOf({onGotPointerCaptureCapture: true}) + } + }, input: { phasedRegistrationNames: { bubbled: keyOf({onInput: true}), @@ -158,6 +164,12 @@ var eventTypes = { captured: keyOf({onLoadCapture: true}) } }, + lostPointerCapture: { + phasedRegistrationNames: { + bubbled: keyOf({onLostPointerCapture: true}), + captured: keyOf({onLostPointerCaptureCapture: true}) + } + }, error: { phasedRegistrationNames: { bubbled: keyOf({onError: true}), @@ -305,11 +317,13 @@ var topLevelEventsToDispatchConfig = { topDrop: eventTypes.drop, topError: eventTypes.error, topFocus: eventTypes.focus, + topGotPointerCapture: eventTypes.gotPointerCapture, topInput: eventTypes.input, topKeyDown: eventTypes.keyDown, topKeyPress: eventTypes.keyPress, topKeyUp: eventTypes.keyUp, topLoad: eventTypes.load, + topLostPointerCapture: eventTypes.lostPointerCapture, topMouseDown: eventTypes.mouseDown, topMouseMove: eventTypes.mouseMove, topMouseOut: eventTypes.mouseOut, @@ -415,6 +429,8 @@ var SimpleEventPlugin = { case topLevelTypes.topPointerOut: case topLevelTypes.topPointerOver: case topLevelTypes.topPointerUp: + case topLevelTypes.topGotPointerCapture: + case topLevelTypes.topLostPointerCapture: EventConstructor = SyntheticPointerEvent; break; case topLevelTypes.topDrag: diff --git a/src/event/EventConstants.js b/src/event/EventConstants.js index 0ba4f6b5fd1..286e68f9f3a 100644 --- a/src/event/EventConstants.js +++ b/src/event/EventConstants.js @@ -46,11 +46,13 @@ var topLevelTypes = keyMirror({ topDrop: null, topError: null, topFocus: null, + topGotPointerCapture: null, topInput: null, topKeyDown: null, topKeyPress: null, topKeyUp: null, topLoad: null, + topLostPointerCapture: null, topMouseDown: null, topMouseMove: null, topMouseOut: null,