diff --git a/qutebrowser/completion/completionwidget.py b/qutebrowser/completion/completionwidget.py index 9fc1ef5d7..364d783f6 100644 --- a/qutebrowser/completion/completionwidget.py +++ b/qutebrowser/completion/completionwidget.py @@ -192,10 +192,13 @@ class CompletionView(QTreeView): Args: prev: True for prev item, False for next one. """ - idx = self._next_idx(prev) - qtutils.ensure_valid(idx) - self.selectionModel().setCurrentIndex( - idx, QItemSelectionModel.ClearAndSelect | QItemSelectionModel.Rows) + # selmodel can be None if 'show' and 'auto-open' are set to False + # https://github.com/The-Compiler/qutebrowser/issues/1731 + selmodel = self.selectionModel() + if (selmodel is not None): + idx = self._next_idx(prev) + selmodel.setCurrentIndex(idx, + QItemSelectionModel.ClearAndSelect | QItemSelectionModel.Rows) def set_model(self, model): """Switch completion to a new model. diff --git a/tests/unit/completion/test_completionwidget.py b/tests/unit/completion/test_completionwidget.py index 9e7bf04bf..badc1fc89 100644 --- a/tests/unit/completion/test_completionwidget.py +++ b/tests/unit/completion/test_completionwidget.py @@ -119,6 +119,8 @@ def test_maybe_resize_completion(completionview, config_stub, qtbot): ([['Aa'], []], -1, 'Aa'), ([['Aa'], [], []], 1, 'Aa'), ([['Aa'], [], []], -1, 'Aa'), + ([[]], 1, None), + ([[]], -1, None), ]) def test_completion_item_next_prev(tree, count, expected, completionview): """Test that on_next_prev_item moves the selection properly. @@ -146,3 +148,13 @@ def test_completion_item_next_prev(tree, count, expected, completionview): completionview.completion_item_next() idx = completionview.selectionModel().currentIndex() assert filtermodel.data(idx) == expected + + +def test_completion_item_next_prev_no_model(completionview): + """Test that next/prev won't crash with no model set. + + This can happen if completion.show and completion.auto-open are False. + Regression test for issue #1722. + """ + completionview.completion_item_prev() + completionview.completion_item_next()