pointer.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. 'use strict';
  2. require('../../utils/dataTransfer/Clipboard.js');
  3. var getTreeDiff = require('../../utils/misc/getTreeDiff.js');
  4. var cssPointerEvents = require('../../utils/pointer/cssPointerEvents.js');
  5. var shared = require('./shared.js');
  6. var buttons = require('./buttons.js');
  7. function _define_property(obj, key, value) {
  8. if (key in obj) {
  9. Object.defineProperty(obj, key, {
  10. value: value,
  11. enumerable: true,
  12. configurable: true,
  13. writable: true
  14. });
  15. } else {
  16. obj[key] = value;
  17. }
  18. return obj;
  19. }
  20. class Pointer {
  21. init(instance) {
  22. const target = this.getTarget(instance);
  23. const [, enter] = getTreeDiff.getTreeDiff(null, target);
  24. const init = this.getEventInit();
  25. cssPointerEvents.assertPointerEvents(instance, target);
  26. instance.dispatchUIEvent(target, 'pointerover', init);
  27. enter.forEach((el)=>instance.dispatchUIEvent(el, 'pointerenter', init));
  28. return this;
  29. }
  30. move(instance, position) {
  31. const prevPosition = this.position;
  32. const prevTarget = this.getTarget(instance);
  33. this.position = position;
  34. if (!shared.isDifferentPointerPosition(prevPosition, position)) {
  35. return;
  36. }
  37. const nextTarget = this.getTarget(instance);
  38. const init = this.getEventInit(-1);
  39. const [leave, enter] = getTreeDiff.getTreeDiff(prevTarget, nextTarget);
  40. return {
  41. leave: ()=>{
  42. if (cssPointerEvents.hasPointerEvents(instance, prevTarget)) {
  43. if (prevTarget !== nextTarget) {
  44. instance.dispatchUIEvent(prevTarget, 'pointerout', init);
  45. leave.forEach((el)=>instance.dispatchUIEvent(el, 'pointerleave', init));
  46. }
  47. }
  48. },
  49. enter: ()=>{
  50. cssPointerEvents.assertPointerEvents(instance, nextTarget);
  51. if (prevTarget !== nextTarget) {
  52. instance.dispatchUIEvent(nextTarget, 'pointerover', init);
  53. enter.forEach((el)=>instance.dispatchUIEvent(el, 'pointerenter', init));
  54. }
  55. },
  56. move: ()=>{
  57. instance.dispatchUIEvent(nextTarget, 'pointermove', init);
  58. }
  59. };
  60. }
  61. down(instance, button = 0) {
  62. if (this.isDown) {
  63. return;
  64. }
  65. const target = this.getTarget(instance);
  66. cssPointerEvents.assertPointerEvents(instance, target);
  67. this.isDown = true;
  68. this.isPrevented = !instance.dispatchUIEvent(target, 'pointerdown', this.getEventInit(button));
  69. }
  70. up(instance, button = 0) {
  71. if (!this.isDown) {
  72. return;
  73. }
  74. const target = this.getTarget(instance);
  75. cssPointerEvents.assertPointerEvents(instance, target);
  76. this.isPrevented = false;
  77. this.isDown = false;
  78. instance.dispatchUIEvent(target, 'pointerup', this.getEventInit(button));
  79. }
  80. release(instance) {
  81. const target = this.getTarget(instance);
  82. const [leave] = getTreeDiff.getTreeDiff(target, null);
  83. const init = this.getEventInit();
  84. // Currently there is no PointerEventsCheckLevel that would
  85. // make this check not use the *asserted* cached value from `up`.
  86. /* istanbul ignore else */ if (cssPointerEvents.hasPointerEvents(instance, target)) {
  87. instance.dispatchUIEvent(target, 'pointerout', init);
  88. leave.forEach((el)=>instance.dispatchUIEvent(el, 'pointerleave', init));
  89. }
  90. this.isCancelled = true;
  91. }
  92. getTarget(instance) {
  93. var _this_position_target;
  94. return (_this_position_target = this.position.target) !== null && _this_position_target !== undefined ? _this_position_target : instance.config.document.body;
  95. }
  96. getEventInit(/**
  97. * The `button` that caused the event.
  98. *
  99. * This should be `-1` if the event is not caused by a button or touch/pen contact,
  100. * e.g. a moving pointer.
  101. */ button) {
  102. return {
  103. ...this.position.coords,
  104. pointerId: this.pointerId,
  105. pointerType: this.pointerType,
  106. isPrimary: this.isPrimary,
  107. button: buttons.getMouseEventButton(button),
  108. buttons: this.buttons.getButtons()
  109. };
  110. }
  111. constructor({ pointerId, pointerType, isPrimary }, buttons){
  112. _define_property(this, "pointerId", undefined);
  113. _define_property(this, "pointerType", undefined);
  114. _define_property(this, "isPrimary", undefined);
  115. _define_property(this, "buttons", undefined);
  116. _define_property(this, "isMultitouch", false);
  117. _define_property(this, "isCancelled", false);
  118. _define_property(this, "isDown", false);
  119. _define_property(this, "isPrevented", false);
  120. _define_property(this, "position", {});
  121. this.pointerId = pointerId;
  122. this.pointerType = pointerType;
  123. this.isPrimary = isPrimary;
  124. this.isMultitouch = !isPrimary;
  125. this.buttons = buttons;
  126. }
  127. }
  128. exports.Pointer = Pointer;