diff --git a/doc/changelog.asciidoc b/doc/changelog.asciidoc index 8dcb4cee3..e253e26a5 100644 --- a/doc/changelog.asciidoc +++ b/doc/changelog.asciidoc @@ -53,6 +53,8 @@ Fixed Python upgrade) should now not crash anymore. - When the QtWebEngine resources dir couldn't be found, qutebrowser now doesn't crash anymore (but QtWebEngine still might). +- Fixed a rare crash in the completion widget when there was no selection model + when we went to clear that, probably when leaving a mode. (#7901) [[v3.1.1]] v3.1.1 (unreleased) diff --git a/qutebrowser/completion/completionwidget.py b/qutebrowser/completion/completionwidget.py index 0f5dc0de9..27e631662 100644 --- a/qutebrowser/completion/completionwidget.py +++ b/qutebrowser/completion/completionwidget.py @@ -414,7 +414,7 @@ class CompletionView(QTreeView): def on_clear_completion_selection(self): """Clear the selection model when an item is activated.""" self.hide() - selmod = self._selection_model() + selmod = self.selectionModel() if selmod is not None: selmod.clearSelection() selmod.clearCurrentIndex() diff --git a/tests/unit/completion/test_completionwidget.py b/tests/unit/completion/test_completionwidget.py index 4ab9dfca0..387339f4f 100644 --- a/tests/unit/completion/test_completionwidget.py +++ b/tests/unit/completion/test_completionwidget.py @@ -7,7 +7,7 @@ from unittest import mock import pytest -from qutebrowser.qt.core import QRect +from qutebrowser.qt.core import QRect, QItemSelectionModel from qutebrowser.completion import completionwidget from qutebrowser.completion.models import completionmodel, listcategory @@ -285,6 +285,23 @@ def test_completion_show(show, rows, quick_complete, completionview, model, assert not completionview.isVisible() +def test_completion_selection_clear_no_model(completionview): + completionview.show() + completionview.on_clear_completion_selection() + assert completionview.isVisible() is False + + +def test_completion_selection_clear_with_model(completionview, mocker): + selmod = mock.Mock(spec=QItemSelectionModel) + mocker.patch.object(completionview, "selectionModel", return_value=selmod) + completionview.show() + completionview.on_clear_completion_selection() + + assert completionview.isVisible() is False + selmod.clearSelection.assert_called_once() + selmod.clearCurrentIndex.assert_called_once() + + def test_completion_item_del(completionview, model): """Test that completion_item_del invokes delete_cur_item in the model.""" func = mock.Mock(spec=[])