Skip to content

Commit 0457860

Browse files
authored
v1.28.17
2 parents fd1d810 + 976660e commit 0457860

File tree

6 files changed

+87
-46
lines changed

6 files changed

+87
-46
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "automa",
3-
"version": "1.28.16",
3+
"version": "1.28.17",
44
"description": "An extension for automating your browser by connecting blocks",
55
"repository": {
66
"type": "git",

src/content/blocksHandler/handlerForms.js

+31-25
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import { sendMessage } from '@/utils/message';
21
import handleFormElement from '@/utils/handleFormElement';
2+
import { sendMessage } from '@/utils/message';
33
import handleSelector, { markElement } from '../handleSelector';
4+
import synchronizedLock from '../synchronizedLock';
45

56
async function forms(block) {
67
const { data } = block;
@@ -24,38 +25,43 @@ async function forms(block) {
2425

2526
async function typeText(element) {
2627
if (block.debugMode && data.type === 'text-field') {
28+
// get lock
29+
await synchronizedLock.getLock();
2730
element.focus?.();
2831

29-
if (data.clearValue) {
30-
const backspaceCommands = new Array(element.value?.length ?? 0).fill({
31-
type: 'rawKeyDown',
32-
unmodifiedText: 'Delete',
33-
text: 'Delete',
34-
windowsVirtualKeyCode: 46,
35-
});
32+
try {
33+
if (data.clearValue) {
34+
const backspaceCommands = new Array(element.value?.length ?? 0).fill({
35+
type: 'rawKeyDown',
36+
unmodifiedText: 'Delete',
37+
text: 'Delete',
38+
windowsVirtualKeyCode: 46,
39+
});
40+
41+
await sendMessage(
42+
'debugger:type',
43+
{ commands: backspaceCommands, tabId: block.activeTabId, delay: 0 },
44+
'background'
45+
);
46+
}
3647

48+
const commands = data.value.split('').map((char) => ({
49+
type: 'keyDown',
50+
text: char === '\n' ? '\r' : char,
51+
}));
52+
const typeDelay = +block.data.delay;
3753
await sendMessage(
3854
'debugger:type',
39-
{ commands: backspaceCommands, tabId: block.activeTabId, delay: 0 },
55+
{
56+
commands,
57+
tabId: block.activeTabId,
58+
delay: Number.isNaN(typeDelay) ? 0 : typeDelay,
59+
},
4060
'background'
4161
);
62+
} finally {
63+
synchronizedLock.releaseLock();
4264
}
43-
44-
const commands = data.value.split('').map((char) => ({
45-
type: 'keyDown',
46-
text: char === '\n' ? '\r' : char,
47-
}));
48-
const typeDelay = +block.data.delay;
49-
await sendMessage(
50-
'debugger:type',
51-
{
52-
commands,
53-
tabId: block.activeTabId,
54-
delay: Number.isNaN(typeDelay) ? 0 : typeDelay,
55-
},
56-
'background'
57-
);
58-
5965
return;
6066
}
6167

src/content/index.js

-19
Original file line numberDiff line numberDiff line change
@@ -240,19 +240,9 @@ async function messageListener({ data, source }) {
240240

241241
automa('content');
242242

243-
let locked = false;
244-
const queue = [];
245-
246243
browser.runtime.onMessage.addListener(async (data) => {
247244
const asyncExecuteBlock = async (block) => {
248-
if (locked) {
249-
return new Promise((resolve, reject) => {
250-
queue.push([block, resolve, reject]);
251-
});
252-
}
253-
254245
try {
255-
locked = true;
256246
const res = await executeBlock(block);
257247
return res;
258248
} catch (error) {
@@ -275,20 +265,11 @@ async function messageListener({ data, source }) {
275265

276266
await blocksHandler().loopData(loopBlock);
277267
return executeBlock(block);
278-
} finally {
279-
locked = false;
280268
}
281269
};
282270

283271
if (data.isBlock) {
284272
const res = await asyncExecuteBlock(data);
285-
while (queue.length) {
286-
const [block, resolve, reject] = queue.shift();
287-
requestAnimationFrame(() => {
288-
asyncExecuteBlock(block).then(resolve).catch(reject);
289-
});
290-
}
291-
292273
return res;
293274
}
294275

src/content/synchronizedLock.js

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
class SynchronizedLock {
2+
constructor() {
3+
this.lock = false;
4+
this.queue = [];
5+
}
6+
7+
async getLock(timeout = 10000) {
8+
while (this.lock) {
9+
await new Promise((resolve) => {
10+
this.queue.push(resolve);
11+
setTimeout(() => {
12+
const index = this.queue.indexOf(resolve);
13+
if (index !== -1) {
14+
this.queue.splice(index, 1);
15+
console.warn('SynchronizedLock timeout');
16+
resolve();
17+
}
18+
}, timeout);
19+
});
20+
}
21+
22+
this.lock = true;
23+
}
24+
25+
releaseLock() {
26+
this.lock = false;
27+
const resolve = this.queue.shift();
28+
if (resolve) resolve();
29+
}
30+
}
31+
32+
const synchronizedLock = new SynchronizedLock();
33+
34+
export default synchronizedLock;

src/stores/workflow.js

+17-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ import dayjs from 'dayjs';
77
import { fetchApi } from '@/utils/api';
88
import { tasks } from '@/utils/shared';
99
import firstWorkflows from '@/utils/firstWorkflows';
10-
import { cleanWorkflowTriggers } from '@/utils/workflowTrigger';
10+
import {
11+
cleanWorkflowTriggers,
12+
registerWorkflowTrigger,
13+
} from '@/utils/workflowTrigger';
1114
import { useUserStore } from './user';
1215

1316
const defaultWorkflow = (data = null, options = {}) => {
@@ -180,6 +183,19 @@ export const useWorkflowStore = defineStore('workflow', {
180183

181184
this.workflows[workflowId].updatedAt = Date.now();
182185
updatedWorkflows[workflowId] = this.workflows[workflowId];
186+
187+
if (!('isDisabled' in data)) return;
188+
189+
if (data.isDisabled) {
190+
cleanWorkflowTriggers(workflowId);
191+
} else {
192+
const triggerBlock = this.workflows[workflowId].drawflow.nodes?.find(
193+
(node) => node.label === 'trigger'
194+
);
195+
if (triggerBlock) {
196+
registerWorkflowTrigger(id, triggerBlock);
197+
}
198+
}
183199
};
184200

185201
if (isFunction) {

src/workflowEngine/utils/testConditions.js

+4
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import objectPath from 'object-path';
33
import { parseJSON } from '@/utils/helper';
44
import { conditionBuilder } from '@/utils/shared';
55
import renderString from '../templating/renderString';
6+
import { keyParser } from '../templating/mustacheReplacer';
67

78
const isBoolStr = (str) => {
89
if (str === 'true') return true;
@@ -59,6 +60,9 @@ export default async function (conditionsArr, workflowData) {
5960
dataPath = dataPath.slice(2, -2).trim();
6061
}
6162

63+
const parsedPath = keyParser(dataPath, workflowData.refData);
64+
dataPath = `${parsedPath.dataKey}.${parsedPath.path}`;
65+
6266
return objectPath.has(workflowData.refData, dataPath);
6367
}
6468

0 commit comments

Comments
 (0)