diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index b36b5d1c3..e935589a7 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -465,11 +465,21 @@ class AbstractHistory: def current_idx(self): raise NotImplementedError - def back(self): - raise NotImplementedError + def back(self, count): + idx = self.current_idx() - count + if idx >= 0: + self._go_to_item(self._item_at(idx)) + else: + self._go_to_item(self._item_at(0)) + raise WebTabError("At beginning of history.") - def forward(self): - raise NotImplementedError + def forward(self, count): + idx = self.current_idx() + count + if idx < len(self): + self._go_to_item(self._item_at(idx)) + else: + self._go_to_item(self._item_at(len(self) - 1)) + raise WebTabError("At end of history.") def can_go_back(self): raise NotImplementedError @@ -477,6 +487,12 @@ class AbstractHistory: def can_go_forward(self): raise NotImplementedError + def _item_at(self, i): + raise NotImplementedError + + def _go_to_item(self, item): + raise NotImplementedError + def serialize(self): """Serialize into an opaque format understood by self.deserialize.""" raise NotImplementedError diff --git a/qutebrowser/browser/commands.py b/qutebrowser/browser/commands.py index f0c31aa76..8dde90602 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -540,15 +540,13 @@ class CommandDispatcher: else: widget = self._current_widget() - for _ in range(count): + try: if forward: - if not widget.history.can_go_forward(): - raise cmdexc.CommandError("At end of history.") - widget.history.forward() + widget.history.forward(count) else: - if not widget.history.can_go_back(): - raise cmdexc.CommandError("At beginning of history.") - widget.history.back() + widget.history.back(count) + except browsertab.WebTabError as e: + raise cmdexc.CommandError(e) @cmdutils.register(instance='command-dispatcher', scope='window') @cmdutils.argument('count', count=True) diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py index 11672d3b3..8d328f5e8 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -411,18 +411,18 @@ class WebEngineHistory(browsertab.AbstractHistory): def current_idx(self): return self._history.currentItemIndex() - def back(self): - self._history.back() - - def forward(self): - self._history.forward() - def can_go_back(self): return self._history.canGoBack() def can_go_forward(self): return self._history.canGoForward() + def _item_at(self, i): + return self._history.itemAt(i) + + def _go_to_item(self, item): + return self._history.goToItem(item) + def serialize(self): if not qtutils.version_check('5.9'): # WORKAROUND for diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py index c29aa15cb..348d2c628 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -506,18 +506,18 @@ class WebKitHistory(browsertab.AbstractHistory): def current_idx(self): return self._history.currentItemIndex() - def back(self): - self._history.back() - - def forward(self): - self._history.forward() - def can_go_back(self): return self._history.canGoBack() def can_go_forward(self): return self._history.canGoForward() + def _item_at(self, i): + return self._history.itemAt(i) + + def _go_to_item(self, item): + return self._history.goToItem(item) + def serialize(self): return qtutils.serialize(self._history)