瀏覽代碼

fix: dashboard

Ahmad Kholid 2 年之前
父節點
當前提交
5b2d030693

+ 8 - 3
src/background/BackgroundUtils.js

@@ -27,12 +27,17 @@ class BackgroundUtils {
       } else {
         const windowOptions = {
           url: tabUrl,
-          height: 715,
-          width: 750,
           type: 'popup',
-          focused: updateTab,
         };
 
+        if (updateTab) {
+          windowOptions.height = 715;
+          windowOptions.width = 715;
+          windowOptions.focused = true;
+        } else {
+          windowOptions.state = 'minimized';
+        }
+
         await browser.windows.create(windowOptions);
       }
     } catch (error) {

+ 20 - 5
src/background/BackgroundWorkflowTriggers.js

@@ -6,8 +6,24 @@ import {
   registerSpecificDay,
   registerWorkflowTrigger,
 } from '@/utils/workflowTrigger';
+import BackgroundUtils from './BackgroundUtils';
 import BackgroundWorkflowUtils from './BackgroundWorkflowUtils';
 
+async function executeWorkflow(workflowData, options) {
+  const isMV2 = browser.runtime.getManifest().manifest_version === 2;
+  const context = workflowData.settings.execContext;
+  if (isMV2 || context === 'background') {
+    BackgroundWorkflowUtils.executeWorkflow(workflowData, options);
+    return;
+  }
+
+  await BackgroundUtils.openDashboard('', false);
+  await BackgroundUtils.sendMessageToDashboard('workflow:execute', {
+    data: workflowData,
+    options,
+  });
+}
+
 class BackgroundWorkflowTriggers {
   static async visitWebTriggers(tabId, tabUrl) {
     const { visitWebTriggers } = await browser.storage.local.get(
@@ -31,8 +47,7 @@ class BackgroundWorkflowTriggers {
       const workflowData = await BackgroundWorkflowUtils.getWorkflow(
         workflowId
       );
-      if (workflowData)
-        BackgroundWorkflowUtils.executeWorkflow(workflowData, { tabId });
+      if (workflowData) executeWorkflow(workflowData, { tabId });
     }
   }
 
@@ -99,7 +114,7 @@ class BackgroundWorkflowTriggers {
         if (isAfter) return;
       }
 
-      BackgroundWorkflowUtils.executeWorkflow(currentWorkflow);
+      executeWorkflow(currentWorkflow);
 
       if (!data) return;
 
@@ -135,7 +150,7 @@ class BackgroundWorkflowTriggers {
       const workflowData = await BackgroundWorkflowUtils.getWorkflow(
         workflowId
       );
-      BackgroundWorkflowUtils.executeWorkflow(workflowData, {
+      executeWorkflow(workflowData, {
         data: {
           variables: message,
         },
@@ -180,7 +195,7 @@ class BackgroundWorkflowTriggers {
 
       if (triggerBlock) {
         if (isStartup && triggerBlock.type === 'on-startup') {
-          BackgroundWorkflowUtils.executeWorkflow(currWorkflow);
+          executeWorkflow(currWorkflow);
         } else {
           if (isStartup && triggerBlock.triggers) {
             for (const trigger of triggerBlock.triggers) {

+ 47 - 0
src/background/index.js

@@ -3,6 +3,7 @@ import { MessageListener } from '@/utils/message';
 import { sleep } from '@/utils/helper';
 import getFile from '@/utils/getFile';
 import automa from '@business';
+import { workflowState } from '@/workflowEngine';
 import { registerWorkflowTrigger } from '../utils/workflowTrigger';
 import BackgroundUtils from './BackgroundUtils';
 import BackgroundWorkflowUtils from './BackgroundWorkflowUtils';
@@ -108,6 +109,7 @@ message.on('dashboard:refresh-packages', async () => {
   });
 });
 
+message.on('workflow:stop', (stateId) => workflowState.stop(stateId));
 message.on('workflow:execute', async (workflowData, sender) => {
   const context = workflowData.settings.execContext;
   if (!context || context === 'popup') {
@@ -179,3 +181,48 @@ message.on('recording:stop', async () => {
 automa('background', message);
 
 browser.runtime.onMessage.addListener(message.listener());
+
+/* eslint-disable no-use-before-define */
+
+const isMV2 = browser.runtime.getManifest().manifest_version === 2;
+let lifeline;
+async function keepAlive() {
+  if (lifeline) return;
+  for (const tab of await browser.tabs.query({ url: '*://*/*' })) {
+    try {
+      await browser.scripting.executeScript({
+        target: { tabId: tab.id },
+        func: () => chrome.runtime.connect({ name: 'keepAlive' }),
+      });
+      browser.tabs.onUpdated.removeListener(retryOnTabUpdate);
+      return;
+    } catch (e) {
+      // Do nothing
+    }
+  }
+  browser.tabs.onUpdated.addListener(retryOnTabUpdate);
+}
+async function retryOnTabUpdate(tabId, info) {
+  if (info.url && /^(file|https?):/.test(info.url)) {
+    keepAlive();
+  }
+}
+function keepAliveForced() {
+  lifeline?.disconnect();
+  lifeline = null;
+  keepAlive();
+}
+
+if (!isMV2) {
+  browser.runtime.onConnect.addListener((port) => {
+    if (port.name === 'keepAlive') {
+      lifeline = port;
+      /* eslint-disable-next-line */
+      console.log('Stayin alive: ', new Date());
+      setTimeout(keepAliveForced, 295e3);
+      port.onDisconnect.addListener(keepAliveForced);
+    }
+  });
+
+  keepAlive();
+}

+ 4 - 1
src/components/newtab/workflow/settings/SettingsGeneral.vue

@@ -32,7 +32,7 @@
       </span>
     </div>
   </div>
-  <div class="flex items-center pt-4">
+  <div v-if="!isMV2" class="flex items-center pt-4">
     <div class="mr-4 flex-1">
       <p>Workflow Execution</p>
       <p class="text-gray-600 dark:text-gray-200 text-sm leading-tight">
@@ -141,6 +141,7 @@
 <script setup>
 import { useI18n } from 'vue-i18n';
 import { useToast } from 'vue-toastification';
+import browser from 'webextension-polyfill';
 import { clearCache } from '@/utils/helper';
 import { useHasPermissions } from '@/composable/hasPermissions';
 
@@ -156,6 +157,8 @@ const { t } = useI18n();
 const toast = useToast();
 const permissions = useHasPermissions(['notifications']);
 
+const isMV2 = browser.runtime.getManifest().manifest_version === 2;
+
 const browserType = BROWSER_TYPE;
 const onError = [
   {

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

@@ -118,7 +118,7 @@ function deleteLog() {
     .equals(route.params.id)
     .delete()
     .then(() => {
-      if (backHistory.startsWith('/workflows')) {
+      if (backHistory?.startsWith('/workflows')) {
         router.replace(backHistory);
         return;
       }
@@ -129,7 +129,7 @@ function deleteLog() {
 function goToWorkflow() {
   let path = `/workflows/${currentLog.value.workflowId}`;
 
-  if (backHistory.startsWith(path)) {
+  if (backHistory?.startsWith(path)) {
     path = backHistory;
   }
 

+ 24 - 3
src/popup/pages/Home.vue

@@ -125,6 +125,8 @@ import automa from '@business';
 import HomeWorkflowCard from '@/components/popup/home/HomeWorkflowCard.vue';
 import HomeTeamWorkflows from '@/components/popup/home/HomeTeamWorkflows.vue';
 
+const isMV2 = browser.runtime.getManifest().manifest_version === 2;
+
 const { t } = useI18n();
 const dialog = useDialog();
 const userStore = useUserStore();
@@ -201,8 +203,25 @@ function togglePinWorkflow(workflow) {
     pinnedWorkflows: copyData,
   });
 }
-function executeWorkflow(workflow) {
-  sendMessage('workflow:execute', workflow, 'background');
+async function executeWorkflow(workflow) {
+  try {
+    const [tab] = await browser.tabs.query({
+      url: browser.runtime.getURL('/newtab.html'),
+    });
+    if (tab && !isMV2) {
+      await browser.tabs.sendMessage(tab.id, {
+        type: 'workflow:execute',
+        data: {
+          data: workflow,
+          options: workflow?.options,
+        },
+      });
+    } else {
+      sendMessage('workflow:execute', workflow, 'background');
+    }
+  } catch (error) {
+    console.error(error);
+  }
 }
 function updateWorkflow(id, data) {
   return workflowStore.update({
@@ -236,7 +255,9 @@ function deleteWorkflow({ id, name }) {
   });
 }
 function openDashboard(url) {
-  sendMessage('open:dashboard', url, 'background');
+  sendMessage('open:dashboard', url, 'background').then(() => {
+    window.close();
+  });
 }
 function initElementSelector() {
   initElementSelectorFunc().then(() => {

+ 1 - 1
src/workflowEngine/blocksHandler/handlerCreateElement.js

@@ -60,7 +60,7 @@ async function handleCreateElement(block, { refData }) {
       args: [
         data.javascript,
         block.id,
-        payload.data.automaScript,
+        payload.data?.automaScript || '',
         preloadScripts,
       ],
       target: {

+ 2 - 1
src/workflowEngine/index.js

@@ -143,8 +143,9 @@ export function startWorkflowExec(workflowData, options, isPopup = true) {
 export function executeWorkflow(workflowData, options) {
   if (!workflowData || workflowData.isDisabled) return;
 
+  const isMV2 = browser.runtime.getManifest().manifest_version === 2;
   const context = workflowData.settings.execContext;
-  if (context === 'background') {
+  if (isMV2 || context === 'background') {
     sendMessage('workflow:execute', { ...workflowData, options }, 'background');
     return;
   }