summaryrefslogtreecommitdiff
path: root/qutebrowser
diff options
context:
space:
mode:
authorFlorian Bruhin <me@the-compiler.org>2023-07-22 12:36:31 +0200
committerFlorian Bruhin <me@the-compiler.org>2023-07-22 12:36:31 +0200
commit273230eb07eb848e67abc8c1e6fc95cfe4c46b6f (patch)
treea198f4b32f439f3602c25a4942b9a0aabe511b87 /qutebrowser
parent1387b0598b90501dfa1dc8e4cbe5e1d0d05cd048 (diff)
parented70741587d0d7f5cc90b2f510c38474a7ad9375 (diff)
downloadqutebrowser-273230eb07eb848e67abc8c1e6fc95cfe4c46b6f.tar.gz
qutebrowser-273230eb07eb848e67abc8c1e6fc95cfe4c46b6f.zip
Merge remote-tracking branch 'origin/pr/7789'
Diffstat (limited to 'qutebrowser')
-rw-r--r--qutebrowser/app.py8
-rw-r--r--qutebrowser/browser/qutescheme.py7
-rw-r--r--qutebrowser/browser/webengine/webenginetab.py3
-rw-r--r--qutebrowser/browser/webkit/webkitelem.py5
-rw-r--r--qutebrowser/browser/webkit/webkithistory.py5
-rw-r--r--qutebrowser/browser/webkit/webkitinspector.py4
-rw-r--r--qutebrowser/browser/webkit/webkitsettings.py5
-rw-r--r--qutebrowser/browser/webkit/webkittab.py4
-rw-r--r--qutebrowser/browser/webkit/webpage.py5
-rw-r--r--qutebrowser/browser/webkit/webview.py5
-rw-r--r--qutebrowser/html/warning-qt5.html28
-rw-r--r--qutebrowser/keyinput/keyutils.py30
-rw-r--r--qutebrowser/qt/_core_pyqtproperty.py2
-rw-r--r--qutebrowser/qt/machinery.py40
-rw-r--r--qutebrowser/qt/opengl.py2
-rw-r--r--qutebrowser/qutebrowser.py2
16 files changed, 100 insertions, 55 deletions
diff --git a/qutebrowser/app.py b/qutebrowser/app.py
index bb2ff56e7..fbfa3df12 100644
--- a/qutebrowser/app.py
+++ b/qutebrowser/app.py
@@ -367,6 +367,14 @@ def _open_special_pages(args):
os.environ.get("QTWEBENGINE_DISABLE_SANDBOX") == "1"
),
'qute://warning/sandboxing'),
+
+ ('qt5-warning-shown',
+ (
+ machinery.IS_QT5 and
+ machinery.INFO.reason == machinery.SelectionReason.auto and
+ objects.backend != usertypes.Backend.QtWebKit,
+ ),
+ 'qute://warning/qt5'),
]
if 'quickstart-done' not in general_sect:
diff --git a/qutebrowser/browser/qutescheme.py b/qutebrowser/browser/qutescheme.py
index 25834670b..0073f9bd2 100644
--- a/qutebrowser/browser/qutescheme.py
+++ b/qutebrowser/browser/qutescheme.py
@@ -22,6 +22,7 @@ Module attributes:
_HANDLERS: The handlers registered via decorators.
"""
+import sys
import html
import json
import os
@@ -583,6 +584,12 @@ def qute_warning(url: QUrl) -> _HandlerRet:
elif path == '/sandboxing':
src = jinja.render('warning-sandboxing.html',
title='Qt 6 macOS sandboxing warning')
+ elif path == '/qt5':
+ is_venv = hasattr(sys, 'real_prefix') or sys.base_prefix != sys.prefix
+ src = jinja.render('warning-qt5.html',
+ title='Switch to Qt 6',
+ is_venv=is_venv,
+ prefix=sys.prefix)
else:
raise NotFoundError("Invalid warning page {}".format(path))
return 'text/html', src
diff --git a/qutebrowser/browser/webengine/webenginetab.py b/qutebrowser/browser/webengine/webenginetab.py
index e55d75ecd..c2957181b 100644
--- a/qutebrowser/browser/webengine/webenginetab.py
+++ b/qutebrowser/browser/webengine/webenginetab.py
@@ -400,7 +400,8 @@ class WebEngineCaret(browsertab.AbstractCaret):
# https://bugreports.qt.io/browse/QTBUG-53134
# Even on Qt 5.10 selectedText() seems to work poorly, see
# https://github.com/qutebrowser/qutebrowser/issues/3523
- # FIXME:qt6 Reevaluate?
+ # With Qt 6.2-6.5, there still seem to be issues (especially with
+ # multi-line text)
self._tab.run_js_async(javascript.assemble('caret', 'getSelection'),
callback)
diff --git a/qutebrowser/browser/webkit/webkitelem.py b/qutebrowser/browser/webkit/webkitelem.py
index ef3e3bea5..8bf5031b1 100644
--- a/qutebrowser/browser/webkit/webkitelem.py
+++ b/qutebrowser/browser/webkit/webkitelem.py
@@ -15,16 +15,15 @@
# You should have received a copy of the GNU General Public License
# along with qutebrowser. If not, see <https://www.gnu.org/licenses/>.
-# FIXME:qt6 (lint)
-# pylint: disable=no-name-in-module
-
"""QtWebKit specific part of the web element API."""
from typing import cast, TYPE_CHECKING, Iterator, List, Optional, Set
from qutebrowser.qt.core import QRect, Qt
+# pylint: disable=no-name-in-module
from qutebrowser.qt.webkit import QWebElement, QWebSettings
from qutebrowser.qt.webkitwidgets import QWebFrame
+# pylint: enable=no-name-in-module
from qutebrowser.config import config
from qutebrowser.utils import log, utils, javascript, usertypes
diff --git a/qutebrowser/browser/webkit/webkithistory.py b/qutebrowser/browser/webkit/webkithistory.py
index aea648361..d89c705e6 100644
--- a/qutebrowser/browser/webkit/webkithistory.py
+++ b/qutebrowser/browser/webkit/webkithistory.py
@@ -15,14 +15,13 @@
# You should have received a copy of the GNU General Public License
# along with qutebrowser. If not, see <https://www.gnu.org/licenses/>.
-# FIXME:qt6 (lint)
-# pylint: disable=no-name-in-module
-
"""QtWebKit specific part of history."""
import functools
+# pylint: disable=no-name-in-module
from qutebrowser.qt.webkit import QWebHistoryInterface
+# pylint: enable=no-name-in-module
from qutebrowser.utils import debug
from qutebrowser.misc import debugcachestats
diff --git a/qutebrowser/browser/webkit/webkitinspector.py b/qutebrowser/browser/webkit/webkitinspector.py
index cb9cb5615..c181435d1 100644
--- a/qutebrowser/browser/webkit/webkitinspector.py
+++ b/qutebrowser/browser/webkit/webkitinspector.py
@@ -15,13 +15,13 @@
# You should have received a copy of the GNU General Public License
# along with qutebrowser. If not, see <https://www.gnu.org/licenses/>.
-# FIXME:qt6 (lint)
-# pylint: disable=no-name-in-module
"""Customized QWebInspector for QtWebKit."""
+# pylint: disable=no-name-in-module
from qutebrowser.qt.webkit import QWebSettings
from qutebrowser.qt.webkitwidgets import QWebInspector, QWebPage
+# pylint: enable=no-name-in-module
from qutebrowser.qt.widgets import QWidget
from qutebrowser.browser import inspector
diff --git a/qutebrowser/browser/webkit/webkitsettings.py b/qutebrowser/browser/webkit/webkitsettings.py
index bd65be65b..a20811bae 100644
--- a/qutebrowser/browser/webkit/webkitsettings.py
+++ b/qutebrowser/browser/webkit/webkitsettings.py
@@ -15,9 +15,6 @@
# You should have received a copy of the GNU General Public License
# along with qutebrowser. If not, see <https://www.gnu.org/licenses/>.
-# FIXME:qt6 (lint)
-# pylint: disable=no-name-in-module
-
"""Bridge from QWebSettings to our own settings.
Module attributes:
@@ -30,8 +27,10 @@ import os.path
from qutebrowser.qt.core import QUrl
from qutebrowser.qt.gui import QFont
+# pylint: disable=no-name-in-module
from qutebrowser.qt.webkit import QWebSettings
from qutebrowser.qt.webkitwidgets import QWebPage
+# pylint: enable=no-name-in-module
from qutebrowser.config import config, websettings
from qutebrowser.config.websettings import AttributeInfo as Attr
diff --git a/qutebrowser/browser/webkit/webkittab.py b/qutebrowser/browser/webkit/webkittab.py
index a756e1a3d..e0483a23a 100644
--- a/qutebrowser/browser/webkit/webkittab.py
+++ b/qutebrowser/browser/webkit/webkittab.py
@@ -15,8 +15,6 @@
# You should have received a copy of the GNU General Public License
# along with qutebrowser. If not, see <https://www.gnu.org/licenses/>.
-# FIXME:qt6 (lint)
-# pylint: disable=no-name-in-module
"""Wrapper over our (QtWebKit) WebView."""
@@ -28,8 +26,10 @@ from typing import cast, Iterable, Optional
from qutebrowser.qt.core import pyqtSlot, Qt, QUrl, QPoint, QTimer, QSizeF, QSize
from qutebrowser.qt.gui import QIcon
from qutebrowser.qt.widgets import QWidget
+# pylint: disable=no-name-in-module
from qutebrowser.qt.webkitwidgets import QWebPage, QWebFrame
from qutebrowser.qt.webkit import QWebSettings, QWebHistory, QWebElement
+# pylint: enable=no-name-in-module
from qutebrowser.qt.printsupport import QPrinter
from qutebrowser.browser import browsertab, shared
diff --git a/qutebrowser/browser/webkit/webpage.py b/qutebrowser/browser/webkit/webpage.py
index 27429f331..b3b1b7ceb 100644
--- a/qutebrowser/browser/webkit/webpage.py
+++ b/qutebrowser/browser/webkit/webpage.py
@@ -15,9 +15,6 @@
# You should have received a copy of the GNU General Public License
# along with qutebrowser. If not, see <https://www.gnu.org/licenses/>.
-# FIXME:qt6 (lint)
-# pylint: disable=no-name-in-module
-
"""The main browser widgets."""
import html
@@ -28,7 +25,9 @@ from qutebrowser.qt.gui import QDesktopServices
from qutebrowser.qt.network import QNetworkReply, QNetworkRequest
from qutebrowser.qt.widgets import QFileDialog
from qutebrowser.qt.printsupport import QPrintDialog
+# pylint: disable=no-name-in-module
from qutebrowser.qt.webkitwidgets import QWebPage, QWebFrame
+# pylint: enable=no-name-in-module
from qutebrowser.config import websettings, config
from qutebrowser.browser import pdfjs, shared, downloads, greasemonkey
diff --git a/qutebrowser/browser/webkit/webview.py b/qutebrowser/browser/webkit/webview.py
index 7a08a0736..831b2b689 100644
--- a/qutebrowser/browser/webkit/webview.py
+++ b/qutebrowser/browser/webkit/webview.py
@@ -15,14 +15,13 @@
# You should have received a copy of the GNU General Public License
# along with qutebrowser. If not, see <https://www.gnu.org/licenses/>.
-# FIXME:qt6 (lint)
-# pylint: disable=no-name-in-module
-
"""The main browser widgets."""
from qutebrowser.qt.core import pyqtSignal, Qt
+# pylint: disable=no-name-in-module
from qutebrowser.qt.webkit import QWebSettings
from qutebrowser.qt.webkitwidgets import QWebView, QWebPage
+# pylint: enable=no-name-in-module
from qutebrowser.config import config, stylesheet
from qutebrowser.keyinput import modeman
diff --git a/qutebrowser/html/warning-qt5.html b/qutebrowser/html/warning-qt5.html
new file mode 100644
index 000000000..17af2f72c
--- /dev/null
+++ b/qutebrowser/html/warning-qt5.html
@@ -0,0 +1,28 @@
+{% extends "styled.html" %}
+
+{% block content %}
+<h1>{{ title }}</h1>
+<span class="note">Note this warning will only appear once. Use <span class="mono">:open
+qute://warning/qt5</span> to show it again at a later time.</span>
+
+<p>
+ qutebrowser <b>now supports Qt 6</b>.
+</p>
+<p>
+ However, in your environment, <b>Qt 6 is not installed</b>. Thus, qutebrowser is still using Qt 5 instead.
+
+ Qt 5.15 based on a very old Chromium version (83 or 87, from mid/late 2020).
+</p>
+{% if is_venv %}
+<p>
+ You are using a virtualenv. If you want to use Qt 6, you need to create a new
+ virtualenv with PyQt6 installed.
+
+ If using <span class="mono">mkvenv.py</span>, <b>rerun the script</b> to create a
+ new virtualenv with Qt 6.
+</p>
+{% endif %}
+<p>
+ <span class="note">Python installation prefix: <span class="mono">{{ prefix }}</span></span>
+</p>
+{% endblock %}
diff --git a/qutebrowser/keyinput/keyutils.py b/qutebrowser/keyinput/keyutils.py
index e2a15b2c0..10f4d5378 100644
--- a/qutebrowser/keyinput/keyutils.py
+++ b/qutebrowser/keyinput/keyutils.py
@@ -37,9 +37,7 @@ from qutebrowser.qt import machinery
from qutebrowser.qt.core import Qt, QEvent
from qutebrowser.qt.gui import QKeySequence, QKeyEvent
if machinery.IS_QT6:
- # FIXME:qt6 (lint) how come pylint isn't picking this up with both backends
- # installed?
- from qutebrowser.qt.core import QKeyCombination # pylint: disable=no-name-in-module
+ from qutebrowser.qt.core import QKeyCombination
else:
QKeyCombination = None # QKeyCombination was added in Qt 6
@@ -349,7 +347,7 @@ def _unset_modifier_bits(
https://github.com/python/cpython/issues/105497
"""
if machinery.IS_QT5:
- return cast(_ModifierType, modifiers & ~mask)
+ return Qt.KeyboardModifiers(modifiers & ~mask) # can lose type if it's 0
else:
return Qt.KeyboardModifier(modifiers.value & ~mask.value)
@@ -369,11 +367,14 @@ class KeyInfo:
def __post_init__(self) -> None:
"""Run some validation on the key/modifier values."""
- # This is mainly useful while porting from Qt 5 to 6.
- # FIXME:qt6 do we want to remove or keep this (and fix the remaining
- # issues) when done?
- # assert isinstance(self.key, Qt.Key), self.key
- # assert isinstance(self.modifiers, Qt.KeyboardModifier), self.modifiers
+ # This changed with Qt 6, and e.g. to_qt() relies on this.
+ if machinery.IS_QT5:
+ modifier_classes = (Qt.KeyboardModifier, Qt.KeyboardModifiers)
+ elif machinery.IS_QT6:
+ modifier_classes = Qt.KeyboardModifier
+ assert isinstance(self.key, Qt.Key), self.key
+ assert isinstance(self.modifiers, modifier_classes), self.modifiers
+
_assert_plain_key(self.key)
_assert_plain_modifier(self.modifiers)
@@ -488,16 +489,7 @@ class KeyInfo:
if machinery.IS_QT5:
return int(self.key) | int(self.modifiers)
else:
- try:
- # FIXME:qt6 We might want to consider only supporting KeyInfo to be
- # instanciated with a real Qt.Key, not with ints. See __post_init__.
- key = Qt.Key(self.key)
- except ValueError as e:
- # WORKAROUND for
- # https://www.riverbankcomputing.com/pipermail/pyqt/2022-April/044607.html
- raise InvalidKeyError(e)
-
- return QKeyCombination(self.modifiers, key)
+ return QKeyCombination(self.modifiers, self.key)
def with_stripped_modifiers(self, modifiers: Qt.KeyboardModifier) -> "KeyInfo":
mods = _unset_modifier_bits(self.modifiers, modifiers)
diff --git a/qutebrowser/qt/_core_pyqtproperty.py b/qutebrowser/qt/_core_pyqtproperty.py
index 8ae62264f..ae6435039 100644
--- a/qutebrowser/qt/_core_pyqtproperty.py
+++ b/qutebrowser/qt/_core_pyqtproperty.py
@@ -5,7 +5,7 @@ https://github.com/python-qt-tools/PyQt5-stubs/blob/5.15.6.0/PyQt5-stubs/QtCore.
"""
# flake8: noqa
-# pylint: disable=invalid-name,missing-class-docstring,too-many-arguments,redefined-builtin,unused-argument,import-error
+# pylint: disable=invalid-name,missing-class-docstring,too-many-arguments,redefined-builtin,unused-argument,no-name-in-module
import typing
from PyQt6.QtCore import QObject, pyqtSignal
diff --git a/qutebrowser/qt/machinery.py b/qutebrowser/qt/machinery.py
index e626edcb4..616c7ccfc 100644
--- a/qutebrowser/qt/machinery.py
+++ b/qutebrowser/qt/machinery.py
@@ -3,6 +3,16 @@
"""Qt wrapper selection.
Contains selection logic and globals for Qt wrapper selection.
+
+All other files in this package are intended to be simple wrappers around Qt imports.
+Depending on what is set in this module, they import from PyQt5 or PyQt6.
+
+The import wrappers are intended to be as thin as possible. They will not unify
+API-level differences between Qt 5 and Qt 6. This is best handled by the calling code,
+which has a better picture of what changed between APIs and how to best handle it.
+
+What they *will* do is handle simple 1:1 renames of classes, or moves between
+modules (where they aim to always expose the Qt 6 API). See e.g. webenginecore.py.
"""
# NOTE: No qutebrowser or PyQt import should be done here (at import time),
@@ -20,11 +30,11 @@ from typing import Optional, Dict
from qutebrowser.utils import log
-# Packagers: Patch the line below to change the default wrapper for Qt 6 packages, e.g.:
-# sed -i 's/_DEFAULT_WRAPPER = "PyQt5"/_DEFAULT_WRAPPER = "PyQt6"/' qutebrowser/qt/machinery.py
+# Packagers: Patch the line below to enforce a Qt wrapper, e.g.:
+# sed -i 's/_WRAPPER_OVERRIDE = .*/_WRAPPER_OVERRIDE = "PyQt6"/' qutebrowser/qt/machinery.py
#
# Users: Set the QUTE_QT_WRAPPER environment variable to change the default wrapper.
-_DEFAULT_WRAPPER = "PyQt5"
+_WRAPPER_OVERRIDE = None
WRAPPERS = [
"PyQt6",
@@ -80,6 +90,9 @@ class SelectionReason(enum.Enum):
#: The wrapper was faked/patched out (e.g. in tests).
fake = "fake"
+ #: The wrapper was overridden by patching _WRAPPER_OVERRIDE.
+ override = "override"
+
#: The reason was not set.
unknown = "unknown"
@@ -152,7 +165,7 @@ def _select_wrapper(args: Optional[argparse.Namespace]) -> SelectionInfo:
- If --qt-wrapper is given, use that.
- Otherwise, if the QUTE_QT_WRAPPER environment variable is set, use that.
- - Otherwise, use PyQt5 (FIXME:qt6 autoselect).
+ - Otherwise, try the wrappers in WRAPPER in order (PyQt6 -> PyQt5)
"""
# If any Qt wrapper has been imported before this, something strange might
# be happening.
@@ -170,15 +183,17 @@ def _select_wrapper(args: Optional[argparse.Namespace]) -> SelectionInfo:
if env_wrapper == "auto":
return _autoselect_wrapper()
elif env_wrapper not in WRAPPERS:
- raise Error(f"Unknown wrapper {env_wrapper} set via {env_var}, "
- f"allowed: {', '.join(WRAPPERS)}")
+ raise Error(
+ f"Unknown wrapper {env_wrapper} set via {env_var}, "
+ f"allowed: {', '.join(WRAPPERS)}"
+ )
return SelectionInfo(wrapper=env_wrapper, reason=SelectionReason.env)
- # FIXME:qt6 Go back to the auto-detection once ready
- # FIXME:qt6 Make sure to still consider _DEFAULT_WRAPPER for packagers
- # (rename to _WRAPPER_OVERRIDE since our sed command is broken anyways then?)
- # return _autoselect_wrapper()
- return SelectionInfo(wrapper=_DEFAULT_WRAPPER, reason=SelectionReason.default)
+ if _WRAPPER_OVERRIDE is not None:
+ assert _WRAPPER_OVERRIDE in WRAPPERS # type: ignore[unreachable]
+ return SelectionInfo(wrapper=_WRAPPER_OVERRIDE, reason=SelectionReason.override)
+
+ return _autoselect_wrapper()
# Values are set in init(). If you see a NameError here, it means something tried to
@@ -219,8 +234,7 @@ def _set_globals(info: SelectionInfo) -> None:
Those are split into multiple global variables because that way we can teach mypy
about them via --always-true and --always-false, see tox.ini.
"""
- global INFO, USE_PYQT5, USE_PYQT6, USE_PYSIDE6, IS_QT5, IS_QT6, \
- IS_PYQT, IS_PYSIDE, _initialized
+ global INFO, USE_PYQT5, USE_PYQT6, USE_PYSIDE6, IS_QT5, IS_QT6, IS_PYQT, IS_PYSIDE, _initialized
assert info.wrapper is not None, info
assert not _initialized
diff --git a/qutebrowser/qt/opengl.py b/qutebrowser/qt/opengl.py
index 0a14dffad..bc5a31c11 100644
--- a/qutebrowser/qt/opengl.py
+++ b/qutebrowser/qt/opengl.py
@@ -1,4 +1,4 @@
-# pylint: disable=import-error,wildcard-import,unused-import
+# pylint: disable=import-error,wildcard-import,unused-import,unused-wildcard-import
"""Wrapped Qt imports for Qt OpenGL.
diff --git a/qutebrowser/qutebrowser.py b/qutebrowser/qutebrowser.py
index e778cc23a..fcca87feb 100644
--- a/qutebrowser/qutebrowser.py
+++ b/qutebrowser/qutebrowser.py
@@ -50,7 +50,7 @@ except ImportError:
sys.exit(100)
check_python_version()
-import argparse # FIXME:qt6 (lint): disable=wrong-import-order
+import argparse
from qutebrowser.misc import earlyinit
from qutebrowser.qt import machinery