Browse Source

fix: workflow doesn't execute when has the same `when visit web` trigger

Ahmad Kholid 3 years ago
parent
commit
2f3bbec5ff
2 changed files with 24 additions and 24 deletions
  1. 23 23
      src/background/index.js
  2. 1 1
      src/content/services/recordWorkflow/recordEvents.js

+ 23 - 23
src/background/index.js

@@ -145,43 +145,43 @@ async function checkWorkflowStates() {
   await storage.set('workflowState', states);
   await storage.set('workflowState', states);
 }
 }
 checkWorkflowStates();
 checkWorkflowStates();
-async function checkVisitWebTriggers(changeInfo, tab) {
-  if (!changeInfo.status || changeInfo.status !== 'complete') return;
-
-  const tabIsUsed = await workflow.states.get(({ state }) =>
-    state.tabIds.includes(tab.id)
+async function checkVisitWebTriggers(tabId, tabUrl) {
+  const workflowState = await workflow.states.get(({ state }) =>
+    state.tabIds.includes(tabId)
   );
   );
-
-  if (tabIsUsed) return;
-
   const visitWebTriggers = await storage.get('visitWebTriggers');
   const visitWebTriggers = await storage.get('visitWebTriggers');
-  const triggeredWorkflow = visitWebTriggers.find(({ url, isRegex }) => {
+  const triggeredWorkflow = visitWebTriggers.find(({ url, isRegex, id }) => {
     if (url.trim() === '') return false;
     if (url.trim() === '') return false;
 
 
-    return tab.url.match(isRegex ? new RegExp(url, 'g') : url);
+    const matchUrl = tabUrl.match(isRegex ? new RegExp(url, 'g') : url);
+
+    return matchUrl && id !== workflowState.workflowId;
   });
   });
 
 
   if (triggeredWorkflow) {
   if (triggeredWorkflow) {
     const workflowData = await workflow.get(triggeredWorkflow.id);
     const workflowData = await workflow.get(triggeredWorkflow.id);
 
 
-    if (workflowData) workflow.execute(workflowData, { tabId: tab.id });
+    if (workflowData) workflow.execute(workflowData, { tabId });
   }
   }
 }
 }
-async function checkRecordingWorkflow({ status }, { url, id }) {
-  if (status === 'complete' && validateUrl(url)) {
-    const { isRecording } = await browser.storage.local.get('isRecording');
+async function checkRecordingWorkflow(tabId, tabUrl) {
+  if (!validateUrl(tabUrl)) return;
 
 
-    if (!isRecording) return;
+  const isRecording = await storage.get('isRecording');
+  if (!isRecording) return;
 
 
-    await browser.tabs.executeScript(id, {
-      file: 'recordWorkflow.bundle.js',
-    });
-  }
+  await browser.tabs.executeScript(tabId, {
+    file: 'recordWorkflow.bundle.js',
+  });
 }
 }
-browser.tabs.onUpdated.addListener(async (tabId, changeInfo, tab) => {
-  checkRecordingWorkflow(changeInfo, tab);
-  checkVisitWebTriggers(changeInfo, tab);
-});
+browser.webNavigation.onCompleted.addListener(
+  async ({ tabId, url, frameId }) => {
+    if (frameId > 0) return;
+
+    checkRecordingWorkflow(tabId, url);
+    checkVisitWebTriggers(tabId, url);
+  }
+);
 browser.commands.onCommand.addListener((name) => {
 browser.commands.onCommand.addListener((name) => {
   if (name === 'open-dashboard') openDashboard();
   if (name === 'open-dashboard') openDashboard();
 });
 });

+ 1 - 1
src/content/services/recordWorkflow/recordEvents.js

@@ -163,13 +163,13 @@ function clickListener(event) {
 
 
   if (isAutomaInstance(target)) return;
   if (isAutomaInstance(target)) return;
 
 
-  let isClickLink = true;
   const isTextField =
   const isTextField =
     (target.tagName === 'INPUT' && target.getAttribute('type') === 'text') ||
     (target.tagName === 'INPUT' && target.getAttribute('type') === 'text') ||
     ['SELECT', 'TEXTAREA'].includes(target.tagName);
     ['SELECT', 'TEXTAREA'].includes(target.tagName);
 
 
   if (isTextField) return;
   if (isTextField) return;
 
 
+  let isClickLink = false;
   const selector = findSelector(target);
   const selector = findSelector(target);
 
 
   if (target.tagName === 'A') {
   if (target.tagName === 'A') {