Support Pointer Events (#12507)

* Support Pointer Events

* Add Pointer Events DOM Fixture
This commit is contained in:
Philipp Spieß 2018-05-16 15:34:33 +02:00 committed by Dan Abramov
parent de84d5c107
commit 49979bbf52
13 changed files with 373 additions and 17 deletions

View File

@ -64,6 +64,7 @@ class Header extends React.Component {
<option value="/event-pooling">Event Pooling</option> <option value="/event-pooling">Event Pooling</option>
<option value="/custom-elements">Custom Elements</option> <option value="/custom-elements">Custom Elements</option>
<option value="/media-events">Media Events</option> <option value="/media-events">Media Events</option>
<option value="/pointer-events">Pointer Events</option>
</select> </select>
</label> </label>
<label htmlFor="react_version"> <label htmlFor="react_version">

View File

@ -11,6 +11,7 @@ import ErrorHandling from './error-handling';
import EventPooling from './event-pooling'; import EventPooling from './event-pooling';
import CustomElementFixtures from './custom-elements'; import CustomElementFixtures from './custom-elements';
import MediaEventsFixtures from './media-events'; import MediaEventsFixtures from './media-events';
import PointerEventsFixtures from './pointer-events';
const React = window.React; const React = window.React;
@ -46,6 +47,8 @@ function FixturesPage() {
return <CustomElementFixtures />; return <CustomElementFixtures />;
case '/media-events': case '/media-events':
return <MediaEventsFixtures />; return <MediaEventsFixtures />;
case '/pointer-events':
return <PointerEventsFixtures />;
default: default:
return <p>Please select a test fixture.</p>; return <p>Please select a test fixture.</p>;
} }

View File

@ -0,0 +1,90 @@
const React = window.React;
const CIRCLE_SIZE = 80;
class DragBox extends React.Component {
state = {
hasCapture: false,
circleLeft: 80,
circleTop: 80,
};
isDragging = false;
previousLeft = 0;
previousTop = 0;
onDown = event => {
this.isDragging = true;
event.target.setPointerCapture(event.pointerId);
// We store the initial coordinates to be able to calculate the changes
// later on.
this.extractPositionDelta(event);
};
onMove = event => {
if (!this.isDragging) {
return;
}
const {left, top} = this.extractPositionDelta(event);
this.setState(({circleLeft, circleTop}) => ({
circleLeft: circleLeft + left,
circleTop: circleTop + top,
}));
};
onUp = event => (this.isDragging = false);
onGotCapture = event => this.setState({hasCapture: true});
onLostCapture = event => this.setState({hasCapture: false});
extractPositionDelta = event => {
const left = event.pageX;
const top = event.pageY;
const delta = {
left: left - this.previousLeft,
top: top - this.previousTop,
};
this.previousLeft = left;
this.previousTop = top;
return delta;
};
render() {
const {hasCapture, circleLeft, circleTop} = this.state;
const boxStyle = {
border: '1px solid #d9d9d9',
margin: '10px 0 20px',
minHeight: 400,
width: '100%',
position: 'relative',
};
const circleStyle = {
width: CIRCLE_SIZE,
height: CIRCLE_SIZE,
borderRadius: CIRCLE_SIZE / 2,
position: 'absolute',
left: circleLeft,
top: circleTop,
backgroundColor: hasCapture ? 'blue' : 'green',
touchAction: 'none',
};
return (
<div style={boxStyle}>
<div
style={circleStyle}
onPointerDown={this.onDown}
onPointerMove={this.onMove}
onPointerUp={this.onUp}
onPointerCancel={this.onUp}
onGotPointerCapture={this.onGotCapture}
onLostPointerCapture={this.onLostCapture}
/>
</div>
);
}
}
export default DragBox;

View File

@ -0,0 +1,25 @@
import TestCase from '../../TestCase';
import DragBox from './drag-box';
const React = window.React;
class Drag extends React.Component {
render() {
return (
<TestCase title="Drag" description="">
<TestCase.Steps>
<li>Drag the circle below with any pointer tool</li>
</TestCase.Steps>
<TestCase.ExpectedResult>
While dragging, the circle must have turn blue to indicate that a
pointer capture was received.
</TestCase.ExpectedResult>
<DragBox />
</TestCase>
);
}
}
export default Drag;

View File

@ -0,0 +1,34 @@
const React = window.React;
class DrawBox extends React.Component {
render() {
const boxStyle = {
border: '1px solid #d9d9d9',
margin: '10px 0 20px',
padding: '20px 20px',
touchAction: 'none',
};
const obstacleStyle = {
border: '1px solid #d9d9d9',
width: '25%',
height: '200px',
margin: '12.5%',
display: 'inline-block',
};
return (
<div
style={boxStyle}
onPointerOver={this.props.onOver}
onPointerOut={this.props.onOut}
onPointerEnter={this.props.onEnter}
onPointerLeave={this.props.onLeave}>
<div style={obstacleStyle} />
<div style={obstacleStyle} />
</div>
);
}
}
export default DrawBox;

View File

@ -0,0 +1,51 @@
import TestCase from '../../TestCase';
import HoverBox from './hover-box';
const React = window.React;
class Hover extends React.Component {
state = {
overs: 0,
outs: 0,
enters: 0,
leaves: 0,
};
onOver = () => this.setState({overs: this.state.overs + 1});
onOut = () => this.setState({outs: this.state.outs + 1});
onEnter = () => this.setState({enters: this.state.enters + 1});
onLeave = () => this.setState({leaves: this.state.leaves + 1});
render() {
const {overs, outs, enters, leaves} = this.state;
return (
<TestCase title="Hover" description="">
<TestCase.Steps>
<li>Hover over the above box and the obstacles</li>
</TestCase.Steps>
<TestCase.ExpectedResult>
Overs and outs should increase when moving over the obstacles but
enters and leaves should not.
</TestCase.ExpectedResult>
<HoverBox
onOver={this.onOver}
onOut={this.onOut}
onEnter={this.onEnter}
onLeave={this.onLeave}
/>
<p>
Pointer Overs: <b>{overs}</b> <br />
Pointer Outs: <b>{outs}</b> <br />
Pointer Enters: <b>{enters}</b> <br />
Pointer Leaves: <b>{leaves}</b> <br />
</p>
</TestCase>
);
}
}
export default Hover;

View File

@ -0,0 +1,20 @@
import FixtureSet from '../../FixtureSet';
import Drag from './drag';
import Hover from './hover';
const React = window.React;
class PointerEvents extends React.Component {
render() {
return (
<FixtureSet
title="Pointer Events"
description="Pointer Events are not supported in every browser. The examples below might not work in every browser. To test pointer events, make sure to use Google Chrome, Firefox, Internet Explorer, or Edge.">
<Drag />
<Hover />
</FixtureSet>
);
}
}
export default PointerEvents;

View File

@ -35,6 +35,7 @@ Array [
"ended", "ended",
"error", "error",
"focus", "focus",
"gotPointerCapture",
"input", "input",
"invalid", "invalid",
"keyDown", "keyDown",
@ -44,6 +45,7 @@ Array [
"loadStart", "loadStart",
"loadedData", "loadedData",
"loadedMetadata", "loadedMetadata",
"lostPointerCapture",
"mouseDown", "mouseDown",
"mouseEnter", "mouseEnter",
"mouseLeave", "mouseLeave",
@ -55,6 +57,14 @@ Array [
"pause", "pause",
"play", "play",
"playing", "playing",
"pointerCancel",
"pointerDown",
"pointerEnter",
"pointerLeave",
"pointerMove",
"pointerOut",
"pointerOver",
"pointerUp",
"progress", "progress",
"rateChange", "rateChange",
"reset", "reset",

View File

@ -72,6 +72,9 @@ export const TOP_ENCRYPTED = unsafeCastStringToDOMTopLevelType('encrypted');
export const TOP_ENDED = unsafeCastStringToDOMTopLevelType('ended'); export const TOP_ENDED = unsafeCastStringToDOMTopLevelType('ended');
export const TOP_ERROR = unsafeCastStringToDOMTopLevelType('error'); export const TOP_ERROR = unsafeCastStringToDOMTopLevelType('error');
export const TOP_FOCUS = unsafeCastStringToDOMTopLevelType('focus'); export const TOP_FOCUS = unsafeCastStringToDOMTopLevelType('focus');
export const TOP_GOT_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType(
'gotpointercapture',
);
export const TOP_INPUT = unsafeCastStringToDOMTopLevelType('input'); export const TOP_INPUT = unsafeCastStringToDOMTopLevelType('input');
export const TOP_INVALID = unsafeCastStringToDOMTopLevelType('invalid'); export const TOP_INVALID = unsafeCastStringToDOMTopLevelType('invalid');
export const TOP_KEY_DOWN = unsafeCastStringToDOMTopLevelType('keydown'); export const TOP_KEY_DOWN = unsafeCastStringToDOMTopLevelType('keydown');
@ -83,6 +86,9 @@ export const TOP_LOADED_DATA = unsafeCastStringToDOMTopLevelType('loadeddata');
export const TOP_LOADED_METADATA = unsafeCastStringToDOMTopLevelType( export const TOP_LOADED_METADATA = unsafeCastStringToDOMTopLevelType(
'loadedmetadata', 'loadedmetadata',
); );
export const TOP_LOST_POINTER_CAPTURE = unsafeCastStringToDOMTopLevelType(
'lostpointercapture',
);
export const TOP_MOUSE_DOWN = unsafeCastStringToDOMTopLevelType('mousedown'); export const TOP_MOUSE_DOWN = unsafeCastStringToDOMTopLevelType('mousedown');
export const TOP_MOUSE_MOVE = unsafeCastStringToDOMTopLevelType('mousemove'); export const TOP_MOUSE_MOVE = unsafeCastStringToDOMTopLevelType('mousemove');
export const TOP_MOUSE_OUT = unsafeCastStringToDOMTopLevelType('mouseout'); export const TOP_MOUSE_OUT = unsafeCastStringToDOMTopLevelType('mouseout');
@ -92,6 +98,26 @@ export const TOP_PASTE = unsafeCastStringToDOMTopLevelType('paste');
export const TOP_PAUSE = unsafeCastStringToDOMTopLevelType('pause'); export const TOP_PAUSE = unsafeCastStringToDOMTopLevelType('pause');
export const TOP_PLAY = unsafeCastStringToDOMTopLevelType('play'); export const TOP_PLAY = unsafeCastStringToDOMTopLevelType('play');
export const TOP_PLAYING = unsafeCastStringToDOMTopLevelType('playing'); export const TOP_PLAYING = unsafeCastStringToDOMTopLevelType('playing');
export const TOP_POINTER_CANCEL = unsafeCastStringToDOMTopLevelType(
'pointercancel',
);
export const TOP_POINTER_DOWN = unsafeCastStringToDOMTopLevelType(
'pointerdown',
);
export const TOP_POINTER_ENTER = unsafeCastStringToDOMTopLevelType(
'pointerenter',
);
export const TOP_POINTER_LEAVE = unsafeCastStringToDOMTopLevelType(
'pointerleave',
);
export const TOP_POINTER_MOVE = unsafeCastStringToDOMTopLevelType(
'pointermove',
);
export const TOP_POINTER_OUT = unsafeCastStringToDOMTopLevelType('pointerout');
export const TOP_POINTER_OVER = unsafeCastStringToDOMTopLevelType(
'pointerover',
);
export const TOP_POINTER_UP = unsafeCastStringToDOMTopLevelType('pointerup');
export const TOP_PROGRESS = unsafeCastStringToDOMTopLevelType('progress'); export const TOP_PROGRESS = unsafeCastStringToDOMTopLevelType('progress');
export const TOP_RATE_CHANGE = unsafeCastStringToDOMTopLevelType('ratechange'); export const TOP_RATE_CHANGE = unsafeCastStringToDOMTopLevelType('ratechange');
export const TOP_RESET = unsafeCastStringToDOMTopLevelType('reset'); export const TOP_RESET = unsafeCastStringToDOMTopLevelType('reset');

View File

@ -7,8 +7,14 @@
import {accumulateEnterLeaveDispatches} from 'events/EventPropagators'; import {accumulateEnterLeaveDispatches} from 'events/EventPropagators';
import {TOP_MOUSE_OUT, TOP_MOUSE_OVER} from './DOMTopLevelEventTypes'; import {
TOP_MOUSE_OUT,
TOP_MOUSE_OVER,
TOP_POINTER_OUT,
TOP_POINTER_OVER,
} from './DOMTopLevelEventTypes';
import SyntheticMouseEvent from './SyntheticMouseEvent'; import SyntheticMouseEvent from './SyntheticMouseEvent';
import SyntheticPointerEvent from './SyntheticPointerEvent';
import { import {
getClosestInstanceFromNode, getClosestInstanceFromNode,
getNodeFromInstance, getNodeFromInstance,
@ -23,6 +29,14 @@ const eventTypes = {
registrationName: 'onMouseLeave', registrationName: 'onMouseLeave',
dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER], dependencies: [TOP_MOUSE_OUT, TOP_MOUSE_OVER],
}, },
pointerEnter: {
registrationName: 'onPointerEnter',
dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER],
},
pointerLeave: {
registrationName: 'onPointerLeave',
dependencies: [TOP_POINTER_OUT, TOP_POINTER_OVER],
},
}; };
const EnterLeaveEventPlugin = { const EnterLeaveEventPlugin = {
@ -41,14 +55,17 @@ const EnterLeaveEventPlugin = {
nativeEvent, nativeEvent,
nativeEventTarget, nativeEventTarget,
) { ) {
if ( const isOverEvent =
topLevelType === TOP_MOUSE_OVER && topLevelType === TOP_MOUSE_OVER || topLevelType === TOP_POINTER_OVER;
(nativeEvent.relatedTarget || nativeEvent.fromElement) const isOutEvent =
) { topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_POINTER_OUT;
if (isOverEvent && (nativeEvent.relatedTarget || nativeEvent.fromElement)) {
return null; return null;
} }
if (topLevelType !== TOP_MOUSE_OUT && topLevelType !== TOP_MOUSE_OVER) {
// Must not be a mouse in or mouse out - ignoring. if (!isOutEvent && !isOverEvent) {
// Must not be a mouse or pointer in or out - ignoring.
return null; return null;
} }
@ -68,7 +85,7 @@ const EnterLeaveEventPlugin = {
let from; let from;
let to; let to;
if (topLevelType === TOP_MOUSE_OUT) { if (isOutEvent) {
from = targetInst; from = targetInst;
const related = nativeEvent.relatedTarget || nativeEvent.toElement; const related = nativeEvent.relatedTarget || nativeEvent.toElement;
to = related ? getClosestInstanceFromNode(related) : null; to = related ? getClosestInstanceFromNode(related) : null;
@ -83,26 +100,43 @@ const EnterLeaveEventPlugin = {
return null; return null;
} }
let eventInterface, leaveEventType, enterEventType, eventTypePrefix;
if (topLevelType === TOP_MOUSE_OUT || topLevelType === TOP_MOUSE_OVER) {
eventInterface = SyntheticMouseEvent;
leaveEventType = eventTypes.mouseLeave;
enterEventType = eventTypes.mouseEnter;
eventTypePrefix = 'mouse';
} else if (
topLevelType === TOP_POINTER_OUT ||
topLevelType === TOP_POINTER_OVER
) {
eventInterface = SyntheticPointerEvent;
leaveEventType = eventTypes.pointerLeave;
enterEventType = eventTypes.pointerEnter;
eventTypePrefix = 'pointer';
}
const fromNode = from == null ? win : getNodeFromInstance(from); const fromNode = from == null ? win : getNodeFromInstance(from);
const toNode = to == null ? win : getNodeFromInstance(to); const toNode = to == null ? win : getNodeFromInstance(to);
const leave = SyntheticMouseEvent.getPooled( const leave = eventInterface.getPooled(
eventTypes.mouseLeave, leaveEventType,
from, from,
nativeEvent, nativeEvent,
nativeEventTarget, nativeEventTarget,
); );
leave.type = 'mouseleave'; leave.type = eventTypePrefix + 'leave';
leave.target = fromNode; leave.target = fromNode;
leave.relatedTarget = toNode; leave.relatedTarget = toNode;
const enter = SyntheticMouseEvent.getPooled( const enter = eventInterface.getPooled(
eventTypes.mouseEnter, enterEventType,
to, to,
nativeEvent, nativeEvent,
nativeEventTarget, nativeEventTarget,
); );
enter.type = 'mouseenter'; enter.type = eventTypePrefix + 'enter';
enter.target = toNode; enter.target = toNode;
enter.relatedTarget = fromNode; enter.relatedTarget = fromNode;

View File

@ -29,6 +29,7 @@ import SyntheticClipboardEvent from './SyntheticClipboardEvent';
import SyntheticFocusEvent from './SyntheticFocusEvent'; import SyntheticFocusEvent from './SyntheticFocusEvent';
import SyntheticKeyboardEvent from './SyntheticKeyboardEvent'; import SyntheticKeyboardEvent from './SyntheticKeyboardEvent';
import SyntheticMouseEvent from './SyntheticMouseEvent'; import SyntheticMouseEvent from './SyntheticMouseEvent';
import SyntheticPointerEvent from './SyntheticPointerEvent';
import SyntheticDragEvent from './SyntheticDragEvent'; import SyntheticDragEvent from './SyntheticDragEvent';
import SyntheticTouchEvent from './SyntheticTouchEvent'; import SyntheticTouchEvent from './SyntheticTouchEvent';
import SyntheticTransitionEvent from './SyntheticTransitionEvent'; import SyntheticTransitionEvent from './SyntheticTransitionEvent';
@ -78,6 +79,9 @@ const interactiveEventTypeNames: Array<EventTuple> = [
[DOMTopLevelEventTypes.TOP_PASTE, 'paste'], [DOMTopLevelEventTypes.TOP_PASTE, 'paste'],
[DOMTopLevelEventTypes.TOP_PAUSE, 'pause'], [DOMTopLevelEventTypes.TOP_PAUSE, 'pause'],
[DOMTopLevelEventTypes.TOP_PLAY, 'play'], [DOMTopLevelEventTypes.TOP_PLAY, 'play'],
[DOMTopLevelEventTypes.TOP_POINTER_CANCEL, 'pointerCancel'],
[DOMTopLevelEventTypes.TOP_POINTER_DOWN, 'pointerDown'],
[DOMTopLevelEventTypes.TOP_POINTER_UP, 'pointerUp'],
[DOMTopLevelEventTypes.TOP_RATE_CHANGE, 'rateChange'], [DOMTopLevelEventTypes.TOP_RATE_CHANGE, 'rateChange'],
[DOMTopLevelEventTypes.TOP_RESET, 'reset'], [DOMTopLevelEventTypes.TOP_RESET, 'reset'],
[DOMTopLevelEventTypes.TOP_SEEKED, 'seeked'], [DOMTopLevelEventTypes.TOP_SEEKED, 'seeked'],
@ -104,14 +108,19 @@ const nonInteractiveEventTypeNames: Array<EventTuple> = [
[DOMTopLevelEventTypes.TOP_ENCRYPTED, 'encrypted'], [DOMTopLevelEventTypes.TOP_ENCRYPTED, 'encrypted'],
[DOMTopLevelEventTypes.TOP_ENDED, 'ended'], [DOMTopLevelEventTypes.TOP_ENDED, 'ended'],
[DOMTopLevelEventTypes.TOP_ERROR, 'error'], [DOMTopLevelEventTypes.TOP_ERROR, 'error'],
[DOMTopLevelEventTypes.TOP_GOT_POINTER_CAPTURE, 'gotPointerCapture'],
[DOMTopLevelEventTypes.TOP_LOAD, 'load'], [DOMTopLevelEventTypes.TOP_LOAD, 'load'],
[DOMTopLevelEventTypes.TOP_LOADED_DATA, 'loadedData'], [DOMTopLevelEventTypes.TOP_LOADED_DATA, 'loadedData'],
[DOMTopLevelEventTypes.TOP_LOADED_METADATA, 'loadedMetadata'], [DOMTopLevelEventTypes.TOP_LOADED_METADATA, 'loadedMetadata'],
[DOMTopLevelEventTypes.TOP_LOAD_START, 'loadStart'], [DOMTopLevelEventTypes.TOP_LOAD_START, 'loadStart'],
[DOMTopLevelEventTypes.TOP_LOST_POINTER_CAPTURE, 'lostPointerCapture'],
[DOMTopLevelEventTypes.TOP_MOUSE_MOVE, 'mouseMove'], [DOMTopLevelEventTypes.TOP_MOUSE_MOVE, 'mouseMove'],
[DOMTopLevelEventTypes.TOP_MOUSE_OUT, 'mouseOut'], [DOMTopLevelEventTypes.TOP_MOUSE_OUT, 'mouseOut'],
[DOMTopLevelEventTypes.TOP_MOUSE_OVER, 'mouseOver'], [DOMTopLevelEventTypes.TOP_MOUSE_OVER, 'mouseOver'],
[DOMTopLevelEventTypes.TOP_PLAYING, 'playing'], [DOMTopLevelEventTypes.TOP_PLAYING, 'playing'],
[DOMTopLevelEventTypes.TOP_POINTER_MOVE, 'pointerMove'],
[DOMTopLevelEventTypes.TOP_POINTER_OUT, 'pointerOut'],
[DOMTopLevelEventTypes.TOP_POINTER_OVER, 'pointerOver'],
[DOMTopLevelEventTypes.TOP_PROGRESS, 'progress'], [DOMTopLevelEventTypes.TOP_PROGRESS, 'progress'],
[DOMTopLevelEventTypes.TOP_SCROLL, 'scroll'], [DOMTopLevelEventTypes.TOP_SCROLL, 'scroll'],
[DOMTopLevelEventTypes.TOP_SEEKING, 'seeking'], [DOMTopLevelEventTypes.TOP_SEEKING, 'seeking'],
@ -282,6 +291,16 @@ const SimpleEventPlugin: PluginModule<MouseEvent> & {
case DOMTopLevelEventTypes.TOP_PASTE: case DOMTopLevelEventTypes.TOP_PASTE:
EventConstructor = SyntheticClipboardEvent; EventConstructor = SyntheticClipboardEvent;
break; break;
case DOMTopLevelEventTypes.TOP_GOT_POINTER_CAPTURE:
case DOMTopLevelEventTypes.TOP_LOST_POINTER_CAPTURE:
case DOMTopLevelEventTypes.TOP_POINTER_CANCEL:
case DOMTopLevelEventTypes.TOP_POINTER_DOWN:
case DOMTopLevelEventTypes.TOP_POINTER_MOVE:
case DOMTopLevelEventTypes.TOP_POINTER_OUT:
case DOMTopLevelEventTypes.TOP_POINTER_OVER:
case DOMTopLevelEventTypes.TOP_POINTER_UP:
EventConstructor = SyntheticPointerEvent;
break;
default: default:
if (__DEV__) { if (__DEV__) {
if (knownHTMLTopLevelTypes.indexOf(topLevelType) === -1) { if (knownHTMLTopLevelTypes.indexOf(topLevelType) === -1) {

View File

@ -0,0 +1,25 @@
/**
* Copyright (c) 2013-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import SyntheticMouseEvent from './SyntheticMouseEvent';
/**
* @interface PointerEvent
* @see http://www.w3.org/TR/pointerevents/
*/
const SyntheticPointerEvent = SyntheticMouseEvent.extend({
pointerId: null,
width: null,
height: null,
pressure: null,
tiltX: null,
tiltY: null,
pointerType: null,
isPrimary: null,
});
export default SyntheticPointerEvent;

View File

@ -15,6 +15,10 @@ import {
TOP_MOUSE_DOWN, TOP_MOUSE_DOWN,
TOP_MOUSE_MOVE, TOP_MOUSE_MOVE,
TOP_MOUSE_UP, TOP_MOUSE_UP,
TOP_POINTER_CANCEL,
TOP_POINTER_DOWN,
TOP_POINTER_UP,
TOP_POINTER_MOVE,
TOP_TOUCH_CANCEL, TOP_TOUCH_CANCEL,
TOP_TOUCH_END, TOP_TOUCH_END,
TOP_TOUCH_MOVE, TOP_TOUCH_MOVE,
@ -23,14 +27,20 @@ import {
import SyntheticUIEvent from './SyntheticUIEvent'; import SyntheticUIEvent from './SyntheticUIEvent';
function isStartish(topLevelType) { function isStartish(topLevelType) {
return topLevelType === TOP_MOUSE_DOWN || topLevelType === TOP_TOUCH_START; return (
topLevelType === TOP_MOUSE_DOWN ||
topLevelType === TOP_TOUCH_START ||
topLevelType === TOP_POINTER_DOWN
);
} }
function isEndish(topLevelType) { function isEndish(topLevelType) {
return ( return (
topLevelType === TOP_MOUSE_UP || topLevelType === TOP_MOUSE_UP ||
topLevelType === TOP_TOUCH_END || topLevelType === TOP_POINTER_CANCEL ||
topLevelType === TOP_TOUCH_CANCEL topLevelType === TOP_POINTER_UP ||
topLevelType === TOP_TOUCH_CANCEL ||
topLevelType === TOP_TOUCH_END
); );
} }
@ -102,8 +112,16 @@ const touchEvents = [
TOP_TOUCH_MOVE, TOP_TOUCH_MOVE,
]; ];
const pointerEvents = [
TOP_POINTER_CANCEL,
TOP_POINTER_DOWN,
TOP_POINTER_MOVE,
TOP_POINTER_UP,
];
const dependencies = [TOP_MOUSE_DOWN, TOP_MOUSE_MOVE, TOP_MOUSE_UP].concat( const dependencies = [TOP_MOUSE_DOWN, TOP_MOUSE_MOVE, TOP_MOUSE_UP].concat(
touchEvents, touchEvents,
pointerEvents,
); );
const eventTypes = { const eventTypes = {