From bf0fe3c43bbde28c63cd31591885f290396db72a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Klinkovsk=C3=BD?= Date: Thu, 11 Aug 2016 15:45:44 +0200 Subject: [PATCH 1/6] clear keychain properly fixes #1805 --- qutebrowser/keyinput/modeman.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/qutebrowser/keyinput/modeman.py b/qutebrowser/keyinput/modeman.py index 9aa492062..71a83b9a3 100644 --- a/qutebrowser/keyinput/modeman.py +++ b/qutebrowser/keyinput/modeman.py @@ -282,6 +282,9 @@ class ModeManager(QObject): raise NotInModeError("Not in mode {}!".format(mode)) log.modes.debug("Leaving mode {}{}".format( mode, '' if reason is None else ' (reason: {})'.format(reason))) + # leaving a mode implies clearing keychain, see + # https://github.com/The-Compiler/qutebrowser/issues/1805 + self.clear_keychain() self.mode = usertypes.KeyMode.normal self.left.emit(mode, self.mode, self._win_id) From 55a00ab2cf5966380c8a3498166763464de423f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Klinkovsk=C3=BD?= Date: Thu, 11 Aug 2016 15:47:22 +0200 Subject: [PATCH 2/6] emit keystring_updated iff necessary --- qutebrowser/keyinput/basekeyparser.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/qutebrowser/keyinput/basekeyparser.py b/qutebrowser/keyinput/basekeyparser.py index 887f22515..88c1774c1 100644 --- a/qutebrowser/keyinput/basekeyparser.py +++ b/qutebrowser/keyinput/basekeyparser.py @@ -193,7 +193,7 @@ class BaseKeyParser(QObject): if match == self.Match.definitive: self._debug_log("Definitive match for '{}'.".format( self._keystring)) - self._keystring = '' + self.clear_keystring() self.execute(binding, self.Type.chain, count) elif match == self.Match.ambiguous: self._debug_log("Ambiguous match for '{}'.".format( @@ -205,7 +205,7 @@ class BaseKeyParser(QObject): elif match == self.Match.none: self._debug_log("Giving up with '{}', no matches".format( self._keystring)) - self._keystring = '' + self.clear_keystring() else: raise AssertionError("Invalid match value {!r}".format(match)) return match @@ -271,7 +271,7 @@ class BaseKeyParser(QObject): time = config.get('input', 'timeout') if time == 0: # execute immediately - self._keystring = '' + self.clear_keystring() self.execute(binding, self.Type.chain, count) else: # execute in `time' ms @@ -289,8 +289,7 @@ class BaseKeyParser(QObject): command/count: As if passed to self.execute() """ self._debug_log("Executing delayed command now!") - self._keystring = '' - self.keystring_updated.emit(self._keystring) + self.clear_keystring() self.execute(command, self.Type.chain, count) def handle(self, e): @@ -366,6 +365,7 @@ class BaseKeyParser(QObject): def clear_keystring(self): """Clear the currently entered key sequence.""" - self._debug_log("discarding keystring '{}'.".format(self._keystring)) - self._keystring = '' - self.keystring_updated.emit(self._keystring) + if self._keystring: + self._debug_log("discarding keystring '{}'.".format(self._keystring)) + self._keystring = '' + self.keystring_updated.emit(self._keystring) From 9f8b5dad92f23076a76e7b622855d50d509a0398 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Klinkovsk=C3=BD?= Date: Thu, 11 Aug 2016 16:11:13 +0200 Subject: [PATCH 3/6] simplify binding Note that leave-mode implies clear-keychain since bf0fe3c. --- qutebrowser/config/configdata.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/qutebrowser/config/configdata.py b/qutebrowser/config/configdata.py index b62968904..805557e94 100644 --- a/qutebrowser/config/configdata.py +++ b/qutebrowser/config/configdata.py @@ -1452,7 +1452,7 @@ RETURN_KEYS = ['', '', '', '', '', KEY_DATA = collections.OrderedDict([ ('!normal', collections.OrderedDict([ - ('clear-keychain ;; leave-mode', ['', '']), + ('leave-mode', ['', '']), ])), ('normal', collections.OrderedDict([ @@ -1683,7 +1683,7 @@ CHANGED_KEY_COMMANDS = [ (re.compile(r'^scroll ([-\d]+ [-\d]+)$'), r'scroll-px \1'), (re.compile(r'^search *;; *clear-keychain$'), r'clear-keychain ;; search'), - (re.compile(r'^leave-mode$'), r'clear-keychain ;; leave-mode'), + (re.compile(r'^clear-keychain *;; *leave-mode$'), r'leave-mode'), (re.compile(r'^download-remove --all$'), r'download-clear'), From 2d2b0f5340ecc42cda8d4a455b6176e97d7fd11c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Klinkovsk=C3=BD?= Date: Thu, 11 Aug 2016 17:30:46 +0200 Subject: [PATCH 4/6] fix tests for config migrations --- tests/unit/config/test_config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/unit/config/test_config.py b/tests/unit/config/test_config.py index 6ef44f47d..1fe6dbeec 100644 --- a/tests/unit/config/test_config.py +++ b/tests/unit/config/test_config.py @@ -278,7 +278,7 @@ class TestKeyConfigParser: ('search ;; clear-keychain', 'clear-keychain ;; search'), ('search;;clear-keychain', 'clear-keychain ;; search'), ('search;;foo', None), - ('leave-mode', 'clear-keychain ;; leave-mode'), + ('clear-keychain ;; leave-mode', 'leave-mode'), ('leave-mode ;; foo', None), ('download-remove --all', 'download-clear'), From 567fe0ec1006400f3b804f02a89d0caef8a8200e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Klinkovsk=C3=BD?= Date: Thu, 11 Aug 2016 17:48:43 +0200 Subject: [PATCH 5/6] keyinput: don't emit keystring_updated twice when clearing --- qutebrowser/keyinput/basekeyparser.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/qutebrowser/keyinput/basekeyparser.py b/qutebrowser/keyinput/basekeyparser.py index 88c1774c1..db7a6705f 100644 --- a/qutebrowser/keyinput/basekeyparser.py +++ b/qutebrowser/keyinput/basekeyparser.py @@ -306,7 +306,9 @@ class BaseKeyParser(QObject): if handled or not self._supports_chains: return handled match = self._handle_single_key(e) - self.keystring_updated.emit(self._keystring) + # don't emit twice if the keystring was cleared in self.clear_keystring + if self._keystring: + self.keystring_updated.emit(self._keystring) return match != self.Match.none def read_config(self, modename=None): From 0e359833628d924ebaf7f20071bfa557cb239c40 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Klinkovsk=C3=BD?= Date: Thu, 11 Aug 2016 19:15:26 +0200 Subject: [PATCH 6/6] fix lint ('line too long') --- qutebrowser/keyinput/basekeyparser.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/qutebrowser/keyinput/basekeyparser.py b/qutebrowser/keyinput/basekeyparser.py index db7a6705f..c549c4b8c 100644 --- a/qutebrowser/keyinput/basekeyparser.py +++ b/qutebrowser/keyinput/basekeyparser.py @@ -368,6 +368,7 @@ class BaseKeyParser(QObject): def clear_keystring(self): """Clear the currently entered key sequence.""" if self._keystring: - self._debug_log("discarding keystring '{}'.".format(self._keystring)) + self._debug_log("discarding keystring '{}'.".format( + self._keystring)) self._keystring = '' self.keystring_updated.emit(self._keystring)