index.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import browser from 'webextension-polyfill';
  2. import { nanoid } from 'nanoid';
  3. import { toCamelCase } from '@/utils/helper';
  4. import elementSelector from './element-selector';
  5. import executedBlock from './executed-block';
  6. import blocksHandler from './blocks-handler';
  7. (() => {
  8. if (window.isAutomaInjected) return;
  9. window.isAutomaInjected = true;
  10. browser.runtime.onMessage.addListener((data) => {
  11. return new Promise((resolve, reject) => {
  12. if (data.isBlock) {
  13. const removeExecutedBlock = executedBlock(
  14. data,
  15. data.executedBlockOnWeb
  16. );
  17. const handler = blocksHandler[toCamelCase(data.name)];
  18. if (handler) {
  19. handler(data)
  20. .then((result) => {
  21. removeExecutedBlock();
  22. resolve(result);
  23. })
  24. .catch(reject);
  25. return;
  26. }
  27. console.error(`"${data.name}" doesn't have a handler`);
  28. resolve('');
  29. return;
  30. }
  31. switch (data.type) {
  32. case 'content-script-exists':
  33. resolve(true);
  34. break;
  35. case 'select-element':
  36. elementSelector();
  37. resolve(true);
  38. break;
  39. case 'give-me-the-frame-id':
  40. browser.runtime.sendMessage({
  41. type: 'this-is-the-frame-id',
  42. });
  43. resolve();
  44. break;
  45. case 'loop-elements': {
  46. const selectors = [];
  47. const attrId = nanoid(5);
  48. const elements = document.body.querySelectorAll(data.selector);
  49. elements.forEach((el, index) => {
  50. if (data.max > 0 && selectors.length - 1 > data.max) return;
  51. const attrName = 'automa-loop';
  52. const attrValue = `${attrId}--${index}`;
  53. el.setAttribute(attrName, attrValue);
  54. selectors.push(`[${attrName}="${attrValue}"]`);
  55. });
  56. resolve(selectors);
  57. break;
  58. }
  59. default:
  60. }
  61. });
  62. });
  63. })();