elementSelector.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import browser from 'webextension-polyfill';
  2. async function initElementSelector(tab = null) {
  3. let activeTab = tab;
  4. if (!tab) {
  5. const [queryTab] = await browser.tabs.query({
  6. active: true,
  7. url: '*://*/*',
  8. });
  9. activeTab = queryTab;
  10. }
  11. const result = await browser.tabs.sendMessage(activeTab.id, {
  12. type: 'automa-element-selector',
  13. });
  14. if (!result) {
  15. await browser.scripting.executeScript({
  16. target: {
  17. allFrames: true,
  18. tabId: activeTab.id,
  19. },
  20. files: ['./elementSelector.bundle.js'],
  21. });
  22. }
  23. await browser.tabs.update(activeTab.id, { active: true });
  24. await browser.windows.update(activeTab.windowId, { focused: true });
  25. }
  26. export function verifySelector() {}
  27. export async function selectElement(name) {
  28. const [tab] = await browser.tabs.query({
  29. active: true,
  30. url: '*://*/*',
  31. });
  32. if (!tab) throw new Error('No active tab');
  33. await initElementSelector(tab);
  34. const port = await browser.tabs.connect(tab.id, { name });
  35. const getSelector = () => {
  36. return new Promise((resolve, reject) => {
  37. port.onDisconnect.addListener(() => {
  38. reject(new Error('Port closed'));
  39. });
  40. port.onMessage.addListener(async (message) => {
  41. try {
  42. const [currentTab] = await browser.tabs.query({
  43. active: true,
  44. currentWindow: true,
  45. });
  46. await browser.windows.update(currentTab.windowId, {
  47. focused: true,
  48. });
  49. } catch (error) {
  50. console.error(error);
  51. } finally {
  52. resolve(message);
  53. }
  54. });
  55. });
  56. };
  57. const selector = await getSelector();
  58. return selector;
  59. }
  60. export default {
  61. selectElement,
  62. verifySelector,
  63. };