Bläddra i källkod

fix: `Element not found` error in verify selector (#958)

Ahmad Kholid 2 år sedan
förälder
incheckning
c5393cee27
3 ändrade filer med 42 tillägg och 19 borttagningar
  1. 5 2
      src/newtab/pages/workflows/[id].vue
  2. 1 17
      src/newtab/utils/elementSelector.js
  3. 36 0
      src/utils/helper.js

+ 5 - 2
src/newtab/pages/workflows/[id].vue

@@ -315,7 +315,7 @@ import { getBlocks } from '@/utils/getSharedData';
 import { excludeGroupBlocks } from '@/utils/shared';
 import { useGroupTooltip } from '@/composable/groupTooltip';
 import { useCommandManager } from '@/composable/commandManager';
-import { debounce, parseJSON, throttle } from '@/utils/helper';
+import { debounce, parseJSON, throttle, getActiveTab } from '@/utils/helper';
 import { executeWorkflow } from '@/workflowEngine';
 import { registerWorkflowTrigger } from '@/utils/workflowTrigger';
 import emitter from '@/lib/mitt';
@@ -697,7 +697,10 @@ async function executeFromBlock(blockId) {
 
     const workflowOptions = { blockId };
 
-    const [tab] = await browser.tabs.query({ active: true, url: '*://*/*' });
+    let tab = await getActiveTab();
+    if (!tab) {
+      [tab] = await browser.tabs.query({ active: true, url: '*://*/*' });
+    }
     if (tab) {
       workflowOptions.tabId = tab.id;
     }

+ 1 - 17
src/newtab/utils/elementSelector.js

@@ -1,24 +1,8 @@
 import browser from 'webextension-polyfill';
-import { isXPath, sleep } from '@/utils/helper';
+import { isXPath, sleep, getActiveTab } from '@/utils/helper';
 
 const isMV2 = browser.runtime.getManifest().manifest_version === 2;
 
-async function getActiveTab() {
-  const currentWindow = await browser.windows.getCurrent();
-  if (currentWindow)
-    await browser.windows.update(currentWindow.id, { focused: false });
-
-  await sleep(200);
-
-  const [tab] = await browser.tabs.query({
-    active: true,
-    url: '*://*/*',
-    lastFocusedWindow: true,
-  });
-  if (!tab) throw new Error('No active tab');
-
-  return tab;
-}
 async function makeDashboardFocus() {
   const [currentTab] = await browser.tabs.query({
     active: true,

+ 36 - 0
src/utils/helper.js

@@ -1,5 +1,41 @@
 import browser from 'webextension-polyfill';
 
+export async function getActiveTab() {
+  try {
+    let windowId = null;
+    const tabsQuery = {
+      active: true,
+      url: '*://*/*',
+    };
+    const extURL = browser.runtime.getURL('');
+    const windows = await browser.windows.getAll({ populate: true });
+    for (const browserWindow of windows) {
+      const [tab] = browserWindow.tabs;
+      const isDashboard =
+        browserWindow.tabs.length === 1 && tab.url?.includes(extURL);
+
+      if (isDashboard) {
+        await browser.windows.update(browserWindow.id, {
+          focused: false,
+          state: 'minimized',
+        });
+      } else if (browserWindow.focused) {
+        windowId = browserWindow.id;
+      }
+    }
+
+    if (windowId) tabsQuery.windowId = windowId;
+    else if (windows.length > 2) tabsQuery.lastFocusedWindow = true;
+
+    const [tab] = await browser.tabs.query(tabsQuery);
+
+    return tab;
+  } catch (error) {
+    console.error(error);
+    return null;
+  }
+}
+
 export function isXPath(str) {
   const regex = /^([(/@]|id\()/;