diff --git a/qutebrowser/browser/browsertab.py b/qutebrowser/browser/browsertab.py index b36b5d1c3..5ba0bd898 100644 --- a/qutebrowser/browser/browsertab.py +++ b/qutebrowser/browser/browsertab.py @@ -477,6 +477,12 @@ class AbstractHistory: def can_go_forward(self): raise NotImplementedError + def itemAt(self, i): + raise NotImplementedError + + def goToItem(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..e11b9a61b 100644 --- a/qutebrowser/browser/commands.py +++ b/qutebrowser/browser/commands.py @@ -540,15 +540,16 @@ class CommandDispatcher: else: widget = self._current_widget() - for _ in range(count): - if forward: - if not widget.history.can_go_forward(): - raise cmdexc.CommandError("At end of history.") - widget.history.forward() - else: - if not widget.history.can_go_back(): - raise cmdexc.CommandError("At beginning of history.") - widget.history.back() + if forward: + try: + widget.history.forward(count) + except IndexError: + raise cmdexc.CommandError("At end of history.") + else: + try: + widget.history.back(count) + except IndexError: + raise cmdexc.CommandError("At beginning of history.") @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..a86b9c6c1 100644 --- a/qutebrowser/browser/webengine/webenginetab.py +++ b/qutebrowser/browser/webengine/webenginetab.py @@ -411,11 +411,21 @@ class WebEngineHistory(browsertab.AbstractHistory): def current_idx(self): return self._history.currentItemIndex() - def back(self): - self._history.back() + def back(self, count): + idx = self.current_idx() - count + if idx >= 0: + self.goToItem(self.itemAt(idx)) + else: + self.goToItem(self.itemAt(0)) + raise IndexError - def forward(self): - self._history.forward() + def forward(self, count): + idx = self.current_idx() + count + if idx < len(self): + self.goToItem(self.itemAt(idx)) + else: + self.goToItem(self.itemAt(len(self) - 1)) + raise IndexError def can_go_back(self): return self._history.canGoBack() @@ -423,6 +433,12 @@ class WebEngineHistory(browsertab.AbstractHistory): def can_go_forward(self): return self._history.canGoForward() + def itemAt(self, i): + return self._history.itemAt(i) + + def goToItem(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..6306ac542 100644 --- a/qutebrowser/browser/webkit/webkittab.py +++ b/qutebrowser/browser/webkit/webkittab.py @@ -506,11 +506,21 @@ class WebKitHistory(browsertab.AbstractHistory): def current_idx(self): return self._history.currentItemIndex() - def back(self): - self._history.back() + def back(self, count): + idx = self.current_idx() - count + if idx >= 0: + self.goToItem(self.itemAt(idx)) + else: + self.goToItem(self.itemAt(0)) + raise IndexError - def forward(self): - self._history.forward() + def forward(self, count): + idx = self.current_idx() + count + if idx < len(self): + self.goToItem(self.itemAt(idx)) + else: + self.goToItem(self.itemAt(len(self) - 1)) + raise IndexError def can_go_back(self): return self._history.canGoBack() @@ -518,6 +528,12 @@ class WebKitHistory(browsertab.AbstractHistory): def can_go_forward(self): return self._history.canGoForward() + def itemAt(self, i): + return self._history.itemAt(i) + + def goToItem(self, item): + return self._history.goToItem(item) + def serialize(self): return qtutils.serialize(self._history)