From 3750754c09963fbe8d69d279b64d3dde3d0a1bbf Mon Sep 17 00:00:00 2001 From: Simon Lydell Date: Sun, 18 Jan 2015 21:59:02 +0100 Subject: [PATCH] Fix #389: Make sure autofocus prevention does not cause infinite loops --- extension/lib/events.coffee | 10 ++++++++++ extension/lib/vim.coffee | 1 + 2 files changed, 11 insertions(+) diff --git a/extension/lib/events.coffee b/extension/lib/events.coffee index c8c467d..93bcb36 100644 --- a/extension/lib/events.coffee +++ b/extension/lib/events.coffee @@ -179,6 +179,7 @@ windowsListeners = target instanceof HTMLInputElement and (vim.lastInteraction == null or Date.now() - vim.lastInteraction > getPref('autofocus_limit')) + vim.lastAutofocusPrevention = Date.now() target.blur() blur: (event) -> @@ -190,6 +191,15 @@ windowsListeners = vim.enterMode('normal') return + # Some sites (such as icloud.com) re-focuses inputs if they are blurred, + # causing an infinite loop autofocus prevention and re-focusing. Therefore + # we suppress blur events that happen just after an autofocus prevention. + if vim.lastAutofocusPrevention != null and + Date.now() - vim.lastAutofocusPrevention < 1 + vim.lastAutofocusPrevention = null + suppressEvent(event) + return + click: (event) -> target = event.originalTarget return unless vim = getVimFromEvent(event) diff --git a/extension/lib/vim.coffee b/extension/lib/vim.coffee index 9640aa4..abfe261 100644 --- a/extension/lib/vim.coffee +++ b/extension/lib/vim.coffee @@ -26,6 +26,7 @@ module.exports = class Vim @rootWindow = utils.getRootWindow(@window) # For convenience. @storage = {} @lastInteraction = null + @lastAutofocusPrevention = null @enterMode('normal') enterMode: (mode, args...) -> -- 2.39.3