From 5cd00f699e5f2504dd80f6bac12f59c96a2d0494 Mon Sep 17 00:00:00 2001 From: Ryan Roden-Corrent Date: Thu, 14 Sep 2017 12:03:40 -0400 Subject: [PATCH] Resolve KeyError when deleting URL with space. Resolves #2963. --- qutebrowser/browser/history.py | 8 +++++--- tests/unit/browser/test_history.py | 14 +++++++++----- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/qutebrowser/browser/history.py b/qutebrowser/browser/history.py index 72fca984b..c9609bc03 100644 --- a/qutebrowser/browser/history.py +++ b/qutebrowser/browser/history.py @@ -26,7 +26,7 @@ from PyQt5.QtCore import pyqtSlot, QUrl, QTimer from qutebrowser.commands import cmdutils, cmdexc from qutebrowser.utils import (utils, objreg, log, usertypes, message, - debug, standarddir) + debug, standarddir, qtutils) from qutebrowser.misc import objects, sql @@ -144,8 +144,10 @@ class WebHistory(sql.SqlTable): Args: url: URL string to delete. """ - self.delete('url', url) - self.completion.delete('url', url) + qurl = QUrl(url) + qtutils.ensure_valid(qurl) + self.delete('url', self._format_url(qurl)) + self.completion.delete('url', self._format_completion_url(qurl)) @pyqtSlot(QUrl, QUrl, str) def add_from_tab(self, url, requested_url, title): diff --git a/tests/unit/browser/test_history.py b/tests/unit/browser/test_history.py index 7b34090f2..51157fccb 100644 --- a/tests/unit/browser/test_history.py +++ b/tests/unit/browser/test_history.py @@ -127,21 +127,25 @@ def test_clear_force(qtbot, tmpdir, hist): assert not len(hist.completion) -def test_delete_url(hist): +@pytest.mark.parametrize('raw, escaped', [ + ('http://example.com/1', 'http://example.com/1'), + ('http://example.com/1 2', 'http://example.com/1%202'), +]) +def test_delete_url(hist, raw, escaped): hist.add_url(QUrl('http://example.com/'), atime=0) - hist.add_url(QUrl('http://example.com/1'), atime=0) + hist.add_url(QUrl(escaped), atime=0) hist.add_url(QUrl('http://example.com/2'), atime=0) before = set(hist) completion_before = set(hist.completion) - hist.delete_url(QUrl('http://example.com/1')) + hist.delete_url(QUrl(raw)) diff = before.difference(set(hist)) - assert diff == {('http://example.com/1', '', 0, False)} + assert diff == {(escaped, '', 0, False)} completion_diff = completion_before.difference(set(hist.completion)) - assert completion_diff == {('http://example.com/1', '', 0)} + assert completion_diff == {(raw, '', 0)} @pytest.mark.parametrize(