handler-trigger-event.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import { sendMessage } from '@/utils/message';
  2. import simulateEvent from '@/utils/simulate-event';
  3. import simulateMouseEvent from '@/utils/simulate-event/mouse-event';
  4. import handleSelector from '../handle-selector';
  5. const modifiers = {
  6. altKey: 1,
  7. ctrlKey: 2,
  8. metKey: 3,
  9. shiftKey: 4,
  10. };
  11. const eventHandlers = {
  12. 'mouse-event': async ({ params, sendCommand, name }) => {
  13. const mouseButtons = {
  14. 0: { id: 1, name: 'left' },
  15. 1: { id: 4, name: 'middle' },
  16. 2: { id: 2, name: 'right' },
  17. };
  18. const commandParams = {
  19. button: mouseButtons[params.button]?.name || 'left',
  20. };
  21. if (params.clientX) commandParams.x = +params.clientX;
  22. if (params.clientY) commandParams.y = +params.clientY;
  23. Object.keys(modifiers).forEach((key) => {
  24. if (commandParams.modifiers) return;
  25. if (params[key]) commandParams.modifiers = modifiers[key];
  26. });
  27. const mouseEvents = simulateMouseEvent({ sendCommand, commandParams });
  28. const eventHandler = {
  29. mouseover: 'mouseenter',
  30. mouseout: 'mouseleave',
  31. };
  32. const eventName = eventHandler[name] || name;
  33. await mouseEvents[eventName]();
  34. },
  35. 'keyboard-event': async ({ name, params, sendCommand }) => {
  36. const commandParams = {
  37. key: params.key ?? '',
  38. code: params.code ?? '',
  39. autoRepeat: params.repeat,
  40. windowsVirtualKeyCode: params.keyCode ?? 0,
  41. type: name === 'keyup' ? 'keyUp' : 'keyDown',
  42. };
  43. Object.keys(modifiers).forEach((key) => {
  44. if (commandParams.modifiers) return;
  45. if (params[key]) commandParams.modifiers = modifiers[key];
  46. });
  47. await sendCommand('Input.dispatchKeyEvent', commandParams);
  48. },
  49. };
  50. function triggerEvent({ data, id, frameSelector, debugMode, activeTabId }) {
  51. return new Promise((resolve, reject) => {
  52. handleSelector(
  53. { data, id, frameSelector },
  54. {
  55. async onSelected(element) {
  56. const eventHandler = eventHandlers[data.eventType];
  57. if (debugMode && eventHandler) {
  58. const { x, y, width, height } = element.getBoundingClientRect();
  59. const elCoordinate = {
  60. x: x + width / 2,
  61. y: y + height / 2,
  62. };
  63. const sendCommand = (method, params = {}) => {
  64. const payload = {
  65. method,
  66. params: {
  67. x: elCoordinate.x,
  68. y: elCoordinate.y,
  69. ...params,
  70. },
  71. tabId: activeTabId,
  72. };
  73. return sendMessage(
  74. 'debugger:send-command',
  75. payload,
  76. 'background'
  77. );
  78. };
  79. await eventHandler({
  80. element,
  81. sendCommand,
  82. name: data.eventName,
  83. params: data.eventParams,
  84. });
  85. return;
  86. }
  87. simulateEvent(element, data.eventName, data.eventParams);
  88. },
  89. onSuccess() {
  90. resolve(data.eventName);
  91. },
  92. onError(error) {
  93. reject(error);
  94. },
  95. }
  96. );
  97. resolve(data.eventName);
  98. });
  99. }
  100. export default triggerEvent;