Browse Source

fix: handle dialog block not working

Ahmad Kholid 2 years ago
parent
commit
2257828242

+ 5 - 3
src/content/blocksHandler/handlerJavascriptCode.js

@@ -1,13 +1,15 @@
 import { jsContentHandler } from '@/workflowEngine/utils/javascriptBlockUtil';
 
 function javascriptCode({ data, isPreloadScripts, frameSelector }) {
-  if (!isPreloadScripts) return jsContentHandler(...data);
+  if (!isPreloadScripts && Array.isArray(data))
+    return jsContentHandler(...data);
+  if (!data.scripts) return Promise.resolve({ success: true });
 
   let $documentCtx = document;
 
   if (frameSelector) {
     const iframeCtx = document.querySelector(frameSelector)?.contentDocument;
-    if (!iframeCtx) return Promise.resolve(false);
+    if (!iframeCtx) return Promise.resolve({ success: false });
 
     $documentCtx = iframeCtx;
   }
@@ -29,7 +31,7 @@ function javascriptCode({ data, isPreloadScripts, frameSelector }) {
     $documentCtx.documentElement.appendChild(scriptEl);
   });
 
-  return Promise.resolve(true);
+  return Promise.resolve({ success: true });
 }
 
 export default javascriptCode;

+ 1 - 0
src/content/index.js

@@ -207,6 +207,7 @@ function messageListener({ data, source }) {
         executeBlock(data)
           .then(resolve)
           .catch((error) => {
+            console.error(error);
             const elNotFound = error.message === 'element-not-found';
             const isLoopItem = data.data?.selector?.includes('automa-loop');
             if (elNotFound && isLoopItem) {

+ 3 - 0
src/content/services/webService.js

@@ -191,6 +191,9 @@ window.addEventListener('DOMContentLoaded', async () => {
         const isInstalled = packages.some((pkg) => pkg.id === data);
 
         sendMessageBack(type, isInstalled);
+      } else if (type === 'get-workflows') {
+        const storage = await browser.storage.local.get('workflows');
+        sendMessageBack(type, storage.workflows);
       }
     });
   } catch (error) {

+ 0 - 1
src/workflowEngine/WorkflowWorker.js

@@ -374,7 +374,6 @@ class WorkflowWorker {
         frameSelector: this.frameSelector,
         ...payload,
       };
-
       const data = await browser.tabs.sendMessage(
         this.activeTab.id,
         messagePayload,

+ 43 - 4
src/workflowEngine/blocksHandler/handlerHandleDialog.js

@@ -1,4 +1,5 @@
-import { sendDebugCommand } from '../helper';
+import browser from 'webextension-polyfill';
+import { sendDebugCommand, checkCSPAndInject } from '../helper';
 
 const overwriteDialog = (accept, promptText) => `
   const realConfirm = window.confirm;
@@ -22,18 +23,56 @@ async function handleDialog({ data, id: blockId }) {
     const isScriptExist = this.preloadScripts.some(({ id }) => id === blockId);
 
     if (!isScriptExist) {
+      const jsCode = overwriteDialog(data.accept, data.promptText);
       const payload = {
         id: blockId,
         isBlock: true,
         name: 'javascript-code',
+        isPreloadScripts: true,
         data: {
           everyNewTab: true,
-          code: overwriteDialog(data.accept, data.promptText),
+          scripts: [{ data: { code: jsCode }, id: blockId }],
         },
       };
 
-      this.preloadScripts.push(payload);
-      await this._sendMessageToTab(payload, {}, true);
+      if (this.engine.isMV2) {
+        this.preloadScripts.push(payload);
+        await this._sendMessageToTab(payload, {}, true);
+      } else {
+        const target = { tabId: this.activeTab.id, allFrames: true };
+        const { debugMode } = this.engine.workflow.settings;
+        const cspResult = await checkCSPAndInject(
+          {
+            target,
+            debugMode,
+            injectOptions: {
+              injectImmediately: true,
+            },
+          },
+          () => jsCode
+        );
+        if (!cspResult.isBlocked) {
+          await browser.scripting.executeScript({
+            target,
+            args: [data],
+            world: 'MAIN',
+            injectImmediately: true,
+            func: (blockData) => {
+              window.confirm = function () {
+                return blockData.accept;
+              };
+
+              window.alert = function () {
+                return blockData.accept;
+              };
+
+              window.prompt = function () {
+                return blockData.accept ? blockData.promptText : null;
+              };
+            },
+          });
+        }
+      }
     }
   } else {
     this.dialogParams = {

+ 2 - 1
src/workflowEngine/helper.js

@@ -228,7 +228,7 @@ export function injectPreloadScript({ target, scripts, frameSelector }) {
 }
 
 export async function checkCSPAndInject(
-  { target, debugMode, options = {} },
+  { target, debugMode, options = {}, injectOptions = {} },
   callback
 ) {
   const [isBlockedByCSP] = await browser.scripting.executeScript({
@@ -273,6 +273,7 @@ export async function checkCSPAndInject(
       });
     },
     world: 'MAIN',
+    ...(injectOptions || {}),
   });
 
   if (isBlockedByCSP.result) {

+ 16 - 6
src/workflowEngine/index.js

@@ -1,3 +1,4 @@
+import { toRaw } from 'vue';
 import browser from 'webextension-polyfill';
 import dayjs from '@/lib/dayjs';
 import decryptFlow, { getWorkflowPass } from '@/utils/decryptFlow';
@@ -45,7 +46,12 @@ export function startWorkflowExec(workflowData, options, isPopup = true) {
     }
   }
 
-  const convertedWorkflow = convertWorkflowData(workflowData);
+  const clonedWorkflowData = {};
+  Object.keys(workflowData).forEach((key) => {
+    clonedWorkflowData[key] = toRaw(workflowData[key]);
+  });
+
+  const convertedWorkflow = convertWorkflowData(clonedWorkflowData);
   const engine = new WorkflowEngine(convertedWorkflow, {
     options,
     isPopup,
@@ -65,10 +71,13 @@ export function startWorkflowExec(workflowData, options, isPopup = true) {
       endedTimestamp,
       blockDetail,
     }) => {
-      if (workflowData.id.startsWith('team') && workflowData.teamId) {
+      if (
+        clonedWorkflowData.id.startsWith('team') &&
+        clonedWorkflowData.teamId
+      ) {
         const payload = {
           status,
-          workflowId: workflowData.id,
+          workflowId: clonedWorkflowData.id,
           workflowLog: {
             status,
             endedTimestamp,
@@ -97,7 +106,7 @@ export function startWorkflowExec(workflowData, options, isPopup = true) {
           };
         }
 
-        fetchApi(`/teams/${workflowData.teamId}/workflows/logs`, {
+        fetchApi(`/teams/${clonedWorkflowData.teamId}/workflows/logs`, {
           method: 'POST',
           body: JSON.stringify(payload),
         }).catch((error) => {
@@ -109,9 +118,10 @@ export function startWorkflowExec(workflowData, options, isPopup = true) {
         browser.permissions
           .contains({ permissions: ['notifications'] })
           .then((hasPermission) => {
-            if (!hasPermission || !workflowData.settings.notification) return;
+            if (!hasPermission || !clonedWorkflowData.settings.notification)
+              return;
 
-            const name = workflowData.name.slice(0, 32);
+            const name = clonedWorkflowData.name.slice(0, 32);
 
             browser.notifications.create(`logs:${id}`, {
               type: 'basic',