index.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import browser from 'webextension-polyfill';
  2. import { finder } from '@medv/finder';
  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 elements = document.body.querySelectorAll(data.selector);
  48. elements.forEach((el) => {
  49. if (data.max > 0 && selectors.length - 1 > data.max) return;
  50. selectors.push(finder(el));
  51. });
  52. console.log(data, selectors);
  53. resolve(selectors);
  54. break;
  55. }
  56. default:
  57. }
  58. });
  59. });
  60. })();