main
js 121 lines 3.12 KB
Raw
1 /**
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 *
7 * @emails react-core
8 */
9
10 'use strict';
11
12 import {buttonType, buttonsType} from './constants';
13 import * as domEvents from './domEvents';
14 import * as domEventSequences from './domEventSequences';
15 import {hasPointerEvent, setPointerEvent, platform} from './domEnvironment';
16 import {describeWithPointerEvent, testWithPointerType} from './testHelpers';
17
18 const createEventTarget = node => ({
19 node,
20 /**
21 * Simple events abstraction.
22 */
23 blur(payload) {
24 node.dispatchEvent(domEvents.blur(payload));
25 node.dispatchEvent(domEvents.focusOut(payload));
26 },
27 click(payload) {
28 node.dispatchEvent(domEvents.click(payload));
29 },
30 focus(payload) {
31 node.dispatchEvent(domEvents.focus(payload));
32 node.dispatchEvent(domEvents.focusIn(payload));
33 node.focus();
34 },
35 keydown(payload) {
36 node.dispatchEvent(domEvents.keydown(payload));
37 },
38 keyup(payload) {
39 node.dispatchEvent(domEvents.keyup(payload));
40 },
41 scroll(payload) {
42 node.dispatchEvent(domEvents.scroll(payload));
43 },
44 virtualclick(payload) {
45 node.dispatchEvent(domEvents.virtualclick(payload));
46 },
47 /**
48 * PointerEvent abstraction.
49 * Dispatches the expected sequence of PointerEvents, MouseEvents, and
50 * TouchEvents for a given environment.
51 */
52 contextmenu(payload, options) {
53 domEventSequences.contextmenu(node, payload, options);
54 },
55 // node no longer receives events for the pointer
56 pointercancel(payload) {
57 domEventSequences.pointercancel(node, payload);
58 },
59 // node dispatches down events
60 pointerdown(payload) {
61 domEventSequences.pointerdown(node, payload);
62 },
63 // node dispatches move events (pointer is not down)
64 pointerhover(payload) {
65 domEventSequences.pointerhover(node, payload);
66 },
67 // node dispatches move events (pointer is down)
68 pointermove(payload) {
69 domEventSequences.pointermove(node, payload);
70 },
71 // node dispatches enter & over events
72 pointerenter(payload) {
73 domEventSequences.pointerenter(node, payload);
74 },
75 // node dispatches exit & leave events
76 pointerexit(payload) {
77 domEventSequences.pointerexit(node, payload);
78 },
79 // node dispatches up events
80 pointerup(payload) {
81 domEventSequences.pointerup(node, payload);
82 },
83 /**
84 * Gesture abstractions.
85 * Helpers for event sequences expected in a gesture.
86 * target.tap({ pointerType: 'touch' })
87 */
88 tap(payload) {
89 domEventSequences.pointerdown(payload);
90 domEventSequences.pointerup(payload);
91 },
92 /**
93 * Utilities
94 */
95 setBoundingClientRect({x, y, width, height}) {
96 node.getBoundingClientRect = function () {
97 return {
98 width,
99 height,
100 left: x,
101 right: x + width,
102 top: y,
103 bottom: y + height,
104 };
105 };
106 },
107 });
108
109 const resetActivePointers = domEventSequences.resetActivePointers;
110
111 export {
112 buttonType,
113 buttonsType,
114 createEventTarget,
115 describeWithPointerEvent,
116 platform,
117 hasPointerEvent,
118 resetActivePointers,
119 setPointerEvent,
120 testWithPointerType,
121 };