Ahmad Kholid 2 years ago
parent
commit
534495d4a3

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "automa",
-  "version": "1.23.3",
+  "version": "1.23.4",
   "description": "An extension for automating your browser by connecting blocks",
   "repository": {
     "type": "git",

+ 6 - 0
src/background/BackgroundEventsListeners.js

@@ -36,6 +36,12 @@ class BackgroundEventsListeners {
     BackgroundWorkflowTriggers.reRegisterTriggers(true);
   }
 
+  static onHistoryStateUpdated({ frameId, url, tabId }) {
+    if (frameId !== 0) return;
+
+    BackgroundWorkflowTriggers.visitWebTriggers(tabId, url, true);
+  }
+
   static async onRuntimeInstalled({ reason }) {
     try {
       if (reason === 'install') {

+ 7 - 5
src/background/BackgroundWorkflowTriggers.js

@@ -27,17 +27,19 @@ async function executeWorkflow(workflowData, options) {
 }
 
 class BackgroundWorkflowTriggers {
-  static async visitWebTriggers(tabId, tabUrl) {
+  static async visitWebTriggers(tabId, tabUrl, spa = false) {
     const { visitWebTriggers } = await browser.storage.local.get(
       'visitWebTriggers'
     );
     if (!visitWebTriggers || visitWebTriggers.length === 0) return;
 
-    const triggeredWorkflow = visitWebTriggers.find(({ url, isRegex }) => {
-      if (url.trim() === '') return false;
+    const triggeredWorkflow = visitWebTriggers.find(
+      ({ url, isRegex, supportSPA }) => {
+        if (!url.trim() || (spa && !supportSPA)) return false;
 
-      return tabUrl.match(isRegex ? new RegExp(url, 'g') : url);
-    });
+        return tabUrl.match(isRegex ? new RegExp(url, 'g') : url);
+      }
+    );
 
     if (triggeredWorkflow) {
       let workflowId = triggeredWorkflow.id;

+ 3 - 2
src/background/index.js

@@ -27,6 +27,9 @@ browser.runtime.onInstalled.addListener(
 browser.webNavigation.onCompleted.addListener(
   BackgroundEventsListeners.onWebNavigationCompleted
 );
+browser.webNavigation.onHistoryStateUpdated.addListener(
+  BackgroundEventsListeners.onHistoryStateUpdated
+);
 
 const contextMenu =
   BROWSER_TYPE === 'firefox' ? browser.menus : browser.contextMenus;
@@ -115,8 +118,6 @@ message.on('workflow:execute', async (workflowData, sender) => {
   const isMV2 = browser.runtime.getManifest().manifest_version === 2;
   if (!isMV2 && (!context || context === 'popup')) {
     await BackgroundUtils.openDashboard('', false);
-    await sleep(1000);
-    console.log('halo', workflowData);
     await BackgroundUtils.sendMessageToDashboard('workflow:execute', {
       data: workflowData,
       options: workflowData.option,

+ 3 - 2
src/components/content/shared/SharedElementSelector.vue

@@ -25,7 +25,7 @@
       active-fill="rgba(248, 113, 113, 0.1)"
     />
   </svg>
-  <teleport to="body">
+  <teleport to="html">
     <div
       v-if="!disabled"
       id="automa-selector-overlay"
@@ -155,8 +155,9 @@ function retrieveElementsRect({ clientX, clientY, target: eventTarget }, type) {
   if (!target) return;
 
   const onlyInList = props.onlyInList && elementsState.selected.length > 0;
+  const framesEl = ['IFRAME', 'FRAME'];
 
-  if (target.tagName === 'IFRAME' || target.tagName === 'FRAME') {
+  if (framesEl.includes(target.tagName)) {
     if (type === 'selected') removeElementsList();
 
     if (target.contentDocument) {

+ 1 - 0
src/components/newtab/shared/SharedWorkflowTriggers.vue

@@ -127,6 +127,7 @@ const triggersData = {
     data: {
       url: '',
       isUrlRegex: false,
+      supportSPA: false,
     },
   },
   'keyboard-shortcut': {

+ 7 - 0
src/components/newtab/workflow/edit/Trigger/TriggerVisitWeb.vue

@@ -13,6 +13,13 @@
     >
       {{ t('workflow.blocks.trigger.useRegex') }}
     </ui-checkbox>
+    <ui-checkbox
+      :model-value="data.supportSPA"
+      class="ml-6"
+      @change="$emit('update', { supportSPA: $event })"
+    >
+      Support SPA website
+    </ui-checkbox>
   </div>
 </template>
 <script setup>

+ 3 - 1
src/content/blocksHandler/handlerSwitchTo.js

@@ -1,13 +1,15 @@
 import { isXPath } from '@/utils/helper';
 import handleSelector from '../handleSelector';
 
+const framesEl = ['IFRAME', 'FRAME'];
+
 function switchTo(block) {
   return new Promise((resolve, reject) => {
     block.data.findBy = isXPath(block.data.selector) ? 'xpath' : 'cssSelector';
 
     handleSelector(block, {
       onSelected(element) {
-        if (element.tagName !== 'IFRAME') {
+        if (!framesEl.includes(element.tagName)) {
           reject(new Error('not-iframe'));
           return;
         }

+ 1 - 0
src/utils/workflowTrigger.js

@@ -226,6 +226,7 @@ export async function registerVisitWeb(workflowId, data) {
       id: workflowId,
       url: data.url,
       isRegex: data.isUrlRegex,
+      supportSPA: data.supportSPA ?? false,
     };
 
     if (index === -1) {

+ 0 - 2
src/workflowEngine/blocksHandler/handlerActiveTab.js

@@ -44,8 +44,6 @@ async function activeTab(block) {
       }
     }
 
-    await sleep(500);
-
     const [tab] = await browser.tabs.query({
       active: true,
       lastFocusedWindow: true,

+ 0 - 2
src/workflowEngine/blocksHandler/handlerGoogleSheets.js

@@ -59,7 +59,6 @@ async function updateSpreadsheetValues(
   columns
 ) {
   let values = [];
-
   if (['data-columns', 'table'].includes(dataFrom)) {
     if (keysAsFirstRow) {
       values = convertArrObjTo2DArr(columns);
@@ -114,7 +113,6 @@ export default async function ({ data, id }, { refData }) {
   if (isWhitespace(data.range)) throw new Error('empty-spreadsheet-range');
 
   let result = [];
-
   if (data.type === 'get') {
     const spreadsheetValues = await getSpreadsheetValues(data);
 

+ 5 - 0
src/workflowEngine/blocksHandler/handlerJavascriptCode.js

@@ -1,6 +1,7 @@
 import { customAlphabet } from 'nanoid/non-secure';
 import browser from 'webextension-polyfill';
 import cloneDeep from 'lodash.clonedeep';
+import { parseJSON } from '@/utils/helper';
 import {
   jsContentHandler,
   automaFetchClient,
@@ -96,6 +97,10 @@ async function executeInWebpage(args, target, worker) {
     func: jsContentHandler,
   });
 
+  if (typeof result?.columns?.data === 'string') {
+    result.columns.data = parseJSON(result.columns.data, {});
+  }
+
   return result;
 }
 

+ 1 - 1
src/workflowEngine/utils/javascriptBlockUtil.js

@@ -155,8 +155,8 @@ export function jsContentHandler($blockData, $preloadScripts, $automaScript) {
           cleanUp(detail || {});
           resolve({
             columns: {
-              data: detail?.data,
               insert: detail?.insert,
+              data: JSON.stringify(detail?.data ?? {}),
             },
             variables: detail?.refData?.variables,
           });