summaryrefslogtreecommitdiff
path: root/qutebrowser/mainwindow/tabbedbrowser.py
AgeCommit message (Collapse)Author
2021-12-03pylint: Enable else-if-usedpylint-2-12Florian Bruhin
2021-11-13Simplify logicTim Gadanidis
2021-11-01Always close tabs when given or takenTim Gadanidis
Add an optional boolean argument to `tabbed_browser.close_tab()` called `transfer` which indicates whether the tab is closing as a result of being given to another window (`tab-give`) or taken by another window (`tab-take`). If so, the tab will always close, even if it is the last tab in the window and `tabs.last_close` is not set to 'close'.
2021-03-11Show renderer process log after error page is shownFlorian Bruhin
Needs to be this way for BDD tests, regressed in de42cffd4f7a03409571aba3849155ff593108e4
2021-03-11Add a hint pointing to the locale workaroundFlorian Bruhin
See #6235
2021-03-09Add renderer process status to all error messagesFlorian Bruhin
Might help debug issues such as #6235
2021-01-26doc: Switch URLs to httpsFlorian Bruhin
2021-01-20Bump copyright yearsFlorian Bruhin
Closes #6015
2021-01-13dataclasses: Fix typing around undoFlorian Bruhin
See #6023
2021-01-13dataclasses: Adjust import orderFlorian Bruhin
See #6023
2021-01-13dataclasses: Initial switchFlorian Bruhin
See #6023
2020-12-22Ignore tabs.last_close with tabs.tabs_are_windowsFlorian Bruhin
Closes #5695 Supersedes #5771
2020-11-20Move utils.interpolate_color to qtutilsFlorian Bruhin
This avoids a circular import between utils and qtutils, which, while unproblematic, was easy to fix. Also, qtutils is actually a better fit here, because we're dealing with QColor objects anyways.
2020-11-04old qt: Remove crashed tab workaroundFlorian Bruhin
2020-11-04old qt: Drop error page workaroundFlorian Bruhin
2020-11-04old qt: Drop tab.setFocus() workaroundFlorian Bruhin
2020-11-04old qt: Drop layout unwrap workaroundFlorian Bruhin
2020-11-04old qt: Drop load signal workaroundFlorian Bruhin
2020-10-28mypy: use from-import style for typingTim Brown
Update files in `keyinput`, `mainwindow`, and `misc`. See #5396
2020-09-14mypy: Remove now unneeded ignoresFlorian Bruhin
2020-09-14Handle tab pinned status in AbstractTabFlorian Bruhin
This replaces TabbedBrowser.set_tab_pinned() with AbstractTab.set_pinned() and thus also allows us to set a tab as pinned without having to know which TabbedBrowser it belongs to. This also fixes a bug when :undo is used after closing a tab and then setting tabs_are_windows to true - we asked "self" (i.e. the TabbedBrowser the tab was closed in) to restore the tab's pinned status, but the tab wasn't actually part of that TabbedBrowser as it was opened in a new window after the undo.
2020-09-14Use TabWidget for icon handling in TabbedBrowserFlorian Bruhin
Avoids a bit of code duplication.
2020-07-29Add timestamp to :undo completionFlorian Bruhin
2020-07-29Add completion for :undoFlorian Bruhin
See #32
2020-07-28Merge remote-tracking branch 'origin/pr/5207'Florian Bruhin
2020-07-28Use keyword arguments for _UndoEntryFlorian Bruhin
2020-07-28Make UndoEntry/WindowUndoEntry privateFlorian Bruhin
2020-07-28Make TabbedBrowser.undo_stack publicFlorian Bruhin
If we have a public getter/setter, no point in keeping the attribute private.
2020-07-13Add get/setter for undo stack.Jimmy
2020-07-13Don't consider undoing into a None tab.Jimmy
For undoing the closing of windows we currently instantiate a TabbedBrowser without any tabs. We make tabs by filling in the browsers `_undo` list and calling `undo()`. If the "tabs.last_close" setting was on of the values that modifies the last tab instead of closing it we were getting an AttributeError when trying to access the history of the sole tab.
2020-07-13Re-open all tabs from closed windows on undo.Jimmy
2020-07-13Add prototype window close undo command.Jimmy
Adds a shutting_down signal to TabbedBrowser. Application listens for that signal and hoards the closing browser's undo stack. A new command is added to make a new window and give it a undo stack. Only the first tab on the undo stack is popped. We don't know how many were open when the window was closed. Since the only way to close a window(?) is with :close though the easiest way to get that would be to have `TabbedBrowser.shutdown()` clear the undo stack before closing the tabs. Then change the window undoer to undo all the tabs, or flatten the entries into one list. Still needs to remember the page geometry and privatness and be wired into the existing :undo command.
2020-07-13Rename TabbedBrowser.shutting_downJimmy
It was made public in 1c10a1aecfd50 and the method that used it externally was removed in 08bb3f4f19b51. I renamed it to be the same as in the views and so I can add a shutting_down signal. As an aside the `Application.new_window` signal that was also added for 1c10a1aecfd50 also had its sole consumer removed in that refactoring. I can see more future use of it though.
2020-07-12Shut down tabs properly when a window is closedFlorian Bruhin
2020-06-23Revert "Remove Qt 5.8 workarounds for _remove_tab"Florian Bruhin
After 86d794320343e58467d34daad8cc9a1b8011a512, this now also re-adds the workaround for QTBUG-58982 (#2290) because it is apparently still needed with Qt 5.7... This reverts commit 87d7dd93420ab92a1a209919297371dc0fadcecd.
2020-06-23Re-add segfault workaroundsFlorian Bruhin
Some tests (e.g. in test_invocations.py) still seem to segfault without this. This partially reverts 87d7dd93420ab92a1a209919297371dc0fadcecd. See #2261
2020-06-22Remove Qt 5.8 workarounds for _remove_tabFlorian Bruhin
Qt 5.8 support was removed in April 2018 with 69a58c959705b2dd469ba416250f884472593bee, and the last crash report I got with Qt 5.8 was in the same month. The workaround removed in this commit still were around, and despite of what the version check says, they are *not* needed with Qt 5.7. Those were workarounds for the following bugs: - https://bugreports.qt.io/browse/QTBUG-58698 (#2290, 1af951fd62b4878b2eaeb63e628b0ce5c06eeae8) - https://bugreports.qt.io/browse/QTBUG-58982 (#2261, 90f472bf590b6fdb3e7f4158ae420002ccbdee17) See #3608
2020-06-08Fix -1 focus_stack_size in TabDequeFlorian Bruhin
2020-05-22Merge branch 'caret-line'Florian Bruhin
2020-05-10mypy: Disallow incomplete defs globallyFlorian Bruhin
2020-05-10mypy: Use explicit "type: ignore[...]" ignoresFlorian Bruhin
See #5368
2020-05-09mypy: Remove unneeded casts/ignoresFlorian Bruhin
See #5368
2020-05-02implementing visual-line-mode on webengine sidesvetelna
2020-01-25Make :undo reopen the [count]th to last closed tabPeter Rice
2020-01-13Use quitter to shut down tabbed browserFlorian Bruhin
Before this change, we did shut down TabbedBrowser (and thus all the tabs) from the closeEvent of MainWindow. However, this has (at least) two problems: 1) When starting with --nowindow, we never get a window close event when shutting down. Since Qt 5.14 (or probably since the new PyQt exit scheme), this leads to various segfaults around QStyleSheetStyle: [...] QStyleSheetStyle::event(QEvent*) (this=0x5640dfe08940, e=0x7ffe8b8f5eb0) at styles/qstylesheetstyle.cpp:6040 [...] QCoreApplication::notifyInternal2(QObject*, QEvent*) (receiver=0x5640dfe08940, event=0x7ffe8b8f5eb0) at ../../include/QtCore/../../src/corelib/kernel/qobject.h:153 QApplicationPrivate::setFocusWidget(QWidget*, Qt::FocusReason) (reason=Qt::OtherFocusReason, focus=<optimized out>) at /usr/include/c++/9.2.0/bits/atomic_base.h:413 QApplicationPrivate::setFocusWidget(QWidget*, Qt::FocusReason) (focus=focus@entry=0x0, reason=reason@entry=Qt::OtherFocusReason) at kernel/qapplication.cpp:1691 QWidget::clearFocus() (this=this@entry=0x5640dff74640) at kernel/qwidget.cpp:6514 QWidget::~QWidget() (this=0x5640dff74640, __in_chrg=<optimized out>) at kernel/qwidget.cpp:1467 sipQWidget::~sipQWidget() (this=0x5640dff74640, __in_chrg=<optimized out>) at sipQtWidgetsQWidget.cpp:355 sipQWidget::~sipQWidget() (this=0x5640dff74640, __in_chrg=<optimized out>) at sipQtWidgetsQWidget.cpp:358 QObjectPrivate::deleteChildren() (this=this@entry=0x5640dfee2ed0) at kernel/qobject.cpp:2123 QWidget::~QWidget() (this=0x5640dff57f10, __in_chrg=<optimized out>) at kernel/qwidget.cpp:1530 QStackedWidget::~QStackedWidget() (this=0x5640dff57f10, __in_chrg=<optimized out>) at widgets/qstackedwidget.cpp:145 QObjectPrivate::deleteChildren() (this=this@entry=0x5640e006f7d0) at kernel/qobject.cpp:2123 QWidget::~QWidget() (this=0x7fb6a0005b50, __in_chrg=<optimized out>) at kernel/qwidget.cpp:1530 sipQTabWidget::~sipQTabWidget() (this=0x7fb6a0005b50, __in_chrg=<optimized out>) at sipQtWidgetsQTabWidget.cpp:326 sipQTabWidget::~sipQTabWidget() (this=0x7fb6a0005b50, __in_chrg=<optimized out>) at sipQtWidgetsQTabWidget.cpp:329 QObjectPrivate::deleteChildren() (this=this@entry=0x5640df3d3030) at kernel/qobject.cpp:2123 QWidget::~QWidget() (this=0x5640df86e200, __in_chrg=<optimized out>) at kernel/qwidget.cpp:1530 sipQWidget::~sipQWidget() (this=0x5640df86e200, __in_chrg=<optimized out>) at sipQtWidgetsQWidget.cpp:355 sipQWidget::~sipQWidget() (this=0x5640df86e200, __in_chrg=<optimized out>) at sipQtWidgetsQWidget.cpp:358 cleanup_qobject(sipSimpleWrapper*, void*) (sw=0x7fb694fb38b0, closure=0x5640df761b80) at ../../qpy/QtCore/qpycore_public_api.cpp:66 sip_api_visit_wrappers (visitor=0x7fb6bdae33ab <cleanup_qobject(sipSimpleWrapper*, void*)>, closure=0x5640df761b80) at siplib.c:13227 pyqt5_cleanup_qobjects() () at ../../qpy/QtCore/qpycore_public_api.cpp:78 cleanup_on_exit(PyObject*, PyObject*) () at ../../qpy/QtCore/qpycore_init.cpp:37 [...] [...] QObject::inherits(char const*) const (classname=0x7ffff30723cb "QMacStyle", this=<optimized out>) at ../../include/QtCore/../../src/corelib/kernel/qobject.h:428 QStyleSheetStyle::getDefaultStyleSheet() const (this=this@entry=0x5555564b8b70) at styles/qstylesheetstyle_default.cpp:157 QStyleSheetStyle::styleRules(QObject const*) const (this=0x5555564b8b70, obj=<optimized out>) at styles/qstylesheetstyle.cpp:1607 QStyleSheetStyle::renderRule(QObject const*, int, unsigned long long) const (this=this@entry=0x5555564b8b70, obj=<optimized out>, obj@entry=0x555556637bb0, element=element@entry=0, state=<optimized out>) at styles/qstylesheetstyle.cpp:1803 QStyleSheetStyle::setGeometry(QWidget*) (this=this@entry=0x5555564b8b70, w=w@entry=0x555556637bb0) at styles/qstylesheetstyle.cpp:2518 QStyleSheetStyle::unpolish(QWidget*) (w=0x555556637bb0, this=0x5555564b8b70) at styles/qstylesheetstyle.cpp:2948 QStyleSheetStyle::unpolish(QWidget*) (this=0x5555564b8b70, w=0x555556637bb0) at styles/qstylesheetstyle.cpp:2936 QWidgetPrivate::setStyle_helper(QStyle*, bool) (this=this@entry=0x5555565ae550, newStyle=newStyle@entry=0x0, propagate=propagate@entry=true) at kernel/qwidget.cpp:2639 QWidgetPrivate::inheritStyle() (this=this@entry=0x5555565ae550) at kernel/qwidget.cpp:2714 QWidget::setParent(QWidget*, QFlags<Qt::WindowType>) (this=this@entry=0x555556637bb0, parent=<optimized out>, parent@entry=0x0, f=...) at kernel/qwidget.cpp:10457 QWidget::setParent(QWidget*) (parent=0x0, this=0x555556637bb0) at ../../include/QtCore/../../src/corelib/global/qflags.h:140 QWidget::setParent(QWidget*) (this=this@entry=0x555556637bb0, parent=parent@entry=0x0) at kernel/qwidget.cpp:10322 QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget::removeParentBeforeParentDelete() (this=0x555556637bb0) at /tmp/makepkg/qt5-webengine-debug/src/qtwebengine-everywhere-src-5.14.0/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp:192 QtPrivate::QSlotObjectBase::call(QObject*, void**) (a=0x7fffffffd570, r=0x555556637bb0, this=0x5555566326a0) at ../../include/QtCore/../../src/corelib/kernel/qobjectdefs_impl.h:394 doActivate<false>(QObject*, int, void**) (sender=0x555556644a00, signal_index=0, argv=0x7fffffffd570) at kernel/qobject.cpp:3870 QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (sender=sender@entry=0x555556644a00, m=m@entry=0x7ffff62fe320 <QObject::staticMetaObject>, local_signal_index=local_signal_index@entry=0, argv=argv@entry=0x7fffffffd570) at kernel/qobject.cpp:3930 QObject::destroyed(QObject*) (this=this@entry=0x555556644a00, _t1=<optimized out>, _t1@entry=0x555556644a00) at .moc/moc_qobject.cpp:219 QWidget::~QWidget() (this=0x555556644a00, __in_chrg=<optimized out>) at kernel/qwidget.cpp:1505 sipQWebEngineView::~sipQWebEngineView() () at /usr/lib/python3.8/site-packages/PyQt5/QtWebEngineWidgets.abi3.so QObjectPrivate::deleteChildren() (this=this@entry=0x555556671b40) at kernel/qobject.cpp:2123 QWidget::~QWidget() (this=0x55555663cd90, __in_chrg=<optimized out>) at kernel/qwidget.cpp:1530 sipQWidget::~sipQWidget() (this=0x55555663cd90, __in_chrg=<optimized out>) at sipQtWidgetsQWidget.cpp:355 sipQWidget::~sipQWidget() (this=0x55555663cd90, __in_chrg=<optimized out>) at sipQtWidgetsQWidget.cpp:358 QObjectPrivate::deleteChildren() (this=this@entry=0x5555565fbab0) at kernel/qobject.cpp:2123 QWidget::~QWidget() (this=0x5555565bbb80, __in_chrg=<optimized out>) at kernel/qwidget.cpp:1530 QStackedWidget::~QStackedWidget() (this=0x5555565bbb80, __in_chrg=<optimized out>) at widgets/qstackedwidget.cpp:145 QObjectPrivate::deleteChildren() (this=this@entry=0x55555669aa80) at kernel/qobject.cpp:2123 QWidget::~QWidget() (this=0x7fffd8005a90, __in_chrg=<optimized out>) at kernel/qwidget.cpp:1530 sipQTabWidget::~sipQTabWidget() (this=0x7fffd8005a90, __in_chrg=<optimized out>) at sipQtWidgetsQTabWidget.cpp:326 sipQTabWidget::~sipQTabWidget() (this=0x7fffd8005a90, __in_chrg=<optimized out>) at sipQtWidgetsQTabWidget.cpp:329 QObjectPrivate::deleteChildren() (this=this@entry=0x555555b5f8b0) at kernel/qobject.cpp:2123 QWidget::~QWidget() (this=0x5555565fc9f0, __in_chrg=<optimized out>) at kernel/qwidget.cpp:1530 sipQWidget::~sipQWidget() (this=0x5555565fc9f0, __in_chrg=<optimized out>) at sipQtWidgetsQWidget.cpp:355 sipQWidget::~sipQWidget() (this=0x5555565fc9f0, __in_chrg=<optimized out>) at sipQtWidgetsQWidget.cpp:358 cleanup_qobject(sipSimpleWrapper*, void*) (sw=0x7fffc42bb8b0, closure=0x555555e45d20) at ../../qpy/QtCore/qpycore_public_api.cpp:66 sip_api_visit_wrappers (visitor=0x7ffff65e83ab <cleanup_qobject(sipSimpleWrapper*, void*)>, closure=0x555555e45d20) at siplib.c:13227 pyqt5_cleanup_qobjects() () at ../../qpy/QtCore/qpycore_public_api.cpp:78 cleanup_on_exit(PyObject*, PyObject*) () at ../../qpy/QtCore/qpycore_init.cpp:37 [...] 2) We sometimes get a "RuntimeError: wrapped C/C++ object of type QCommonStyle has been deleted" on exit, with this C++ stacktrace: pyqt5_err_print() () at ../../qpy/QtCore/qpycore_public_api.cpp:116 sipVEH_QtCore_PyQt5(_sipSimpleWrapper*, PyGILState_STATE) () at /tmp/makepkg/pyqt5-debug/src/PyQt5-5.14.0/sip/QtCore/qpycore_virtual_error_handler.sip:22 sip_api_call_error_handler (sipGILState=PyGILState_UNLOCKED, py_self=0x7f1c94711820, error_handler=0x7f1cb9044f4c <sipVEH_QtCore_PyQt5(_sipSimpleWrapper*, PyGILState_STATE)>) at siplib.c:12416 sip_api_call_procedure_method (gil_state=PyGILState_UNLOCKED, error_handler=0x7f1cb9044f4c <sipVEH_QtCore_PyQt5(_sipSimpleWrapper*, PyGILState_STATE)>, py_self=0x7f1c94711820, method=0x7f1ca116e220, fmt=<optimized out>) at siplib.c:2303 sipVH_QtWidgets_47(PyGILState_STATE, void (*)(_sipSimpleWrapper*, PyGILState_STATE), _sipSimpleWrapper*, _object*, QWidget*) (sipGILState=PyGILState_UNLOCKED, sipErrorHandler=0x7f1cb9044f4c <sipVEH_QtCore_PyQt5(_sipSimpleWrapper*, PyGILState_STATE)>, sipPySelf=0x7f1c94711820, sipMethod=0x7f1ca116e220, a0=0x55fd39c06df0) at sipQtWidgetscmodule.cpp:6200 sipQCommonStyle::unpolish(QWidget*) (this=0x55fd39b4bbd0, a0=0x55fd39c06df0) at sipQtWidgetsQCommonStyle.cpp:380 QStyleSheetStyle::unpolish(QWidget*) (this=0x55fd39baacc0, w=0x55fd39c06df0) at styles/qstylesheetstyle.cpp:2960 QWidgetPrivate::setStyle_helper(QStyle*, bool) (this=this@entry=0x55fd398b5380, newStyle=newStyle@entry=0x0, propagate=propagate@entry=true) at kernel/qwidget.cpp:2639 QWidgetPrivate::inheritStyle() (this=this@entry=0x55fd398b5380) at kernel/qwidget.cpp:2714 QWidget::setParent(QWidget*, QFlags<Qt::WindowType>) (this=this@entry=0x55fd39c06df0, parent=<optimized out>, parent@entry=0x0, f=...) at kernel/qwidget.cpp:10457 QWidget::setParent(QWidget*) (parent=0x0, this=0x55fd39c06df0) at ../../include/QtCore/../../src/corelib/global/qflags.h:140 QWidget::setParent(QWidget*) (this=this@entry=0x55fd39c06df0, parent=parent@entry=0x0) at kernel/qwidget.cpp:10322 QtWebEngineCore::RenderWidgetHostViewQtDelegateWidget::removeParentBeforeParentDelete() (this=0x55fd39c06df0) at /tmp/makepkg/qt5-webengine-debug/src/qtwebengine-everywhere-src-5.14.0/src/webenginewidgets/render_widget_host_view_qt_delegate_widget.cpp:192 QtPrivate::QSlotObjectBase::call(QObject*, void**) (a=0x7ffff40c2340, r=0x55fd39c06df0, this=0x55fd39c022c0) at ../../include/QtCore/../../src/corelib/kernel/qobjectdefs_impl.h:394 doActivate<false>(QObject*, int, void**) (sender=0x55fd39c1e700, signal_index=0, argv=0x7ffff40c2340) at kernel/qobject.cpp:3870 QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (sender=sender@entry=0x55fd39c1e700, m=m@entry=0x7f1cb8f22320 <QObject::staticMetaObject>, local_signal_index=local_signal_index@entry=0, argv=argv@entry=0x7ffff40c2340) at kernel/qobject.cpp:3930 QObject::destroyed(QObject*) (this=this@entry=0x55fd39c1e700, _t1=<optimized out>, _t1@entry=0x55fd39c1e700) at .moc/moc_qobject.cpp:219 QWidget::~QWidget() (this=0x55fd39c1e700, __in_chrg=<optimized out>) at kernel/qwidget.cpp:1505 sipQWebEngineView::~sipQWebEngineView() () at /usr/lib/python3.8/site-packages/PyQt5/QtWebEngineWidgets.abi3.so QObjectPrivate::deleteChildren() (this=this@entry=0x55fd39c1e4a0) at kernel/qobject.cpp:2123 QWidget::~QWidget() (this=0x55fd39bc1430, __in_chrg=<optimized out>) at kernel/qwidget.cpp:1530 sipQWidget::~sipQWidget() (this=0x55fd39bc1430, __in_chrg=<optimized out>) at sipQtWidgetsQWidget.cpp:355 sipQWidget::~sipQWidget() (this=0x55fd39bc1430, __in_chrg=<optimized out>) at sipQtWidgetsQWidget.cpp:358 QObjectPrivate::deleteChildren() (this=this@entry=0x55fd39b7aa60) at kernel/qobject.cpp:2123 QWidget::~QWidget() (this=0x55fd39b9e3c0, __in_chrg=<optimized out>) at kernel/qwidget.cpp:1530 QStackedWidget::~QStackedWidget() (this=0x55fd39b9e3c0, __in_chrg=<optimized out>) at widgets/qstackedwidget.cpp:145 QObjectPrivate::deleteChildren() (this=this@entry=0x55fd39c68ba0) at kernel/qobject.cpp:2123 QWidget::~QWidget() (this=0x7f1c98005a70, __in_chrg=<optimized out>) at kernel/qwidget.cpp:1530 sipQTabWidget::~sipQTabWidget() (this=0x7f1c98005a70, __in_chrg=<optimized out>) at sipQtWidgetsQTabWidget.cpp:326 sipQTabWidget::~sipQTabWidget() (this=0x7f1c98005a70, __in_chrg=<optimized out>) at sipQtWidgetsQTabWidget.cpp:329 QObjectPrivate::deleteChildren() (this=this@entry=0x55fd39481760) at kernel/qobject.cpp:2123 QWidget::~QWidget() (this=0x55fd394c90d0, __in_chrg=<optimized out>) at kernel/qwidget.cpp:1530 sipQWidget::~sipQWidget() (this=0x55fd394c90d0, __in_chrg=<optimized out>) at sipQtWidgetsQWidget.cpp:355 sipQWidget::~sipQWidget() (this=0x55fd394c90d0, __in_chrg=<optimized out>) at sipQtWidgetsQWidget.cpp:358 cleanup_qobject(sipSimpleWrapper*, void*) (sw=0x7f1c946dc940, closure=0x55fd3939f9a0) at ../../qpy/QtCore/qpycore_public_api.cpp:66 sip_api_visit_wrappers (visitor=0x7f1cb920c3ab <cleanup_qobject(sipSimpleWrapper*, void*)>, closure=0x55fd3939f9a0) at siplib.c:13227 pyqt5_cleanup_qobjects() () at ../../qpy/QtCore/qpycore_public_api.cpp:78 cleanup_on_exit(PyObject*, PyObject*) () at ../../qpy/QtCore/qpycore_init.cpp:37 [...] Instead, let's use the shutting_down signal we have already to shut down all the TabbedBrowsers (and their children). I'm not exactly sure why, but this results in a clean exit. Fixes #5124 Fixes #5187
2020-01-04Adjust copyrights for 2020Florian Bruhin
2019-12-18Remove unneeded ignore_tabs_are_windows argumentFlorian Bruhin
This was originally introduced in 57adcea58740663a3bb01a155f19b72a4b0efe51 for #2162. However, support for Qt < 5.7.1 was dropped long ago in a86170f45dbc56b62f33709f33a258a077afe6f4, so this can be removed.
2019-11-25Remove web-history from objregFlorian Bruhin
See #640
2019-10-22mypy: Fix new issues in mainwindow.tabbedbrowserFlorian Bruhin
2019-10-15mypy: check_untyped_defs for qutebrowser.mainwindowFlorian Bruhin