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. };