From 047547169abd92a665c32919afee6e8629ff9d2a Mon Sep 17 00:00:00 2001 From: Kyle Spearrin Date: Fri, 18 May 2018 17:05:46 -0400 Subject: [PATCH] delayed autofill attempt --- src/content/autofiller.ts | 32 ++++++++++++++++++++++++++++---- src/services/autofill.service.ts | 1 + 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/content/autofiller.ts b/src/content/autofiller.ts index 465c69a937..d242735801 100644 --- a/src/content/autofiller.ts +++ b/src/content/autofiller.ts @@ -1,5 +1,8 @@ document.addEventListener('DOMContentLoaded', (event) => { let pageHref: string = null; + let filledThisHref = false; + let delayFillTimeout: number; + const isSafari = (typeof safari !== 'undefined') && navigator.userAgent.indexOf(' Safari/') !== -1 && navigator.userAgent.indexOf('Chrome') === -1; @@ -12,7 +15,9 @@ document.addEventListener('DOMContentLoaded', (event) => { safari.self.addEventListener('message', (msgEvent: any) => { const msg = msgEvent.message; if (msg.command === responseCommand && msg.data.autofillEnabled === true) { - setInterval(doFillIfNeeded, 500); + setInterval(() => doFillIfNeeded(), 500); + } else if (msg.command === 'fillForm' && pageHref === msg.url) { + filledThisHref = true; } }, false); return; @@ -20,13 +25,32 @@ document.addEventListener('DOMContentLoaded', (event) => { const enabledKey = 'enableAutoFillOnPageLoad'; chrome.storage.local.get(enabledKey, (obj: any) => { if (obj != null && obj[enabledKey] === true) { - setInterval(doFillIfNeeded, 500); + setInterval(() => doFillIfNeeded(), 500); + } + }); + chrome.runtime.onMessage.addListener((msg: any, sender: any, sendResponse: Function) => { + if (msg.command === 'fillForm' && pageHref === msg.url) { + filledThisHref = true; } }); } - function doFillIfNeeded() { - if (pageHref !== window.location.href) { + function doFillIfNeeded(force: boolean = false) { + if (force || pageHref !== window.location.href) { + if (!force) { + // Some websites are slow and rendering all page content. Try to fill again later + // if we haven't already. + filledThisHref = false; + if (delayFillTimeout != null) { + window.clearTimeout(delayFillTimeout); + } + delayFillTimeout = window.setTimeout(() => { + if (!filledThisHref) { + doFillIfNeeded(true); + } + }, 1500); + } + pageHref = window.location.href; const msg = { command: 'bgCollectPageDetails', diff --git a/src/services/autofill.service.ts b/src/services/autofill.service.ts index 5dd81ac5ad..f92fbb8e6a 100644 --- a/src/services/autofill.service.ts +++ b/src/services/autofill.service.ts @@ -174,6 +174,7 @@ export default class AutofillService implements AutofillServiceInterface { BrowserApi.tabSendMessage(tab, { command: 'fillForm', fillScript: fillScript, + url: tab.url, }, { frameId: pd.frameId }); if (options.cipher.type !== CipherType.Login || totpPromise || options.skipTotp ||