diff --git a/src/content/functions/inputToken.js b/src/content/functions/inputToken.js index 33b88be..7f8b5f7 100644 --- a/src/content/functions/inputToken.js +++ b/src/content/functions/inputToken.js @@ -18,7 +18,7 @@ // /* global Event, KeyboardEvent, InputEvent */ -const delay = require('../../partials/delay'); +const runTasksWithDelay = require('../../partials/runTasksWithDelay'); const getTabData = require('./getTabData'); const clickSubmit = require('./clickSubmit'); const clearAfterInputToken = require('./clearAfterInputToken'); @@ -35,14 +35,14 @@ const inputToken = (request, inputElement, siteURL) => { const tokenLength = request.token.length; const promises = []; - let currentToken = ''; + inputElement.value = ''; inputElement.focus(); for (let i = 0; i < tokenLength; i++) { promises.push( - delay(() => { - if (document.activeElement.value.length > 0 && document.activeElement.value !== currentToken) { + () => new Promise(resolve => { + if (document.activeElement !== inputElement) { document.activeElement.value = ''; } @@ -59,12 +59,12 @@ const inputToken = (request, inputElement, siteURL) => { document.activeElement.dispatchEvent(new KeyboardEvent('keyup', { bubbles: true, cancelable: true, charCode: 0, code: `Digit${request.token[i]}`, ctrlKey: false, key: request.token[i], keyCode: 48 + parseInt(request.token[i], 10), location: 0, metaKey: false, repeat: false, shiftKey: false, which: 48 + parseInt(request.token[i], 10) })); document.activeElement.dispatchEvent(new Event('change', { bubbles: true, cancelable: true })); - currentToken += request.token[i]; - }, 100 * i) + return resolve(); + }) ); } - return Promise.all(promises) + return runTasksWithDelay(promises, 150) .then(async () => { const tab = await getTabData(); diff --git a/src/partials/index.js b/src/partials/index.js index f64a125..507b610 100644 --- a/src/partials/index.js +++ b/src/partials/index.js @@ -32,7 +32,9 @@ exports.inputsSelectors = require('./inputsSelectors'); exports.months = require('./months'); exports.onTabFocused = require('./onTabFocused'); exports.openShortcutEdit = require('./openShortcutEdit'); +exports.runTasksWithDelay = require('./runTasksWithDelay'); exports.sendMessageToTab = require('./sendMessageToTab'); exports.storageValidation = require('./storageValidation'); exports.storeLog = require('./storeLog'); exports.uniqueOnly = require('./uniqueOnly'); +exports.wait = require('./wait'); diff --git a/src/partials/runTasksWithDelay.js b/src/partials/runTasksWithDelay.js new file mode 100644 index 0000000..ebc8393 --- /dev/null +++ b/src/partials/runTasksWithDelay.js @@ -0,0 +1,29 @@ +// +// This file is part of the 2FAS Browser Extension (https://github.com/twofas/2fas-browser-extension) +// Copyright © 2023 Two Factor Authentication Service, Inc. +// Contributed by Grzegorz Zając. All rights reserved. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see +// + +const wait = require('./wait'); + +const runTasksWithDelay = async (tasks, delayTime) => { + for (const task of tasks) { + await task(); + await wait(delayTime); + } +}; + +module.exports = runTasksWithDelay; diff --git a/src/partials/wait.js b/src/partials/wait.js new file mode 100644 index 0000000..c2aee19 --- /dev/null +++ b/src/partials/wait.js @@ -0,0 +1,24 @@ +// +// This file is part of the 2FAS Browser Extension (https://github.com/twofas/2fas-browser-extension) +// Copyright © 2023 Two Factor Authentication Service, Inc. +// Contributed by Grzegorz Zając. All rights reserved. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see +// + +const wait = async ms => { + return new Promise(resolve => setTimeout(resolve, ms)); +}; + +module.exports = wait;