elementSelector.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import browser from 'webextension-polyfill';
  2. import { isXPath } from '@/utils/helper';
  3. async function getActiveTab() {
  4. const [tab] = await browser.tabs.query({
  5. active: true,
  6. url: '*://*/*',
  7. });
  8. if (!tab) throw new Error('No active tab');
  9. return tab;
  10. }
  11. async function makeDashboardFocus() {
  12. const [currentTab] = await browser.tabs.query({
  13. active: true,
  14. currentWindow: true,
  15. });
  16. await browser.windows.update(currentTab.windowId, {
  17. focused: true,
  18. });
  19. }
  20. async function initElementSelector(tab = null) {
  21. let activeTab = tab;
  22. if (!tab) {
  23. const [queryTab] = await browser.tabs.query({
  24. active: true,
  25. url: '*://*/*',
  26. });
  27. activeTab = queryTab;
  28. }
  29. const result = await browser.tabs.sendMessage(activeTab.id, {
  30. type: 'automa-element-selector',
  31. });
  32. if (!result) {
  33. await browser.scripting.executeScript({
  34. target: {
  35. allFrames: true,
  36. tabId: activeTab.id,
  37. },
  38. files: ['./elementSelector.bundle.js'],
  39. });
  40. }
  41. await browser.tabs.update(activeTab.id, { active: true });
  42. await browser.windows.update(activeTab.windowId, { focused: true });
  43. }
  44. async function verifySelector(data) {
  45. const activeTab = await getActiveTab();
  46. if (!data.findBy) {
  47. data.findBy = isXPath(data.selector) ? 'xpath' : 'cssSelector';
  48. }
  49. await browser.tabs.update(activeTab.id, { active: true });
  50. await browser.windows.update(activeTab.windowId, { focused: true });
  51. const result = await browser.tabs.sendMessage(activeTab.id, {
  52. data,
  53. isBlock: true,
  54. label: 'verify-selector',
  55. });
  56. await makeDashboardFocus();
  57. return result;
  58. }
  59. async function selectElement(name) {
  60. const tab = await getActiveTab();
  61. await initElementSelector(tab);
  62. const port = await browser.tabs.connect(tab.id, { name });
  63. const getSelector = () => {
  64. return new Promise((resolve, reject) => {
  65. port.onDisconnect.addListener(() => {
  66. reject(new Error('Port closed'));
  67. });
  68. port.onMessage.addListener(async (message) => {
  69. try {
  70. makeDashboardFocus();
  71. } catch (error) {
  72. console.error(error);
  73. } finally {
  74. resolve(message);
  75. }
  76. });
  77. });
  78. };
  79. const selector = await getSelector();
  80. return selector;
  81. }
  82. export default {
  83. selectElement,
  84. verifySelector,
  85. };