diff options
author | Florian Bruhin <git@the-compiler.org> | 2018-03-06 06:29:03 +0100 |
---|---|---|
committer | Florian Bruhin <git@the-compiler.org> | 2018-03-06 06:29:38 +0100 |
commit | 41dfa296483954e3f4eaf3285b9688b318211861 (patch) | |
tree | 07eea6e9de437ed072fec5b27ad945ef0535e19d | |
parent | 7a9f8fda72797f5cd075f37c6b884917be721d55 (diff) | |
download | qutebrowser-41dfa296483954e3f4eaf3285b9688b318211861.tar.gz qutebrowser-41dfa296483954e3f4eaf3285b9688b318211861.zip |
Improve parsing of invalid keys
This should handle "<>" and "\x1f" correctly.
-rw-r--r-- | qutebrowser/keyinput/keyutils.py | 8 | ||||
-rw-r--r-- | tests/unit/keyinput/test_keyutils.py | 18 |
2 files changed, 17 insertions, 9 deletions
diff --git a/qutebrowser/keyinput/keyutils.py b/qutebrowser/keyinput/keyutils.py index fd00cf5b5..91d6a36a3 100644 --- a/qutebrowser/keyinput/keyutils.py +++ b/qutebrowser/keyinput/keyutils.py @@ -413,12 +413,12 @@ class KeySequence: def _validate(self, keystr=None): for info in self: - assert Qt.Key_Space <= info.key <= Qt.Key_unknown, info.key - if info.key == Qt.Key_unknown: - raise KeyParseError(keystr, "Got unknown key!") + if info.key < Qt.Key_Space or info.key >= Qt.Key_unknown: + raise KeyParseError(keystr, "Got invalid key!") for seq in self._sequences: - assert seq + if not seq: + raise KeyParseError(keystr, "Got invalid key!") def matches(self, other): """Check whether the given KeySequence matches with this one. diff --git a/tests/unit/keyinput/test_keyutils.py b/tests/unit/keyinput/test_keyutils.py index 97c9da04c..11dd41b1f 100644 --- a/tests/unit/keyinput/test_keyutils.py +++ b/tests/unit/keyinput/test_keyutils.py @@ -19,6 +19,8 @@ import operator +import hypothesis +from hypothesis import strategies import pytest from PyQt5.QtCore import Qt, QEvent, pyqtSignal from PyQt5.QtGui import QKeyEvent, QKeySequence @@ -203,15 +205,11 @@ class TestKeySequence: seq = keyutils.KeySequence() assert not seq - @pytest.mark.parametrize('key', [Qt.Key_unknown, -1]) + @pytest.mark.parametrize('key', [Qt.Key_unknown, -1, '\x1f', 0]) def test_init_unknown(self, key): with pytest.raises(keyutils.KeyParseError): keyutils.KeySequence(key) - def test_init_invalid(self): - with pytest.raises(AssertionError): - keyutils.KeySequence(0) - @pytest.mark.parametrize('orig, normalized', [ ('<Control+x>', '<Ctrl+x>'), ('<Windows+x>', '<Meta+x>'), @@ -410,6 +408,7 @@ class TestKeySequence: ('<alt+<>', keyutils.KeyParseError), ('<alt+>>', keyutils.KeyParseError), ('<blub>', keyutils.KeyParseError), + ('<>', keyutils.KeyParseError), ('\U00010000', keyutils.KeyParseError), ]) def test_parse(self, keystr, expected): @@ -419,6 +418,15 @@ class TestKeySequence: else: assert keyutils.KeySequence.parse(keystr) == expected + @hypothesis.given(strategies.text()) + def test_parse_hypothesis(self, keystr): + try: + seq = keyutils.KeySequence.parse(keystr) + except keyutils.KeyParseError: + pass + else: + str(seq) + def test_key_info_from_event(): ev = QKeyEvent(QEvent.KeyPress, Qt.Key_A, Qt.ShiftModifier, 'A') |